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

## はじめに

LangChainは、大規模言語モデル（LLM）を活用したアプリケーション開発を容易にするためのフレームワークです。この記事では、LangChainを使用して、ユーザーの質問に基づいて関連する情報を検索し、それを基に回答を生成する質問応答エージェントの作成方法について解説します。

**この記事で使用している技術一覧**
- **LangChain**: 大規模言語モデル（LLM）を活用したアプリケーション開発を容易にするフレームワーク。
- **OpenAI GPT-3.5**: 強力な自然言語処理能力を持つ大規模言語モデル。
- **FAISS (Facebook AI Similarity Search)**: 高速な類似性検索を行うためのライブラリ。特に大量のベクトルデータを扱う際に有用。
- **Python**: このエージェントの開発に使用されるプログラミング言語。

これらの技術を組み合わせることで、ユーザーの質問に対して関連する情報を検索し、それを基に回答を生成する質問応答エージェントを作成します。

## 必要なライブラリ

本記事のソースコードを実行するためには、以下のライブラリが必要です。

- langchain
- openai
- faiss-cpu

これらはpipを使用してインストールできます。

```bash
pip install langchain openai faiss-cpu
```

## ソースコードの解説

**<details><summary>ソースコード全文</summary><div>**



```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()
```

</div></details>


### 1. テキストデータの準備

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

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

### 2. VectorStoreの作成

LangChainの`FAISS`を使用して、テキストデータのベクトル表現を作成します。これにより、後で質問に最も関連するテキストを検索できるようになります。

```python
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`モデルを使用して、回答を生成します。

```python
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）を使用して、上記のコンポーネントを連結し、質問応答エージェントのチェーンを定義します。

```python
from langchain.schema.runnable import RunnablePassthrough

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

### 5. チェーンの実行

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

```python
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