評価結果の正確性に関する問題を修正 - #298
Open
kiakiraki wants to merge 1 commit into
Open
Conversation
kiakiraki
marked this pull request as ready for review
July 20, 2026 09:50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
評価結果の正確性や再現性に影響する5件の問題を修正します。単なるリファクタリングではなく、誤った応答を評価する、入力件数と出力件数がずれる、集計値がNaNになる、異なる問題同士を比較する、といった評価結果そのものに影響する不具合が対象です。
1. LLM Judgeプリセットが最終回答を評価していない
問題
単一ターン用のLLM Judgeプリセットが
messages[0]/messages[1]を固定参照していました。evaluate_chat_responseが最終回答を除いた会話履歴をextra_infoに渡すため、system prompt付きデータではsystem文が「質問」、最初のuser発話が「回答」として扱われます。また複数ターンのデータでは、実際の最終生成結果lm_outputが評価対象になりませんでした。修正
lm_outputを使用lm_outputをそれぞれ使用主な対象
flexeval/preset_configs/Metric/assistant_eval_*_single_turn.jsonnetflexeval/preset_configs/PairwiseJudge/assistant_judge_*_single_turn.jsonnetflexeval/core/chat_dataset/chatbot_bench.pydocs/how_to/evaluate_with_llm_judges.mdテスト
system prompt、過去のuser/assistantターン、最終ターンにそれぞれsentinel文字列を入れ、レンダリング結果に最終質問・最終回答だけが含まれることを確認しています。
2. G-Evalの入力件数とラベル展開数が一致しない
問題
G-Evalは、各入力について有効ラベルごとのlog probabilityを取得します。しかしtext版は実際の端数バッチではなく設定値
batch_sizeを使って入力を展開していました。chat版は入力件数を参照せず、ラベル数を基準に展開していました。その結果、端数バッチや「バッチ件数 > ラベル数」の場合に件数不一致が発生し、バックエンドによっては
IndexErrorでクラッシュします。緩いテストスタブではzipによって余分な要素が切り捨てられ、問題が検出されませんでした。修正
evaluator_inputs件数を基準に入力とラベルを展開ValueError主な対象
flexeval/core/metric/llm_geval_score.pyテスト
text/chatの両方について、端数バッチ、バッチ件数がラベル数を上回るケース、LMが不正な件数を返すケースを追加しています。
3. Bradley-TerryスコアがNaNになる
問題
旧実装には次の2つの問題がありました。
log(0)からNaNが全モデルへ伝播するさらに、全敗モデルを含む場合など、勝敗の有向グラフが強連結でなければBradley-Terryの有限MLE自体が存在しません。このケースを数値計算だけで処理しようとしていたため、無効なスコアが正常結果として返っていました。
修正
win_rateと完了済みのjudge結果は返すため、高額なLLM judge呼び出し結果を失わないeps引数は後方互換のため受理しつつ、指定時にFutureWarningを出す非動作パラメータとして非推奨化主な対象
flexeval/core/pairwise_comparison/scorer/bradley_terry.pyflexeval/core/evaluate_pairwise.pyテスト
1勝のみの2モデル、正常な相互対戦に全敗モデルを追加したケースを拒否し、強連結なサイクルでは有限スコアを返すことを確認しています。また、1つのスコアラーが失敗しても他のスコアと対戦結果が返ることを確認しています。
4. Pairwise評価が行番号だけで出力を対応付ける
問題
モデル間で出力件数だけを確認し、各行が同じ問題に対応しているかを検証していませんでした。並び順が異なるJSONLを渡しても評価が正常終了し、異なる問題の回答同士から無意味なスコアが生成されます。
フレームワーク全体には共通のinstance IDがないため、完全なID照合ではなく、利用可能な入力情報を使った検証が必要です。
修正
referencesとextra_info/task_inputsをモデル間で比較主な対象
flexeval/core/evaluate_pairwise.pyテスト
行順が異なるケース、片方だけidentity情報がないケースを拒否し、assistant履歴だけが異なる正当なケースは許可することを確認しています。
5. Few-shot適用時にキャッシュ済み会話が破壊的に変更される
問題
few-shotメッセージを追加する際、datasetが返した
ChatInstance.messagesをin-placeで置換していました。同じインスタンスをキャッシュして返すdatasetでは、評価を繰り返すたびにメッセージが累積します。--num_repeatsは浅いコピーを使うため、この問題の影響を受けます。修正
ChatInstanceをdeep copyしてからメッセージを追加__getitem__で防御的にコピー主な対象
flexeval/core/evaluate_chat_response.pyflexeval/core/chat_dataset/chatbot_bench.pyテスト
同じキャッシュ済みインスタンスを使って評価を2回実行し、元のmessagesが変更されず、2回の出力も一致することを確認しています。ChatbotBenchについても、取得したインスタンスのリスト変更が次回取得へ残らないことを確認しています。