本文へ移動
JianguoDing

技術実践

GraphRAG プロダクト分析 ↗

RETRIEVAL NOTES /『水滸伝』知識探索の実験

GraphRAG 実践
グラフ検索の試行錯誤

『水滸伝』を対象にした GraphRAG の検索実験。BM25・N-gram・Analyzer・RRF から根拠の選択とコンテキストへの格納まで、そして関係によるランキングが失敗したあと、関係を原文根拠の特定に使うようになった経緯。

グラフの関係はすでにあるのに、答えはまだ揃わない。実際の検索の失敗をたどりながら、語、スコア、統合、根拠の選択を分けて見直し、構造化された知識をどこに置くべきかを考える。

一致したコンテキストに入った答えを支えるのに十分

01 RAG · 導入と検索のベースライン

まず、検索の過程を観察できるようにする

Retrieval-Augmented Generation / 检索增强生成

『水滸伝』を対象にした知識探索の実験は、語彙ベースの検索から始めました。質問と原文を「語」に変え、どの原文ブロックがより関連するかを計算します。

RAG(検索拡張生成)は、先に資料を検索し、その資料を使って回答の生成を助けます。GraphRAG(Graph-based Retrieval-Augmented Generation)はグラフ構造でこの過程を支えますが、グラフをどう使うかは実装によってまだ異なります。

『水滸伝』は、梁山泊に集う好漢たちを描いた中国の古典長編です。実験では中国語の原文を使うため、以下の例も中国語のまま示し、日本語の訳を添えています。主な登場人物は林冲(りんちゅう)と魯智深(ろ・ちしん)です。

初期の MVP は、文字の 2-gram・3-gram 片と BM25 を使い、ベクトル検索やグラフデータベースを主経路には入れませんでした。利点は説明できることです。どの語が一致し、各ブロックが何点を得て、どこで絞り込まれたのかを記録し、比較できます。

これは「BM25 がベクトル検索に勝つ」という選定実験ではありません。このプロジェクトは両者の完全な A/B 比較を行っていません。意味検索が必要かどうかは、語彙ベースの方式にどんな失敗が残り、導入して実際にどれだけ効果があるかで決まります。

仕組みの図質問から根拠まで、間にはそれぞれ別の役割がある
  1. 語どう一致させるかN-gram / Analyzer
  2. 順位誰が先に来るかBM25 / RRF
  3. 選択何が収まるか根拠の予算
  4. 回答根拠は足りているか原文と引用を確認

初期には、抽出した人物と関係があり、その後に回答を中心にしたローカルグラフも作りました。しかし「グラフのデータがある」「グラフを表示する」「グラフでどの根拠を検索するかを決める」は、別々のことです。グラフ関係検索のトピックで、この線引きに戻ります。

根拠初期 BM25 MVP · 実験データ回答中心のローカルグラフ · 実験データ検索戦略の実験 · 実験データ

PART 01 / FOUNDATIONS

基礎技術

語の一致から順位の統合まで。よく使われる四つの段階が、それぞれ何を解決するのかを先に整理します。

02 BM25 · 関連度スコア

BM25|キーワードの一致を関連度の順位に変える

Best Matching 25 / 相关性评分

「林冲 宝刀」(林冲、宝刀)で検索すると、これらの語を含む文章がたくさん見つかることがあります。BM25 は、語の出現回数、その語の珍しさ、文章の長さをもとに、どの結果を先に並べるかを判断します。

教材用の図 · 以下の文章は作った例同じ語が 1 回出る場合と 2 回出る場合

検索語:宝刀 (宝刀)

文章 A

林冲买了一口宝刀。

林冲は宝刀を一振り買った。

1 回一致
文章 B

林冲看见宝刀,又仔细端详这口宝刀。

林冲は宝刀を見つけ、その宝刀をじっくり眺めた。

2 回一致

TF|単語頻度

Term Frequency

語がより多く出るほど、一致の手がかりは通常より強くなります。

BM25 の単語頻度の寄与は次第に飽和し、繰り返しの回数に比例して無限に増えることはありません。

教材用の図 · 仮のデータで、プロジェクトの実測ではない100 件の文章のうち、二つの語が現れる範囲
林冲80 / 100 件
宝刀5 / 100 件

棒の長さはその語を含む文章の割合で、関連度のスコアではありません。

IDF|逆文書頻度

Inverse Document Frequency

珍しい語ほど、どの結果が本当に関連するかを見分ける力が通常は高くなります。

「林冲」は多くの文章に出てくるため、珍しい語に比べると統計的な識別力は弱いかもしれません。珍しさは、意味の重要さと同じではありません。

教材用の図 · 以下の文章は作った例どちらも 1 回の一致でも、一致の集中度が違う

短い文章「宝刀」が 1 回

林冲把宝刀拿在手里,翻来覆去地看。

林冲は宝刀を手に取り、何度もひっくり返して眺めた。

長い文章「宝刀」が 1 回

林冲清早出门,经过街边的店铺,和熟人说了几句话。路上人来人往,有人挑着担子,有人停下歇脚。走到街角时,他看见一口宝刀,拿起来仔细查看。随后他又沿街走了一段,听见附近酒家传来谈笑声,便转身向家中走去。

林冲は朝早く家を出て、通りの店先を過ぎ、知り合いと少し言葉を交わした。道は人が行き交い、荷を担ぐ者もいれば、足を止めて休む者もいる。角まで来たとき、彼は宝刀を見つけ、手に取ってよく調べた。その後、通りをしばらく歩き、近くの酒場から談笑の声が聞こえると、きびすを返して家へ向かった。

文書長による正規化

Length Normalization

長い文章が、内容が多いというだけで自然に有利になるのを防ぎます。

BM25 は、文書の長さとコーパスの平均の長さを参照してスコアを補正します。ここでは一致回数を固定し、語が短い文章と長い文章でどれだけ集中して現れるかだけを比べています。

2 位だった根拠が、ようやく選ばれる

過去の記録 · 「刀を買う」の根拠 ch007_chunk_012スコアの足切りをなくし、元の順位は保つ

変更前 · 固定のしきい値 5

3.39 < 5

関連する根拠が 2 位でも、除外されたままです。

変更後 · 絶対しきい値を廃止

今も 2 位

スコアの足切りでは外れなくなり、以降は容量と予算で絞り込まれます。

答えのある 31 問のうち、コンテキストに核となる根拠が 1 ブロック以上入った問題

18 / 3120 / 31

しきい値をなくすと、根拠が選ばれる機会は得られますが、必ずコンテキストに入るとは限りません。候補の数、容量、予算は選択を引き続き制限します。

さらに詳しく:BM25 のスコアと過去のしきい値実験S0 / S1 のデータ、評価条件、そしてスコアと根拠の選択の違いを確認します。
検索戦略レポート · S0 / S1、スコアと順位は変更なし
過去の戦略Hit@3コンテキストに核が 1 以上
S0 · しきい値 50.6518/31 ≈ 0.58
S1 · しきい値なし0.6520/31 ≈ 0.65

第 7〜11 回、59 ブロック、答えのある 31 問。予算は 2000、最大 4 ブロックで、収まらないブロックは飛ばして続けます。Hit@3 は上位 3 件に核となるブロックが 1 つ以上あるかを調べ、コンテキストのカバー率は最終的に選ばれたブロックを調べます。両者は別の指標です。

3.39、2 位、しきい値 5 は過去の診断によるものです。従来のチャネルは BM25 を基礎に、エンティティと隣接ブロックの加点も含んでいたため、この 3.39 は厳密には過去の検索の総合スコアと呼ぶべきものです。サンプルは小さく、ラベル付けも一人で行ったため、全ての質問に一般化はできません。

根拠検索戦略の実験 · 実験データ検索の実装メモ · 実験データElastic · BM25 similarity ↗

03 N-gram · 連続した文字片

N-gram|文字を連続した片に切る

Character N-gram / 字符 N 元片段

中国語には、語の境界を示す自然な空白がありません。文字 N-gram は、先に語を判断する必要がなく、窓をずらしながら固定長の文字片を作ります。

教材用の図 · 操作は任意窓の幅を変えると、語もそれに合わせて変わる
林冲买宝刀

「林冲が宝刀を買う」

1-gram
林冲买宝刀
2-gram
林冲冲买买宝宝刀
3-gram
林冲买冲买宝买宝刀

これは簡略化した文字の切り出しの図で、プロジェクトの検索出力そのものではありません。3 通りの切り出しの語は、操作しなくても常にすべて読めます。

N は連続する文字の数です。標準的な文字 N-gram は通常 1 文字ずつずらすため、隣り合う語は重なります。

N-gram の重なりは語を作るときに起こり、チャンクのオーバーラップは文章をチャンクに分けるときに起こります。

  • 長所:辞書がなくても、未知の語の中の連続した文字に一致できます。
  • 短所:意味のない片を生むことがあり、類義の表現も自然には理解できません。

プロジェクトでの実践 · Python の 2-gram・3-gram 片検索の実装メモ · 実験データOpenSearch · N-gram tokenizer ↗

04 Analyzer · テキスト分析

Analyzer · テキスト分析

Tokenizer / Text Analyzer / 文本分析器

Analyzer は、生のテキストを検索できる語に変えます。

標準的な Analyzer の図 · 同じ文章を順に処理する。プロジェクトの実際のトークナイザーではない
  1. Character Filter

    文字の前処理 · 生のテキストから句読点などを取り除く

    林冲!!买了一把宝刀!!!林冲买了一把宝刀
  2. Tokenizer

    語への分割 · 連続した文章を検索できる語に分ける

    林冲买了一把宝刀[林冲] [买] [了] [一把] [宝刀]
  3. Token Filter

    語のフィルタリング · 規則に従って一部の語を取り除く

    [林冲] [买] [了] [一把] [宝刀][林冲] [买] [宝刀]

例文は「林冲は宝刀を一振り買った」という意味です。語は、林冲(人名)、買う、完了を表す助詞、「一つ(助数詞)」、宝刀です。この例の分割とフィルタの規則は説明用に決めたもので、助詞と「一つ(助数詞)」を取り除いています。すべての Analyzer がこう処理するわけではありません。

Character Filter は生の文字を処理し、Tokenizer は語を作り、Token Filter は語をさらに絞り込みます。

03 · N-gram:文字の切り出し方の違い。
次の研究:語のフィルタリングとクエリ拡張のその後の方向。

このプロジェクトでは、テキスト分析とフィルタリングの一部を Python のカスタムコードで実装しています。

根拠検索の実装メモ · 実験データ検索戦略の実験 · 実験データOpenSearch · Text analysis ↗

05 RRF · 順位の統合

RRF · 順位の統合

Reciprocal Rank Fusion / 倒数排名融合

同じ内容でも、検索の方法が違えば順位は変わります。RRF は、各ランキングでの順位から最終的な順序を計算します。

二つの順位から、一つの最終順位へ

記事 A は二つのランキングで 1 位と 2 位になり、統合後に最終 1 位になります。

教材用の図 · 作った A / B / C、等しい重みの RRF、k = 60

ランキング 1

  1. 1 位記事 A
  2. 2 位記事 B

例:2-gram・3-gram の文字 BM25。

ランキング 2

  1. 1 位記事 C
  2. 2 位記事 A

例:1 文字の BM25。

RRF · 順位で統合

最終ランキング

  1. 1 位記事 A0.03252
  2. 2 位記事 C0.01639
  3. 3 位記事 B0.01613

A はなぜ 1 位なのか

ランキング 1:1 位。

ランキング 2:2 位。

1/61 + 1/62 ≈ 0.03252

二つの寄与が足し合わされるため、統合後のスコアが最も高くなります。

RRF は順位を統合するもので、異なる検索器の元のスコアを直接足すわけではありません。

過去の実測 · 2 系統の語彙検索を統合した RRF · Hit@3

0.650.77

「上位 3 件に核となる根拠が 1 ブロック以上あるか」を満たす、答えのある問題の割合が上がりました。

これは 1 文字のチャネルを加えて統合した全体の結果であり、効果のすべてを RRF そのものによるものとは言えません。統合された順位が、答えの正しさを意味するわけでもありません。

さらに詳しく:RRF のパラメータと評価データの全体k = 60、ランキングに入らなかった候補の扱い、そして過去の三つの戦略の比較を確認します。

各ランキングの寄与は 1 / (k + 順位) です。この図は等しい重みで統合し、k = 60 としています。あるランキングの候補に入らなかった記事は、そのランキングでの寄与が 0 で、最下位として扱うわけではありません。スコアは小数第 5 位まで揃えています。

従来チャネル2-gram・3-gram の BM25 + 加点
0.65
1文字 BM25別の語の粒度
0.71
2系統の語彙検索を統合した RRF2つのチャネルの順位を統合
0.77

第 7〜11 回、59 ブロック、答えのある 31 問。従来のチャネルは 2-gram・3-gram の BM25 にエンティティと隣接ブロックの加点を含み、1 文字の BM25 の Hit@3 は 0.71、2 系統の語彙検索を統合した等しい重みの RRF(k = 60)は 0.77 です。しきい値の廃止、チャネルの粒度、統合それぞれの寄与は、分けて確かめる必要があります。

根拠検索戦略の実験 · 実験データ予算比較の実験 · 実験データ複数章の知識検索の設計 · 実験データCormack ほか · SIGIR 2009 ↗

PART 02 / FIELD NOTES

プロジェクトの実践記録

ここまでで、テキスト分析、関連度スコア、順位の統合を見てきました。次に、これらの技術が実際の検索システムでどう組み合わさるか、そして検索の流れに沿って問題を見つけ、方法を調整した過程を見ていきます。

S 検索パイプライン

基礎技術から、実際の検索の流れへ

Retrieval Pipeline / 检索链路

先に見てきた技術は、並べて覚える知識ではなく、ひとつの回答の背後にある同じ流れの、異なる段階です。

簡略化した図 · 現在の質問応答の主経路で、検索の対象は原文ブロックひとつの質問が、ひとつの回答になるまで
  1. ユーザーの質問「鲁智深和林冲怎么认识?」
    魯智深と林冲はどのように知り合ったのか。
  2. テキスト分析と語の生成参照 03 N-gram04 Analyzer

    質問と原文ブロックは、どちらも二組の語に変えられます。2-gram・3-gram の文字片と、頻出の機能的な文字を除いた 1 文字です。

  3. 候補の検索と関連度スコア参照 02 BM25

    チャネル 12-gram・3-gram の語 → BM25 の順位

    チャネル 21 文字の語 → BM25 の順位

  4. 複数の結果の統合参照 05 RRF

    二つのランキングを、各候補の順位に基づいて一つに統合します。

  5. 根拠の選択とコンテキストの組み立て実践 A 検索と根拠

    統合後の順位に従い、原文ブロックを丸ごと順にコンテキストへ入れます。トークン予算とブロック数の上限があります。

  6. コンテキストの境界:モデルには、入れられた根拠しか見えません。

    モデルが回答を生成

    実際に受け取ったコンテキストだけをもとに答えます。回答のあと、システムが引用を原文と照合します。

この図は現在の主経路を簡略化したもので、完全な呼び出しの流れではありません。実践 A の 2,000 / 4,000 / 8,000 は時期の異なる実験の設定(従来の戦略 → RRF)で、現在の既定の設定は RRF · 推定トークン 8,000 · 最大 12 ブロックです。

さらに詳しく:この図が省いている部分主経路と過去の設定の違い、知識探索の別経路、出来事の骨格、そして関係の検索と RRF の関係を確認します。

主経路と過去の設定。主経路は、原文ブロックに 2 つの BM25 の順位を作り、RRF(k = 60、等しい重み)で統合してから、順位の順にブロックを丸ごと入れていきます。収まらないブロックがあれば、それを飛ばして下位のブロックで埋めることはせず、そこで選択を止めます。従来の戦略は、しきい値 5、最大 4 ブロック、推定トークン 2,000 で、収まらないブロックを飛ばして埋め続けました。第 1 部の 0.65 → 0.77 は従来のチャネルから 2 系統の語彙検索を統合した RRF への過去の実験で、この図の各段階の単独の効果ではありません。

知識探索の別経路。このプロジェクトには、主経路とは別に、知識探索の経路もあります。あらかじめ整理した人物のプロフィール、出来事・関係・状態の記録、章の要約を「知識」とし、原文ブロックを別の取得元として、それぞれに予算を設けます。知識の候補も、2 つの語彙の順位を RRF で統合して並べます。質問に、見分けのつく人物が二人以上含まれるときは、人物の関与度による順位がもう一つ加わります。これは既存の知識の記録を並べるもので、実践 B の「関係エッジによるランキングチャネル」とは別の実験です。

出来事の骨格と関係の検索。人物の経歴の道筋を聞かれる質問では、出来事の骨格がモデルを呼ぶ前に知識ベースによって決められ、コンテキストとしてモデルに渡されて、各段階の説明が書かれます。「二人の人物にどんな関係や共通の出来事があるか」といった検索は、記録を ID で読み出すもので、順位付けはせず、RRF のチャネルでもありません。

引用の確認。回答のあと、引用が示された原文の中に一字一句そのまま見つかるかが確認されます。これは引用の位置を特定できることを示すだけで、結論が意味の上で裏付けられたことを意味しません。

図には、セッションの根拠の記憶、追質問の扱い、検索語の整理も含めていません。

これらの段階を組み合わせても、検索が関連する内容を見つけているのに、回答に抜けが出ることがあります。では、問題はどの段階で起きているのでしょうか。実践 A へ ↓

アーキテクチャの根拠現在の質問応答の主経路 · 実験データ質問応答の制御 · 実験データ知識探索の検索 · 実験データ知識探索の処理 · 実験データ

A 検索と根拠の選択

検索結果と最終的な根拠

Evidence Selection / Token Budget / 证据选择 / Token 预算

検索は関連する内容を見つけたように見えるのに、回答にはまだ重要な情報が足りません。問題は流れのどの段階にあるのでしょうか。

01回答が不完全なら、まず問題が起きた段階を確かめる

実際の回答は、重要な情報を落としていました。すぐにパラメータを調整せず、上の流れを後ろから順にたどります。まず、モデルが実際に受け取ったコンテキストにその情報があるかを見ます。次に原文に戻って必要な事実を確かめます。最後に、候補の検索(BM25 のスコアと RRF の統合を経た順位)と、根拠の選択とコンテキストへの格納の記録を突き合わせ、検索で見つからなかったのか、見つかったのに入れられなかったのかを判断します。

  1. 最後に突き合わせる候補の検索と根拠の選択・格納
  2. 最初に確認コンテキスト
  3. 問題に気づくモデルの回答

02重要な根拠は検索されていたが、コンテキストには入っていなかった

「魯智深と林冲はどのように知り合ったのか」というオフラインの記録を振り返ると、結義の原文はすでに候補に入っていました。従来のチャネルでは 8 位、RRF に切り替えると 4 位です。しかし、根拠の予算が推定トークン 2,000 の状態では、選択と格納の規則がなおそれを阻み、コンテキストにこの原文は入りませんでした。この問題では、順位を上げるだけでは足りず、コンテキストに入る機会も必要だったのです。

RRF のオフライン比較 · 根拠の選択の仕組みの図4 位なのに、予算に阻まれてコンテキストの外に残る
#1選択#2選択#3予算超過#4核となる根拠

モデルには、選ばれたブロックしか見えない4 位が役に立つものでも、この段階のコンテキストには送られません。

4 位は RRF のオフラインの順位で、従来の戦略の 4 位ではありません。図は「予算を超えたら止める」という仕組みで説明したもので、ブロックの幅や他のブロックの打ち切り位置は図解用です。これは、以下のどの実際のモデル呼び出しの完全なトレースでもありません。

補足情報 · 初期の実際の設定 · 第 7〜11 回の評価セット

従来の戦略 · 2,000 トークン

原文の平均の長さ
639 文字 / チャンク
実際に入れられるのは通常
約 2〜3 原文ブロック
過去のレポートは 1 文字 ≈ 1 トークンの保守的な推定です。モデルが実測したトークンではなく、容量はブロックの長さと選択の規則によっても変わります。

設定の出典検索戦略の実験 · 実験データ

03検索の戦略と予算を変えて、実際の回答を観察する

実際の質問:「鲁智深和林冲怎么认识?」(魯智深と林冲はどのように知り合ったのか)。検索の戦略を従来のチャネルから RRF の統合に変え、同時に根拠の予算も広げて、必要な根拠がコンテキストに入る機会を増やしました。そのうえで、出会い、結義、野猪林での救助を、回答が区別できるかを確かめました。

検索の戦略と予算コンテキストの根拠のカバー率実際の回答

従来の戦略 · 2,000

トークン · 根拠の予算(保守的な推定)

コンテキスト:結義の原文がない。

根拠が足りず、答えられなかった。

insufficient を返した。

RRF · 4,000

トークン · 根拠の予算(保守的な推定)

コンテキスト:結義の根拠があり、順位の高い野猪林の場面も入っていた。

根拠は増えたが、出来事の混同は残った。

第 7 回の結義と第 9 回の野猪林での再会を混ぜて書いた。引用 3 件のうち、位置を特定できたのは 1 件だけ。

RRF · 8,000

トークン · 根拠の予算(保守的な推定)

コンテキスト:予算を広げ、より多くの根拠が入る機会があった。

今回の回答はより完全で、再び混同することはなく、引用の位置も特定できた。

レポートの記録は、街での出会い、林冲の父との面識、結義して兄弟になったこと。引用 2 件とも位置を特定できた。

各組は、検索の戦略、予算、選択の規則が同時に違うため、効果のすべてを予算の増加によるものとは言えません。各設定で実際のモデル呼び出しは 1 回だけ(n = 1)で、統計的な因果の証明ではありません。この問題の 4000 → 8000 でコンテキストがどう違ったかをブロックごとには確認していないため、どのブロックが加わったかは推測しません。引用の位置を特定できることは、意味の上での裏付けが検証されたこととは別です。

根拠が増えても、回答が正しくなるとは限らない。

予算を広げると根拠を網羅できる機会は増えますが、ノイズも入りやすくなります。モデルが根拠を自動的によく理解するようになるわけではありません。

コンテキストに必要な事実がまだない:検索、候補の順位、根拠の選択とコンテキストへの格納を引き続き確認します。言葉の表面がそもそも合わない場合(たとえば「報復」と聞いても、原文は「殺す」「突く」と書いている)は、次の研究を参照してください。

根拠は十分なのに、回答がまだ混同している:予算を増やし続けるのではなく、根拠の理解、出来事の関連づけ、プロンプトの設計、回答の生成を確認します。

さらに詳しく:候補の選択と予算実験の記録カバー率とノイズの統計の全体、候補数の上限、さまざまな選択の規則を確認します。

予算を広げると、ノイズも入りやすくなります。評価セット全体で、RRF の 4000 から 8000 の段階に進むと、すべての核となるブロックが選ばれた問題の数は 21/31 から 27/31 に増え、核にも関連にも印のないブロックが選ばれた割合は 61% から 79% に増えました。

Context Selection / Context Packing(コンテキストの選択と組み立て)は、コンテキストを選び、整理する役割です。この記事では根拠のカバー率と予算でこの役割を説明しており、独立した基礎的なスコアリングのアルゴリズムとは見なしていません。

質問ごとのオフラインの記録では、「どう知り合ったか」の問題で、核となるブロック ch007_chunk_004 は従来のチャネルの 8 位から RRF の 4 位に上がりました。RRF の 2000 の段階では選ばれず、4000 の段階では選ばれました。別の実際の回答の記録では、野猪林の場面と結義の混同が記されています。二種類の記録を、同じ呼び出しの完全なトレースとしてつなぎ合わせることはできません。

2 系統の語彙検索を統合した RRF · ブロック数の上限なし · 予算を超えたら止める
予算
推定トークン
すべての核
問題数 / 31
平均
選ばれたブロック数
無関係なブロック
割合
2,00012 / 312.345%
4,00021 / 315.061%
8,00027 / 3110.679%
16,00030 / 3121.689%

「すべての核」は、人手でラベル付けした核のブロックがすべて選ばれたかを調べます。無関係なブロックは core ∪ rel に属さないものとして数えたノイズの上限で、ラベルのないものが必ず有害とは限りません。表は評価セット全体の結果で、「どう知り合ったか」の一問だけの集計ではありません。

4000 から 8000 の段階では、核となるブロックが 6 個、無関係なブロックが 176 個増えました。コーパスは 59 ブロックしかないため、この結果を、より大きなコーパスでの推奨予算としてそのまま使うことはできません。

Top-K は候補を制限し、ブロック数の上限とトークン予算は選ばれるものを制限します。上限を 4 ブロックのままにすると、予算を上げてもそれ以上は改善しません。従来の戦略は、収まらないブロックを飛ばして隙間を埋め続けます。予算を超えたら止める方式は一部のノイズを抑えられますが、すべてのタスクで最適な規則ではありません。

根拠予算比較の実験 · 実験データ質問別の順位と失敗の帰属 · 実験データ検索戦略の実験 · 実験データ

B グラフ検索の試行錯誤

グラフ関係検索の試行錯誤

Graph Retrieval / 图检索

グラフの関係を加えたら、検索のヒット率がかえって下がりました。

先ほどの検索の流れは、主に語の一致、関連度スコア、順位の統合で根拠を探します。では、すでに抽出した人物、出来事、関係は、この流れに新しい検索の能力を加えられるのでしょうか。

01関係エッジを順位付けに加えても、改善はなかった

プロジェクトにはすでに人物、出来事、関係の知識がありました。最初の試みは、関係エッジを三つ目の検索の信号とし、元の二つの語彙の順位と RRF で等しい重みで統合するものでした。

過去の実験 · 答えのある 31 問関係を順位付けに加える

Hit@3:0.77 → 0.68

0.77:元の 2 系統の語彙検索を統合した RRF。
0.68:関係エッジの順位付けチャネルを追加。

失敗の分析追加した関係がノイズを生むこともある

よく登場する人物には多くの関係エッジがつながり、関係の記述は質問の用語とは限らず一致しません。等しい重みで統合すると、そのノイズが前に押し上げられ、元の順位を乱すおそれがあります。

これは特定の関係テキスト、一致の規則、等しい重みの統合方式での結果で、グラフ検索そのものが無効だという意味に解釈してはいけません。上のノイズの原因はレポートの分析によるもので、一般的な因果の結論ではありません。

02失敗したのは、グラフの関係か、それとも使い方か

この失敗は、関係の順位付けチャネルをそのまま加えるやり方が期待どおりにならなかったことを示しますが、構造化された関係の価値を否定するものではありません。研究はここで止まらず、別の使い方を探し始めました。

すべての関係エッジに順位を競わせるのではなく、関係を使って関連する人物と出来事を探し、対応する原文の根拠をたどることはできないか。

03関係に、根拠の探索を助けさせる

その後のシステムは、構造化された関係にすでに別の役割を担わせています。順位表をもう一つ増やすのではなく、関連する人物と出来事を見つけ、対応する原文の根拠に戻る手助けをする役割です。

初期の実験

関係エッジ順位付けチャネルRRF で統合語彙の結果と順位を競う

その後の実装

人物 / 出来事 / 関係の記録関連を検索出典の原文根拠の表示と出来事の経路

  • 人物の関係の検索二人の人物の間の関係の記録を読み出します。
  • 関連する出来事の検索二人がともに関わった出来事を探します。
  • 原文の根拠の特定関係や出来事の記録には出典があり、対応する原文の箇所に戻れます。
  • 経歴の道筋と出来事の整理人物の経歴を聞かれると、知識ベースが先に出来事を順序のある段階に分け、モデルに渡して各段階の説明を書かせます。

実装の確認実装の説明 · 実験データ

整理の仕方の図 · 原文の箇所は確認済み同じ二人の人物に、二つの異なる出来事の根拠がある
林冲ともに関わった出来事 / 関係の記録鲁智深

林冲と魯智深

第 7 回林冲と魯智深が義兄弟になる
ch007_chunk_004

原文

“林沖大喜,就當結義智深為兄。”

訳(参考)

「林冲は大いに喜び、智深を兄として義兄弟の契りを結んだ。」

二人の出会いと結義の、原文の根拠です。

第 9 回魯智深が野猪林で林冲を助ける
ch009_chunk_001

原文

“林沖方纔閃開眼看時,認得是魯智深。”

訳(参考)

「林冲がようやく目を開けて見ると、そこにいたのが魯智深だと分かった。」

ここでの「認得」は、以前から知っている相手だと認識したことを示しており、初対面を意味しません。

出来事の見出しは説明用の要約で、線は整理の関係を表しています。実際の検索経路や元のスキーマを装うものではありません。引用は原文の繁体字のまま、訳は読解の補助として添えたものです。

一度の失敗は、研究の方向そのものに価値がないことを意味しない。

最初の順位付けの戦略は成功しませんでしたが、その後のシステムは、構造化された関係を根拠の関連づけと出来事の整理に使っています。関係がどんな役割を担うかは、問題と実験の効果で決まり、チャネルを一つ増やせばよくなるとは限りません。

上記の検索、出典の関連づけ、出来事の整理の機能は実装済みです。ただし、回答の正確さと完全さへの安定した貢献はまだ検証が必要で、すべてのマルチホップの質問が解決したという意味でもありません。検証の方向は次の研究を参照してください。

さらに詳しく:関係検索の実験と実装の限界初期の等しい重みの統合の条件、その後に実装した検索と経歴の道筋の整理、効果を確かめるうえでの限界を確認します。

検索戦略レポート S4 / S6、答えのある 31 問。ハブとなる人物の名前の一致はノイズを生み、「知り合う」と関係の種類「結義」は字面では一致するとは限りません。今回の低下は、その実験の方式だけに当てはまります。

現在のサービスでは、kb_pair が二人の人物の関係と共通の出来事を検索し、kb_record が出来事・関係・状態・出典を結びつけます。経歴の道筋は plan_for_question が出来事の骨格として組み立てます。人物の組の検索は ID による読み出しで、順位付けには参加せず、自動でモデルのコンテキストに入ることもありません。検索でき、整理できることは、回答の品質向上が証明されたこととは別です。

根拠検索戦略の実験 · 実験データ質問別の順位と失敗の帰属 · 実験データ複数章の知識検索の設計 · 実験データPython 知識探索エンジン · 実験データ回答中心のローカルグラフ · 実験データPython / FalkorDB プロバイダ · 実験データ

PART 03 / OPEN QUESTIONS

次の研究

実践は二種類の問題を残しました。ユーザーの表現と原文の用語が違うと、根拠がなお見つからないことがあること。そして、関係や構造化された知識が回答の品質にどれだけ貢献するかが、まだ検証されていないことです。

→ 次の改善

次に:クエリが根拠をより正確に見つけられるようにする

Query Expansion / Query Rewrite / 查询扩展 / 查询改写

現在の語彙ベースの検索は、表現の違いの一部を、なお扱いきれません。たとえば、ユーザーが「報復」(报仇)と言っても、原文では「殺す」(杀)や「突く」(搠)といった動作で書いています。

Analyzer / Token Filter · 語の処理とフィルタリング
語の処理、分野の辞書、フィルタの規則を調整し、検索の一致が改善するか、ノイズが減るかを観察します。

Query Expansion / Rewrite · クエリの拡張と書き換え
元の質問を残したまま関連する検索表現を補い、以前は見落とした根拠が見つかるかを確かめつつ、クエリのずれを防ぎます。

これらの方向は、まだ検証が必要な仮説で、同じ評価セットと元の戦略との比較が要ります。構造化された関係が回答の正確さと完全さにどれだけ貢献するかも、同じように比較して評価してから結論を出します。

問題の根拠検索戦略の実験 · 実験データ予算比較の実験 · 実験データ複数章の知識検索の設計 · 実験データ

技術的な判断に立ち返る

まず、どの層で失敗したかを突き止めてから、技術を選ぶ。

語が一致していなければ、予算を変えても助けにならず、根拠が上位にあっても押し出されたなら、グラフの関係を足しても解決しないかもしれません。より確かな出発点は、一致、順位、選択、根拠の裏付けのすべてを確認できるようにすることです。

さらに詳しく:根拠の出典と記事の限界実測、教材用の図、未検証の方向の違いと、規模と独立性の限界を確認します。

実験の数値は、コミット済みの過去のレポートによるものです。レポートとコードは非公開のリポジトリにあるため、この記事からはリンクしていません。方法、数値、限界は、記事末尾の実験データと検証の根拠にまとめています。LLM の実験は再実行しておらず、独立した再評価も完了していません。

Analyzer の個別の例、N-gram、RRF の数値例、予算による打ち切り、関係の整理の図は、いずれも教材用の図です。否定的な実験を技術の優劣に一般化することはせず、今後の研究を既存の成果とは見なしません。

実験の規模は小さく(第 7〜11 回、59 個の原文ブロック、答えのある 31 問)、ラベル付けも一人で行ったため、1〜2 問の違いで数値が変わります。結果を、他のコーパスやより大きな規模に一般化すべきではありません。

実験データと検証の根拠

この節の役割はひとつです。記事が引用する実験の数値、方法、限界を、誰でも読める場所に置くこと。内部レポートの全文とソースコードは公開しておらず、ここにも写していません。

評価の設定と検索結果の比較評価セットと指標の定義、検索戦略・しきい値の除去・関係エッジチャネルの Hit@3 の比較。

評価の設定

コーパス『水滸伝』第 7〜11 回、59 個の原文ブロック(チャンク)。平均でおよそ 639 文字 / ブロック。
評価セット33 問のうち、31 問に答えがあり、2 問にはありません。核となる根拠のブロックは一人でラベル付けしました。Hit@3 とコア根拠のカバー率の指標は、主に答えのある 31 問が対象です。
指標Hit@3:上位 3 件に核となるブロックが 1 つ以上あるか。コンテキストのカバー率:最終的にコンテキストへ入ったブロックに核が含まれるか。二つは別の指標です。
予算の基準1 文字 ≈ 1 トークンという保守的な推定で、モデルが実測したトークンではありません。容量はブロックの長さと選択の規則によって変わります。
実際の回答設定ごとにモデルを 1 回だけ呼び出しています(n = 1)。統計的な実験ではありません。引用が「位置を特定できる」とは、引用先のブロックの中に一字一句そのまま見つかることです。
規模と独立性小さなコーパスで、ラベル付けも一人のため、1〜2 問の違いで数値が変わります。独立した再評価も、繰り返し呼び出したときのばらつきの測定もありません。

検索戦略の比較

答えのある 31 問での、三つの検索設定の Hit@3(語彙ベースの検索のみで、ベクトル検索は使っていません):

設定Hit@3説明
従来のチャネル0.652-gram・3-gram の BM25 に、エンティティと隣接ブロックの加点。
1 文字の BM250.71別の語の粒度。
2 系統の語彙検索を統合した RRF0.772-gram・3-gram と 1 文字の 2 チャネルの順位を統合。k = 60、等しい重み。

0.65 → 0.77 は、1 文字のチャネルを加えて統合した全体の結果です。しきい値の廃止、チャネルの粒度、統合それぞれの寄与は分けて制御していないため、効果のすべてを RRF によるものとは言えません。

スコアのしきい値をなくす

S0 と S1 は、スコアの計算と順位が同じで、絶対しきい値を適用するかどうかだけが違います。予算は 2,000、最大 4 ブロックで、収まらないブロックは飛ばして続けます。

戦略Hit@3コンテキストに核が 1 以上
S0 · しきい値 50.6518/31 ≈ 0.58
S1 · しきい値なし0.6520/31 ≈ 0.65

診断のための一例:「刀を買う」の根拠ブロック ch007_chunk_012 は、過去の検索の総合スコアが 3.39 で 2 位でしたが、しきい値 5 によって除外されました。このスコアは BM25 を基礎に、エンティティと隣接ブロックの加点も含むため、厳密には「過去の検索の総合スコア」であり、純粋な BM25 のスコアではありません。

関係エッジのチャネルを加える

2 系統の語彙検索を統合した RRF に、「関係エッジ」の順位をもう一つ加え、等しい重みで統合した場合(レポートの S4 / S6)。答えのある 31 問:

設定Hit@3
2 系統の語彙検索を統合した RRF0.77
関係エッジのチャネルを追加0.68

レポートによる低下の分析:よく登場する人物には多くの関係エッジがつながること、関係の記述が質問の用語と一致するとは限らないこと、等しい重みで統合するとそのノイズが前に押し上げられうること。これはその方式(特定の関係テキスト、一致の規則、等しい重みの統合)の結果で、グラフ検索そのものが無効だという意味には解釈できません。

証拠の予算と実際の回答予算ごとのコアチャンクの網羅とノイズ、同じ質問に対する三つの構成の回答の記録。

根拠の予算の比較

2 系統の語彙検索を統合した RRF、ブロック数の上限なし、予算を超えたら止める方式(収まらないブロックがあればそこで選択を止め、飛ばして下位のブロックで埋めることはしません)。評価セット全体の結果:

予算(推定トークン)すべての核が選ばれた問題数選ばれたブロックの平均数無関係なブロックの割合
2,00012 / 31 問2.345%
4,00021 / 31 問5.061%
8,00027 / 31 問10.679%
16,00030 / 31 問21.689%

「無関係なブロック」は、人手でラベル付けした core ∪ rel に属さないブロックのことです。ノイズの上限であり、ラベルがないことが必ず有害であることを意味しません。

4,000 の段階から 8,000 の段階では、核となるブロックが 6 個、無関係なブロックが 176 個増えました。コーパスは 59 ブロックしかないため、この結果を、より大きなコーパスでの推奨予算としてそのまま使うことはできません。

従来の戦略(しきい値 5、最大 4 ブロック、推定トークン 2,000)は、収まらないブロックを飛ばして埋め続けます。上限が 4 ブロックのままだと、予算を上げてもそれ以上は改善しません。

実際の回答と順位の記録

同じ実際の質問「魯智深と林冲はどのように知り合ったのか」に、設定ごとにモデルを 1 回ずつ呼び出した結果:

設定コンテキスト回答の記録引用の位置を特定できた数
従来の戦略 · 2,000結義の原文がない。根拠が足りず、insufficient を返した。—
RRF · 4,000結義の根拠があり、順位の高い野猪林の場面も入っていた。答えたが、第 7 回の結義と第 9 回の野猪林での再会を混ぜて書いた。1 / 3
RRF · 8,000予算を広げ、より多くの根拠が入る機会があった。今回の回答はより完全で、以前に見られた出来事の混同は再び現れなかった。街での出会い、林冲の父との面識、結義して兄弟になったこと。2 / 2

核となるブロック ch007_chunk_004 の順位:従来のチャネルでは 8 位、RRF では 4 位。RRF の 2,000 の段階では選ばれず、4,000 の段階では選ばれました。これは質問ごとのオフラインの記録で、上の実際の回答と同じ呼び出しの完全なトレースではないため、一本の因果の鎖としてつなぐことはできません。

三つの設定は、検索の戦略、予算、選択の規則が同時に違うため、効果を予算の増加だけによるものとは言えません。この問題で 4,000 から 8,000 の間にどのブロックが加わったかも、ブロックごとには確認していません。

「引用の位置を特定できた」は、引用先のブロックの中に一字一句そのまま見つかるという意味だけで、結論が意味の上で裏付けられたことを示すものではありません。各設定の呼び出しは 1 回で、繰り返し呼び出したときのばらつきは測っていません。

実装の説明・限界・出典検索実装の確認メモ、実験の限界と信頼性、数値の出典。

実装の説明

記事のシステム図は、以下の実装を簡略化したものです。2026 年 10 月時点のコード(非公開のリポジトリ、コミット 0d26b5c)で確認しています。

部分説明
現在の質問応答の主経路原文ブロックだけを検索します。2-gram・3-gram の語と 1 文字の語で、それぞれ BM25 の順位を作り、RRF(k = 60、等しい重み)で統合します。順位の順に丸ごとのブロックを入れ、ブロック数の上限に達するか、あるブロックが予算を超えたところで止めます。既定は推定トークン 8,000、最大 12 ブロックです。質問ごとに検索 1 回、モデル呼び出し 1 回で、回答のあとに引用を確認します。
従来の戦略(過去)BM25 の 1 チャネル(エンティティと隣接ブロックの加点を含む)、しきい値 5、最大 4 ブロック、推定トークン 2,000。収まらないブロックは飛ばして埋め続けます。
知識探索の別経路あらかじめ整理した人物のプロフィール、出来事・関係・状態の記録、章の要約を「知識」とし、原文ブロックを別の取得元として、それぞれに予算を設けます。知識の候補も、2 つの語彙の順位を RRF で統合して並べます。質問に見分けのつく人物が二人以上含まれるときは、人物の関与度による順位がもう一つ加わります。
出来事の骨格人物の経歴の道筋を聞かれる質問では、出来事の骨格がモデルを呼ぶ前に知識ベースによって決められ、コンテキストの一部としてモデルに渡されて、各段階の説明が書かれます。
関係の検索二人の人物の間の関係や共通の出来事、記録とその出典の検索は、記録の ID で読み出します。順位付けはせず、RRF のチャネルでもなく、自動でモデルのコンテキストに入ることもありません。
複数章の検索の設計知識探索の別経路の検索の設計は、第 7〜11 回を対象にした複数章のオフライン実験に基づきます。この記事は、その実験の数値を使っていません。
経緯初期の BM25 MVP(2061743)→ 回答中心のローカルグラフ(e32245a)→ Python の知識探索エンジン(0b36e0c)→ Relation Provider(Python / FalkorDB、d687c29)→ 今回確認した主経路のバージョン(0d26b5c)。これらは非公開のリポジトリのコミット識別子で、識別のためだけに示しており、リンクはありません。

検索でき、整理できることは、回答の正確さや完全さが安定して向上すると示したことと同じではありません。その点は実験では検証していません。

限界と信頼性

  • コーパスが小さく(59 ブロック)、評価セットも小さく(答えのある 31 問)、核となるブロックのラベル付けも一人です。1〜2 問の違いで数値が変わります。
  • ベクトル検索と語彙ベースの検索の完全な A/B 比較はないため、記事は「BM25 がベクトル検索より優れている」とは主張しません。
  • 実際の回答は設定ごとに 1 回だけの呼び出し(n = 1)で、繰り返しのばらつきはありません。回答は、筆者がラベルと原文に照らして判断したもので、第三者による採点ではありません。
  • 予算は文字数に基づく保守的な推定で、モデルが実測したトークンではありません。
  • 実験は再実行しておらず、独立した再評価もありません。
  • 関係エッジのチャネルの失敗は、その方式についてのことだけを示します。実装済みの関係の検索と出来事の整理が回答の品質にどれだけ貢献するかは、まだ検証が必要です。

数値の出どころ

これらの数値は、graphrag-shuihu プロジェクトでコミット済みの実験レポートとコードによるものです。このリポジトリは現在非公開のため、本サイトからはリンクしていません。この節が、数値と方法の公開された記録です。

この節が抜き出すのは方法、結果、限界だけで、内部レポートの全文やソースコードは写していません。この節が元のレポートの数値と食い違う場合は、元のレポートが優先され、この節を訂正すべきです。

BM25、N-gram、Analyzer、RRF の一般的な説明は、次の公開ドキュメントを参照してください:

根拠Elastic · BM25 similarity ↗OpenSearch · Text analysis ↗OpenSearch · N-gram tokenizer ↗Cormack ほか · SIGIR 2009 · RRF ↗