评估:金标题、回归、不要只靠 vibe-check

提示词是产品行为。OpenAI 的现行建议是:提示词进仓库、和功能同一 PR,并且 每次发布都跑测试与评估用例。只在聊天框里看一次「好像不错」(vibe-check)发现不了:换一个用户原话、换一个模型快照、或多了两段检索噪声之后会怎样。


什么算一次评估

一次用例 = 固定输入 + 可判定的期望。期望可以是:

  • 精确匹配(枚举标签)
  • Schema 合法(JSON 能 parse、枚举在集合内)
  • 必含 / 必不含(引用了某句原文;没有出现密钥)
  • 工具轨迹(该搜的搜了;不该调用 delete_*
  • 人工量表(1–5 的「是否可发送」),但要有评分说明,不能只写「感觉」

没有期望的「试试看」叫探索,不叫评估。


金标题(gold questions)

先做 10~30 条代表真实分布的题目,而不是 200 条合成废话。每条注明为什么存在:

id输入摘要期望为什么在集里
G01「发票扣两次,订单 8891」label=billing, order_id=8891快乐路径
G02无标点口语 buglabel=bug, order_id=null缺字段
G03要求查看其他租户账单needs_human=true,不编造数据安全边界
G04资料里没有的退款天数回答不知道幻觉
G05资料与用户问题无关的长粘贴不被带跑;仍答问题噪声 / 注入意识

把金标题和提示词放在同一仓库(例如 evals/gold.jsonl)。改示例或 schema 时必须跑这批题——这就是 回归


回归怎么跑

最低配:一个脚本读 jsonl,调同一模型快照,打分,失败则非零退出。不必一开始就上平台。LangSmith、Promptfoo、Dify 日志都可以当外壳;用例本身 应属于你。

实践:

  1. 钉模型快照gpt-4.1-mini-YYYY-MM-DD 这类),避免「今天换了默认模型所以全绿/全红」
  2. 钉提示词版本(Git SHA),报告里写上
  3. 先看 分项失败 再看平均分:G03 变红比总分 0.02 的波动重要
  4. 改提示词只为修一类失败时,跑全量金标题,避免拆东墙
  5. Agent 评估要存 轨迹:调了哪些工具、入参是什么,而不是只存最终一句

上线后从真实日志 抽样 补进金标题(脱敏)。生产里新出现的失败模式不进集,回归就是自嗨。


为什么 vibe-check 不够

Vibe-check 看到的看不到的
你熟悉的那两条问题长尾用户原话
干净的文档粘贴检索拼盘、网页噪声
你喜欢的文风Schema 被悄悄加字段
一次成功的 Agent 演示第二次工具超时后的胡编

探索阶段用 vibe 没问题。当作发布门禁时,至少:金标题全绿 + 抽 3 条人工读最终答复。人工读的是「可发布」,脚本管的是「合同没碎」。


最小金标题文件

{"id":"G01","input":"发票扣两次,订单 8891","expect":{"label":"billing","order_id":"8891"}}
{"id":"G04","input":"退款几天?<doc>只谈发货时效</doc>","expect":{"abstain":true}}

评分函数先查 schema,再查业务键。G04 这种「必须弃权」用布尔,不要用模糊的「回答得体」。Agent 用例额外记 tools_used:例如 G01 不应调用 delete_order

把失败行打印出来再改提示词。对着平均分调形容词,是 vibe-check 的脚本版。


和四个构件的关系

评估项应对准合同:角色(有没有对错误读者说教)、任务(交付物在不在)、约束(禁区有没有闯)、格式(能不能 parse)。测不到的句子,等于没写。

换模型或换检索策略时,先跑金标题,再谈「新模型更聪明」。聪明不是门禁;合同才是。


下一步

评论