fix: count gate INFRA guard numerator by unit not record
This commit is contained in:
+26
-6
@@ -259,6 +259,23 @@ def _infra_question_ids_from_db(
|
||||
}
|
||||
|
||||
|
||||
def _count_infra_units(units: list[QuestionUnit], infra_qids: set[str]) -> int:
|
||||
"""统计含 INFRA record 的 unit 数(一个 unit 任一题 INFRA 即计 1)。
|
||||
|
||||
使护栏分子与分母(r.total,unit 粒度)同口径:AR pair 一 unit 含两 record,
|
||||
逐 record 计数会放大分子致 gate_guard_err 误触发,破坏 unit 粒度一致性
|
||||
(核心算法保真 #5/#6)。
|
||||
|
||||
参数:
|
||||
units: 当前块的单元列表(single 或 AR pair)。
|
||||
infra_qids: 本 run 中 stop_reason 属 INFRA 故障族的 question_id 集合。
|
||||
|
||||
返回:
|
||||
含至少一题 INFRA 的 unit 数。
|
||||
"""
|
||||
return sum(1 for u in units if any(q.question_id in infra_qids for q in u.questions))
|
||||
|
||||
|
||||
def _candidate_correctness_from_db(
|
||||
log: HarnessLog,
|
||||
run_id: str,
|
||||
@@ -332,11 +349,12 @@ async def _resolve_baseline_block(
|
||||
if miss_units:
|
||||
miss_questions = flatten_units(miss_units)
|
||||
r_b = await run_inference(miss_questions, run_id=run_id, skills_dir=base_skills_dir)
|
||||
# 护栏错误计数与 INFRA 判定口径一致:error + parse_error 都计入,
|
||||
# 使 parse_error 风暴同样能触发 gate_guard_err 熔断(不被绕过)。
|
||||
errors_inc = sum(r_b.stop_reason_counts.get(reason, 0) for reason in _INFRA_STOP_REASONS)
|
||||
denom_inc = r_b.total
|
||||
infra_qids = _infra_question_ids_from_db(log, r_b.run_id, miss_questions)
|
||||
# 护栏分子与分母(r.total,unit 粒度)同口径:含 INFRA record 的 unit 计 1,
|
||||
# 避免 AR pair(一 unit 两 record)逐 record 计数放大分子致误触发;仍涵盖
|
||||
# error + parse_error(_infra_question_ids_from_db 口径),parse_error 风暴不被绕过。
|
||||
errors_inc = _count_infra_units(miss_units, infra_qids)
|
||||
denom_inc = r_b.total
|
||||
fresh_per_q = _candidate_correctness_from_db(log, r_b.run_id, miss_questions)
|
||||
fresh_units = unit_correctness_view(miss_units, fresh_per_q)
|
||||
# 只回写非 INFRA 单元;INFRA 单元不入缓存(不永久污染基线快照)
|
||||
@@ -382,8 +400,10 @@ async def _run_candidate_block(
|
||||
questions = flatten_units(units)
|
||||
r_c = await run_inference(questions, run_id=run_id, skills_dir=cand_dir)
|
||||
c_per_q = _candidate_correctness_from_db(log, r_c.run_id, questions)
|
||||
# 护栏错误计数与 INFRA 判定口径一致:error + parse_error 都计入。
|
||||
errors_inc = sum(r_c.stop_reason_counts.get(reason, 0) for reason in _INFRA_STOP_REASONS)
|
||||
infra_qids = _infra_question_ids_from_db(log, r_c.run_id, questions)
|
||||
# 护栏分子与分母(r.total,unit 粒度)同口径:含 INFRA record 的 unit 计 1
|
||||
# (见 _count_infra_units),涵盖 error + parse_error。
|
||||
errors_inc = _count_infra_units(units, infra_qids)
|
||||
return c_per_q, errors_inc, r_c.total
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user