この記事では、LangChainという強力なフレームワークを使ったAIアプリケーション開発の第一歩を、実際のコードを交えてわかりやすく解説します。今回作るアプリケーションは、PDFファイルの内容を学習して、その内容について質問すると答えてくれる「PDF質疑応答システム」です。
なぜLangChainを使うのか?
LangChainは、LLMを使ったアプリケーション開発を非常に簡単にしてくれるオープンソースのフレームワークです。本来、複雑なプロセスを必要とするLLMアプリも、LangChainの提供する部品(コンポーネント)を組み合わせるだけで、まるでレゴブロックを組み立てるように作ることができます。
今回作るシステムは、「RAG(Retrieval-Augmented Generation)」という技術をベースにしています。これは、AIに外部の知識(今回はPDFファイル)を「検索」させてから「回答を生成」させることで、より正確で最新の情報に基づいた回答をさせる技術です。
ステップ1:必要なものを準備しよう
まずは、開発環境を整えましょう。Pythonがインストールされていることを前提に、以下のライブラリをインストールします。
Bash
pip install langchain-community langchain-openai faiss-cpu pypdf
langchain-community
: LangChainの基本的なコンポーネントが含まれています。langchain-openai
: OpenAIのモデル(GPT-4など)と連携するために必要です。faiss-cpu
: ベクトルデータベースとして使用するライブラリです。pypdf
: PDFファイルを読み込むために使います。
また、OpenAIのAPIキーを環境変数に設定しておきましょう。
ステップ2:PDFを読み込んで下準備をする
AIにPDFを読ませるには、まずテキストデータを抽出し、扱いやすいサイズに分割する必要があります。
Python
from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. PDFドキュメントの読み込み loader = PyPDFLoader("your_document.pdf") docs = loader.load() # 2. テキストを小さな塊(チャンク)に分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len, ) texts = text_splitter.split_documents(docs)
このコードでは、PDFを読み込んだ後、RecursiveCharacterTextSplitter
を使ってテキストを1000文字の塊に分割しています。こうすることで、AIが一度に処理できる情報量を適切に保ちます。
ステップ3:AIが理解できるようにデータを変換する
分割したテキストを、AIが意味を理解できるように数値のリスト(ベクトル)に変換します。このプロセスを「埋め込み(Embedding)」と呼びます。変換されたベクトルは、検索しやすいようにベクターデータベースに保存します。
Python
from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS # 3. 埋め込みとベクターデータベースの作成 embeddings = OpenAIEmbeddings() db = FAISS.from_documents(texts, embeddings)
FAISS
は、高速な類似度検索ができるベクターデータベースです。ここで、テキストの「意味」が数学的に表現され、データベースに登録されます。
ステップ4:質問に答えるAIアプリケーションを構築する
いよいよ、質問応答の核となる部分を構築します。LangChainのRetrievalQA
という便利なチェーンを使います。このチェーンは、以下の流れを自動で実行してくれます。
- ユーザーの質問をベクトルに変換
- ベクターデータベースから関連性の高いテキストチャンクを検索
- 検索結果と質問をLLMに渡して回答を生成
Python
from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate # 4. LLM(モデル)の準備 llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0) # 5. RAGチェーンの作成 retriever = db.as_retriever() # データベースから検索するリトリーバーを設定 # プロンプトのテンプレートを定義 prompt_template = """ あなたは、提供されたドキュメントに基づいて質問に回答するAIアシスタントです。 以下の情報を参考にして、簡潔かつ正確に回答してください。 もしドキュメントに関連情報がない場合は、「その質問にはお答えできません。」と答えてください。 {context} 質問: {question} """ PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) # RetrievalQAチェーンを構築 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": PROMPT}, ) # 6. 質疑応答の実行 question = "ドキュメントに書かれている主要なポイントは何ですか?" result = qa_chain.invoke({"query": question}) print("質問:", question) print("回答:", result["result"])
このコードを実行すると、your_document.pdf
の内容に基づいて、AIが質問に答えてくれます。
まとめ
このように、LangChainを使えば、複雑に思えるRAGシステムも、各ステップのコンポーネントを組み合わせて簡単に構築できます。今回紹介したコードはあくまで基礎ですが、これを応用することで、さらに多くのことができるようになります。