AI 应用工程化 03:LLM 评测、回归测试与可观测性怎么做
传统软件有一个很朴素的判断:
1 | 输入固定,输出应该固定。 |
大模型应用不是这样。
同一个问题,模型可能每次措辞不同;换一个模型版本、系统提示、temperature、检索结果,答案质量都会变化。
所以 AI 项目最危险的开发方式是:
1 | 我刚刚试了几个问题,感觉效果不错,可以上线。 |
这就是 vibe-based evaluation。
真正的 AI 工程需要回答:
1 | 这次修改在哪些真实任务上变好了? |
这篇文章讲一套不依赖特定平台的 LLM 评测和可观测性流程。
资料核对时间:2026-10-01。
一、评测对象不是只有模型
AI 应用通常由多层组成:
1 | 用户输入 |
换模型只是其中一个变量。
系统效果还受这些因素影响:
- system prompt
- few-shot examples
- chunking
- embedding 模型
- topK
- reranker
- 工具描述
- temperature
- 最大输出长度
- 输出 schema
所以评测对象应该是完整应用版本:
1 | { |
没有版本记录,分数变化后你不知道是谁造成的。
二、先定义任务,再定义分数
不要先问:
1 | 应该用 BLEU、ROUGE 还是 LLM-as-a-Judge? |
先问业务目标:
1 | 客服回答要解决什么问题? |
例如退款客服助手的成功标准可以是:
1 | 政策结论正确 |
再为每一项选择评测方式。
指标应该服务于任务,而不是反过来。
三、建立最小黄金数据集
不用一开始准备一万条。
先准备 50-100 个高价值案例,覆盖:
1 | 常见问题 |
数据结构可以这样:
1 | { |
不要只存一段“标准答案”。
自然语言有很多正确表达,更实用的是存:
1 | 必须满足的事实 |
四、数据集要分层
建议至少分三层:
Smoke set
10-20 条,几十秒内跑完。
每次提交都跑,检查最基本能力没有坏。
Regression set
100-1000 条,覆盖核心业务和历史问题。
合并重要 Prompt、模型、检索改动前运行。
Challenge set
高难、攻击、长上下文、低频边界案例。
定期运行,不一定阻塞每次发布。
这样既能快速反馈,也不会让评测成本失控。
五、优先使用确定性评分
能用代码判断的,不要先用大模型判断。
例如结构化抽取:
1 | type ExtractionResult = { |
工具调用可以检查:
1 | 工具名是否正确 |
RAG 可以检查:
1 | 正确证据是否在 topK |
确定性评分便宜、稳定、容易回归。
六、什么时候使用 LLM-as-a-Judge
有些质量无法靠字符串相等判断:
- 回答是否完整
- 语气是否合适
- 摘要是否保留关键事实
- 解释是否清晰
- 回答是否忠实于证据
这时可以用 LLM 作为评审。
但 Judge 也会波动和偏见。
评审提示要尽量具体:
1 | 请根据以下标准分别评分: |
不要只问:
1 | 这个回答好吗?打 1-10 分。 |
还要定期让人类标注一批样本,检查 Judge 和人类是否一致。
OpenAI 的评测实践也建议把自动指标和人工判断结合,并用人工反馈校准自动评分。
七、对比评测通常比绝对评分更稳定
如果要比较 Prompt A 和 Prompt B,可以让评审做 pairwise comparison:
1 | 同一个输入 |
还要随机交换 A/B 顺序,减少位置偏差。
对比结果可以统计:
1 | A 胜率 |
例如整体 B 更好,但在 long-context 标签下明显退化,这比一个总分更有指导意义。
八、RAG 要拆成检索评测和回答评测
RAG 最常见的误区是只评最终答案。
应该至少拆成:
检索指标:
1 | Recall@K |
生成指标:
1 | 答案正确性 |
如果正确证据根本没检索到,生成模型很难凭空修复。
如果正确证据已经排第一,但回答仍然错,问题才在生成层。
拆开评测,才能知道该改哪里。
九、Agent 要评轨迹,不只评结果
Agent 最后完成任务,不代表过程安全、高效。
例如两个 Agent 都成功创建工单:
1 | Agent A:查一次客户 -> 创建工单,2 步完成 |
最终结果一样,但 B 的成本和风险更高。
Agent 评测需要记录:
1 | 任务是否完成 |
安全任务中,错误动作即使最终被修正,也可能直接判失败。
十、建立一个简单评测 Runner
不一定一开始就上平台。
一个 TypeScript runner 就够用:
1 | type EvalCase = { |
输出 JSON,保留到 CI artifact 或数据库:
1 | { |
十一、发布门槛要同时考虑质量、成本和延迟
一个版本准确率提升 1%,但成本增长 5 倍,不一定值得上线。
可以设置门槛:
1 | 核心任务通过率不得下降 |
不同业务权重不同。
医疗、金融、权限操作应该更看重错误率和安全;内容生成可能更看重偏好和成本。
十二、线上可观测性要记录完整 Trace
普通 API 日志只记录:
1 | 路径 |
AI 请求还需要:
1 | trace_id |
不要默认记录完整用户输入和输出。
涉及个人信息、商业数据、密钥和代码时,要做脱敏、采样、权限控制和保留周期管理。
Phoenix 和 MLflow 等工具都支持围绕 trace 做 LLM/Agent 可观测性。它们也越来越多地基于 OpenTelemetry/OpenInference,方便接入现有监控体系。
十三、Trace 要能回答“慢在哪里、错在哪里”
一次 RAG 请求可以拆成 spans:
1 | request |
一次 Agent 请求:
1 | agent_run |
每个 span 记录耗时、状态和必要元数据。
用户说“AI 很慢”时,你能看到是 embedding 100ms、检索 80ms,还是模型首 token 等了 6 秒。
十四、把线上失败变成回归用例
线上数据是最有价值的评测来源。
流程可以是:
1 | 低评分或人工投诉 |
这样每次事故都会扩大系统的防线。
注意不要把所有生产日志自动加入数据集。需要去重、脱敏、标注和质量审核。
十五、抽样做线上评测
离线数据永远追不上真实用户分布。
可以对线上请求做采样:
1 | 1% 普通请求做自动质量评分 |
线上评测重点监控趋势,不一定每个请求都用昂贵 Judge。
例如:
1 | 引用缺失率突然升高 |
这些变化可能意味着知识库、Prompt、模型或用户流量发生了改变。
十六、常见反模式
只跑公开 benchmark
公开榜单适合初筛模型,不能代表你的业务任务。
只看平均分
平均分会掩盖关键类别退化。必须按标签切片。
测试数据来自 Prompt 作者
容易只覆盖自己预期的问法。要加入生产数据和其他人编写的边界案例。
Judge 和被测模型相同且没有校准
可能出现风格偏好和自我偏好。需要人工样本校准。
每次修改同时换模型、Prompt、检索器
最后不知道哪项变化有效。尽量单变量实验。
只记录成功响应
失败、超时、重试和拒答更值得分析。
十七、一个可落地的最小流程
如果项目还没有任何评测系统,可以这样开始:
1 | 第 1 周:整理 50 个真实案例和明确期望 |
CI 中:
1 | 每次提交跑 smoke set |
上线后:
1 | 抽样自动评测 |
十八、最后的判断
大模型应用不会因为“今天效果不错”就一直不错。
模型会换,知识库会更新,Prompt 会修改,用户问题也会变化。
所以评测不是上线前的一次验收,而是持续循环:
1 | 观察 -> 收集案例 -> 评测 -> 修改 -> 回归 -> 上线 -> 再观察 |
真正稳定的 AI 产品,不一定每次都使用最强模型。
它更重要的能力是:
1 | 知道自己在哪些任务上可靠, |
当这些问题都有数据回答时,AI 应用才从“试出来的 Demo”变成了“可以维护的软件”。