最近 AI 圈流行一个词,叫 Benchmaxxing。我第一次看到这个组合的第一反应是,有人把 benchmark 和极限运动里常用的 maxxing 拼在一起,用来形容“把模型在某张评测榜单上的分数刷到极致”的行为。这个词能流行起来,不是因为它有趣,而是因为它戳中了很多 AI 应用开发者共同的痛:公开榜单上分数很漂亮的模型,放到真实业务里,依然会被用户吐槽“回答太蠢”“完全不可用”。为了讨论方便,我在这里虚构一个项目叫 Z AI,它是一款面向公司内部员工的知识问答助手,主要基于知识库回答人事制度、报销流程、项目规范等问题。假设 Z AI 在选型时跑过公开 benchmark,多轮问答准确率超过不少知名模型,但上线后却频繁出现答非所问、引用错误、规则过期等状况。这不是个例,而是很多 AI 团队正在经历的现实。
问题出在哪?我认为真正值得关注的根本不是“要不要刷 benchmark”,而是我们有没有一套能持续识别失败模式、贴近真实业务、可重复运行的评测体系。下面就从 Benchmaxxing 这个现象开始拆,聊一聊 AI 评测的失真点,以及 AI 应用开发、Agent 调试、模型部署里更务实的评估方法。
1. 拆开 Benchmaxxing:把模型能力压缩成一个分数,真的安全吗
先做一次概念拆解。Benchmaxxing 不是论文里的正式定义,它更像是社区对一种行为的归纳:把团队的大部分精力投入到基准测试上,通过调 Prompt、调整解码参数、适配测试集格式、甚至针对榜单题目做后处理,来尽量提高那个最终分数。这里要说明白,凡是合理优化 benchmark 的做法,本身没有错。评测本来就是模型迭代、版本对比和落地选型的基础。真正的坑在于,当分数被推到最高优先级时,大家很容易忘掉一件事:这份测试题到底在测什么,它和目标场景是不是同一类问题。
1.1 从 benchmark 到 Benchmaxxing,真正变化的是什么
Benchmark 本质上是一种有限样本上的抽测。它把模型在某些任务上的表现压成一个或几个分数,方便横向比较。这很像考试:一张卷子覆盖不了学生的全部能力,但因为它能给出可量化的排名,所以只要还有升学选拔,考试就不会消失。问题不在考试,而在有些人开始“只刷题,不读书”。
在 AI 模型上,这种偏差会被一段推理链放大:测试集分数高,被解释为模型能力强;模型能力强,又被解释为业务上一定能用。这里的每个等号都会掩盖一批失败样本。比如某些公开 benchmark 的答案是标准化选择题,模型只需要输出一个字母或短语,评测脚本就能自动判分。真实业务却完全不是这样,用户会把一个问题拆成三层来表达,会输入错别字,会省略关键背景,会要求模型引用具体知识来源。很多在“干净题目”上刷到高分的模型,正是在这些混乱输入上露出马脚。
如果只把 Benchmaxxing 理解成“刷榜”,其实低估了它的影响。它真正改变的是团队的思考和决策方式。当“榜单分数上涨”成为开发者的主要追逐目标后,产品里常见的满意度指标、错误率、用户重复提问次数,都会被放到次要位置。最后整个项目可能会做出一个擅长回答考题、但是无法回答真实问题的“高分模型”。
1.2 为什么团队会不由自主地走上这条路
并不是所有团队都愿意刷分。很多时候是传播逻辑和汇报逻辑倒逼的。公开榜单是最好的对外材料,一张对比图、一个“超过某某大模型”的结论,比“用户消息召回率提升 2%”更直观、更容易讲给业务方听。于是对外宣传依赖分数,内部汇报也依赖分数,慢慢形成路径依赖。
另一个原因是,团队缺少足够贴近业务的评测集。如果手头没有从真实用户请求里沉淀出来的样本,就只能依赖公开榜单来选模型、调提示词。这就像没有自己学校的模拟卷,只能拿全国统考题来选拔同学。你说它完全没用,也不客观;但你说它能精准定位本地学生的短板,显然不够。因此,我更愿意把 Benchmaxxing 看成一种评测体系缺失后的应激反应,而不是简单的团队浮躁。
注意:这里并不是要求大家抵制 benchmark。而是在跑 benchmark 之外,至少要回答一个问题——如果这份榜单上的 100 道题全部换成本业务里的真实问题,结果还能保持同样的优势吗?
2. 排行榜分数高、业务却翻车,问题往往出在评测链路本身
很多团队遇到“分数和体验不一致”时,第一反应是找模型的问题,第二反应是调 Prompt。但在我的经验里,应该先检查评测链路。下面三个环节是最容易造成分数“虚高”的地方,也是 Benchmaxxing 最容易放大的失真源。
2.1 评测样本分布不等于真实业务分布
公开 benchmark 的样本来自学术社区认为有代表性的任务,比如常识问答、数学推理、代码生成、多轮对话。这些任务固然重要,但不一定覆盖你的业务。拿 Z AI 来说,员工问的问题集中在“年假怎么算”“报销单被退回怎么办”“项目里程碑延期怎么申请”,这类问题高度依赖具体制度文本和公司内部流程。你拿通用竞赛榜单来测,模型可能能回答“什么是年假”,但答不出“今年公司年假在离职结算时怎么折算”。
这种分布错位,比想象中更隐蔽。一些评测集看起来覆盖了某个领域,但题目里的表述和真实员工提问习惯差异很大。员工不会一板一眼地输入“请根据员工手册回答综合工时制下的加班费计算方式”,而可能直接问“我上个月加班 20 小时,怎么算钱?”。同一个模型,在这两类问法下的效果可能完全不同。所以,不要急着用公开榜单选最终模型。我的建议是:把候选模型放进同一份小规模业务样本集里重新排序。榜单的作用是帮你圈定三到五个值得深入测试的候选,而不是直接告诉你最终答案。
2.2 输出格式和解码参数会产生“虚假提升”
自动评测越依赖规则匹配,越容易被格式“骗”到。很多排行榜要求模型从 A/B/C/D 中选择答案,模型只要输出正确选项,即使推理过程是错的,也可能得分。更隐蔽的是,模型在大量指令微调和偏好对齐后,会学习到“这种题只要输出简短结论就好”的倾向。当你的评测脚本或者 Prompt 示例倾向于奖励短答案时,模型可能牺牲掉中间的推理步骤,只求输出格式和判分规则对齐。
解码参数也会造成分数波动。同一个模型,温度从 0.2 调到 0.8,输出内容差异会很大。有些测试集适合低温度下的稳定输出,有些任务反而需要高一点的随机性。如果不固定这些参数,两次评测结果可能相差好几个百分点。我们团队内部做回归时,把模型版本、推理后端、解码温度、最大输出 token、系统提示词全部固定下来,才不会在复盘时搞不清分数变化来自模型还是环境。
所以,要先把“评测结果可复现”这道门槛过了。一个不看样本级输出、只看总分的评测系统,本质上只是在给自己一个确定性的心理暗示。
2.3 Agent 场景下,单轮评测分数几乎没有参考价值
如果你开发的是 AI Agent,比如让模型调用公司内部 API、搜索知识库、写代码并执行,那传统 benchmark 的参考价值会更低。Agent 类任务要求模型在多个回合里完成规划、执行工具调用、观察返回结果、根据错误修正下一步。模型在单轮问答得分高,不代表它能在多轮工具调用里保持状态一致。
这里我有一个切身经验:Agent 的失败往往不是模型“不会回答”,而是模型不知道在合适的时候调用工具,或者调用了工具但传入参数不对,又或者在工具返回异常后没有继续尝试。用普通问答的正确率去评估 Agent,会漏掉最关键的“轨迹质量”。在实践里,我会把 Z AI 这类系统的指标拆开看:
- 工具选择准确率:模型是不是在应该搜索知识库时去搜索了;
- 参数填充准确率:调用工具需要的字段是否齐全、正确;
- 错误恢复成功率:工具返回空结果或超时时,模型能否重新组织问题;
- 回合数失控比例:有没有出现无限循环追问或反复调用同一工具的异常情况。
这些指标不能合并成一个简单的 end-to-end 成功率就结束。合并之后,你看到的是一个平均分数,但团队无法定位失败到底发生在哪个环节。下面用一个表格来概括常见失效点和干预方向。
| 评测失效点 | 典型表现 | 优先处理方向 |
|---|---|---|
| 样本分布错位 | 公开榜高分,业务问题频错 | 收集真实请求,建立业务回归集 |
| 格式应试 | 模型输出正确选项但缺少推理 | 在评测集里加入可验证性的判分项 |
| 环境不稳定 | 两次评测分数波动大 | 固定模型版本、参数、后端脚本 |
| Agent 轨迹失真 | 单轮正确率高,多轮工具调用失败 | 拆分指标,按工具步骤分析失败样本 |
| 离线与线上目标分裂 | 离线分数高,线上留存低 | 接入线上反馈闭环,定期回流失败样本 |
3. 与其抵制榜单,不如搭一套“反刷分”的三层评测体系
既然公开 benchmark 不能直接照搬,线上效果又需要长期观察,那我们该怎么做?我的答案是:不要完全拒绝榜单,而是给它一个明确的位置。用一套“漏斗式”的三层评测体系,把从模型选型到业务落地的过程拆开。
3.1 第一层:通用能力评测,只做初筛和回归
第一层使用公开的、覆盖面广的测试集。目的是做两件事:一是从多个候选模型里筛出还算靠谱的几个;二是在每次模型、Prompt 或知识库变更后,快速发现整体能力有没有明显回退。
这一层的核心是“固定基底、看相对变化”。绝对分数不是最重要的,重要的是同一份样本、同一套脚本下,这次改动是让得分上升还是下降。如果某个本来表现不错的能力项突然掉了 10 个百分点,那不管总平均分涨了多少,都要先查是不是引入了回归。一个有效的方法是记录样本级输出,而不只是保留总分。否则当你想知道是哪一类问题变差时,会缺少最基础的追溯材料。
我对这个阶段投入的自动化要求不高,但要求基础设施稳定。模型版本、Prompt 版本、评测脚本、随机种子这些都要纳入版本管理。没有版本管理的评测结果,数据再多也很难支撑决策。
3.2 第二层:业务场景回归集,从真实请求和失败案例里长出来
第二层才真正决定模型能不能用。做法是从真实日志中抽样,按照业务关键场景建立一份回归集。这份回归集不需要特别大,但要有代表性,包含:
- 正常但典型的业务问题;
- 用户换一种说法或带错别字的边界问题;
- 日常高频、但容易出错的关键场景;
- 历史线上处理失败、用户明确不满意的问题。
我这里有一个比较可行的起点:收集近两周真实请求,人工聚合出 20 到 30 个意图类别,每类挑三到五条样本,构造一份 100 条以内的验证集。为什么是 100 条左右?因为太少,随机性太强,一次 Prompt 修改可能带来虚假波动;太多,人工维护成本太高,小团队没法在每个迭代周期都跑完。这个数量对于绝大多数中小团队来说,是一个在可信度和成本之间比较均衡的点。
一份业务回归集里,每条样本至少要有输入、期望回答方向以及它所属的失败模式或类别。比如样本可以标记为“规则过期”“引用缺失”“理解歧义”。有了这些标签,后续的失败分析才能归类,而不是零散的单点修补。
建议:业务回归集不要只保留“问题+标准答案”。对开放型回答,标准答案是参考方向,不是唯一答案。评分人应该判断“它是否解决了用户核心诉求”,而不是和参考答案逐字对比。
3.3 第三层:线上反馈与数据回流,形成闭环
离线评测只能覆盖“已知的问题”,无法覆盖未来的分布漂移。公司制度会变,员工问法会变,新项目新术语会不断出现。如果只做离线回归,没过多久,模型表现就会和真实业务重新脱节。因此第三层必须接到线上指标和用户反馈上。
这里要关注的指标不是泛泛的“用户满意度”,而是几个更可观测的信号:
- 用户是否在同一个会话里重新表述了问题;
- 用户是否在得到回答后继续追问下一层细节;
- 用户是否明显点踩、反馈“答案不对”;
- Agent 场景里是否有大量中途放弃或转人工。
要形成一个稳定循环:每周或每两周,从线上把这些失败样本加入业务回归集;用回归集重新测试当前模型和 Prompt;确认修复效果后,再灰度到线上。你会发现,当这套循环跑起来之后,对整个系统的“质量感觉”会越来越具体。你不再依赖某一个综合分数,而是能说出“Z AI 最近最常犯的错误是引用旧版报销政策”,这比“模型又涨了两个点”更有工程价值。
4. 从 0 到 1 的最小评测流程:以 Z AI 项目为例
前面讲了方法论,下面直接给一条可执行的最小路径。假设你有一个类似 Z AI 的问答项目,需要从真实业务问题里选模型、调 Prompt,并建立长期回归机制。下面这套流程适合先跑通,再逐步补工程化能力。
4.1 第一步:准备 50 条真实样本,跑通评估脚本
不要一开始追求大规模测试集。先花一个下午,从真实问答记录里挑 50 条样本。这 50 条不需要完美均衡,但至少要覆盖正常询问、模糊描述、边界问题和历史失败案例。把它们整理成一份公共格式,方便脚本读取。
{ "id": "sample_001", "query": "年假是按自然年算还是按入职时间算?", "reference": "按自然年计算,具体执行规则见员工手册第 4 章。", "category": "人事制度", "failure_type": "none" }接着用一段最简脚本,把每条 query 发给候选模型,记录输出,再与 reference 做比较。刚开始不需要写自动评分器,先人工看 10 到 20 条输出,找出错误类型。比如模型是不是答非所问、是不是完全没有引用内部规则、是不是把制度表述得含含糊糊。这一步的核心是让整个流程跑通,并且让团队对模型“在真实业务里的表现”有第一手感觉。
4.2 第二步:按“三轮审计法”检查失败样本
跑完 50 条样本后,把失败的案例单独挑出来。我通常会用三轮审计法来定位问题根源,这也可以当成固定排查链路来用。
先看输入。这条 query 是否有歧义?是否缺少必要的上下文?提问者是不是把多个问题塞在了一句话里?如果是,那很可能是评测样本本身设置得不好,和线上真实输入不一致。这种情况下,先修正样本,而不是急着调模型。再看输出。模型是格式错误、知识性错误,还是意图理解错误?格式错误可能要改 Prompt,知识性错误可能要补知识库或换检索策略,意图理解错误考虑要不要换模型。最后看环境与参数。模型版本有没有换?推理温度是否一致?上下文最大长度是否足够?知识库是否更新到了同一切片?很多人在这里踩坑,明明两次评测时知识库版本不同,却把结果差异归因成“提示词变好了”。
每一轮审计都要记录失败类型,不要只写“模型答错了”。这样积累一段时间后,你会得到一份“失败模式分布表”,它会告诉你到底应该先优化哪一块。如果连续几天都是知识库召回不准导致错误,那调模型和 Prompt 的意义就很有限;如果大量错误是模型不按格式结构化输出,那 Prompt 工程才是重点。
4.3 第三步:把人工审计转成可重复的回归流程
当失败原因逐渐清晰后,就可以把人工评估逐步转成自动化或半自动化回归流程。常见路径是:
- 维护一份 golden set,也就是经过人工确认的标准用例;
- 写一个评测脚本,统一调用模型、获取输出,再通过规则、大模型评审或人工抽检来打分;
- 每次变更模型、Prompt、知识库后,运行同一份脚本,记录分数差异和样本级 diff;
- 把新产生的失败案例追加回 golden set,保证它不会在后续迭代中再次被漏掉。
下面给一个最简采集和回流的示例结构,重点在流程参考,不是完整可运行代码。
def run_eval(model, golden_set): for case in golden_set: output = model.generate(case["query"]) score = judge(case, output) # 规则打分 / 模型打分 / 人工复核 save_record(case, output, score) def append_failure(case): golden_set.update([case]) run_eval(model, golden_set)这里的关键不是自动化程度一开始就要很高,而是“可重复、可追踪”。每次跑完评测后,至少能回答四个问题:这次跑了多少条样本?哪些样本变好了?哪些变差了?变差的原因属于哪一类?如果这些问题回答不了,那说明链路还不够完善,没有必要急着增加更多评测指标。
5. 别只追上限,要看清失败边界:对三种角色的建议
这套评测思路要落到团队里,还需要知道每个角色最该关注的层面。否则很容易出现“开发者建了一套评测集,产品经理觉得太技术,业务方觉得太抽象”的割裂。
5.1 选型时,宁可接受分数稍低,也要清楚失败边界
很多团队选模型时都追求“综合分数最高”,但生产系统往往更需要“已知失败范围”。一个模型总分很高,如果在关键场景上出现不可接受的错误,那这个高分就是风险;另一个模型总分稍低,但错误集中在低频、低风险问题上,可以通过兜底策略来规避,那它在真实系统里反而更可用。
我在做类似 Z AI 的问答系统时,会额外问一个问题:“如果我们必须把这个模型上线,哪些问题它一定答不好?”如果团队答不上来,说明对能力边界的理解还不够。你可以在评测时故意构造一些边界样本,比如最新政策、多轮追问、夹带歧义的说法,观察它的失败方式。知道模型会在哪里失效,是比追求更高分更重要的产出。
5.2 这套方法适合谁,不适合谁
这套“反 Benchmaxxing”的评测体系,更适合正在做 AI 应用、知识助手、Agent、自动化流程的团队。它帮助解决的是工程落地中的“泛而不准”问题,核心是把评测从一次性的榜单行为,变成可持续的业务反馈循环。
它不适合纯模型研究者或参加学术比赛的人。学术实验需要统一的公开 benchmark,需要在可控条件下对比模型能力。这类场景里,公开榜单本身是重要的一部分,不应该和工程落地里的“唯分数论”混为一谈。也不要因为业务效果不好,就全盘否定 benchmark 的价值。它适合做初筛,适合做回归,只是不能替代对业务场景的理解。
5.3 今天就能做的一个动作
如果你被“模型分数不错但业务不买账”困扰了很久,建议今天就做一件事:找回最近一周的用户失败请求,挑出 20 条,逐条写下“模型到底错在哪一步”。不需要整理成复杂表格,只需要一句话描述。连续记录两周,你会得到一张比任何公开榜单都有用的错误热点图。到那时,你再看 Benchmaxxing 这个词,应该会有不同的理解。
我们在 AI 项目里真正应该追的,不是那个不断被刷新的分数,而是当用户说“这个回答不对”的时候,系统能不能在下一个版本里承认错误、修正偏差、并给出更可信的答案。能做到这一点,你才算把模型能力真正接到了真实业务里。