如何评估大模型的幻觉与事实性?常见指标有哪些局限?
简化版
幻觉评估要把回复拆成可核验的原子声明,再判断每条是否被给定证据或权威来源支持,分别统计事实精确率、覆盖率、不可验证比例。TruthfulQA、FActScore、NLI、LLM Judge 各自只覆盖部分问题,不能用单个总分代表所有领域的事实错误。核心认知:幻觉评估不是”整段看起来像不像真的”,而是”声明拆开、证据对齐、逐条验证”。
详细版
事实性至少两类:内在一致性(回答不违背给定上下文)、外在事实性(声明符合现实世界可靠来源)。摘要、RAG、开放问答的证据边界不同,要分别设计评测。
长答案按原子事实拆分:支持的声明数 ÷ 可核验声明数 = 类似事实精确率;同时测答案是否遗漏关键事实。自动核验依赖检索召回、证据质量、Judge 能力——检索不到 ≠ 一定是错的。
完整版教学
易错点:检索器没有找到证据,只能标成“当前证据下不可验证”;除非存在矛盾证据,不能直接把它算成事实错误。
一、先给幻觉分类(别泛指”错误”)
「幻觉」常被泛指任何错误,但工程评估要分类才能定位根因:
| 类型 | 例子 | 根因可能在 |
|---|---|---|
| 与上下文矛盾 | 材料说 A,答成 B | 生成/忠实度 |
| 无证据添加 | 编了材料里没有的细节 | 语言先验 |
| 现实事实错误 | 违背世界事实 | 模型知识 |
| 错误引用 | 引了不支持结论的来源 | 检索/生成 |
| 数字错误 | 算错或编数字 | 推理 |
| 不当确定性 | 不确定的事说得很肯定 | 校准 |
分类后才知道该调检索、Prompt、模型知识还是生成策略。
二、原子事实方法(FActScore 类,带计算)
一段长回答含多个声明,整段只给对错会丢细节。原子化方法:
回答拆成最小可独立验证的事实:
声明1:"爱因斯坦生于 1879 年" → 检索证据 → 支持 ✓
声明2:"他发明了晶体管" → 检索证据 → 不支持 ✗
声明3:"他获得诺贝尔奖" → 支持 ✓
事实精确率 = 支持数 / 可核验声明数 = 2/3 ≈ 0.67
注意:原子化和证据判定本身也会出错,需要抽样人工核验。
同样的「拆开再逐条对证据」思路也能用在运行时:数据分析 Agent 里,结论中的每个数字按步骤回查取数结果、因果还要校验时序,见「AI 给出的归因结论怎么校验,防止编造数据和因果?」。
三、常见数据集与指标的局限
TruthfulQA:关注"会诱发人类常见错误观念"的问题(测模型是否模仿错误说法)
⚠️ 它不是通用知识覆盖测试,分高不代表全知识域可靠
摘要任务:用事实一致性分类器(内在一致性)
RAG:测回答声明是否由检索上下文支持
引用任务:测引文是否真的蕴含对应结论
关键:不同指标的分母和任务定义不同,分数不能直接混合(TruthfulQA 的分和 FActScore 的分不是一回事)。
四、自动评分的风险
NLI 模型:可能不懂领域事实
LLM Judge:受表达风格、错误参考答案、候选中的提示注入影响
检索式核验:会把搜索引擎的偏差带进评估
→ 高风险领域用权威资料 + 专家复核,记录证据版本和访问时间
五、必须同时测有用性(否则”拒答刷分”)
一个隐蔽陷阱:让模型全部回答”不知道”,事实错误率能刷到很低,但完全没用。所以要同时测:
事实精确率(答对的比例)+ 覆盖率(该答的答了没)
+ 正确拒答(该拒的拒了)+ 过度拒答(能答的误拒了)
并按【问题是否可回答】分组
只看事实精确率会奖励「什么都不敢答」的无用模型。
六、怎样汇总并校准事实性指标
先保留声明级四分类:supported / contradicted / unverifiable / subjective,再按回答和任务聚合。分母必须写清,例如事实精确率可取 supported / (supported + contradicted),但是否把 unverifiable 计入风险要由 grounded 任务协议决定,不能在看到结果后调整。
自动 Judge 应在人工黄金集上给出混淆矩阵。假设 200 条人工判定的“不支持”声明中,Judge 检出 170 条,同时把 800 条受支持声明中的 40 条误报为不支持,则召回率为 170/200=85%,误报率为 40/800=5%;最终模型分数应同时披露评分器误差,而不是把 Judge 标签当无噪声真值。
七、常见误区与追问
- 误区:幻觉评估看整段像不像真的。 要拆成原子声明逐条对齐证据验证,不是看整体观感。
- 误区:一个事实性分数能代表所有领域。 TruthfulQA/FActScore 各覆盖部分,分母和任务不同不能混合。
- 误区:只看事实精确率就够。 全答”不知道”也能刷低错误率,要同时测覆盖率和过度拒答。
- 误区:检索不到就判为错。 检索召回有限,检索不到不等于事实错误,要区分”不可验证”。
- 误区:TruthfulQA 分高=知识全面可靠。 它专测”是否模仿人类错误观念”,不是通用知识覆盖。
- 追问:事实性分哪两类? 内在一致性(不违背给定上下文)、外在事实性(符合现实权威来源)。
- 追问:FActScore 怎么算? 拆原子事实、逐条检索判定支持、支持数/可核验数(如 2/3≈0.67)。
- 追问:为什么要同时测有用性? 否则全拒答就能刷低幻觉率,要配覆盖率和过度拒答,按可否回答分组。
八、加强记忆
幻觉评估记「声明拆开、证据对齐、逐条验证」,不是「整段像不像真的」:先分类(上下文矛盾/无证据添加/事实错/错误引用/数字错/不当确定性)、原子事实方法算事实精确率(支持数/可核验数)、同时测覆盖率和过度拒答(否则全拒答刷分)。核心局限钉死:不同指标(TruthfulQA/FActScore)分母任务不同不可混合、TruthfulQA 测的是”模仿人类错误观念”非通用知识、检索不到≠错、自动评分有偏要人工校准。高风险领域用权威资料+专家复核。
项目实战落地
项目里怎么做的
《AI Agent旅游行程智能规划平台》的行程由 Agent 排出来,每一版排完都跑 14 条代码硬校验。其中有一组专门核对「行程和事实对不对得上」,拿的是点位库里的开放信息:
| 规则编码 | 核对什么 | 依据的事实 |
|---|---|---|
POI_CLOSED_DAY | 点位排在了闭馆日 | 点位的开放星期(「每日」或「周二,周三……」) |
POI_CLOSED_SEASON | 点位排在了闭园季 | 点位的闭园季区间(如「12-01~02-28」) |
POI_OUT_OF_HOURS | 开始早于开园,或结束晚于闭园 | 点位的开放时段 |
LAST_ENTRY_MISS | 开始时间晚于最晚入场 | 点位的最晚入场时间 |
金额同样不信模型:预算超支按每条明细的预估花费由代码累加判定,模型自报的价格不参与。命中的每一条问题写一行 trip_check:
check_code 规则编码,例如 POI_CLOSED_DAY
problem_type 预算 / 时间 / 距离 / 合规 / 完整性
severity 严重 / 一般
problem_desc 点名到哪一天、哪一项,闭馆日的格式是:
第 N 天(日期 星期)「点位名」安排在 周X,该点位开放星期为「……」,当天闭馆。
related_day_id / related_item_id 关联到具体的日程和明细
运营统计看板再按规则编码汇总:每条规则命中多少次、其中严重几次、一般几次、占全部命中的比例,命中多的排在前面。
为什么这样取舍
- 能对着库核对的事实,不交给模型自评。 开放星期、闭园季、开放时段都在点位表里,查库、比大小就能判定,结果可复现,同一版行程校验两次结论一样。
- 问题要能统计。 每条问题带固定的规则编码,看板才能按编码统计「哪类错误最常出现」;模型自由写出来的描述凑不出稳定的口径。
- 描述要点名。 问题描述写到哪一天、哪一项、依据是什么,页面上能直接定位,反思重排时也能直接变成改进要求。
判据为什么用代码而不是让模型评,见「反思环怎么判定「够好了」:模型自评还是代码硬校验?」。
面试官还会追问
- 预算超支的上限是怎么算的?规则模板里的预算容差是怎么参与进来的?
- 闭园季写成「12-01~02-28」这种跨年区间时,代码怎么判断某一天在不在闭园季里?
学完《AI Agent旅游行程智能规划平台》,上面这些追问你都会迎刃而解。