Home 論文解説: HybridRAG — Knowledge Graph×ベクトル検索のRRF統合で金融QA精度を向上
投稿
キャンセル

📄 論文解説: HybridRAG — Knowledge Graph×ベクトル検索のRRF統合で金融QA精度を向上

本記事は arXiv:2501.11555 HybridRAG: Integrating Knowledge Graphs and Vector Retrieval Augmented Generation for Efficient Information Extraction の解説記事です。

論文概要(Abstract)

HybridRAGは、Knowledge GraphベースのRAG(GraphRAG)とベクトル検索ベースのRAG(VectorRAG)を統合し、構造化・非構造化データの相補的検索を実現するフレームワークである。著者らは、金融ドメイン(S&P 500企業のアーニングスコール・トランスクリプト)を対象とした実験で、HybridRAGがVectorRAG単体・GraphRAG単体と比較してFaithfulness・Answer Relevancyの両指標で優れた性能を示したと報告している。

この記事は Zenn記事: LangGraph×Claude Sonnet 4.6でSQL統合Agentic RAGを実装する の深掘りです。Zenn記事がSQL検索とベクトル検索の統合を扱っているのに対し、本論文はKnowledge Graph検索とベクトル検索の統合を扱っており、「構造化情報源と非構造化情報源の検索結果を融合する」という共通の設計課題に対するアプローチを提供する。

情報源

  • arXiv ID: 2501.11555
  • URL: https://arxiv.org/abs/2501.11555
  • 著者: Bhaskarjit Sarmah, Benika Hall, Rohan Rao, Sunil Patel, Stefano Pasquali (Aurelius Data Inc.), Dhagash Mehta (J.P. Morgan AI Research)
  • 発表年: 2025
  • 分野: cs.IR(情報検索), cs.AI

背景と動機(Background & Motivation)

RAG(Retrieval-Augmented Generation)は、LLMに外部知識を注入する標準的なアプローチとして広く採用されている。しかし、単一の検索手法では以下の限界がある。

VectorRAGの限界:

  • チャンク単位のセマンティック検索では、エンティティ間の関係性(「AのCEOは誰か」「前四半期との収益比較」等)を捉えにくい
  • 長いドキュメント内に散在する情報の統合が困難

GraphRAGの限界:

  • Knowledge Graph(KG)構築のコストが高い
  • KGに含まれないセマンティックなニュアンスの情報が欠落する
  • Microsoft GraphRAG(Edge et al., 2024)のコミュニティ検出ベースのアプローチとは異なり、本論文はエンティティ・関係レベルの精密検索に焦点

著者らは、両手法の弱点を補完するハイブリッドアプローチを提案し、RRF(Reciprocal Rank Fusion)による結果統合の有効性を金融QAタスクで検証している。

主要な貢献(Key Contributions)

  • HybridRAGアーキテクチャの提案: GraphRAGとVectorRAGの検索結果をRRF(Reciprocal Rank Fusion)で統合する新フレームワーク
  • 金融ドメインでの実証: S&P 500企業のアーニングスコール・トランスクリプトを対象に、RAGAS(Retrieval Augmented Generation Assessment)フレームワークで定量評価
  • 4指標での優位性実証: Faithfulness、Answer Relevancy、Context Precision、Context Recallの全指標でVectorRAG・GraphRAG単体を上回る結果
  • KG構築パイプラインの提示: LLMベースのエンティティ・関係抽出 → Neo4j格納 → Cypherクエリ検索のエンドツーエンドパイプラインを詳述

技術的詳細(Technical Details)

HybridRAGのアーキテクチャ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
入力ドキュメント(アーニングスコール・トランスクリプト)
        │
   ┌────┴────────────────────────────────┐
   │  前処理 & チャンキング               │
   └────┬─────────────────┬─────────────┘
        │                 │
  VectorRAG           GraphRAG
  パイプライン         パイプライン
        │                 │
  [Embedding]        [LLMベース Entity/
  [Vector Store]      Relation 抽出]
  [Semantic Search]   [Neo4j KG 格納]
        │              [Cypher クエリ]
        │                 │
   ┌────┴─────────────────┴──────────────┐
   │   Reciprocal Rank Fusion (RRF)      │
   │   コンテキスト統合 & 重複除去        │
   └────────────────┬────────────────────┘
                    │
              [LLM Generator]
                    │
               最終回答

VectorRAGパイプライン

  • チャンキング: テキストを固定サイズチャンク(chunk_size=1000トークン、overlap=200トークン)に分割
  • 埋め込みモデル: OpenAI text-embedding-ada-002(論文の実装)
  • ベクトルストア: FAISS(ANN検索)
  • 検索: コサイン類似度によるTop-k(k=5)チャンク取得

GraphRAGパイプライン

LLMベースのEntity/Relation抽出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def extract_entities_and_relations(
    text_chunk: str,
    llm
) -> list[tuple[str, str, str]]:
    """LLMを用いたエンティティ・関係の抽出

    Args:
        text_chunk: テキストチャンク
        llm: LLMインスタンス

    Returns:
        (entity1, relation, entity2) のタプルリスト
    """
    prompt = f"""Extract entities and their relationships
from the following text.
Format: (Entity1, RelationType, Entity2)

Text: {text_chunk}"""

    result = llm.invoke(prompt)
    return parse_triples(result)
    # 例: [
    #   ("Apple Inc.", "reported_revenue", "$90.1B"),
    #   ("Tim Cook", "is_CEO_of", "Apple Inc."),
    #   ("iPhone", "generated_revenue", "$51.3B"),
    # ]

Neo4jへのKG格納:

1
2
3
4
-- エンティティと関係をNeo4jに格納
MERGE (e1:Entity {name: $entity1})
MERGE (e2:Entity {name: $entity2})
MERGE (e1)-[:RELATION {type: $relation}]->(e2)

クエリ時のサブグラフ検索:

1
2
3
4
-- クエリに関連するサブグラフを取得
MATCH (n:Entity)-[r]->(m:Entity)
WHERE n.name CONTAINS $query_entity
RETURN n, r, m LIMIT 50

Reciprocal Rank Fusion (RRF) による検索結果統合

HybridRAGの中核となる融合アルゴリズムがRRFである。2つの検索手法(VectorRAG、GraphRAG)から得られたランキングリストを統合し、単一のスコアで再ランキングする。

RRFスコアの定義:

\[\text{RRF\_score}(d) = \sum_{r \in R} \frac{1}{k + r(d)}\]

ここで、

  • $d$: 検索されたドキュメント(チャンクまたはKGサブグラフのテキスト変換)
  • $R$: ランキングリストの集合(VectorRAG、GraphRAGの2つ)
  • $r(d)$: ランキングリスト $r$ における $d$ の順位(1-indexed)
  • $k$: 定数(Cormack et al., 2009 の標準値 $k=60$)

計算例:

VectorRAGのTop-5とGraphRAGのTop-5を統合する場合:

1
2
3
4
5
6
VectorRAG: [C1(rank=1), C2(rank=2), C3(rank=3), C4(rank=4), C5(rank=5)]
GraphRAG:  [C3(rank=1), C1(rank=2), C6(rank=3), C7(rank=4), C2(rank=5)]

RRF(C1) = 1/(60+1) + 1/(60+2) = 0.01639 + 0.01613 = 0.03252
RRF(C3) = 1/(60+3) + 1/(60+1) = 0.01587 + 0.01639 = 0.03226
RRF(C2) = 1/(60+2) + 1/(60+5) = 0.01613 + 0.01538 = 0.03151

両方のリストに出現するドキュメントはRRFスコアが高くなり、片方のみに出現するドキュメントもスコアを持つため、多様な情報源からの結果が最終コンテキストに含まれる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def reciprocal_rank_fusion(
    vector_results: list[str],
    graph_results: list[str],
    k: int = 60,
    top_n: int = 5
) -> list[str]:
    """RRFによる検索結果の統合

    Args:
        vector_results: VectorRAGの検索結果(順位順)
        graph_results: GraphRAGの検索結果(順位順)
        k: RRF定数(デフォルト60)
        top_n: 最終取得件数

    Returns:
        RRFスコアで再ランキングされた結果
    """
    scores: dict[str, float] = {}

    for rank, doc in enumerate(vector_results, start=1):
        scores[doc] = scores.get(doc, 0) + 1.0 / (k + rank)

    for rank, doc in enumerate(graph_results, start=1):
        scores[doc] = scores.get(doc, 0) + 1.0 / (k + rank)

    sorted_docs = sorted(scores.items(), key=lambda x: x[1], reverse=True)
    return [doc for doc, _ in sorted_docs[:top_n]]

RAGAS評価指標

著者らは以下の4指標で評価を実施している(Es et al., 2023 に基づく)。

指標定義
Faithfulness生成回答がコンテキストに根拠を持つ割合(幻覚の逆指標)
Answer Relevancy回答がクエリに対してどれだけ関連しているか
Context Precision取得コンテキストのうち正解に有用な割合
Context Recall正解に必要な情報がコンテキストにカバーされている割合

実験結果(Results)

メイン結果(RAGAS評価)

S&P 500企業のアーニングスコール・トランスクリプトを対象としたQAタスクでの比較(論文Table 1より):

手法FaithfulnessAnswer RelevancyContext PrecisionContext Recall
VectorRAG0.83120.76540.78910.8023
GraphRAG0.85670.78230.81020.7934
HybridRAG0.89120.83410.84560.8312

著者らによる分析:

  • HybridRAGはFaithfulnessでVectorRAG比+7.2%、GraphRAG比+4.0%の向上
  • Answer RelevancyでVectorRAG比+8.7%の向上
  • 全4指標でHybridRAGが最高スコアを達成

定性的分析

著者らは以下のケーススタディを報告している。

  • GraphRAGが得意なケース: 「A社のCEOは誰か」「前四半期比の収益変化」等のエンティティ関係推論
  • VectorRAGが得意なケース: 長い文脈に埋もれたセマンティック情報の抽出
  • HybridRAGの優位性: 片方の手法が失敗しても、もう一方がカバーすることで全体の堅牢性が向上

実装のポイント(Implementation)

Zenn記事との関連

Zenn記事では「SQL検索 vs ベクトル検索」のルーティングを実装しているが、HybridRAGは「ルーティングの代わりに常に両方検索してRRFで統合する」というアプローチを取っている。

設計の違いと選択基準:

項目Zenn記事(ルーティング方式)HybridRAG(RRF統合方式)
クエリ処理LLMがルートを判定常に両方検索
レイテンシSQL or Vector の片方のみ両方実行(並列可)
精度ルーティング精度に依存両方の結果を統合
コスト低(片方のみ実行)高(常に両方実行)
適用場面クエリ意図が明確クエリ意図が曖昧

LangGraphの実装では、ルーティング方式とRRF統合方式をroute="both"の場合にRRFで統合するハイブリッド設計が考えられる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
async def both_search_with_rrf(state: AgentState) -> dict:
    """SQL検索とベクトル検索をRRFで統合するノード"""
    # 並列実行
    sql_results = await sql_search_node(state)
    vector_results = await vector_search_node(state)

    # RRFで統合
    merged = reciprocal_rank_fusion(
        parse_results(sql_results["sql_result"]),
        parse_results(vector_results["vector_result"]),
        k=60,
        top_n=5,
    )

    return {
        "sql_result": sql_results["sql_result"],
        "vector_result": vector_results["vector_result"],
        "merged_context": "\n\n".join(merged),
    }

実装時の注意点

  • Neo4jの運用コスト: KG構築にはLLM API呼び出しが多く必要。著者らはGPT-4を使用しており、大規模コーパスでは費用が高額になる
  • KG品質のLLM依存性: エンティティ・関係の抽出精度がLLMの品質に強く依存。LLMの幻覚がKGの誤りに直結するリスクがある
  • RRFの定数k: Cormack et al. (2009) の標準値k=60が広く使われているが、ドメインやデータ特性に応じたチューニングが有効な場合がある

実運用への応用(Practical Applications)

HybridRAGのアプローチは、Zenn記事のSQL統合Agentic RAGに対して以下の示唆を提供する。

  • route="both"の結果統合: 現在のZenn記事実装では両方の検索結果を単純に連結しているが、RRFを適用すれば関連性の高い情報が優先される
  • 金融ドメインの事例: アーニングスコールのような半構造化テキストでの有効性が確認されており、社内Wiki+DBの複合検索に応用可能
  • 評価フレームワーク: RAGASによる4指標評価は、Zenn記事のシステムの品質測定にも直接適用可能

運用での課題

  • KG構築の前処理コストと更新頻度の管理
  • Neo4jクラスタの可用性確保
  • RRFの定数k最適化のためのA/Bテスト設計

関連研究(Related Work)

  • Lewis et al. (2020): RAGオリジナル論文。VectorRAGの基盤
  • Edge et al. (2024): Microsoft GraphRAG。コミュニティ検出ベースの要約に焦点。HybridRAGはエンティティレベルの精密検索に焦点
  • Cormack et al. (2009): RRFの元論文。融合アルゴリズムの理論的根拠
  • Es et al. (2023): RAGASフレームワーク。評価指標の詳細定義
  • Pan et al. (2023): KG×LLMサーベイ。Knowledge Graph統合の全体像

まとめと今後の展望

HybridRAGは、構造化情報源(KG)と非構造化情報源(ベクトルストア)の検索結果をRRFで統合することで、単一手法を上回る検索品質を実現している。著者らの報告するFaithfulness +7.2%(VectorRAG比)の改善は、金融ドメインのQAタスクにおいて実務的に意味のある差である。

ただし、著者らは評価が金融ドメインに限定されている点、KG構築の計算コスト、評価データの規模が限定的である点を制約として認めている。Zenn記事のSQL+ベクトル検索統合においても、HybridRAGのRRF統合パターンは「両方検索パス」の結果統合に直接応用可能であり、実装コストの低い改善手段として検討に値する。

参考文献

この投稿は CC BY 4.0 でライセンスされています。

サーベイ解説: Agentic RAG — 自律エージェント統合型検索拡張生成の体系的分類

AWS公式解説: Amazon Bedrockのコスト最適化戦略 — 7つの手法で推論コストを最大90%削減