「LangChainとOpenAI APIを使用した生成型AIアプリケーションの構築」
Building a generative AI application using LangChain and OpenAI API.
イントロダクション
生成AIは、現在の技術の最先端をリードしています。画像生成、テキスト生成、要約、質疑応答ボットなど、生成AIアプリケーションが急速に拡大しています。OpenAIが最近大規模な言語モデルの波を牽引したことで、多くのスタートアップがLLMを使用した革新的なアプリケーションの開発を可能にするツールやフレームワークを開発しました。そのようなツールの一つがLangChainです。LangChainは、LLMによるアプリケーションの構築を可能にする柔軟性と信頼性を備えたフレームワークです。LangChainは、世界中のAI開発者が生成AIアプリケーションを構築するための定番ツールとなっています。LangChainは、外部データソースと市場で利用可能な多くのLLMとの統合も可能にします。また、LLMを利用したアプリケーションは、後で取得するデータを格納するためのベクトルストレージデータベースが必要です。この記事では、OpenAI APIとChromaDBを使用してアプリケーションパイプラインを構築することで、LangChainとその機能について学びます。
学習目標:
- LangChainの基礎を学んで生成AIパイプラインを構築する方法を学ぶ
- オープンソースモデルやChromadbなどのベクトルストレージデータベースを使用したテキスト埋め込み
- LangChainを使用してOpenAI APIを統合し、LLMをアプリケーションに組み込む方法を学ぶ
この記事は、データサイエンスブログマラソンの一環として公開されました。
- OpenAIのCEOであるSam Altman氏:AIの力が証明されるにつれて、仕事に関するリスクが生じる
- 「4つのテック巨人 – OpenAI、Google、Microsoft、Anthropicが安全なAIのために結集」
- 「Amazon SageMaker StudioでAmazon SageMaker JumpStartを使用して安定したDiffusion XLを利用する」
LangChainの概要
LangChainは、最近大規模言語モデルアプリケーションのための人気のあるフレームワークになりました。LangChainは、LLM、外部データソース、プロンプト、およびユーザーインターフェースとの対話を提供する洗練されたフレームワークを提供しています。
LangChainの価値提案
LangChainの主な価値提案は次のとおりです:
- コンポーネント:これらは言語モデルで作業するために必要な抽象化です。コンポーネントはモジュール化されており、多くのLLMの使用例に簡単に適用できます。
- 既製のチェーン:特定のタスク(要約、Q&Aなど)を達成するためのさまざまなコンポーネントとモジュールの構造化された組み立てです。
プロジェクトの詳細
LangChainはオープンソースプロジェクトであり、ローンチ以来、54K+のGithubスターを集めています。これは、プロジェクトの人気と受け入れられ方を示しています。
プロジェクトのreadmeファイルでは、次のようにフレームワークを説明しています:
大規模言語モデル(LLM)は、以前は開発者ができなかったアプリケーションを作成するための変革的な技術として現れつつあります。ただし、これらのLLMを単独で使用するだけでは、本当に強力なアプリを作成するには不十分なことがしばしばあります。真のパワーは、他の計算ソースや知識と組み合わせるときに発揮されます。
出典:プロジェクトリポジトリ
明らかに、フレームワークの目的を定義し、ユーザーの知識を活用したアプリケーションの開発を支援することを目指しています。
LangChainには、LLMアプリケーションを構築するための6つの主要なコンポーネントがあります:モデルI/O、データ接続、チェーン、メモリ、エージェント、およびコールバック。このフレームワークは、OpenAI、Huggingface Transformers、Pineconeやchromadbなどのベクトルストアなど、多くのツールとの統合も可能にします。
コンポーネントの詳細な説明:
- モデルI/O:言語モデルとのインターフェースです。プロンプト、モデル、および出力パーサーから構成されています。
- データ接続:アプリケーション固有のデータソースとのインターフェースであり、データの変換、テキストの分割、ベクトルストア、およびリトリーバーが含まれます。
- チェーン:AIアプリケーションの他のコンポーネントとの連続呼び出しを構築します。シーケンシャルチェーン、要約チェーン、検索Q&Aチェーンなどの例があります。
- エージェント:LangChainはエージェントを提供し、ユーザーの入力に基づいてLLMを含むさまざまなツールの動的なチェーンを利用することができます。
- メモリ:チェーンの実行間にアプリケーションの状態を永続化します。
- コールバック:連続チェーンのステップをログに記録し、ストリーム化してチェーンを効率的に実行し、リソースの消費を監視します。
LangChainの使用例をいくつか見てみましょう。
- 特定のドキュメント上での質問応答やチャット
- チャットボット
- 要約
- エージェント
- APIとの連携
これらは多くの使用例の一部です。OpenAIのAPIとオープンソースのベクトルデータベースであるChromaDBを使用して、特定のドキュメント上での質問応答のためのセマンティックサーチアプリケーションを学習・開発します。LangChainフレームワークについて詳しく学びたい場合は、公式ドキュメントをお読みいただくことをお勧めします。 (リンク: こちら)
環境のセットアップとドキュメントの読み込み
では、OpenAIのLLM APIを使用して、ユーザーの質問に対して一連のドキュメント上で回答するためのセマンティックサーチアプリケーションの環境をセットアップしていきましょう。この記事ではサンプルドキュメントを使用していますが、質問応答アプリケーションを構築するために独自のドキュメントを使用することもできます。まず、次のライブラリをインストールする必要があります。
プロジェクトの依存関係のインストール
# openai、langchain、sentence_transformersなどの依存関係のインストール
!pip install openai langchain sentence_transformers -q
!pip install unstructured -q
# 環境の依存関係のインストール
!pip install pydantic==1.10.8
!pip install typing-inspect==0.8.0 typing_extensions==4.5.
!pip install chromadb==0.3.26
LangChainには、pydantic、typing extensions、ChromaDBなどの特定のバージョンの環境依存が必要です。インストールが完了したら、以下のコードをColabや他のノートブック環境で実行することができます。
LangChainドキュメントローダー
LangChainは、ユーザーの入力やデータベースからドキュメントを読み込むためのドキュメントローダークラスを提供しています。HTML、JSON、CSVなど、さまざまなファイル形式をサポートしています。この使用例ではいくつかのテキストファイルを使用します。ファイルはGitHubのリポジトリで見つけることができます。(GitHubリポジトリ-リンク)
# ドキュメントローダーからlangchain dir loaderをインポート
from langchain.document_loaders import DirectoryLoader
# ディレクトリのパス
directory = '/content/pets'
# テキストドキュメントを読み込むための関数
def load_docs(directory):
loader = DirectoryLoader(directory)
documents = loader.load()
return documents
documents = load_docs(directory)
len(documents)
---------------------------[出力]----------------------------------------
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data] Unzipping tokenizers/punkt.zip.
[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data] /root/nltk_data...
[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.
5
データを読み込んだら、次にテキストスプリッターを使用してテキストドキュメントを固定サイズのチャンクに分割してベクトルデータベースに保存します。LangChainは、文字による分割、コードによる分割など、複数のテキストスプリッターを提供しています。
# テキストスプリッターを使用してテキストをチャンクに分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 再帰的な文字スプリッターを使用してドキュメントをチャンクに分割
def split_docs(documents,chunk_size=1000,chunk_overlap=20):
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = text_splitter.split_documents(documents)
return docs
# スプリットされたドキュメントをdocs変数に格納
docs = split_docs(documents)
ドキュメントをチャンクに変換したら、次のセクションでオープンソースの埋め込みモデルを使用してベクトルに埋め込みます。
LangChainとオープンソースモデルを使用したテキストの埋め込み
テキストの埋め込みは、LLMアプリケーション開発パイプラインで最も重要な概念です。セマンティックサーチ、要約などのタスクに処理する前に、すべてのテキストドキュメントをベクトル化する必要があります。テキスト埋め込みには、オープンソースのsentence-transformerモデル「all-MiniLM-L6-v2」を使用します。ドキュメントが埋め込まれたら、セマンティックサーチを実行するためにオープンソースのベクトルデータベースであるChromaDBに保存できます。実際のコード例を見てみましょう。
# langchainを使用した埋め込み
from langchain.embeddings import SentenceTransformerEmbeddings
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
# Chromaをベクトルストアとして使用し、ドキュメントを保存する
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings)
# クエリを使用して類似度検索を実行
query = "一般的なペットの種類は何ですか?"
matching_docs = db.similarity_search(query)
matching_docs[0]
--------------------------[出力]----------------------------------------
Document(page_content='ペットはさまざまな形状やサイズで存在し、
それぞれが異なるライフスタイルや家庭環境に適しています。
犬や猫は最も一般的で、その仲間意識と個性的な性格で知られています。
ハムスターやモルモット、ウサギなどの小型哺乳類は、
手入れが簡単なためよく選ばれます。
鳥は美しさと歌声を提供し、亀やトカゲなどの爬虫類は興味深いペットになることがあります。
魚も穏やかな存在感を示すため、素晴らしいペットになります。',
metadata={'source': '/content/pets/Different Types of Pet Animals.txt'})
上記のコードでは、埋め込みを使用してChromaDBに保存し、インメモリストレージをサポートしています。そのため、テキストドキュメントから回答を取得するためにデータベースにクエリを実行できます。私たちは、一般的に人々が所有するさまざまな種類のペットについて知りたいと尋ね、回答が正しく源泉付きで結果が出ました。
OpenAI API、ChromaDB、およびLangChainを使用した生成型AIアプリケーション
LangChainとOpenAI APIを使用した意味検索Q&A
このパイプラインでは、検索用語とドキュメントの意図と文脈を解釈し、より正確な検索結果を生成します。ユーザーの意図を理解し、単語や概念の関係を調べ、自然言語処理(NLP)の注意機構を利用して文脈に応じた検索結果を生成することで、検索の精度を向上させることができます。
LangChainは、OpenAIのチャットインターフェースを提供し、モデルAPIをアプリケーションに呼び出して、与えられたコンテキストや入力ドキュメントに基づいてユーザーのクエリに回答する質問/回答パイプラインを作成します。基本的には、質問に対して最も類似した回答を見つけるためにベクトル化された検索を実行します。(以下のフローチャートを参照してください。)
# 下記のパラメーターにOpenAIキーを挿入してください
import os
os.environ["OPENAI_API_KEY"] = "YOUR-OPENAI-KEY"
# LLMモデルをロードする
from langchain.chat_models import ChatOpenAI
model_name = "gpt-3.5-turbo"
llm = ChatOpenAI(model_name=model_name)
# q&aチェーンを使用してクエリの回答を取得する
from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type="stuff",verbose=True)
# クエリを書いて類似性検索を実行して回答を生成する
query = "ペットを飼うことの感情的な利点は何ですか?"
matching_docs = db.similarity_search(query)
answer = chain.run(input_documents=matching_docs, question=query)
answer
-----------------------------------[結果]---------------------------------
'ペットを飼うことには、数多くの感情的な利点があります。ペットは、孤独感や孤立感を軽減するための仲間を提供し、気分や全体的な幸福感を高めるために無条件の愛とサポートを提供します。ペットと触れ合うこと(撫でたり、遊んだりするなど)は、ストレスホルモンのレベルを低下させ、結合とリラクゼーションに関連するホルモンであるオキシトシンの放出を増加させることが示されています。また、ペットは目的や責任感を提供し、日常のストレス要因からの気晴らしを提供することで、満足感を与えます。さらに、ペットと飼い主の間の絆は、個人または社会的なストレスの時に安定感と一貫性を提供することができます。'
上記のコードでは、LangChainのChatOpenAI()関数を使用して「gpt-3.5-turbo」モデルAPIを呼び出し、クエリに対する回答のためのq&aチェーンを作成しています。コードの詳細情報については、LangChainの公式ドキュメント(こちら)とGithubのコードノートブック(こちら)を参照してください。
LLMChainを使用して企業名を生成する
大規模な言語モデルの別のユースケースは、LangChainのLLMChain、OpenAI LLM、およびPromptTemplateを使用して企業名を生成することです。与えられた説明をプロンプトとして使用して、企業名や製品名を生成することができます。以下のコードを参照してください。
# langchainから必要なコンポーネントをインポートする
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# OpenAIによるLLM
llm = OpenAI(temperature=0.9)
# PromptTemplateを使用してプロンプトを作成する
prompt = PromptTemplate(
input_variables=["product"],
template="製品を作る会社の良い名前は何ですか?",
)
# LLMChainを使用してチェーンを作成する
chain = LLMChain(llm=llm, prompt=prompt)
# 入力変数のみを指定してチェーンを実行する
print(chain.run("カラフルなソックス"))
出力>>> カラフルトゥーズ株式会社
LangChainチェーンを使用したテキスト文書の要約
チェーンは、法廷プロセスを迅速化するために法律業界で大量の法的文書を要約するのに役立つテキスト要約アプリケーションの開発も可能にします。以下は、LangChainの機能を使用した例のコードを参照してください。
# langChainからload_summarize_chain関数とOpenAI llmをインポート
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
# OpenAIのLLM
llm = OpenAI(temperature=0.9)
# map_reduceチェーンタイプを使用してOpenAI LLMでチェーンインスタンスを作成
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
LangChainの使いやすいインターフェースは、多くの異なるアプリケーションを解放し、エンドユーザーのさまざまな問題を解決します。上記のコードを見るとわかるように、わずか数行のコードで、ウェブ上の任意のソースからデータを要約するためにLLMのパワーを活用することができます。
結論
このブログ投稿では、LangChainとOpenAI APIを使用して生成型AIアプリケーションを構築するエキサイティングなドメインについて探求しました。LangChainの概要、そのさまざまなコンポーネント、およびLLMアプリケーションのユースケースについて概説しました。生成型AIは、テキスト、画像、ビデオなどをリアルに生成することを可能にし、様々なドメインを革新しています。セマンティックサーチは、OpenAIのGPT-3.5やGPT-4などのLLMを使用して質問応答アプリケーションを構築するために使用されるアプリケーションの一つです。このブログのキーポイントを見てみましょう:
- LangChainの概要について概説しました – LLMパワードアプリケーションを構築するためのオープンソースフレームワークです。
- LangChainとChromaDBを使用して埋め込みを保存するベクトルデータベースである類似性検索アプリケーションの使用方法を学びました。
- 最後に、LangChainを使用して生成型AIアプリケーションを構築するためのOpenAI LLM APIについて学びました。
よくある質問
この記事に表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles