🤖
AI・機械学習

【2026年最新】LangChainとPythonでRAGシステムを構築する手順を徹底解説

#RAG #LangChain #Python #LLM #ベクトルデータベース #AI開発 #RAG構築手順
AI

ヨミアゲAI編集部

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

RAG(Retrieval Augmented Generation)システムは、大規模言語モデル(LLM)の「幻覚」問題に対処し、最新かつ信頼性の高い情報に基づいた回答を生成するために、2026年4月時点においても不可欠な技術として広く採用されています。本記事では、LangChainとPythonを使用してRAGシステムを構築する具体的な手順について、最新の動向を交えながら解説します。

1. RAGシステム構築の基礎と2026年の進化

RAGは、ユーザーの質問に対し、外部の知識ベースから関連情報を「検索(Retrieval)」し、その情報でLLMのプロンプトを「拡張(Augmentation)」して回答を「生成(Generation)」するプロセスです。これにより、LLMが学習データに含まれない最新の情報や、企業独自のドキュメントに基づいた回答を提供できるようになります。

2026年4月現在、LangChainはRAGシステム構築のための最も強力かつ柔軟なフレームワークの一つとして、その地位を確立しています。特に、**LangChain Expression Language (LCEL)**の登場により、複雑なチェーンを宣言的に、かつ効率的に構築することが可能になりました。

RAGシステムの主要コンポーネントは以下の通りです。

  • ドキュメントローダー: さまざまな形式のドキュメント(PDF、Webページ、CSVなど)を読み込む。
  • テキストスプリッター: 読み込んだドキュメントを、LLMのコンテキストウィンドウに適したサイズの「チャンク」に分割する。
  • 埋め込みモデル (Embedding Model): テキストチャンクを数値のベクトル表現(埋め込み)に変換する。
  • ベクトルデータベース (Vector Database): 埋め込みベクトルを効率的に格納し、類似度検索を可能にする。Qdrant v1.8やWeaviate v1.25のようなクラウドネイティブなソリューションが人気を集める一方、ローカル開発にはChromaDBが引き続き利用されます。
  • リトリーバー: ベクトルデータベースから関連性の高いチャンクを検索する。
  • LLM (Large Language Model): 検索された情報に基づいて最終的な回答を生成する。OpenAIのGPT-4o、AnthropicのClaude 3.5 Sonnet、高性能なオープンソースモデル(例: Llama 3.1シリーズ)など、選択肢が豊富です。

2. LangChainとPythonによるRAG構築ステップバイステップ

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

Python 3.10以上を推奨します。必要なライブラリをインストールします。

pip install langchain langchain-community langchain-openai chromadb pypdf tiktoken

次に、OpenAI APIキーを環境変数に設定します。

export OPENAI_API_KEY="sk-..."

💡 ポイント: 実際のプロジェクトでは、APIキーを直接環境変数に設定するのではなく、.envファイルやシークレット管理サービスを使用することを推奨します。

2.2 ドキュメントの読み込みとチャンキング

PDFファイルを例に、ドキュメントを読み込み、チャンクに分割します。2026年4月時点では、多くのユースケースで「500トークン、オーバーラップ50トークン」のチャンクサイズがバランスが良いとされています。

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# ドキュメントの読み込み
loader = PyPDFLoader("path/to/your/document.pdf")
documents = loader.load()

# テキストチャンクへの分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, # チャンクの最大サイズ (トークン数)
    chunk_overlap=50, # チャンク間のオーバーラップ (トークン数)
    length_function=len,
    is_separator_regex=False,
)
chunks = text_splitter.split_documents(documents)

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

⚠️ 注意: チャンクサイズが不適切だと、関連情報が分割されたり、ノイズが増えたりして検索精度が低下します。ドキュメントの内容に応じて調整が必要です。

2.3 埋め込みモデルの選択とベクトルストアへの格納

チャンクをベクトル化し、ChromaDBに格納します。埋め込みモデルには、OpenAIEmbeddingstext-embedding-3-smallを使用します。これは1536次元のベクトルを生成し、精度とコストのバランスに優れています。

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# 埋め込みモデルの初期化
# 2026年4月時点でのOpenAIEmbeddingsのデフォルトモデルはtext-embedding-3-small
# より高性能なtext-embedding-3-large (3072次元) も選択可能。
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# ベクトルストアの作成とチャンクの格納
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db" # ベクトルストアをローカルに永続化
)
vectorstore.persist() # 変更を保存
print("ベクトルストアが正常に構築されました。")

⚠️ 注意: 大量のドキュメントを埋め込む場合、APIコストと処理時間に注意してください。OpenAIのtext-embedding-3-smallは、100万トークンあたり$0.02の料金体系です(2026年4月時点)。

2.4 リトリーバーとLLMの統合

ベクトルストアから関連ドキュメントを検索するリトリーバーを作成し、LLMと統合してRAGチェーンを構築します。LLMには、2026年4月時点での高性能モデルであるGPT-4oを使用します。

from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# リトリーバーの作成 (上位3件の関連ドキュメントを検索)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# LLMの初期化
llm = ChatOpenAI(model="gpt-4o", temperature=0) # temperature=0 で決定論的な回答を促す

# プロンプトテンプレートの定義
prompt = ChatPromptTemplate.from_template("""
あなたはアシスタントです。以下のコンテキストのみを使用して質問に答えてください。
回答は簡潔かつ正確に。提供されたコンテキスト以外の情報を使ってはいけません。

{context}

質問: {input}
""")

# ドキュメントをLLMに渡すためのチェーン
document_chain = create_stuff_documents_chain(llm, prompt)

# リトリーバーとドキュメントチェーンを組み合わせたRAGチェーン
retrieval_chain = create_retrieval_chain(retriever, document_chain)

print("RAGチェーンが構築されました。")

2.5 RAGクエリの実行

構築したRAGチェーンに質問を送り、回答を取得します。

# RAGチェーンの実行
question = "このドキュメントの主なテーマは何ですか?"
response = retrieval_chain.invoke({"input": question})

print(f"質問: {question}")
print(f"回答: {response['answer']}")

3. RAGシステムの最適化と運用戦略

RAGシステムの性能を最大限に引き出すためには、いくつかの最適化戦略と継続的な運用が不可欠です。

  • 埋め込みモデルの選択: 2026年4月時点では、OpenAIのtext-embedding-3-largeのような商用モデルが高い性能を示す一方、Hugging Face Hubで公開されているMistral AIのEmbeddingsCohereのEmbed v3のようなオープンソース・商用モデルも、特定のドメインやコスト要件に応じて強力な選択肢となります。これらのモデルは、多くの場合、数千次元のベクトルを生成し、セマンティックな類似度検索の精度を向上させます。
  • チャンキング戦略: 単純なテキスト分割だけでなく、セマンティックチャンキングや親子チャンキング(Parent-Child Chunking)など、より高度な戦略がLangChainの最新バージョンでサポートされています。これにより、検索の粒度とLLMへの情報提示の質が向上し、回答精度が高まります。
  • リランキング: 検索されたドキュメントをLLMに渡す前に、より関連性の高いものを上位に並べ替えるリランキング技術(例: Cohere Rerank、BGE Reranker)は、RAGの性能を大きく改善します。これは、検索のノイズを減らし、LLMが最も重要な情報に集中できるようにするためです。
  • 評価: RAGシステムの品質を客観的に評価するためには、RAGASLangSmithのようなツールが不可欠です。これらのツールは、忠実度(Faithfulness)、関連性(Relevance)、コンテキストリコール(Context Recall)などの指標で評価を自動化し、継続的な改善をサポートします。
  • コスト管理: LLMの利用コストは依然として主要な課題です。例えば、GPT-4oは入力100万トークンあたり$5.00、出力100万トークンあたり$15.00(2026年4月時点)と高価なため、プロンプトの最適化、キャッシュ戦略、またはより低コストなモデル(例: GPT-3.5 Turboやオープンソースモデル)の活用が重要になります。

💡 ポイント: RAGシステムの性能は、埋め込みモデル、チャンキング戦略、リトリーバー、そしてLLMの組み合わせによって大きく変動します。継続的な評価と改善が成功の鍵です。LangChainはこれらの要素を柔軟に組み替え、実験することを容易にします。

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

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