🤖
AI・機械学習

LangChainとPythonでRAG構築!LLMアプリ開発の手順を徹底解説

#RAG #LangChain #Python #LLM #ベクトルストア #AI開発 #プロンプトエンジニアリング
AI

ヨミアゲAI編集部

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

RAGとLangChain:2026年におけるLLMアプリケーション開発の標準手法

2026年3月現在、大規模言語モデル(LLM)のハルシネーション(もっともらしい嘘)を抑制し、最新情報や企業固有データに基づいた正確な回答を生成することは、ビジネス応用の喫緊の課題です。この課題を解決する強力な手法がRAG(検索拡張生成)であり、その構築を効率化するオープンソースフレームワークがLangChainです。RAGは、以下の3つのステップでLLMの能力を拡張します。

  1. Retrieval(検索): ユーザーの質問と関連性の高い外部ドキュメントを検索。
  2. Augmentation(拡張): 検索で見つかった情報とユーザーの質問を統合し、LLMへのプロンプトを拡張。
  3. Generation(生成): 拡張されたプロンプトに基づき、LLMが根拠のある回答を生成。

LangChainは、このRAG構築に必要なデータ読み込み、分割、ベクトル化、検索、生成といった一連のプロセスをモジュール化し、これらを「チェーン」として連結することで、少ないコードで高度なAIアプリケーションを実現します。コンポーネントの差し替えが容易で、LangSmithやLangGraphといった活発なエコシステムも大きな利点です。

LangChainを用いたRAG構築のステップバイステップ

Step 1: ドキュメントの読み込みとチャンク分割

まず、LLMに参照させたい外部データを読み込み、適切なサイズに分割します。

ドキュメントの読み込み

LangChainのDocument Loadersは、PDF、Webページ、Word、CSV、Notionなど多様なデータソースを統一されたDocumentオブジェクトとして読み込みます。この際、ファイルパスなどのメタデータも自動的に取得されます。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("path/to/your/document.pdf")
documents = loader.load()

テキストチャンク分割

読み込んだ長いテキストは、LLMのトークン制限や検索精度を考慮し、意味のあるまとまり(チャンク)に分割する必要があります。Text Splittersの中でも、RecursiveCharacterTextSplitterは、改行、空行、文、単語といった区切り文字を再帰的に試行し、文脈が途切れるのを最小限に抑えます。

💡 ポイント: チャンクサイズとオーバーラップの設定はRAGの検索精度に直結します。例えば、chunk_size=1000文字、chunk_overlap=200文字といった設定が一般的です。

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # チャンクの最大文字数
    chunk_overlap=200  # チャンク間の重複文字数
)
chunks = text_splitter.split_documents(documents)

Step 2: Embeddingとベクトルストアの構築

分割したテキストチャンクをベクトル化し、専用データベースに保存します。

Embedding(埋め込み)

テキストチャンクは、コンピュータが意味的な近さを計算できる数百から数千次元のベクトル(数値の配列)に変換されます。これがEmbeddingです。OpenAIEmbeddingsやオープンソースのOllamaEmbeddingsなどが利用可能です。例えば、OpenAIEmbeddingsではdimensions=512を指定してベクトル次元数を調整できます。OllamaEmbeddingsbge-base-en-v1.5-ggufモデルは、通常768次元のベクトルを生成します。

from langchain_openai import OpenAIEmbeddings
# from langchain_community.embeddings import OllamaEmbeddings # Ollama利用の場合

embeddings = OpenAIEmbeddings(model="text-embedding-3-small", dimensions=512)
# embeddings = OllamaEmbeddings(model='hf.co/CompendiumLabs/bge-base-en-v1.5-gguf')

ベクトルストアの構築

ベクトル化されたデータを高速に保存・検索するためのデータベースがベクトルストアです。プロトタイピングや学習用途には、ローカルで迅速に利用できるChromaが非常に便利です。Chromaはわずか5分程度で起動し、persist_dirを指定することで永続化も可能です。大規模なプロダクション環境では、PineconeQdrantMilvusなどが選択肢となります。

ベクトルストア 特徴 用途
Chroma 軽量、ローカル動作、永続化可能 プロトタイピング、学習、小規模プロジェクト
Pinecone SaaS、高いスケーラビリティ、マネージド 大規模プロダクション、高負荷環境
Qdrant セルフホスト、豊富な検索機能、分散可能 中〜大規模プロジェクト、高いカスタマイズ性
from langchain_community.vectorstores import Chroma

# ベクトルストアの構築と永続化
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)
vectorstore.persist()

Step 3: 情報の検索と回答生成

最後に、ユーザーの質問に基づき関連情報を検索し、LLMに回答を生成させます。

情報の検索(Retrieval)

Retrieverは、ユーザーの質問をベクトル化し、ベクトルストアから最も関連性の高いドキュメントチャンクを効率的に抽出するインターフェースです。vectorstore.as_retriever(search_kwargs={"k": 5})のように設定することで、上位k=5件の関連文書を取得できます。

retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) # 上位5件の関連文書を取得

LLMによる回答生成(Generation)

検索されたドキュメントとユーザーの質問を組み合わせ、LLMに渡して回答を生成させます。LangChainのRetrievalQAチェーンは、このプロセスを簡素化します。ChatOpenAI(model_name="gpt-4-turbo", temperature=0.1)や、ローカルで動作するOllamaLLM(model='hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF')などのLLMを利用できます。

⚠️ 注意: 回答の品質と信頼性を高めるには、プロンプトエンジニアリングが重要です。例えば、「提供された文脈から事実ベースで回答し、文脈にない情報は『記載されていません』と明確に述べること」といった指示を含めることで、ハルシネーションを抑制し、信頼性の高い回答を促せます。

from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

llm = ChatOpenAI(model_name="gpt-4-turbo", temperature=0.1)
# llm = OllamaLLM(model='hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF') # Ollama利用の場合

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff", # 検索結果をプロンプトに詰め込む形式
    retriever=retriever,
    return_source_documents=True # 参照元ドキュメントを返す
)

query = "RAG構築におけるチャンク分割の重要性は何ですか?"
result = qa_chain.invoke({"query": query})
print(result["result"])
# print(result["source_documents"]) # 参照元ドキュメントを表示

RAG構築を成功させるための重要ポイント

RAGシステムを効果的に運用するためには、いくつかの共通するポイントと注意点があります。

  • チャンク分割戦略: chunk_sizechunk_overlapの適切な設定は、検索される情報の粒度と文脈の保持に大きく影響し、RAGの精度を左右します。この設定は、ドキュメントの種類やLLMのコンテキストウィンドウサイズに合わせて調整が必要です。
  • ベクトルデータベースの選定: プロジェクトの規模、スケーラビリティ、運用コストを考慮し、最適なベクトルストアを選択することが重要です。プロトタイピングにはChroma、大規模運用にはSaaS型サービスやセルフホスト型ソリューションを検討しましょう。
  • プロンプトエンジニアリング: LLMへの指示(プロンプト)の質が、最終的な回答品質を決定づけます。具体的な指示により、ハルシネーションを抑制し、正確で信頼性の高い回答を引き出すことが可能です。

これらのステップとポイントを踏まえることで、2026年3月時点のLangChainとPythonを用いて、実用的なRAGシステムを効率的に構築できるでしょう。

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

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