🤖
AI・機械学習

LangChainとPythonでRAG構築!2026年最新の手順と最適化戦略

#RAG #LangChain #Python
AI

ヨミアゲAI編集部

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

2026年におけるRAG構築の現状とLangChainの役割

2026年1月現在、**RAG(Retrieval Augmented Generation)**は、大規模言語モデル(LLM)の「幻覚(hallucination)」を抑制し、最新かつ正確な情報に基づいた回答を生成するための不可欠な技術として確立されています。特に、企業内データやリアルタイム情報を活用するエンタープライズAIアプリケーションにおいて、RAGは中心的な役割を担っています。

LangChainは、このRAGシステム構築を効率化するPythonフレームワークとして、2026年時点ではLangChain v0.2.20が広く利用されています。モジュール化がさらに進み、**LangChain Expression Language (LCEL)**による柔軟なチェーン構築が標準的なアプローチとなりました。これにより、複雑なRAGパイプラインも宣言的に記述し、高い保守性と再利用性を実現できます。

RAGシステムは主に以下のコンポーネントで構成されます。

  • ドキュメントローダー: PDF、Webページ、データベースなどからデータを読み込む。
  • ドキュメントスプリッター: 読み込んだドキュメントをLLMが処理しやすいチャンクに分割する。
  • 埋め込みモデル: ドキュメントチャンクを数値ベクトル(埋め込み)に変換する。
  • ベクターデータベース: 埋め込みベクトルを保存し、セマンティック検索を可能にする。
  • Retriever: ユーザーの質問から関連性の高いドキュメントチャンクをベクターデータベースから取得する。
  • LLM: 取得したドキュメントと質問を基に回答を生成する。

LangChainとPythonによるRAGシステム構築ステップバイステップ

ここでは、ローカル環境でChromaDBとOpenAIのLLMを利用したRAGシステムを構築する手順を解説します。

ステップ1: 環境構築とライブラリインストール

まず、必要なライブラリをインストールします。LangChain、OpenAI SDK、ChromaDBクライアント、そしてドキュメント読み込み用のpypdf(PDFファイルの場合)などです。

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

💡 ポイント: langchain-communityは、ChromaDBのようなコミュニティ製のインテグレーションを含むモジュールです。tiktokenはOpenAIモデルのトークン計算に必要です。

ステップ2: ドキュメントの準備(読み込み、分割、埋め込み)

RAGの基盤となるドキュメントを準備し、ベクターデータベースに格納できる形にします。

  1. ドキュメントの読み込み: ここではPDFファイルを例にしますが、Webページやテキストファイルなど、さまざまな形式に対応できます。

    from langchain_community.document_loaders import PyPDFLoader
    
    # 例として、ローカルのPDFファイルを指定
    pdf_path = "path/to/your/document.pdf"
    loader = PyPDFLoader(pdf_path)
    documents = loader.load()
    print(f"Loaded {len(documents)} pages from the PDF.")
    
  2. ドキュメントの分割: LLMのコンテキストウィンドウに収まるように、ドキュメントを適切なサイズに分割します。RecursiveCharacterTextSplitterは、指定された区切り文字のリストに基づいて、ドキュメントを再帰的に分割します。

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,  # チャンクの最大文字数
        chunk_overlap=200, # チャンク間のオーバーラップ文字数
        length_function=len,
        is_separator_regex=False,
    )
    chunks = text_splitter.split_documents(documents)
    print(f"Split into {len(chunks)} chunks.")
    
  3. 埋め込みモデルの初期化: テキストチャンクを数値ベクトルに変換する埋め込みモデルを準備します。OpenAIのtext-embedding-3-smallは、高性能かつコスト効率の良い選択肢として広く利用されています。

    from langchain_openai import OpenAIEmbeddings
    import os
    
    # 環境変数からOpenAI APIキーを読み込む
    os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
    
    embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    

    ⚠️ 注意: APIキーは直接コードに書かず、環境変数として設定することを強く推奨します。

ステップ3: ベクターデータベースの構築とRetrieverの定義

分割されたドキュメントチャンクを埋め込みベクトルに変換し、ベクターデータベースに保存します。その後、質問に基づいて関連ドキュメントを取得するRetrieverを定義します。

  1. ベクターデータベースの構築: ChromaDBは軽量でローカル利用に適しており、開発・テスト段階で非常に便利です。

    from langchain_community.vectorstores import Chroma
    
    # ベクターデータベースを構築し、埋め込みとドキュメントを格納
    vectorstore = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory="./chroma_db" # データベースの保存先ディレクトリ
    )
    print("Vector database created and documents embedded.")
    
    ベクターDB 特徴 無料枠/料金 (2026年1月時点)
    ChromaDB 軽量、ローカル利用可能、開発・テスト向き ローカル利用無料、クラウド版は月額$9から
    Pinecone スケーラブル、マネージドサービス、本番環境向き 100,000ベクトルまで無料
    Qdrant オープンソース、高性能、オンプレミス・クラウド対応 セルフホスト無料、クラウド版は従量課金
  2. Retrieverの定義: ベクターデータベースから関連ドキュメントを検索するためのRetrieverを作成します。as_retriever()メソッドで簡単にRetrieverオブジェクトに変換できます。

    retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 上位3つの関連ドキュメントを取得
    

ステップ4: RAGチェーンの構築と実行

LLMとRetrieverを組み合わせ、LCELを使用してRAGチェーンを構築します。

  1. LLMの初期化: OpenAIのGPT-4o-mini-2026-01-01のような最新かつコスト効率の良いモデルを選択します。2026年1月時点でのgpt-4o-miniの入力トークン単価は**$0.00005/1K tokens**、出力トークン単価は**$0.00015/1K tokens**です。

    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 = ChatOpenAI(model="gpt-4o-mini-2026-01-01", temperature=0.0)
    
  2. プロンプトテンプレートの定義: LLMに渡すプロンプトを定義します。取得したコンテキストとユーザーの質問を組み込む形です。

    template = """You are an AI assistant for question-answering tasks.
    Use the following retrieved context to answer the question.
    If you don't know the answer, just say that you don't know.
    Use three sentences maximum and keep the answer concise.
    
    Question: {question}
    Context: {context}
    Answer:
    """
    prompt = ChatPromptTemplate.from_template(template)
    
  3. RAGチェーンの構築と実行: LCELを使用して、Retriever、プロンプト、LLMを連結したRAGチェーンを構築します。

    rag_chain = (
        {"context": retriever, "question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
    )
    
    # 質問を実行
    question = "RAGの主な利点は何ですか?"
    response = rag_chain.invoke(question)
    print(response)
    

    このコードは、ユーザーの質問を受け取り、Retrieverが関連ドキュメントを検索し、それらをプロンプトに組み込んでLLMが最終的な回答を生成する一連の流れを定義しています。

2026年のRAG最適化戦略と今後の展望

2026年におけるRAGシステムは、単なるドキュメント検索と生成の組み合わせにとどまらず、さらなる高度化が進んでいます。

LangSmithを活用した評価とデバッグ

LangSmithは、LangChainアプリケーションの開発、デバッグ、テスト、評価のためのプラットフォームです。RAGパイプラインの各ステップの実行状況を可視化し、Retrieverの検索精度やLLMの生成品質を詳細に分析できます。特に、新しいデータやプロンプトを導入する際に、LangSmithの評価機能はRAGシステムの性能最適化に不可欠です。2026年1月時点では、LangSmithは月額**$50**からのDeveloperプランを提供しています。

高度なRAG技術

  • リランキング (Re-ranking): Retrieverが取得したドキュメントの中から、より関連性の高いものを再選定することで、LLMに渡すコンテキストの質を向上させます。
  • クエリ変換 (Query Transformation): ユーザーの質問を、よりベクターデータベースでの検索に適した形に変換したり、複数のサブクエリに分解したりすることで、検索精度を高めます。
  • エージェント連携: LangChainのエージェント機能とRAGを組み合わせることで、動的にツールを呼び出し、より複雑なタスクに対応できるRAGシステムを構築することが可能です。例えば、質問内容に応じて異なるベクターデータベースを選択したり、外部APIを呼び出したりできます。

マルチモーダルRAGと性能向上

2026年には、テキストだけでなく画像や音声を含むマルチモーダルRAGの実現も進んでいます。マルチモーダル埋め込みモデルの進化により、様々な形式のデータを統合的に検索し、LLMに提供することで、よりリッチで包括的な回答生成が可能になります。 LangChainもこれらの新しいデータタイプと埋め込みモデルへの対応を強化しており、RAGシステムは今後さらに多様な情報源から価値を引き出すでしょう。

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

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