大模型幻觉怎么量化评测:攒用例打分
先把结论甩前面:幻觉没法靠"感觉不错"来管,得攒一套带标准答案的用例集,每条按维度打分,跑出一个能横向比较的数字。下面是我自己折腾出来的一套打分流程,照着做就能落地。
背景是这样。我们组用 RAG 接了一个内部知识库给客服用,上线第二周就被投诉——它把"7天无理由"答成了"15天",文档里明明白白写的7天。当时我看日志,后台没报错,模型一脸自信,这种最坑。光靠人肉抽查根本兜不住,所以我决定把幻觉这事量化掉。
第一步:攒用例,别凭空想
用例从哪来?我没编,直接扒了三个月的真实客服对话,挑出80条带明确事实答案的问题。每条记三样东西:
question:用户原话
gold:标准答案(从知识库原文里抠出来,精确到数字/日期/条款)
context:这条问题对应的知识库片段
80条不多,但够看出问题了。一开始我贪心想搞500条,后来发现标注标准答案太费人——光这80条我和同事对了一下午,争论"算不算幻觉"的边界。所以建议起步别贪,先跑通。
第二步:定打分维度
幻觉不是非黑即白。我拆成四个维度,每条用例每个维度打0/1/2三档:
维度 | 含义 | 0分 | 1分 | 2分 |
事实一致 | 答案和gold对不对得上 | 编造/矛盾 | 部分对 | 完全一致 |
上下文忠实 | 有没有脱离context瞎发挥 | 凭空捏造 | 掺了外部信息 | 严格基于context |
拒答合理 | 不知道时敢不敢说不知道 | 硬编 | 含糊带过 | 明确说查不到 |
引用可溯 | 答案能不能指回原文 | 无来源 | 来源模糊 | 给出具体片段 |
第三档"引用可溯"是后加的。第一版我没要,结果发现模型答得对、但你不知道它凭啥对,出了错也甩不清责任,补上之后排查快多了。
第三步:自动打分 + 人工兜底
80条×4维度=320个格子,手填会疯。我用一个裁判模型批量打,prompt 大概长这样:
JUDGE = """你是评测员。对照gold和context给answer打分。 维度: 事实一致/上下文忠实/拒答合理/引用可溯 每个维度输出0/1/2和一句理由,JSON返回。 question: {q} gold: {gold} context: {ctx} answer: {ans} """ # 跑完导出 csv,人工只复核裁判给0分的那些裁判模型也会幻觉(套娃了属于是),所以凡是打0分的我都人工复核一遍,大概占15%,半小时搞定。全自动我不敢信。
第四步:算总分,横向比
每条用例满分8,80条满分640。我把基线模型、换提示词后、加了重排序后三个版本各跑一遍:
版本 | 总分 | 事实一致均分 | 拒答合理均分 |
基线 | 478 | 1.42 | 0.91 |
改提示词 | 511 | 1.55 | 1.38 |
加重排序 | 573 | 1.78 | 1.51 |
最大的提升来自"拒答合理"那列——从0.91干到1.51。说白了之前的版本太爱不懂装懂,加了一句"context里没有就说查不到"的约束,7天/15天那种胡答直接少了一大半。
一点真实感受
这套跑下来最大的收获不是分数,是终于能拿数据跟人吵架了。以前说"我觉得这版好点",虚;现在直接甩表,573比478,谁也别犟。
顺带说个偷懒的事。我自己没有去搭一整套评测后台,而是用了那种零代码就能拖出一个智能体的工具,把"读用例—调模型—裁判打分—回填表格"配成一条流水线。不用写调度、不用管部署,拖几个节点连起来,空了改改prompt再重跑一轮。它干的就是这种重复杂活,真要做精细的统计分析还得自己导出来用pandas算,这点别指望它。但攒用例跑分这种活,省了我至少两天搭框架的时间。
(裁判模型和被测模型的API我都走的讯飞星辰MaaS,现成调,没自己部署算力)
幻觉这东西大概率消不干净,但能量化就能管。你们是怎么评的?评论区聊聊你踩过最离谱的一次模型胡说。
