LangChainとPythonでRAG構築!実践的な手順と最適化ガイド
ヨミアゲAI編集部
AI音声・動画制作に関する情報をお届けします
RAG構築の基礎とLangChainの役割 (2026年2月時点)
RAG (Retrieval-Augmented Generation) は、大規模言語モデル (LLM) が外部の知識ベースから関連情報を検索し、それに基づいて回答を生成する技術です。これにより、LLMの幻覚(hallucination)を抑制し、特定のドメイン知識に基づいた正確かつ最新の回答を可能にします。2026年2月現在、LangChainはPythonエコシステムにおいて、このRAGシステムを効率的に構築するためのデファクトスタンダードツールキットとして広く採用されています。
LangChainは、RAGシステムを構成する以下の主要コンポーネントを抽象化し、モジュール化しています。
- Document Loaders: さまざまなデータソース(PDF、Webページ、データベースなど)からドキュメントを読み込みます。
- Text Splitters: 長いドキュメントをLLMが処理しやすいサイズのチャンクに分割します。
- Embeddings: テキストを数値ベクトル(埋め込み)に変換し、意味的な類似性を計算できるようにします。
- Vector Stores: 生成された埋め込みを格納し、類似度検索を高速に行うためのデータベースです。
- Retrievers: ベクトルストアからクエリに関連するドキュメントを取得します。
- LLMs: 回答を生成する大規模言語モデルです。
- Chains / Agents: これら全てのコンポーネントを連結し、一連の処理フローを定義します。LangChain Expression Language (LCEL) を用いた構築が主流です。
LangChainとPythonによるRAG構築のステップバイステップ
ここでは、ローカル環境でChromaDBをベクトルストアとして使用し、WebコンテンツからRAGシステムを構築する手順を解説します。
ステップ1: 環境構築と依存ライブラリのインストール
まず、Python環境をセットアップし、必要なライブラリをインストールします。2026年2月時点では、Python 3.12以降が推奨されます。
# 仮想環境の作成とアクティベート
python -m venv .venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
# 必要なライブラリのインストール
# LangChainのコアパッケージは0.3.5を想定
pip install langchain==0.3.5 langchain-community==0.3.5 langchain-core==0.3.5 \
openai==1.13.3 chromadb==0.4.22 beautifulsoup4==4.12.3 tiktoken==0.6.0
💡 ポイント:
langchain、langchain-community、langchain-coreはそれぞれの役割に応じて分離されており、RAG構築ではこれらを適切にインストールする必要があります。
ステップ2: ドキュメントのロードと分割
Webページから情報を取得し、LLMが処理しやすいように分割します。ここではLangChainのWebBaseLoaderとRecursiveCharacterTextSplitterを使用します。
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# ドキュメントのロード
urls = ["https://www.langchain.com/blog/rag-from-scratch", "https://www.langchain.com/blog/lcel"] # 取得したいWebページのURLリスト
loader = WebBaseLoader(urls)
documents = loader.load()
# ドキュメントの分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # チャンクの最大文字数
chunk_overlap=200, # チャンク間の重複文字数
length_function=len,
is_separator_regex=False,
)
splits = text_splitter.split_documents(documents)
print(f"元のドキュメント数: {len(documents)}")
print(f"分割後のチャンク数: {len(splits)}")
⚠️ 注意:
chunk_sizeとchunk_overlapはRAGシステムの性能に大きく影響します。ドキュメントの内容やLLMのコンテキストウィンドウサイズに合わせて調整が必要です。一般的に、chunk_sizeは500〜1500、chunk_overlapは50〜200が目安とされます。
ステップ3: 埋め込みとベクトルストアの構築
分割されたテキストチャンクを数値ベクトルに変換し、ベクトルストアに保存します。ここではOpenAIの埋め込みモデルとChromaDBを使用します。
import os
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# OpenAI APIキーの設定 (環境変数から取得)
# os.environ["OPENAI_API_KEY"] = "sk-..." # ご自身のAPIキーを設定してください
# 埋め込みモデルの初期化
# 2026年2月時点ではtext-embedding-3-largeが推奨される高性能モデルの一つ
# このモデルは3072次元のベクトルを生成します。
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# ベクトルストアの構築(初回のみデータが永続化される)
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db" # データの保存先ディレクトリ
)
# Retrieverの準備
retriever = vectorstore.as_retriever(search_kwargs={"k": 4}) # 検索するドキュメント数 k=4
💡 ポイント: OpenAIの
text-embedding-3-largeは、2026年2月時点で高い性能とコスト効率を両立しています。同モデルの利用料金は、100万トークンあたり0.00013ドル(入力)です。
ステップ4: LLMの準備とRAGチェーンの構築
LLMを初期化し、LCELを用いてRAGチェーンを構築します。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# LLMの初期化
# 2026年2月時点の最新高性能モデルとしてGPT-4oを想定
llm = ChatOpenAI(model="gpt-4o", temperature=0.1)
# プロンプトテンプレートの定義
template = """以下の質問に答えるために、提供されたコンテキストのみを使用してください。
もしコンテキストに情報がない場合は、「提供された情報からは回答できません。」と答えてください。
コンテキスト:
{context}
質問: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# RAGチェーンの構築 (LCELを使用)
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
💡 ポイント: LCEL (LangChain Expression Language) は、LangChainにおけるチェーン構築の最新かつ最も柔軟な方法です。パイプ演算子
|を用いて、コンポーネントを直感的に連結できます。GPT-4oのAPI料金は、入力トークン100万あたり5.00ドル、出力トークン100万あたり15.00ドルです(2026年2月時点の参考値)。
ステップ5: RAGクエリの実行
構築したRAGチェーンに質問を渡し、回答を取得します。
# クエリの実行
question = "LangChain Expression Language (LCEL) の主なメリットは何ですか?"
response = rag_chain.invoke(question)
print("\n--- 質問 ---")
print(question)
print("\n--- 回答 ---")
print(response)
# 別の質問
question_2 = "LangChainの最新バージョンは何ですか?" # コンテキストにない質問
response_2 = rag_chain.invoke(question_2)
print("\n--- 質問 ---")
print(question_2)
print("\n--- 回答 ---")
print(response_2)
RAGシステム最適化のポイント
RAGシステムの性能を最大化するためには、いくつかの最適化ポイントがあります。
- チャンク戦略の最適化:
RecursiveCharacterTextSplitterだけでなく、セマンティックチャンキングや親子ドキュメント分割など、より高度な分割戦略を検討します。ドキュメントの内容に応じて最適なchunk_sizeとchunk_overlapを見つけることが重要です。 - 埋め込みモデルの選択: OpenAIのモデル以外にも、Cohereの
embed-english-v3.0やHugging Faceのオープンソースモデルなど、用途やコストに応じて最適な埋め込みモデルを選択します。 - Retrieverの強化: 単純な類似度検索だけでなく、HyDE (Hypothetical Document Embeddings) やRAG-Fusion (Reciprocal Rank Fusion) などの高度な検索手法を導入することで、検索精度を向上させることができます。また、マルチクエリ検索や、質問の種類に応じたルーティングも有効です。
- プロンプトエンジニアリング: LLMへの指示(プロンプトテンプレート)を最適化することで、より質の高い回答を引き出すことができます。回答形式の指定、具体例の提供、思考プロセスを促す指示などが含まれます。
- ベクトルストアの選択: 小規模なプロジェクトやプロトタイプにはChromaDBが手軽ですが、大規模な運用や高度な機能が必要な場合は、Pinecone、Weaviate、Qdrantなどのクラウドベースのベクトルデータベースを検討します。これらのサービスは、数億件のベクトルを処理できるスケーラビリティと、高度なフィルタリング機能を提供します。
これらのステップと最適化ポイントを理解することで、LangChainとPythonを用いた効果的なRAGシステムを構築・運用することが可能です。