はじめに
LangChainは、大規模言語モデル(LLM)を活用したアプリケーション開発を容易にするためのフレームワークです。この記事では、LangChainを使用して、ユーザーの質問に基づいて関連する情報を検索し、それを基に回答を生成する質問応答エージェントの作成方法について解説します。
この記事で使用している技術一覧
- LangChain: 大規模言語モデル(LLM)を活用したアプリケーション開発を容易にするフレームワーク。
- OpenAI GPT-3.5: 強力な自然言語処理能力を持つ大規模言語モデル。
- FAISS (Facebook AI Similarity Search): 高速な類似性検索を行うためのライブラリ。特に大量のベクトルデータを扱う際に有用。
- Python: このエージェントの開発に使用されるプログラミング言語。
これらの技術を組み合わせることで、ユーザーの質問に対して関連する情報を検索し、それを基に回答を生成する質問応答エージェントを作成します。
必要なライブラリ
本記事のソースコードを実行するためには、以下のライブラリが必要です。
- langchain
- openai
- faiss-cpu
これらはpipを使用してインストールできます。
pip install langchain openai faiss-cpu
ソースコードの解説
まず、エージェントが参照するテキストデータを準備します。この例では、Python、機械学習、データサイエンスに関する基本的な情報を用意します。 LangChainの LangChainの LangChain Expression Language(LCEL)を使用して、上記のコンポーネントを連結し、質問応答エージェントのチェーンを定義します。 最後に、定義したチェーンを実行して、ユーザーの質問に対する回答を生成します。 実行結果 エージェントに「Pythonの基本的な特徴は何ですか?」という質問をしたところ、以下のような回答が得られました。 回答: Pythonの基本的な特徴は以下の通りです。 この回答は、Pythonの主要な特徴を網羅的に説明しており、LangChainを使用した質問応答エージェントの能力を示しています。 この記事では、LangChainを使用して質問応答エージェントを作成する方法を解説しました。LangChainは、大規模言語モデルを活用したアプリケーションの開発を容易にする強力なツールです。このエージェントは、特定の質問に対して関連する情報を検索し、それを基に詳細な回答を生成することができます。 このようなエージェントの開発は、知識ベースの質問応答システム、教育的なアプリケーション、または特定の分野に特化した情報提供ツールなど、さまざまな用途に応用できます。LangChainを活用することで、開発者は大規模言語モデルの力を最大限に引き出し、より高度な機能を持つアプリケーションを構築することが可能になります。 この記事は以下の情報を参考にして執筆しました。 https://github.com/langchain-ai/langchain https://github.com/facebookresearch/faiss 本記事で使用したソースコードは、下記のGitHubレポジトリに格納しています。ソースコード全文
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.vectorstores import FAISS
def prepare_texts():
"""テキストデータの準備"""
return [
"Pythonについての基本情報",
"機械学習の最新トレンド",
"データサイエンスの応用例"
]
def create_vectorstore(texts):
"""VectorStoreの作成"""
return FAISS.from_texts(texts, embedding=OpenAIEmbeddings())
def create_prompt():
"""プロンプトの作成"""
return ChatPromptTemplate.from_template(
"以下のcontextだけに基づいて回答してください。\n{context}\n質問: {question}"
)
def create_model():
"""モデルの作成"""
return ChatOpenAI(model_name="gpt-3.5-turbo")
def create_chain(retriever, prompt, model):
"""LCELでのチェーンの定義"""
return {"context": retriever, "question": RunnablePassthrough()} | prompt | model
def main():
texts = prepare_texts()
vectorstore = create_vectorstore(texts)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
prompt = create_prompt()
model = create_model()
chain = create_chain(retriever, prompt, model)
question = "Pythonの基本的な特徴は何ですか?"
result = chain.invoke(question)
print(result)
if __name__ == "__main__":
main()
1. テキストデータの準備
texts = [
"Pythonについての基本情報",
"機械学習の最新トレンド",
"データサイエンスの応用例"
]
2. VectorStoreの作成
FAISS
を使用して、テキストデータのベクトル表現を作成します。これにより、後で質問に最も関連するテキストを検索できるようになります。from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
vectorstore = FAISS.from_texts(texts, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
3. プロンプトとモデルの準備
ChatPromptTemplate
を使用して、ユーザーの質問に基づいて回答を生成するためのプロンプトを作成します。また、ChatOpenAI
モデルを使用して、回答を生成します。from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template(
"以下のcontextだけに基づいて回答してください。\n{context}\n質問: {question}"
)
model = ChatOpenAI(model_name="gpt-3.5-turbo")
4. LCELでのチェーンの定義
from langchain.schema.runnable import RunnablePassthrough
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
)
5. チェーンの実行
question = "Pythonの基本的な特徴は何ですか?"
result = chain.invoke(question)
print(result)
おわりに
参考文献
ソースコード