1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生成AIのハードルを下げたい!Advent Calendar 2023

Day 21

【2023年12月最新】LangChainを使用した質問応答エージェントの作成【LCEL・FAISS】

Last updated at Posted at 2023-12-14

はじめに

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

ソースコードの解説

ソースコード全文
question_answering_agent.py
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. テキストデータの準備

まず、エージェントが参照するテキストデータを準備します。この例では、Python、機械学習、データサイエンスに関する基本的な情報を用意します。

texts = [
    "Pythonについての基本情報",
    "機械学習の最新トレンド",
    "データサイエンスの応用例"
]

2. VectorStoreの作成

LangChainの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. プロンプトとモデルの準備

LangChainの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でのチェーンの定義

LangChain Expression Language(LCEL)を使用して、上記のコンポーネントを連結し、質問応答エージェントのチェーンを定義します。

from langchain.schema.runnable import RunnablePassthrough

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
)

5. チェーンの実行

最後に、定義したチェーンを実行して、ユーザーの質問に対する回答を生成します。

question = "Pythonの基本的な特徴は何ですか?"
result = chain.invoke(question)
print(result)

実行結果

エージェントに「Pythonの基本的な特徴は何ですか?」という質問をしたところ、以下のような回答が得られました。

回答: Pythonの基本的な特徴は以下の通りです。

  1. シンプルで読みやすい文法: Pythonの文法はシンプルで読みやすく、初心者にも理解しやすい特徴があります。
  2. インタプリタ言語: Pythonはインタプリタ言語であり、コンパイルの必要がないため、即座にコードの実行結果を確認することができます。
  3. マルチパラダイム: Pythonは複数のプログラミングパラダイム(手法)をサポートしており、手続き型、オブジェクト指向型、関数型など、様々なスタイルでプログラムを書くことができます。
  4. 大規模な標準ライブラリ: Pythonには豊富な標準ライブラリが含まれており、データ処理、ネットワーク通信、GUI開発など、さまざまな目的に利用することができます。
  5. クロスプラットフォーム: Pythonは主要なオペレーティングシステム(Windows、Mac、Linux)で動作するため、プラットフォームに依存せずに開発することができます。
  6. コミュニティの活発さ: Pythonは非常に活発なコミュニティを持っており、多くのユーザーが情報や質問を共有しています。これにより、問題解決や学習のサポートを受けることができます。

この回答は、Pythonの主要な特徴を網羅的に説明しており、LangChainを使用した質問応答エージェントの能力を示しています。

おわりに

この記事では、LangChainを使用して質問応答エージェントを作成する方法を解説しました。LangChainは、大規模言語モデルを活用したアプリケーションの開発を容易にする強力なツールです。このエージェントは、特定の質問に対して関連する情報を検索し、それを基に詳細な回答を生成することができます。

このようなエージェントの開発は、知識ベースの質問応答システム、教育的なアプリケーション、または特定の分野に特化した情報提供ツールなど、さまざまな用途に応用できます。LangChainを活用することで、開発者は大規模言語モデルの力を最大限に引き出し、より高度な機能を持つアプリケーションを構築することが可能になります。

参考文献

この記事は以下の情報を参考にして執筆しました。

https://github.com/langchain-ai/langchain

https://github.com/facebookresearch/faiss

ソースコード

本記事で使用したソースコードは、下記のGitHubレポジトリに格納しています。

https://github.com/Isaka-code/openai-api-hands-on

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?