🤖
AI・機械学習

【2026年最新】LangChainとPythonでRAG構築手順を学ぶ

#RAG #LangChain #Python #LLM #構築手順 #AI

RAG (Retrieval-Augmented Generation) は、大規模言語モデル (LLM) の幻覚 (hallucination) を抑制し、最新かつ正確な情報に基づいた回答を生成するための強力なフレームワークです。2026年10月現在、企業におけるLLM活用においてRAGは標準的なアーキテクチャとして定着しており、その構築にはPythonライブラリであるLangChainがデファクトスタンダードとして利用されています。本記事では、LangChainとPythonを用いたRAGシステム構築の具体的な手順を解説します。

1. RAGの基本とLangChainの役割(2026年10月時点)

RAGは、ユーザーからの質問に対し、まず外部の知識ベース(ドキュメント、データベースなど)から関連性の高い情報を検索 (Retrieval) し、その検索結果をLLMへのプロンプトに含めて回答を生成 (Generation) させる仕組みです。これにより、LLMが学習データに含まれない最新情報や企業固有の情報に基づいた、より正確で信頼性の高い回答を提供できるようになります。

LangChainは、このRAGパイプラインを構築するためのモジュール群を提供するフレームワークです。2026年10月現在、LangChainはバージョン0.2.x台に進化しており、特にExpression Language (LCEL) の導入により、より宣言的かつ効率的なチェーン構築が可能になっています。LangChainは以下の主要コンポーネントを統合することで、RAGシステムの開発を大幅に簡素化します。

  • Document Loaders: さまざまな形式(PDF、Webページ、CSVなど)のデータをロード。
  • Text Splitters: ロードしたドキュメントをLLMが処理しやすいチャンクに分割。
  • Embeddings: テキストを数値ベクトルに変換。
  • Vector Stores: ベクトル化されたチャンクを保存し、類似度検索を可能にする。
  • Retrievers: ベクトルストアから関連ドキュメントを取得。
  • LLMs: 大規模言語モデル。
  • Chains/Agents: 上記コンポーネントを組み合わせて複雑なタスクを実行。

2. LangChainとPythonによるRAG構築手順

ここでは、PDFドキュメントを基にしたRAGシステムを構築する手順をステップバイステップで解説します。

2.1. 環境準備とライブラリのインストール

Pythonバージョン3.10以降の環境を推奨します。必要なライブラリをインストールします。

pip install langchain==0.2.11 langchain-community==0.2.10 langchain-openai==0.1.16 faiss-cpu==1.7.4 tiktoken==0.7.0 pypdf==4.2.0

次に、OpenAI APIキーを設定します。

import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

⚠️ 注意: APIキーは環境変数として設定し、コードに直接記述しないことを強く推奨します。セキュリティリスクを低減し、Gitリポジトリへの誤ったコミットを防ぎます。

2.2. ドキュメントのロードと分割 (Chunking)

RAGの対象となるドキュメントをロードし、LLMのコンテキストウィンドウに収まるように適切なサイズに分割します。ここでは、例としてdocument.pdfというファイルを使用します。

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 1. ドキュメントのロード
loader = PyPDFLoader("document.pdf")
documents = loader.load()

# 2. テキストの分割(チャンキング)
# LLMのコンテキストウィンドウ制限と検索精度を考慮し、適切なチャンクサイズを設定
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # チャンクの最大文字数
    chunk_overlap=200, # 前後のチャンクと重複させる文字数
    length_function=len,
    add_start_index=True,
)
chunks = text_splitter.split_documents(documents)

print(f"元のドキュメント数: {len(documents)}")
print(f"分割されたチャンク数: {len(chunks)}")
# 例: 10ページのPDFが、chunk_size=1000, chunk_overlap=200で約50チャンクに分割された

💡 ポイント: chunk_sizechunk_overlapは、使用するLLMのコンテキストウィンドウサイズやドキュメントの内容によって調整が必要です。特に、文脈が途切れないようにchunk_overlapを設定することが重要です。

2.3. 埋め込みモデルとベクトルストアの構築

分割したチャンクを数値ベクトルに変換(埋め込み)し、検索可能なベクトルストアに格納します。ここでは、OpenAIの埋め込みモデルとFAISS(Facebook AI Similarity Search)をローカルベクトルストアとして使用します。

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# 3. 埋め込みモデルの初期化
# 2026年10月現在、text-embedding-3-smallは100万トークンあたり$0.00002の料金で利用可能
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 4. ベクトルストアの構築とリトリーバーの作成
# チャンクと埋め込みモデルを使ってFAISSインデックスを構築
vectorstore = FAISS.from_documents(chunks, embeddings)

# ベクトルストアから関連ドキュメントを取得するためのリトリーバーを作成
retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) # 検索で上位5件のドキュメントを取得

💡 ポイント: FAISSはローカルでの高速なベクトル検索に適していますが、本番環境ではPineconeChromaWeaviateなどの永続化可能でスケーラブルなベクトルデータベースが推奨されます。

2.4. RAGチェーンの実装と実行

LLMをロードし、検索されたドキュメントとユーザーの質問を組み合わせてプロンプトを作成し、LLMに渡すRAGチェーンを構築します。LangChain Expression Language (LCEL) を用いることで、直感的かつ効率的にチェーンを定義できます。

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 5. LLMの初期化
llm = ChatOpenAI(model="gpt-4o", temperature=0.1) # 2026年10月現在、gpt-4oは高性能かつコスト効率の良いモデル

# 6. プロンプトテンプレートの定義
# 検索されたコンテキストとユーザーの質問を組み込む
template = """以下のコンテキストのみを使用して、質問に答えてください。
もしコンテキストに情報がない場合は、「情報が見つかりませんでした。」と答えてください。

コンテキスト:
{context}

質問: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 7. RAGチェーンの構築 (LCELを使用)
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()} # 質問をそのままLLMに渡し、リトリーバーでコンテキストを取得
    | prompt # プロンプトテンプレートにコンテキストと質問を適用
    | llm # LLMで回答を生成
    | StrOutputParser() # 出力を文字列にパース
)

# 8. RAGチェーンの実行
question = "RAGの主な目的は何ですか?"
response = rag_chain.invoke(question)
print(f"質問: {question}")
print(f"回答: {response}")

# 別の質問例
question_2 = "このドキュメントで説明されている製品の最新機能は何ですか?"
response_2 = rag_chain.invoke(question_2)
print(f"\n質問: {question_2}")
print(f"回答: {response_2}")

3. 2026年におけるRAG構築のベストプラクティス

より高度で堅牢なRAGシステムを構築するためには、以下のベストプラクティスを考慮することが重要です。

  • ハイブリッド検索: キーワード検索(BM25など)とベクトル検索を組み合わせることで、検索漏れを減らし、検索精度を向上させます。LangChainはEnsembleRetrieverなどの機能を提供しています。
  • Reranking (再ランキング): ベクトルストアから取得した上位N個のドキュメントに対し、より高度なセマンティックモデル(例: Cohere Rerankやオープンソースのbge-reranker-base)を用いて関連性の高い順に並べ替えることで、LLMに渡すコンテキストの質を最大化します。
  • プロンプトエンジニアリング: LLMへの指示(システムプロンプトやユーザープロンプト)をより明確にし、期待する出力を得るためのプロンプトを最適化します。回答の形式指定や思考プロセスを促すFew-shotプロンプティングなども有効です。
  • RAG評価メトリクス: RAGシステムの性能を客観的に評価するためのメトリクス(例: Context Relevancy, Faithfulness, Answer Relevancy)を用いて継続的に改善することが不可欠です。LangChainのLangSmithは、RAGチェーンのデバッグと評価を強力にサポートするプラットフォームとして進化しています。
  • Agentic RAG: 単純なRetrievalだけでなく、LLMが自律的に検索戦略を決定したり、複数のツール(データベース検索、API呼び出しなど)を組み合わせて情報を取得するエージェントを活用することで、より複雑な質問にも対応できるようになります。

これらの技術を組み合わせることで、2026年10月現在の要求水準を満たす高性能なRAGシステムを構築することが可能です。

AI音声でナレーションを作ってみませんか?

ヨミアゲAIを試す(無料)