🤖
AI・機械学習

RAG構築手順をLangChainとPythonで学ぶ!実践的開発ガイド

#RAG #LangChain #Python #LLM #ベクトルストア #AI開発 #OpenAI
AI

ヨミアゲAI編集部

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

RAG(Retrieval Augmented Generation)とLangChainの基本

RAGは、大規模言語モデル(LLM)が学習していない最新情報や社内ドキュメントなどの外部知識を参照し、より正確で根拠に基づいた回答を生成するためのフレームワークです。LLMの幻覚(ハルシネーション)を抑制し、特定のドメイン知識に特化した応答能力を向上させます。

LangChainは、2026年3月時点において、LLMアプリケーション開発のデファクトスタンダードともいえるPythonライブラリです。RAGシステムを効率的に構築するためのモジュール(ドキュメントローダー、テキストスプリッター、埋め込みモデル、ベクトルストア、LLMインターフェース、チェーンなど)を豊富に提供しており、特に**LangChain Expression Language (LCEL)**を用いることで、複雑なパイプラインも簡潔かつ柔軟に記述できます。

ステップバイステップでRAGを構築する

ここでは、PDFドキュメントを対象としたRAGシステムをLangChainとPythonで構築する手順を解説します。

1. 環境構築と依存関係のインストール

まず、必要なライブラリをインストールします。ここではOpenAIのLLMと埋め込みモデル、そしてローカルで手軽に利用できるベクトルストアChromaDBを使用します。

pip install langchain==0.2.14 \
            langchain-openai==0.2.10 \
            langchain-community==0.2.10 \
            pypdf==4.2.0 \
            chromadb==0.5.0

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

import os
os.environ["OPENAI_API_KEY"] = "sk-YOUR_OPENAI_API_KEY"
# LangSmithを使用する場合は以下も設定
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = "ls_YOUR_LANGSMITH_API_KEY"
# os.environ["LANGCHAIN_PROJECT"] = "RAG_Tutorial_2026"

💡 ポイント: LangSmithは、開発中のRAGアプリケーションのトレーシング、モニタリング、評価を可能にする強力なツールです。本番運用を考えるなら導入を強く推奨します。

2. ドキュメントのロードとテキスト分割

RAGの最初のステップは、外部知識となるドキュメントをシステムに取り込み、処理しやすい形に分割することです。

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# ドキュメントのロード
loader = PyPDFLoader("path/to/your/document.pdf") # 例: 会社の規定集.pdf
docs = loader.load()

# テキストの分割
# 2026年3月時点では、チャンクサイズ500文字、オーバーラップ100文字が多くのケースでバランスの良い設定とされています。
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100,
    length_function=len,
    is_separator_regex=False,
)
splits = text_splitter.split_documents(docs)

print(f"元のドキュメント数: {len(docs)}")
print(f"分割後のチャンク数: {len(splits)}")

⚠️ 注意: chunk_sizechunk_overlapは、ドキュメントの内容や検索の粒度によって調整が必要です。小さすぎると文脈が失われ、大きすぎると関連性の低い情報が混入しやすくなります。

3. 埋め込みモデルとベクトルストアの選択

分割されたテキストチャンクを数値ベクトル(埋め込み)に変換し、ベクトルデータベースに格納します。これにより、ユーザーのクエリと関連性の高いドキュメントを効率的に検索できるようになります。

from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

# 埋め込みモデルの初期化
# 2026年3月時点のOpenAIの最新埋め込みモデルは「text-embedding-3-large」が推奨されています。
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# ベクトルストアの初期化とチャンクの格納
# ここではChromaDBを永続化モードで利用します。
vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    persist_directory="./chroma_db" # データを保存するディレクトリ
)

# ベクトルストアの永続化
vectorstore.persist()

💡 ポイント: ベクトルストアはChromaDBの他に、Pinecone, Qdrant, Weaviateなどがあります。大規模なRAGシステムやクラウド環境での利用を想定する場合、マネージドサービスを検討すると良いでしょう。例えば、PineconeのStandardプランは月額$70から利用可能で、最大1000万ベクトル、10GBストレージを提供します。ChromaDB CloudのFree Tierは最大2GBストレージ、200万ベクトルまで対応しています。

4. RetrieverとLLMの連携

ベクトルストアから関連ドキュメントを取得するRetrieverと、LLMを連携させてRAGパイプラインを構築します。LangChain Expression Language (LCEL) を用いることで、宣言的にパイプラインを定義できます。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# Retrieverの準備
# 検索結果の上位3件(k=3)を取得する設定。
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# LLMの初期化
# 2026年3月時点では、GPT-4o-2026-03 (仮称)のような高性能モデルが主流です。
# このモデルのAPI利用料金は、入力トークンあたり$0.005/1K、出力トークンあたり$0.015/1K程度が想定されます。
llm = ChatOpenAI(model="gpt-4o-2026-03", temperature=0)

# プロンプトテンプレートの定義
# 取得したドキュメントとユーザーの質問をLLMに渡すためのテンプレート。
template = """あなたは会社の規定に関する質問に答えるアシスタントです。
以下の「参照情報」のみに基づいて質問に答えてください。
参照情報に答えがない場合は、「参照情報からは回答を見つけられませんでした。」と答えてください。

参照情報:
{context}

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

# RAGパイプラインの構築 (LCELを使用)
rag_chain = (
    RunnableParallel(
        {"context": retriever, "question": RunnablePassthrough()}
    )
    | prompt
    | llm
)

5. RAGパイプラインの実行と最適化

構築したRAGパイプラインを実行し、質問に対する回答を得ます。

# 質問の実行
question = "有給休暇の取得条件について教えてください。"
response = rag_chain.invoke(question)

print(response.content)

# 別の質問
question_no_context = "宇宙の起源は何ですか?"
response_no_context = rag_chain.invoke(question_no_context)
print(response_no_context.content)

💡 ポイント: response_no_context のような質問に対して「参照情報からは回答を見つけられませんでした。」と正しく応答するかを確認することは、RAGシステムの信頼性を評価する上で非常に重要です。

2026年におけるさらなる考慮事項

2026年3月時点において、RAGシステムは単なる情報検索と生成の組み合わせを超え、さらに高度な要件が求められています。

  • ハイブリッド検索: ベクトル検索だけでなく、キーワード検索(BM25など)やグラフ検索を組み合わせることで、検索精度を向上させます。LangChainはこれらのハイブリッド検索もサポートしています。
  • RAG-FusionやColBERT: より高度な検索アルゴリズムを導入し、複数の検索結果を融合したり、クエリとドキュメントのよりきめ細かなマッチングを行ったりすることで、関連性を高めます。
  • エージェントの導入: 固定されたRAGパイプラインだけでなく、LLMが自律的にツール(検索、データベースクエリ、API呼び出しなど)を選択し、複雑なタスクを解決するエージェントとの組み合わせが主流となっています。これにより、RAGシステムはより動的で汎用的な知識ワーカーへと進化します。LangChainのエージェント機能は、この分野で非常に強力な選択肢を提供します。
  • 継続的な評価と改善: LangSmithなどのツールを活用し、ユーザーからのフィードバックや評価データに基づいて、埋め込みモデル、テキスト分割戦略、プロンプト、Retrieverの設定などを継続的に調整・改善していくサイクルが不可欠です。

これらの進化を取り入れることで、2026年のRAGシステムは、より堅牢でインテリジェントな情報アクセスおよび生成プラットフォームとして機能するでしょう。

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

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