【実践】LangChainでAIアプリ開発!社内文書に質問できるQ&Aボットを作ってみよう
「自分が持っているPDFやテキストファイルの内容について、ChatGPTみたいに質問できたら便利なのに…」
そう思ったことはありませんか?実は、LLM(大規模言語モデル)開発フレームワークのLangChainを使えば、そんな夢のようなアプリケーションが、驚くほど簡単なコードで実現できてしまいます。
この記事では、LangChainの最も強力で基本的な使い方である「RAG(検索拡張生成)」という仕組みを使って、「独自の文書に答えてくれるQ&Aボット」を、Pythonコードを交えながらステップバイステップで構築していきます。この記事を読み終える頃には、あなたもLangChainアプリ開発の第一歩を踏み出しているはずです!
はじめに:開発の準備をしよう 🛠️
まず、開発に必要なものを準備します。Pythonがインストールされている環境を前提とします。
1. 必要なライブラリのインストール
ターミナル(コマンドプロモート)を開き、以下のコマンドを実行して、今回の開発に必要なライブラリをインストールしてください。
pip install langchain openai faiss-cpu tiktoken
2. OpenAI APIキーの準備
今回のアプリでは、頭脳となるLLMにOpenAIのモデルを使用します。OpenAIの公式サイトでアカウントを作成し、APIキーを取得してください。取得したAPIキーは、プログラムを実行する環境で環境変数として設定しておくと安全です。
export OPENAI_API_KEY="ここにあなたのAPIキーを貼り付け"
これで開発の準備は完了です!
RAGアプリの3ステップ・クッキング 🍳
今回作る「独自文書Q&Aボット」は、RAG(検索拡張生成)という技術を使います。難しそうに聞こえますが、料理に例えるととても簡単です。
- Step 1: 具材の準備(データの読み込みと分割) - AIに読ませたい文書を、扱いやすいように小さくカットします。
- Step 2: 下ごしらえ(ベクトル化してDBに保存) - カットした具材(データ)に「意味」という下味をつけ、すぐに取り出せる保管庫に入れます。
- Step 3: 調理(検索して回答を生成) - 質問が来たら、保管庫から関連する具材を探し出し、LLMという天才シェフに渡して美味しい答えを調理してもらいます。
では、この3ステップを実際にコードで見ていきましょう!
【実践コード】Step 1: 具材の準備(データの読み込みと分割)
まず、AIに学習させたい文書データを用意します。今回は、`my_document.txt`という名前で、以下のような簡単なテキストファイルを作成してください。
my_document.txt
LangChainは、LLM(大規模言語モデル)を活用したアプリケーション開発を効率化するためのフレームワークです。
2022年にハリソン・チェイスによって開発されました。
LangChainの最大の特徴は、複雑なLLMとのやり取りを「コンポーネント」として抽象化し、それらを組み合わせることで、高度なアプリケーションをまるでレゴブロックのように構築できる点にあります。
これにより、開発者はLLMのコアな部分を意識することなく、迅速なプロトタイピングと開発が可能になります。
次に、このテキストファイルをプログラムに読み込み、AIが処理しやすいように小さな塊(チャンク)に分割します。
# 必要なライブラリをインポート
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
# 1. ドキュメントを読み込む
loader = TextLoader('my_document.txt')
documents = loader.load()
# 2. テキストをチャンクに分割する
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
print(f"ドキュメントが {len(docs)} 個のチャンクに分割されました。")
# 実行結果例: ドキュメントが 4 個のチャンクに分割されました。
たったこれだけで、文書の読み込みと分割が完了しました。簡単ですよね?
【実践コード】Step 2: 下ごしらえ(ベクトル化してDBに保存)
次に、分割したチャンクを「ベクトル」という数値のリストに変換します。ベクトルにすることで、AIは単語の羅列ではなく「意味」としてテキストを捉えることができます。そして、そのベクトルデータをすぐに検索できるデータベース(ベクターストア)に保存します。
# 必要なライブラリをインポート
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 3. OpenAIのEmbeddingモデルを準備
embeddings = OpenAIEmbeddings()
# 4. FAISSを使って、ドキュメントをベクトル化し、データベースに保存
db = FAISS.from_documents(docs, embeddings)
print("ベクターストアの準備が完了しました。")
ここでは`FAISS`という、メモリ上で高速に動作するベクターストアを利用しました。これで、いつでも質問に関連する情報を高速に検索できる「魔法の保管庫」が完成です。
【実践コード】Step 3: 調理(検索して回答を生成)
いよいよ最後のステップです。ユーザーからの質問を受け取り、先ほど作ったベクターストアから関連情報を検索し、その情報を基にLLMに回答を生成させます。LangChainには、この一連の流れを簡単に行える`RetrievalQA`という便利なChain(チェーン)が用意されています。
# 必要なライブラリをインポート
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 5. LLMモデル(OpenAI)とRetrievalQAチェーンを準備
llm = OpenAI()
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever() # ベクターストアを検索役として指定
)
# 6. 質問を実行して回答を得る
query = "LangChainとは何ですか?"
response = qa_chain.run(query)
print(f"質問: {query}")
print(f"回答: {response}")
# 実行結果例:
# 質問: LangChainとは何ですか?
# 回答: LangChainは、LLM(大規模言語モデル)を活用したアプリケーション開発を効率化するためのフレームワークです。
見事に、先ほど用意した`my_document.txt`の内容に基づいて回答が生成されました! これで、あなただけのオリジナルQ&Aボットの完成です。
GoogleのGeminiモデルで実行したい場合はこちらをクリックしてみてください
Gemini版 Q&Aボットの作り方 💎
LangChainの素晴らしい点は、モデルの切り替えが非常に簡単なことです。頭脳となるLLMをOpenAIからGoogleのGeminiに変更してみましょう。
1. 準備をしよう - Gemini版
まず、ライブラリのインストールとAPIキーの設定が少し変わります。
ライブラリのインストール:
pip install langchain langchain-google-genai faiss-cpu tiktoken
Google AI StudioでAPIキーを無料で取得し、環境変数に設定してください。
export GOOGLE_API_KEY="ここにあなたのGoogle APIキーを貼り付け"
2. 【実践コード】Gemini版
Step1の「データの読み込みと分割」はOpenAI版と全く同じです。変更が必要なのはStep2とStep3です。
Step 2: 下ごしらえ(ベクトル化)- Gemini版
テキストをベクトルに変換する部分を、Googleのモデルに差し替えます。
# 必要なライブラリをインポート
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain.vectorstores import FAISS
# 3. GoogleのEmbeddingモデルを準備
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
# 4. FAISSを使って、ドキュメントをベクトル化し、データベースに保存
# (docsはStep1で作成したものを使用)
db = FAISS.from_documents(docs, embeddings)
print("Gemini用のベクターストアの準備が完了しました。")
Step 3: 調理(検索して回答を生成)- Gemini版
頭脳となるLLMをGeminiモデルに差し替えて、Q&Aチェーンを実行します。
# 必要なライブラリをインポート
from langchain.chains import RetrievalQA
from langchain_google_genai import ChatGoogleGenerativeAI
# 5. LLMモデル(Gemini)とRetrievalQAチェーンを準備
llm = ChatGoogleGenerativeAI(model="gemini-pro", convert_system_message_to_human=True)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever() # Step2で作成したDBを検索役として指定
)
# 6. 質問を実行して回答を得る
query = "LangChainの最大の特徴は何ですか?"
response = qa_chain.run(query)
print(f"質問: {query}")
print(f"回答: {response}")
これだけで、Q&Aボットの頭脳をGeminiに入れ替えることができました!