GrooveSeek

Semantic search over a Markdown knowledge base, served over MCP.

View the Project on GitHub alphabet-h/grooveseek

6. golden セットを引用しているコーパスを報告する。ただし引用 1 件では報告しない

背景と課題

kb-mcp eval は golden query セットに対して retrieval を測る。測定対象の ナレッジベースが、その持ち主がノートを書く場所でもある場合 — 個人やチームの KB では普通のこと — golden query の文面を逐語で引用したノートは、その query に対する 最強の一致になる。上位を占め、ラベル付けされた正解を押し下げる。

参照コーパスで実際に観測された: ある query の文面を引用した当日書かれたノートが 1 位を取り、expected の文書を 4 位まで落とした。集計 recall は保たれたので何も 失敗せず、原因が分かったのは人がたまたま per-query の行を読んでいたからである。 評価について書くほど評価は通りにくくなるのに、それを知らせるものが無い。

厄介なのは、この観測には原因が 2 つあり、見分けがつかないことだ。query を逐語で 含む文書は、テストについて書いたノートか、そうでなければ query の出典である。 後者ならその文書はその query の expected に入るべきで、間違っているのは golden ファイルの方になる。区別できるのは golden を書いた本人だけである。

判断基準

検討した選択肢

各案を参照コーパス (662 文書 / 26 golden query、既知の混入は上記のノート 1 件のみ) で測った。指標は「健全なコーパスで何件発火するか」である。

  1. embedding 類似度: query 文面と高類似 かつ expected でない hit を報告する。
  2. 逐語引用・1 件で報告・top_k のみ: top_k の hit の本文が query 文面を 逐語で含んでいたら報告する。
  3. 逐語引用・1 件で報告・コーパス全体: 同じ判定を、検索結果ではなく索引済みの 全文書に対して行う。
  4. 逐語引用・distinct な query 2 件以上・コーパス全体。

決定

案 4。

案 1 は引くべき閾値が存在しない。上位 hit はどれも query と高類似であり — それが retrieval というものである — 条件は「検索結果を報告する」にほぼ等しい。

案 3 は 8 件を検出し、全部が偽陽性だった。理由は調整の問題ではなく構造的である: golden query はしばしばトピック名そのもの (cross-encoder / torch.compile / Qwen3.5-Omni) であり、トピック名はそのトピックを解説する文書に逐語で出てくる。 逐語一致 1 件は「そのトピックについての文書」の形である。

案 2 は 0 件だった。top_k に絞っても偽陽性は減らない (構造上それらは上位 hit である) 一方、規則だけが弱くなる。同じコーパスでの実測では、唯一実際に混入 していたノートは、引用している 2 つの query のうち片方の top_k には入り、 もう片方では 1〜10 位すべてが単一文書の chunk で埋まっていて入らなかった。

案 4 は ちょうど 1 件を検出し、それは実際に golden セットを記述していたノート だった — golden query の設計を説明しながら query 文字列をバッククォートで引用して いる文書である。複数の golden query を引用するのは「テストについてのノート」の 形であり、案 3 を使い物にならなくした母集団ときれいに分離できる。

所見は示唆する原因ではなく測った事実で名付け (golden-queries-quoted)、 メッセージには 2 つの原因を両方書く。これは kb-mcp doctor と同じ規律である: 観測を報告し、直し方を挙げ、何も変更しない。

影響