🤖
AI・機械学習

【2026年3月】LangChainとPythonでRAGシステムを構築する手順と最適化

#RAG #LangChain #Python #LLM #ベクターストア #AI開発 #LCEL #埋め込み
AI

ヨミアゲAI編集部

AI音声・動画制作に関する情報をお届けします

2026年3月時点におけるRAGとLangChainの進化

Retrieval-Augmented Generation(RAG)は、大規模言語モデル(LLM)が持つ知識の限界を克服し、リアルタイムで正確な情報に基づいた回答を生成するための不可欠な技術として、2026年3月現在も進化を続けています。特にLangChainは、RAGシステム構築のためのフレームワークとしてデファクトスタンダードの地位を確立しており、そのExpression Language (LCEL) を用いたモジュール性と柔軟性が、複雑なRAGパイプラインの実装を劇的に簡素化しています。

2026年には、LLMの推論能力向上に加え、埋め込みモデルの精度と効率が飛躍的に向上しました。例えば、OpenAIの最新埋め込みモデルやCohere Embed v4などは、より低コストで高精度なベクトル表現を提供しています。LangChain自体もv0.2.15へとバージョンアップし、非同期処理の強化や、LangSmithとの連携による開発・評価サイクルの高速化が進んでいます。本記事では、LangChainとPythonを用いてRAGシステムを構築する具体的な手順を、2026年3月時点のベストプラクティスに基づいて解説します。

LangChainとPythonによるRAG構築ステップ

RAGシステムは、大きく分けて「ドキュメントの準備」「インデックス作成」「検索」「応答生成」の4つのフェーズで構成されます。LangChainはこれらの各フェーズを抽象化し、Pythonを使って効率的に実装するためのツールを提供します。

ステップ1: 環境構築とドキュメント準備

まず、必要なライブラリをインストールし、RAGの基盤となるドキュメントを準備します。

# Python 3.11以上を推奨
pip install langchain langchain-community langchain-openai qdrant-client pypdf tiktoken

💡 ポイント: langchain-communityは各種ローダーやベクターストアなど、コミュニティが提供するモジュールをまとめたパッケージです。qdrant-clientはベクターストアの一例、pypdfはPDF読み込み、tiktokenはトークン数計算に利用します。

次に、外部データを読み込み、LLMが処理しやすいように分割します。ここではPDFファイルを例にしますが、ウェブページ、CSV、Notionなど、様々なデータソースに対応するDocumentLoaderが用意されています。

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

# 1. ドキュメントの読み込み
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()

# 2. ドキュメントの分割
# LLMのコンテキストウィンドウに合わせて、適切なチャンクサイズとオーバーラップを設定する
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # チャンクサイズを1000文字に設定
    chunk_overlap=200, # オーバーラップを200文字に設定
    length_function=len,
    is_separator_regex=False,
)
splits = text_splitter.split_documents(documents)

print(f"オリジナルドキュメント数: {len(documents)}")
print(f"分割後のチャンク数: {len(splits)}")

⚠️ 注意: chunk_sizechunk_overlapの選択はRAGの性能に大きく影響します。小さすぎるとコンテキストが失われ、大きすぎると関連情報が薄まり、LLMの処理コストも増大します。

ステップ2: 埋め込みとベクターストアへの格納

分割されたテキストチャンクを数値ベクトル(埋め込みベクトル)に変換し、それをベクターストアに格納します。これにより、セマンティック検索が可能になります。

from langchain_openai import OpenAIEmbeddings
from langchain_qdrant import Qdrant
import os

# 環境変数からOpenAI APIキーを読み込む
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

# 1. 埋め込みモデルの初期化
# 2026年3月時点では、OpenAI Embeddings v3-largeがコストパフォーマンスに優れる
# 料金例: 100万トークンあたり$0.13
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# 2. ベクターストアへの格納
# Qdrantはオープンソースで、クラウドサービスも提供(月額$25からの有料プランあり)
# persist_directoryを指定すると、ローカルに永続化される
vectorstore = Qdrant.from_documents(
    documents=splits,
    embedding=embeddings,
    location=":memory:", # または "qdrant_db" などのディレクトリパス
    collection_name="my_rag_collection",
)

print("埋め込みとベクターストアへの格納が完了しました。")
ベクターストア タイプ 主な特徴 料金体系(2026年3月時点)
Qdrant オープンソース / クラウド 高速、スケーラブル、ハイブリッド検索対応 無料(セルフホスト)、月額$25〜(クラウド)
Pinecone マネージドクラウド フルマネージド、大規模データ向け、高い可用性 無料枠あり、ポッド課金(規模による)
Chroma オープンソース 軽量、ローカル利用に最適、開発が容易 無料(セルフホスト)

ステップ3: 検索と応答生成の実行

ベクターストアに格納された情報から関連ドキュメントを検索し、LLMに渡して回答を生成します。LangChainのLCELを使うことで、この一連の処理をチェーンとして構築できます。

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

# 1. LLMの初期化
# 2026年3月時点のGPT-4o-mini-2026-03-01は、高速かつ低コストでRAGに適している
# 料金例: 入力100万トークンあたり$0.05、出力100万トークンあたり$0.15
llm = ChatOpenAI(model="gpt-4o-mini-2026-03-01", temperature=0)

# 2. Retrieverの準備
retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 上位3件のドキュメントを検索

# 3. プロンプトテンプレートの定義
template = """あなたは与えられたコンテキストに基づいて質問に答えるAIアシスタントです。
もしコンテキストに情報がない場合は、「情報が見つかりませんでした」と答えてください。

コンテキスト:
{context}

質問: {question}

回答:"""
prompt = ChatPromptTemplate.from_template(template)

# 4. RAGチェーンの構築 (LCELを使用)
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 5. 質問の実行
question = "このドキュメントの主要なテーマは何ですか?"
response = rag_chain.invoke(question)

print(f"質問: {question}")
print(f"回答: {response}")

# 別の質問
question_2 = "2026年のAI技術に関する記述はありますか?"
response_2 = rag_chain.invoke(question_2)
print(f"\n質問: {question_2}")
print(f"回答: {response_2}")

💡 ポイント: LCEL (|演算子) を使うことで、異なるコンポーネントを直感的に連結し、複雑な処理フローを構築できます。これにより、デバッグや拡張が容易になります。

RAGシステムの最適化と今後の展望

RAGは基礎的なシステム構築後も、その性能を最大化するための様々な最適化手法が存在します。2026年3月時点では、以下のような高度な技術が注目されています。

  • ハイブリッド検索: ベクトル検索だけでなく、キーワード検索(BM25など)を組み合わせることで、より網羅的かつ関連性の高いドキュメントを検索します。
  • 再ランキング: 検索されたドキュメントを、より高度なモデル(Cross-Encoderなど)で再評価し、最終的な関連度が高い順に並べ替えることで、LLMに渡すコンテキストの質を向上させます。
  • RAG-Fusion: 複数の検索クエリを生成し、それぞれの検索結果を融合することで、より多角的な情報を取得します。
  • Agentic RAG: LLM自身が検索戦略を立案し、必要に応じてツール(Web検索、データベース検索など)を利用して情報を収集・統合する、より自律的なRAGシステムです。LangChain Agentsがこの分野で強力な支援を提供します。

これらの最適化手法を導入することで、RAGシステムの精度、ロバスト性、ユーザー体験を大幅に向上させることが可能です。また、LangChainと密接に連携するLangSmithのような評価ツールを活用することで、RAGチェーンの各ステップにおけるボトルネックを特定し、継続的な改善を行うことが重要です。RAG技術は今後も進化を続け、より高度な情報処理と対話型AIの実現に貢献していくでしょう。

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

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