1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GraphRAG自作はJEMHopQA 120問でベクトル検索73.3%に負けた

1
Last updated at Posted at 2026-11-03

GraphRAG を自分の案件に入れたい方へ。「ベクトル RAG より賢い」と期待している前提は、小さい実装では成立しないかもしれません。日本語マルチホップ QA のベンチマーク JEMHopQA dev 120 問を、9B モデルと自作簡易 GraphRAG で通したら、包含評価で vector 73.3% / graph 61.7% でした。差は 11.6 ポイントで、自作 GraphRAG がベクトル検索に負けました。構築に 3.2 時間、LLM 呼び出し 2,382 回を使っての結果です。

本記事は、JEMHopQA 120問 × 自作簡易 GraphRAG × qwen3.5:9b の 1 回通しの記録です。Microsoft GraphRAG の実装ではなく、コミュニティ要約もエンティティ解決もない「素の自作」で、どこで負けたのかを数字で見ます。公開ベンチマークに通したときの、再現可能な数字を残すのが狙いです。

GraphRAG 自作は JEMHopQA 120 問で、ベクトル検索 73.3% に負けた — bge-m3 vs 自作 graph、差 11.6pt

6 条件 × 120 問、包含で vector 73.3% / graph 61.7%

まず結果を置きます。条件は、コンテキストなし (none)、ベクトル検索のみ (vector)、自作簡易 GraphRAG (graph)、両者の混合 (hybrid)、トリプルの並べ替えを加えた変種 (graph_rk、hybrid_rk) の 6 つ。120 問を各 1 回、温度 0 で回しました。

条件 n 完全一致 包含
none 120 46 (38.3%) 47 (39.2%)
vector 120 86 (71.7%) 88 (73.3%)
graph 120 73 (60.8%) 74 (61.7%)
hybrid 120 78 (65.0%) 79 (65.8%)
graph_rk 120 69 (57.5%) 71 (59.2%)
hybrid_rk 120 76 (63.3%) 78 (65.0%)

包含は「正解文字列が回答に含まれる」の判定です。vector 73.3% と graph 61.7% は、11.6 ポイント差。hybrid でも 65.8% で、ベクトル単独に届きません。両者の包含を突き合わせると、両方正解 64 / vector だけ 24 / graph だけ 10 / 両方誤り 22 で、「graph だけが拾えた問題」も 10 問はあるものの、全体では vector に負けています。

型別に見ると、compositional の 15 ポイント差が主因

JEMHopQA は問題を 2 型 (compositional 47 問 + comparison 73 問) に分けています。compositional は 2 記事を跨いで答えを合成する型、comparison は 2 つの事実を比べる型です。

条件 compositional 包含 comparison 包含
none 2/47 (4.3%) 45/73 (61.6%)
vector 21/47 (44.7%) 67/73 (91.8%)
graph 14/47 (29.8%) 60/73 (82.2%)
hybrid 18/47 (38.3%) 61/73 (83.6%)

compositional で vector 44.7% vs graph 29.8%。差は 15 ポイントで、全体の負けはここで決まりました。comparison は YES / NO 答えが多く、none でも 60% は当たります。差が付きにくい型です。

compositional は「東條英機が死没した施設は、何という戦争の後に設置されましたか?」のような、2 記事 (東條英機と巣鴨拘置所) をまたいで答える型です。GraphRAG が本来、強いとされるのはこの型のはずなのに、ここで一番負けました。

97.1% のトリプルが「1 ホップ目」で予算を使い切っていた

生ログを読むと、graph の失敗には明確な型があります。「2 記事目に届かない」です。

近傍探索は、質問から抽出したエンティティのノードから出発し、1 ホップ目、2 ホップ目のトリプルを集めてコンテキスト上限 (3,000 文字、トリプル行は 1,000 文字まで) に詰めます。実測では、全 120 問の graph のトリプル行のうち 97.1% (4,691/4,829) が、シード (質問エンティティ) に直接つながる 1 ホップ目の行でした。2 ホップ目の、橋渡し先の記事に由来するトリプルが、ほぼ入っていません。

compositional の問題で、2 記事とも文章チャンクが入ったのは、graph で 19/47 問、vector で 27/47 問。vector のほうが、両方の記事を同時に見られています。

具体例が記録にあります。「東條英機が死没した施設は何という戦争の後に設置されましたか?」で、近傍候補は 309 件、入ったトリプル 33 行はすべて東條英機側の行。巣鴨拘置所の記事に属するトリプルは 1 行も入りませんでした。

表記ゆれで、ノードがつながらない

もう1つの型は、「表記寄せの粗さでノードが分断する」でした。同じ問いで、東條英機の死没地のノードは「日本・東京都豊島区西巣鴨一丁目(巣鴨拘置所)」という 1 つの長い文字列のまま入り、巣鴨拘置所の記事から抽出された「巣鴨拘置所」ノードとは別物として扱われました。正規化は NFKC と記号除去だけで、同義性の寄せ (エンティティ解決) をしていないためです。

Microsoft GraphRAG の論文実装は、エンティティ抽出・コミュニティ検出・コミュニティ要約の 3 段を持ちます。本測定の自作は、どれもありません。「GraphRAG」という括りが広すぎて、同じ名前でも含まれる機能で結果が大きく変わります。本記事の数字は「素の自作」での値です。

構築コストは 3.2 時間、LLM 呼び出し 2,382 回

参考までに、構築側のコストも並べます。チャンクは 2,382 個 (平均 351.8 文字、合計 833,713 文字)。1 チャンクに付き qwen3.5:9b でトリプルを 1 回抽出させています。

項目 値
トリプル抽出の LLM 呼び出し 2,382 回
JSON パース失敗 (num_predict 1,024 で打ち切り) 11
抽出の入力トークン合計 1,123,947
抽出の出力トークン合計 691,277
抽出の壁時計合計 11,478.7 秒 (約 3.2 時間)
抽出トリプル (自己ループ除く) 33,762
ノード / エッジ 26,988 / 33,762
埋め込み (bge-m3、2,382 チャンク) 571,652 トークン、43.3 秒

ベクトル側は、チャンク埋め込み 43 秒で終わります。3.2 時間 vs 43 秒、組み立てコストに 300 倍近い開きがあって、その上で精度が負けました。並べ替え変種 _rk を入れても、シード直結の行は 92.3% に下がった程度で、包含は 59.2% と逆に少し落ちました。

どう使うか

結果だけ見れば「GraphRAG を 9B で簡易実装するな」で終わる話ですが、実務での示唆は 3 つあると思っています。

  • GraphRAG を名乗る実装の仕様を、1 段深く見てから採用する。コミュニティ要約・エンティティ解決の有無で、同じ名前でも結果はまるで違います
  • ベクトル検索を外す理由を、ベンチマークで裏取りする。「GraphRAG のほうが賢い」は、実装と対象型に強く依存します。公開ベンチマーク (JEMHopQA、HotpotQA 等) で、自社の実装が勝てるのかを 100 問規模で先に見ておくべきです
  • 2 ホップ目を素通ししない設計を入れる。シード 1 ホップでトリプル予算を埋めず、「橋渡し先」のチャンクを別枠で確保する実装 (例: 近傍から 2 ホップ目のノードに属する元チャンクを明示的に 1 件入れる) が、自作で勝つ最低条件に見えます

実測範囲と限界

  • 自作の簡易 GraphRAG であって、Microsoft GraphRAG や LightRAG などの実装ではありません
  • モデルは qwen3.5:9b (Q4_K_M) の 1 種類のみ。大きいモデルでは抽出の質も読解も変わる可能性があります
  • Wikipedia 記事は冒頭 4,000 文字で打ち切り。219 記事中 193 記事が打ち切られました
  • 120 問 × 各 1 回、温度 0。条件間の差について検定はしていません
  • Wikipedia の版は 2026-10-24 時点の現行版で、JEMHopQA の前提 (2021 年版) とはずれています
  • 採点は文字列ベースで、表記ゆれは誤答扱いです。JEMHopQA 公式の evaluate.py (類義語辞書つき) とは別採点なので、公式スコアとは比べられません

まとめ

  • JEMHopQA dev 120 問で、包含評価は vector 73.3% / 自作 graph 61.7% / hybrid 65.8%。自作 GraphRAG が 11.6 ポイント負けました
  • 負けの主因は compositional 型の 15 ポイント差 (vector 44.7% vs graph 29.8%)
  • 失敗の型は「シード 1 ホップで予算を使い切り、2 記事目に届かない」「表記寄せが粗くノードが分断する」の 2 つが中心でした
  • 構築に 3.2 時間 / 2,382 回の LLM 呼び出しを掛けて、ベクトル検索単独に負けました
  • 本記事は自作簡易 GraphRAG の値です。Microsoft GraphRAG の論文実装や LightRAG とは比較していません

測定条件

本記事は iris-lab/experiments/048-graphrag-vs-vector-jemhopqa/README.md の実測結果と、JEMHopQA 公式および Microsoft GraphRAG 公式論文の再構成です。新規実測は行っていません。GraphRAG の構築コストを別軸で扱った既出記事や、自分のドキュメント 1 万件での比較記事とは別の、公開ベンチマーク上での再現可能な数字を残す位置付けです。

  • 計測日: 2026-10-24〜25
  • データ: JEMHopQA dev ver1.2、120 問 (compositional 47 + comparison 73)、github.com/aiishii/JEMHopQA commit fed5024f、CC BY-SA 4.0
  • コーパス: ja.wikipedia API で 2026-10-24 取得、219 記事、冒頭 4,000 文字打ち切り、2,382 チャンク (最大 400 文字)
  • LLM: qwen3.5:9b (Ollama、Q4_K_M、digest 6488c96fa5fa)、temperature 0、think=false
  • 埋め込み: bge-m3 (Ollama、F16、digest 790764642607、1024 次元)
  • 実行環境: RTX 4070 12GB、Ollama 経由
  • コンテキスト上限: 全条件 3,000 文字、トリプル行最大 1,000 文字
  • 採点: NFKC・小文字化・記号除去による決定的採点。類義語辞書は未使用

続きはこちら

GraphRAG を「組んで測る」側ではなく、「どのステップに時間を割くか」の設計側に関心がある方は、7 ステップに分解した整理記事があります。

GraphRAG 7ステップで効くのは3つだけ


RAG・MCP・ローカルLLM を実際に動かして測った記事を書いています。続きが気になる方は Qiita でフォロー してもらえると、次の記事が届きます。

本書では、知識グラフを「どう組むか」「どこで効くか」を 7 ステップに分けて、実装側の判断材料をまとめました。

ナレッジグラフ活用大全

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?