Skip to content

eval: test blind LLM selection over independent channels #21

Description

@lipluscodex

Lin: ## 目的

Issue #19 / PR #20でBM25 lexical laneとanchored edge-only relation laneを独立trace IDで返せるようになった。developmentではrelation MRRが0.5から1.0へ改善し、trace分離とfeedback帰属も成立した一方、2-node fixtureのdirect targetはBM25 rank 2、v1 path matcherはobserved stepの追加属性を投影せず完全一致したため、12 gate中10件で停止した。

本Issueではv1 artifactと結果を変更せず、goldを見ないLLMが両laneの実データを読んで使用traceを選べるかをversion 2の独立実験として検証する。固定classifier、cross-lane score fusion、gold cohortによるoracle routingは実装しない。

仮説

  • H1: blind LLM judgeはdirect / directional-negativeではlexical evidenceを、relation lookupではrelation evidenceを選び、development 4ケースを全件正しく選択できる。
  • H2: 3 independent judgesのmajority choiceは各caseで一意に定まり、単独judgeの偶然に依存しない。
  • H3: versioned path matcherがobserved stepをsource_id / target_id / edge_typeへ投影すれば、実際に取得済みのrelation pathを正しく一致判定できる。
  • H4: development gate通過時だけ、fresh 3 judgesで未開封holdoutを一度評価し、同じgateを満たす。

非変更境界

  • v1のmanifest、fixture、gold、runner、result、10/12判定をbyte-for-byte不変に保つ。
  • 既存search()search_channels()の順位規則、default、feedback規則を変更しない。
  • search_channels()をvalidatedまたはdefaultと記録しない。
  • 新D1抽出は行わない。v1でread-only取得・凍結済みのdevelopment / holdoutを再利用する。
  • v1 holdoutはv2 development gateが通るまで実験対象として開封しない。具体的にはholdout packet生成、search_channels()実行、judge提示、v2 evaluatorによるgold照合を禁止する。
  • v1 artifact不変性を証明するhash計算、schema検証、既存contract testによるprocess内readは許可する。ただし内容を人またはjudgeへ表示せず、selection判断へ使用しない。この検証readはholdout open countへ含めない。

Blind judge packet

v2 packet generatorは各caseについてsearch_channels()を一度実行し、judgeへ次だけを渡す。

  • opaque case ID
  • query
  • channel semantics: lexicalは明示一致、relationはedge経由の関連候補、lane間scoreは比較不能
  • lexical / relationの独立trace ID
  • 各hitのlane内rank、node ID、title、content、source metadata
  • relation hitのendpoint / edge type path
  • agreement node IDs
  • 出力schema

packetとjudge promptには次を含めない。

  • cohort / intended channel
  • expected node / acceptable rank / gold path
  • gate、prior result、v1の成功・失敗説明
  • filenameや説明からgold roleを推測できるラベル

judgeはtool、repository、web、goldを参照せず、packetだけから次のJSONを返す。

  • case_id
  • selected_channel: lexical / relation / abstain
  • trace_id: 選択laneのtrace ID、abstain時null
  • node_id: 選択hit、abstain時null
  • concise rationale

retrievalは使用を意味しない。judgeが実際に回答根拠として採用する一つのtrace / nodeだけを選ぶ。lane間scoreの大小は根拠にしない。

Judge isolationと集約

  • development judgeは3 independent fresh Codex agentsとする。
  • 各agentはfork_turns=noneのself-contained promptで起動し、このIssueの会話履歴、repo、gold、他judge出力を受け取らない。
  • judge promptはresult観測前にfreezeする。
  • 3 judgesは同じpacket集合を独立に判定する。
  • (selected_channel, node_id)の過半数をcase majorityとする。過半数なしはabstain扱い。
  • trace IDは選択channelのpacket traceと一致し、そのnodeが同traceのhitに含まれることをvalidatorで要求する。
  • model / agent種別、実行時刻、raw response、parse結果を保存する。

Version 2 path matcher

v1 matcherを変更しない。v2 evaluatorはobserved stepからsource_idtarget_idedge_typeだけを順序保持で投影し、同じ3 fieldのgold pathと比較する。edge_weightfactualityなどのexplanation属性は一致判定から除外するが、raw observed pathには保存する。zero-hop拒否は維持する。

Result-free freeze

実装、prompt、packet schema、response schema、3-judge集約、path projection、development / holdout gate、stop rule、testsを一つのfreeze commitとしてpushする。freeze commitにはpacket、judge response、development result、holdout resultを含めない。

freeze後の実行順は固定する。

  1. development packetを一度生成
  2. fresh 3 judgesへ同じpacketを独立提示
  3. raw responsesを上書き不可で保存
  4. development resultを一度生成
  5. gate不合格なら停止し、holdout packetを生成しない
  6. gate通過時だけholdout packetを一度生成
  7. developmentと異なるfresh 3 judgesで一度評価
  8. holdout resultを一度生成して終了

Development gate

全条件を要求する。

  1. packetとpromptに全禁止field / gold値が存在しない
  2. 全judge responseがschema-validで、trace / node membershipが正しい
  3. 全4 caseでmajorityが成立する
  4. 全4 caseでmajority nodeがexpected nodeと一致する
  5. direct 2件とdirectional-negative 1件でmajority channelがlexical
  6. relation 1件でmajority channelがrelation
  7. relation majority hitのprojected pathがgold endpoint / edge typeと一致しzero-hopでない
  8. 各judgeが最低3/4 caseでexpected nodeを選ぶ
  9. lane scoreの大小をselection ruleとして使用しない
  10. packet生成前後とjudge result評価ではedge weight不変
  11. v1 artifact hashesがorigin/mainのPR feat: add independent retrieval channels #20 merge時と一致
  12. packet / response / resultの上書きを拒否する

補助指標としてjudge別accuracy、majority accuracy、channel accuracy、abstain率、inter-judge agreement、selected-node MRR、union oracleとの差を保存する。4-case minimal fixtureのため、採否は個別hard gateを正本とする。

Holdout gate

Developmentの全gate通過時だけ、v1未開封holdoutをfresh 3 judgesで一度評価する。同じ12 gateを全通過した場合だけ「blind LLM selection protocol supported on the frozen minimal holdout」と記録する。

これはNGR一般性能、任意LLMへの一般化、production default変更、learned router採用を意味しない。holdout観測後のprompt、packet、judge数、集約、matcher、threshold、gate変更、result上書き、再実行を拒否する。

実装境界

  • Python標準ライブラリのみ
  • judge呼び出し自体をcoreやCIに埋め込まない
  • repoにはpacket生成、response検証、集約、scoring、freeze auditを実装する
  • 実LLM呼び出しは親orchestratorが隔離agentとして実行し、subagent実装者へ結果前情報を漏らさない
  • CIはschema、gold非漏洩、path projection、集約、stop rule、hash freeze、synthetic responseでの決定論を検証し、実LLMの品質値を合格閾値として再実行しない
  • 陰性結果もversioned artifactとして保存する

完了条件

  • goldを含まない両lane packetを生成できる
  • fresh blind LLM judgesが独立trace ID / node IDを選択できる
  • majority selectionと実goldを観測後にだけ照合できる
  • development gateと必要時のone-time holdout gateを機械的に再現できる
  • v1 artifacts、core API、defaultを変更しない

Metadata

Metadata

Labels

doneImplementation phase finished; awaiting orchestration.enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions