← 评测与安全

如何评估大模型的幻觉与事实性?常见指标有哪些局限?

高频 中等 幻觉评估与事实校验 · 第 1 / 2 问 更新于 2026/09/29
大模型幻觉事实性FActScoreTruthfulQA
本题落地项目AI Agent旅游行程智能规划平台

简化版

幻觉评估要把回复拆成可核验的原子声明,再判断每条是否被给定证据或权威来源支持,分别统计事实精确率、覆盖率、不可验证比例。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旅游行程智能规划平台》,上面这些追问你都会迎刃而解。

本题落地项目地狱锤炼AI Agent旅游行程智能规划平台基于 SpringBoot + LangChain4j、攻略知识库 RAG、MySQL 向量检索、Function Calling 与数据库驱动工具中心,实现候选池预热与工具收窄、多城联游行程编排、14 条代码硬校验驱动的反思重排、教训记忆与多版本对比、三道闸防空转、编排前探活、预算测算和 Agent 执行时间线,覆盖从需求识别到行程交付的完整闭环。SpringbootLangChain4JAgentRAGFunction Calling源码+SQL喂饭学习教程配套面试文档环境安装文档项目运行文档 学习这个项目