Skip to content

MultipleChoice評価でfew-shotリーク検査が機能しない問題を修正 - #293

Open
kiakiraki wants to merge 1 commit into
mainfrom
fix/few-shot-leak-check-multiple-choice
Open

MultipleChoice評価でfew-shotリーク検査が機能しない問題を修正#293
kiakiraki wants to merge 1 commit into
mainfrom
fix/few-shot-leak-check-multiple-choice

Conversation

@kiakiraki

@kiakiraki kiakiraki commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

概要

MultipleChoice 評価で few-shot リーク検査(num_trials_to_avoid_leak)が構造的に無効になっていた問題を修正します。

問題

FewShotGenerator.__call__few_shot_generator/base.py)は、サンプルした few-shot 例の inputs が評価インスタンスの eval_inputs と一致した場合に再サンプリング・最終的に ValueError を発生させるリーク検査を持っています。

しかし evaluate_multiple_choice.py だけは、プロンプト埋め込み用に "choices" キーを注入した後の template_inputs を検査に渡していました:

template_inputs = {**eval_instance.inputs, "choices": eval_instance.choices}
few_shot_instances = few_shot_generator(template_inputs)  # ← "choices" 入りの dict

比較相手の sampled.inputs"choices" キーを含まないため、同一インスタンスでも dict の等価比較が絶対に成立せず、リーク検査は常に「リークなし」を返す no-op になっていました。評価インスタンスと同じ問題(正解付き)が few-shot 例としてプロンプトに混入しても、エラーにも警告にもならず精度が水増しされ得ます。

evaluate_generation.py / evaluate_chat_response.py は未加工の inputs を渡しており、この問題は MultipleChoice 経路のみです。

修正

few-shot 生成器には "choices" 注入前の eval_instance.inputs を渡すようにしました(evaluate_generation.py と同じ構造)。"choices" の注入はプロンプトテンプレート用の template_inputs 構築時のみ行います。

再現確認方法

リークが必ず発生する状況(few-shot プール=評価データセット、num_shots = データセット全件)を作ると:

few_shot_generator = RandomFewShotGenerator(
    dataset=DummyMultipleChoiceDataset(),
    num_shots=len(DummyMultipleChoiceDataset()),  # 評価インスタンスが必ず shots に含まれる
    num_trials_to_avoid_leak=3,
)
evaluate_multiple_choice(..., few_shot_generator=few_shot_generator, ...)
  • 修正前: ValueError にならず評価が最後まで「成功」する(リーク未検出。答えがプロンプトに含まれるため accuracy は 1.0 になる)
  • 修正後: Few-shot instance has the same inputs as the evaluation instance, which indicates a data leak.ValueError が発生する

この検証をそのまま回帰テスト test_evaluate_multiple_choice_detects_few_shot_leak として追加しています(修正コミットを外すと failed になることを確認済み)。

影響範囲

  • 評価値への影響: リークが実際に起きていない設定では、few-shot 例の選択・プロンプト内容とも一切変わらず、評価結果の数値は変化しません_sample_instanceseval_inputs をサンプリングに使用していないため)。
  • 挙動変化: few-shot プールと評価セットが実際に重複している設定は、これまで黙って完走していたものが ValueError で失敗するようになります。これは num_trials_to_avoid_leak 本来の設計通りの挙動です。
  • 同梱プリセットへの影響: なし。preset_configs/EvalSetup/*multiple_choice/ の全プリセットは few-shot に train、評価に test/validation を使う分離構成であることを確認済みです。
  • カスタム実装への影響: _sample_instanceseval_inputs["choices"] を参照するカスタム FewShotGenerator を使っている場合、このキーは渡されなくなります(Generation / ChatResponse 経路は元々未加工 inputs のみを渡しており、本修正で全経路の契約が統一されます)。
  • Generation / ChatResponse / Perplexity 経路には変更ありません。

🤖 Generated with Claude Code

few_shot_generatorに"choices"キーを注入したtemplate_inputsを渡していた
ため、サンプル済みインスタンスのinputs("choices"を含まない)との等価
比較が絶対に成立せず、num_trials_to_avoid_leakによるリーク検査が
no-opになっていた。evaluate_generation.pyと同様に未加工の
eval_instance.inputsを渡すことで検査が機能するようにする。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kiakiraki
kiakiraki marked this pull request as ready for review July 19, 2026 01:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant