AI Agent 实战避坑 03|AI 的“我修好了“不能信:置信度校准入门
AI Agent 实战避坑 03|AI 的"我修好了"不能信:置信度校准入门
让 Developer Agent 修 100 个 bug。每次修完它都会说一句结论,分三档:
- “已修复,问题解决了。”
- “应该修好了,建议验证一下。”
- “我做了修改,但不确定是否完全解决。”
直觉上你会觉得:第一档最靠谱,第三档最不靠谱。但实际跑完 Reviewer 验证后,数据长这样:
AI 自我评估 总次数 实际通过 通过率
────────────── ────── ──────── ──────
"已修复" 62 38 61%
"应该修好了" 27 19 70%
"不确定" 11 8 73%
发现了吗?最谦虚的那组反而通过率最高。
AI 的自信程度和它的正确率之间,几乎没有正相关关系。这不是个别模型的问题,而是当前 LLM 的结构性缺陷。
为什么 AI 的自信不等于准确
三个根因:
1. 模型在生成时看不到真实世界反馈
当 AI 写完代码说"已修复"时,它既没有跑测试,也没有编译代码,更没有在真实环境验证。它对"修好了没有"的判断,纯粹基于文本层面的推理:“我改了相关的代码行,改动看起来合理,所以应该修好了。”
这相当于一个外科医生闭着眼睛做完手术,然后根据"手感不错"来判断手术是否成功。
2. RLHF 训练奖励自信
在训练阶段,标注者倾向于给确定性的回答打高分。"已修复"听起来比"我不确定"更 helpful、更 professional。于是模型学到:表达确定 → 高分,表达不确定 → 低分。
训练时的隐含 reward:
"我已经完成了修复" → 标注者觉得 helpful → 高分
"我不太确定改对没有" → 标注者觉得不可靠 → 低分
模型学到的策略:
不管修没修对,都说"已修复" → 期望 reward 最大化
3. 模型不会区分"我知道"和"我觉得我知道"
人在不确定时会有"元认知"——知道自己不知道。当前的 LLM 没有可靠的元认知能力。它无法准确评估自己输出的正确概率。
置信度校准:让 AI 的"把握"变得可信
既然 AI 的自我评估不可靠,我们需要从外部建立一套置信度体系。
方法一:基于检查命令的硬置信度
不问 AI “你确定吗”,用命令输出做客观判定:
confidence_checks = {
"syntax": "python -m py_compile {file}", # 能编译 = +20%
"import": "python -c 'import {module}'", # 能导入 = +20%
"test": "pytest {test_file} -x", # 测试过 = +30%
"no_stub": "grep -c 'pass$\\|TODO' {file}", # 无空壳 = +15%
"type": "mypy {file} --no-error-summary", # 类型对 = +15%
}
def calculate_confidence(file_path, test_path):
score = 0
for name, cmd in confidence_checks.items():
exit_code = run(cmd.format(file=file_path, ...))
if exit_code == 0:
score += weights[name]
return score # 0-100 的硬置信度
这种置信度不依赖 AI 的自我评估,完全基于可观测的事实。一个文件能编译、能导入、测试通过、没有空壳、类型检查过——它"被修好了"的概率确实高于一个只能编译的文件。
方法二:基于 Eval 历史的统计置信度
如果你的系统跑了足够多的 eval,可以建立统计模型:
历史数据告诉你:
当 Agent 修改 < 5 行时,一次通过率 = 85%
当 Agent 修改 5-20 行时,一次通过率 = 62%
当 Agent 修改 > 20 行时,一次通过率 = 34%
当任务涉及并发/异步时,一次通过率 = 28%
当任务是纯逻辑 bug 时,一次通过率 = 76%
基于这些历史分布,你可以在 Agent 完成任务时,根据任务特征自动标注预期置信度——不需要问 Agent 本身。
方法三:多路投票
同一个任务让 N 个 Agent(或同一个 Agent 跑 N 次)独立完成,看结果一致性:
3 次运行结果:
Run 1: 修改了 line 45, 52
Run 2: 修改了 line 45, 52
Run 3: 修改了 line 45, 52, 78
投票结果:
line 45, 52 的修改 → 3/3 一致 → 高置信
line 78 的修改 → 1/3 → 低置信,需要人工审查
多路投票的成本是 N 倍 token,但在高风险场景(比如生产环境的配置变更评估),这个成本完全值得。
校准实战:配置表风险评估系统
举一个真实场景。配置表风险评估系统需要判断一次配置变更是"高风险"还是"低风险"。AI 给出判断后,我们怎么知道这个判断靠不靠谱?
第一版:让 AI 自己打分
Prompt: "评估以下配置变更的风险等级(高/中/低),并给出你的置信度(0-100%)。"
结果:
AI 标"低风险, 95%置信" → 实际引发线上事故 × 2
AI 标"高风险, 90%置信" → 实际完全无害 × 8
结论:AI 的自标置信度没有参考价值
第二版:基于规则的客观置信度
def assess_config_risk(change):
risk_signals = {
"touches_money_field": change.affects(["price", "cost", "reward"]),
"changes_threshold": change.modifies_numeric_threshold(),
"affects_all_users": change.scope == "global",
"has_rollback_plan": change.rollback_steps is not None,
"similar_change_safe": history.similar_changes_were_safe(change),
"change_size_small": change.diff_lines < 5,
}
risk_score = sum(
weight * signal
for signal, weight in risk_signals.items()
)
return {
"risk_level": "high" if risk_score > 0.7 else "medium" if risk_score > 0.4 else "low",
"confidence_basis": risk_signals, # 透明展示判断依据
}
关键区别:第二版的"置信度"不是 AI 说的,而是基于可枚举的客观信号计算的。用户看到的不是"AI 觉得风险低",而是"这次变更不涉及金额字段、影响范围是局部、历史类似变更都是安全的——因此风险低"。
效果对比:
误报率 漏报率 用户信任度
第一版(AI自评) 35% 12% "不太敢信"
第二版(规则信号) 15% 8% "至少知道它为什么这么判断"
置信度的 UX 设计
有了可靠的置信度,还需要设计用户怎么看到它。
坏的展示方式:
⚠️ 风险评估:低风险(置信度 87%)
用户心想:“87% 是高还是低?我该信吗?”
好的展示方式:
⚠️ 风险评估:低风险
判断依据:
✅ 不涉及金额相关字段
✅ 影响范围:仅 activity_config 表
✅ 历史 12 次类似变更均无事故
⚠️ 变更行数 8 行(中等)
建议:可直接发布,建议灰度 10% 观察 30 分钟
把黑盒的"87%"拆解成用户能理解的信号列表。用户不需要相信一个数字,他们需要看到判断的理由,然后自己决定是否认同。
什么时候可以信 AI 的判断
也不是说 AI 的输出永远不能信。信任的前提是你能回答三个问题:
┌───────────────────────────────────────────────────┐
│ 信任三问: │
│ │
│ 1. 这个判断有独立验证手段吗? │
│ 有 → 验证后再信 │
│ 没有 → 当参考,不当决策依据 │
│ │
│ 2. 历史上同类判断的准确率是多少? │
│ > 90% → 可以半自动(AI判断 + 人抽检) │
│ 70-90% → 必须人工确认 │
│ < 70% → 只能当线索,不能当结论 │
│ │
│ 3. 判断错误的代价是什么? │
│ 低(格式问题)→ 可以容忍一定误差 │
│ 中(代码风格)→ 需要抽检 │
│ 高(安全/资金)→ 必须独立验证 │
└───────────────────────────────────────────────────┘
不要让做手术的人自己判断手术成功了没有。AI 的输出需要外部验证体系——它的自信不是你的置信。
更多推荐



所有评论(0)