评测:没有评测集的优化,全靠玄学
约 2214 字大约 7 分钟
2026-10-05
系列倒数第二篇,讲一个从第 05 篇就开始铺垫、贯穿始终的话题:评测。本篇对应 relax-admin 的「评测中心」菜单组:Golden Set 和评测实验两页——这个系列从第 05 篇攒到现在的评测资产,最终都在这两页安家。先把这篇的核心判断拍出来:
工程师和调参侠的分界线
有没有评测集,是工程师和调参侠的分界线。 「感觉加了 Rerank 之后准了一点」——这句话没有任何工程价值;「加了 Rerank 后,10 个评测问题里 gold 段落的 top5 命中率从 60% 升到 90%,拒答误杀从 2 例降到 0」——这才叫优化。
我们从第 05 篇攒的那 10 个问题、第 08 篇建的基线档案,今天正式转正。
先搭骨架:评测什么
RAG 的评测必须分层,因为「答错了」的原因分布在好几层,混在一起测就是一笔糊涂账。三层各自有指标:
检索层:该捞的捞回来了吗?
- 命中率@K(最重要):每个问题预先标注「正确答案出自哪个段落」(
gold chunk),跑检索,看 gold 有没有进 topK。10 个问题中了 8 个,命中率 80%。简单粗暴,信息量最大 - MRR(平均倒数排名):gold 排第 1 得 1 分、排第 3 得 1/3 分。比命中率多反映了「排序质量」,想知道 topK 内部谁更靠前时看它
生成层:答得对不对、忠不忠实?
- 忠实度(
faithfulness):回答里的论断是否都能在证据里找到依据——直击幻觉的核心指标 - 答案相关性:回答是否真的在回应问题(防止「正确但跑题」)
- 引用正确率:标注的引用编号指向的段落,是否真的支撑那个论断
产品层:用户体验层面的。 拒答准确率(该拒的拒了没、不该拒的有没有误杀)、首字节延迟、单次对话成本。这些第 15 篇接着用。
评测集怎么建:土法上马,能用就行
评测集的本质:一批问题 + 每个问题标注的 gold chunk(答案出处)+(可选)参考答案。
我的土法:从博客真实读者问过的问题里挑(这是最好的来源,问法是天然分布),加上自己扮演「刁钻用户」出的题,控制在 30 个左右,覆盖几类典型:
- 字面可搜的
- 换说法的
- 带专有名词的
- 否定式的
- 多轮追问组
- 3 个「知识库里根本没有答案」的陷阱题——专门考拒答
标注 gold chunk 是个体力活:一个问题人工去文章里找到那段原文,记下它的标识。30 个问题,一个下午的活。
这些资产的管理端归宿就是「评测中心 → Golden Set」页:问题、标注出处、难度分类(字面题/换说法题/陷阱题……)、多轮组——前面八篇文章里散落的评测用例,全部沉淀在这一页统一维护。Golden Set 是整个系统里复利最高的资产:模型会换、策略会调,唯独这个基准集越攒越值钱。
📷 图片位(待补充)
应放什么图:「评测中心 → Golden Set」页截图,展示基准问题列表——重点圈出类型标签(字面可搜/换说法/专有名词/否定式/多轮组/陷阱题)和每条标注的 gold 出处链接。
别嫌土
这半天的投入,会还你无数个「到底有没有用」的清晰答案。
生成层怎么测:LLM 当裁判
检索层指标是纯代码能算的(gold 在不在 topK,一个 Set 查询的事)。生成层的「忠实度」没有标准答案可比对,怎么办?——用另一个 LLM 当裁判,这是当下业界的通用解法(RAGAS 这类框架的核心思想也是它)。
裁判 Prompt 的思路:
你是评估员。给你【证据】和【模型的回答】,
判断回答中的每个论断是否被证据支持。
输出 JSON:{"supported": 论断数, "unsupported": 论断数, "details": [...]}忠实地提醒一句:LLM 裁判自己也不完美——它会偏袒长回答、偶尔看走眼。两个对策:
- 裁判模型和生成模型别用同一个(自己判自己,分数虚高)
- 关键结论(比如「这次优化要不要保留」)人工抽查裁判结果
套娃但是必要
评测体系本身也需要被验证。LLM 当裁判是权宜之计,但眼下它是唯一能规模化测「忠实度」的手段。
跑一轮评测的产物,理想中长这样:
版本 v0.3(基线) v0.4(+混合检索) v0.5(+Rerank)
命中率@5 60% 80% 90%
MRR 0.52 0.71 0.84
忠实度 0.78 0.81 0.93
拒答正确 1/3 2/3 3/3
平均延迟 0.3s 0.5s 0.7s这张表是这个系列所有优化的总账本。哪招治了什么病、代价几毫秒,全在上面——它也是你做任何 RAG 项目时最硬的履历素材。
这张账本在 relax-admin 里的形态就是「评测中心 → 评测实验」页:一次实验 = 一组配置(切分策略版本、检索开关组合、模型版本)在 Golden Set 上的完整跑分,两三次实验并排对比,指标差异高亮——A/B 实验页存在的意义,就是把「我觉得新版本好」变成「新版本在 30 个基准问题上命中率 +30%」。第 05 篇改切分参数、第 09 篇开混合检索、第 10 篇上 Rerank,回头都能在这里找到自己对应的那次实验记录。
📷 图片位(待补充)
应放什么图:「评测中心 → 评测实验」页截图,两个实验(基线 vs +Rerank)的对比视图,圈出命中率@5、忠实度、拒答正确率三行的差异高亮——这张图是全系列优化的「成绩单」。
评测驱动的工作流:从今天起这么调参
有了体系,工作流就定型了,四步循环:
- 跑评测,找到短板。命中率低?检索问题。命中了但忠实度低?生成侧问题。拒答误杀?阈值问题
- 改一个变量。注意是「一个」——同时改切分参数和换检索策略,效果归因就废了
- 重跑同套评测,对比表格
- 留档。每次改动一行 changelog:改了什么、指标怎么变、要不要保留
第 02 篇说过的「上游的病伪装成下游的症状」,现在有了自动化诊断:分层指标天然就是分诊台。忠实度低但命中率高 → 别动 Prompt,去查证据排序;命中率低 → 生成侧什么都不用改。 没有这套东西之前,你只能瞎猜从哪层下手。
还有一个高频误区值得点名:别拿单条 badcase 当方向标。 用户报了一个答错的案例,你连夜改了切分参数,第二天另一个用户报了个别的错——很可能你昨晚的改动引入的。单例驱动优化是打地鼠,评测集驱动优化才是种田。正确姿势:badcase 收进评测集,跑全量对比,确认净收益再上线。
一个私货:把评测挂进 CI
最后一层进化,把评测脚本化:任何「会影响检索或生成」的改动——切分参数、Prompt 模板、模型版本——提交时自动跑一遍评测集,指标回退超阈值就拦下来。
这招是从「调参侠」到「工程化」的分水岭。RAG 系统是个持续运营的东西,语料在涨、模型在换、你在改,没有回归测试的保护,每次改动都是一次盲飞。CI 里那三十个问题和它们的及格线,就是你系统的火警探测器。
今天的落地清单
到这里,系统有了「知道自己好不好」的能力。最后一篇收尾:上线之后的日子——语料怎么持续更新、对话日志怎么变成洞察、账单怎么控制,以及这个系列做完之后,我还想往哪儿走。
下篇见。