基本RAGの限界

標準的なRAGシステムは、以下のシナリオで性能が低下します:ドキュメント横断的な推論を必要とする複雑な質問、構造化フィルタリングを必要とするクエリ、動的な検索戦略の調整が必要なシナリオ。高度なRAG技術はこれらの問題を解決するために設計されています。

マルチホップ検索

マルチホップ検索は、複雑な質問を複数のサブ質問に分解し、順次検索と推論を行い、最終回答に徐々に近づきます:

from langchain.chains import MultiRetrievalQAChain

# 複数のレトリーバーを定義
retriever_docs = vectorstore_docs.as_retriever()
retriever_code = vectorstore_code.as_retriever()

# マルチホップ検索チェーン
chain = MultiRetrievalQAChain.from_retrievers(
    llm=llm,
    retrievers=[retriever_docs, retriever_code],
    retriever_descriptions=[
        "ドキュメントナレッジベース:製品ドキュメントとユーザーマニュアルを含む",
        "コードリポジトリ:ソースコードとAPIドキュメントを含む"
    ]
)

マルチホップ検索の鍵は:

  • クエリ分解:ユーザーの質問を独立して検索可能なサブ質問に分解する
  • 中間結果の利用:前のステップの検索結果を次のステップのコンテキストとして使用する
  • 情報融合:複数のソースから取得した情報を一貫した回答に統合する

セルフクエリ検索

セルフクエリ検索は、LLMがユーザーの質問から構造化クエリ条件を自動的に抽出し、セマンティック検索とメタデータフィルタリングを組み合わせます:

from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo

metadata_field_info = [
    AttributeInfo(
        name="source",
        description="ドキュメントソース",
        type="string"
    ),
    AttributeInfo(
        name="year",
        description="ドキュメント年",
        type="integer"
    ),
    AttributeInfo(
        name="category",
        description="ドキュメントカテゴリ",
        type="string"
    )
]

retriever = SelfQueryRetriever.from_llm(
    llm=llm,
    vectorstore=vectorstore,
    document_contents="技術ドキュメントコレクション",
    metadata_field_info=metadata_field_info
)

# ユーザーが「2024年のRAGに関する深層学習論文」と質問
# 自動的にクエリを構築:セマンティック="RAG深層学習" + フィルタ year=2024, category="論文"
results = retriever.get_relevant_documents(
    "2024年のRAGに関する深層学習論文"
)

コンテキスト圧縮

検索されたドキュメントが長すぎる場合、コンテキスト圧縮技術はクエリに最も関連する部分を抽出します:

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever
)

# クエリに関連する主要なコンテンツのみを返す
compressed_docs = compression_retriever.get_relevant_documents(query)

高度なRAGアーキテクチャ設計

本番グレードのRAGシステムは通常、階層アーキテクチャを採用します:

  • ルーティング層:クエリタイプに基づいて異なる検索戦略にルーティングする
  • 検索層:複数の検索方法(キーワード、セマンティック、構造化)を組み合わせる
  • 再ランキング層:Cross-encoderを使用して検索結果を再ランキングする
  • 生成層:検索結果を組み合わせて最終回答を生成し、引用トレーサビリティをサポートする
  • 評価層:RAGシステムの品質と性能を継続的に監視する

まとめ

高度なRAG技術により、ナレッジベースQAは「使える」から「使いやすい」へと進化します。基本的なRAGから始め、実際の課題に応じて高度な技術を段階的に導入することをお勧めします。最初から「完璧なアーキテクチャ」を追求するのではなく。