この記事では、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という便利なチェーンを使います。このチェーンは、以下の流れを自動で実行してくれます。

  1. ユーザーの質問をベクトルに変換
  2. ベクターデータベースから関連性の高いテキストチャンクを検索
  3. 検索結果と質問を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システムも、各ステップのコンポーネントを組み合わせて簡単に構築できます。今回紹介したコードはあくまで基礎ですが、これを応用することで、さらに多くのことができるようになります。


この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事