LangChainを使って簡単な質問応答アプリを作ろう!
こんにちは、ホーリーデイです。今回は、LangChainを使って質問応答アプリケーションを作る方法をわかりやすく説明します。技術的な知識がない方でも読めるように、なるべく簡単な言葉で説明して行きます。
LangChainとは?
LangChainは、質問応答アプリケーションやRAG(Retrieval-Augmented Generation)アプリケーションを作成するためのツールです。データを取り込んでインデックスを作成し、ユーザーの質問に対して関連するデータを取り出して回答を生成する仕組みを提供します。
何を作るの?
今回は、あるブログ記事を対象に、質問に答えるアプリケーションを作ります。具体的には、「LLM(大規模言語モデル)を使った自律エージェント」について書かれたブログ記事から、ユーザーの質問に答えるアプリを作成します。
準備するもの
Pythonがインストールされた環境
OpenAI APIキー(OpenAIのサービスを使うために必要です)
必要なパッケージのインストール
まずは、必要なパッケージをインストールします。以下のコマンドをターミナルに入力してください。
!pip install --upgrade langchain langchain-community langchainhub langchain-openai langchain-chroma bs4
コードの実装
それでは、実際のコードを見ていきましょう。以下のコードをqa_app.pyという名前で保存してください。
# -*- coding: utf-8 -*-
import getpass
import os
import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_chroma import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import ChatOpenAI
# 環境変数の設定
api_key = getpass.getpass("OpenAI APIキーを入力してください: ").strip()
os.environ["OPENAI_API_KEY"] = api_key
# モデルの初期化
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
# ブログの内容をロード、チャンク化、およびインデックス化
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
),
)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
# 関連するブログのスニペットを取得および生成
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# クエリの実行と結果の出力
result = rag_chain.invoke("Task Decompositionとは何ですか?")
print(result)
# cleanup
vectorstore.delete_collection()
コードの説明
環境変数の設定:
api_key = getpass.getpass("OpenAI APIキーを入力してください: ").strip()
os.environ["OPENAI_API_KEY"] = api_key
最初に、OpenAIのAPIキーを入力するように求められます。これは、OpenAIのサービスを使用するために必要です。
getpass.getpassを使うことで、入力したAPIキーが表示されないようにしています。
2. モデルの初期化
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
ChatOpenAIというモデルを使います。これは、質問に対して自然な言葉で回答を生成するためのものです。
3. ブログの内容をロード、チャンク化、およびインデックス化:
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
),
)
docs = loader.load()
指定したブログ記事をロードします。BeautifulSoupを使って、必要なHTMLタグのみを抽出します。
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
分割されたドキュメントをベクトルストアに保存し、インデックスを作成します。これにより、後で検索できるようになります。
4. 質問の処理:
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
ユーザーからの質問に対して、関連するドキュメントを取り出すための準備をします。
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
ドキュメントをフォーマットする関数です。複数のドキュメントを1つの文字列にまとめます。
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
質問応答のチェーンを作成します。質問を受け取り、関連するドキュメントを検索し、回答を生成します。
5. クエリの実行と結果の出力:
result = rag_chain.invoke("Task Decompositionとは何ですか?")
print(result)
実際に質問をチェーンに渡して回答を生成し、結果を表示します。
6.ベクトルストアのクリーンアップ:
vectorstore.delete_collection()
使用後にベクトルストアを削除して、リソースを解放します。
実行方法
上記のコードを qa_app.py として保存します。
ターミナルを開き、保存した qa_app.py のディレクトリに移動します。
以下のコマンドを実行します。
python qa_app.py
4.プロンプトが表示されたら、OpenAI APIキーを入力します。
これで、ブログ記事の内容に基づいて質問に答えるアプリが動作するはずです。結果が表示されたら、それが質問に対する回答です。
まとめ
今回は、LangChainを使って簡単な質問応答アプリケーションを作成しました。このアプリは、ブログ記事の内容に基づいてユーザーの質問に答えることができます。AIの力を使って、複雑な情報を簡単に引き出せる便利なツールを作ることができましたね。興味のある方は、ぜひ他の記事やデータセットを使って試してみてください!
次はチャットの履歴の実装を行います。次の記事をお待ちください。
読んでいただきありがとうございます!
参考文献
https://python.langchain.com/v0.1/docs/use_cases/question_answering/quickstart/
この記事が気に入ったらサポートをしてみませんか?