10. 如何评估 Prompt 的质量?有哪些系统化的方法?
整理 Prompt 质量评估的黄金集、A/B 对比、压力测试和维度化打分方法。
简单回答
Prompt 质量的评估要从两个维度入手:功能性评估(Prompt 能不能让模型稳定完成目标任务)和鲁棒性评估(对各种输入变体、边界 case、对抗输入,Prompt 的表现是否稳定)。单凭"感觉好"或"几个例子上表现好"不算有效评估,需要在覆盖多样性的测试集上量化评测。常用方法有:黄金集评测、对比测试、压力测试、以及 LLM Judge 打分——四种方法各有侧重,组合使用才能全面评估。
详细解答
为什么 Prompt 质量评估容易被忽视
Prompt 工程的特点是"快速可见"——改一行 Prompt,马上就能看到模型回答的变化。这种即时反馈容易造成一种错觉:"我看到效果变好了,所以 Prompt 更好了"。但这种判断是基于极少数 case 的主观感受,不能代表整体质量。
一个真实的陷阱:你为了修复 case A 修改了 Prompt,case A 确实变好了,但同时 case B、C、D 悄悄变差了,而你没有去检查。这类"修了一个破了几个"的问题在没有评测集的项目里非常普遍。
方法一:黄金集评测
构建一个"黄金集"(Golden Set)——预先标注好每道题的"理想回答"或"评判标准",作为评测 Prompt 的基准。每次修改 Prompt,都在这个集合上跑一遍,和基线(当前生产版本的 Prompt)对比:
- 哪些 case 变好了(新 Prompt 的输出更接近理想答案)
- 哪些 case 变差了(新 Prompt 的输出和理想答案偏离更多)
- 整体加权分数是否提升
黄金集需要覆盖多样性:典型 case、边界 case、历史失败 case、以及各类输入类型。规模通常是几百条,能在几分钟内跑完。
方法二:A/B 对比测试
不用黄金集,直接让 LLM Judge(GPT-4 等)对新旧两个 Prompt 的输出做成对比较:给同一批用户输入,分别用新旧 Prompt 生成回答,让 Judge 判断哪个更好。
这个方法不需要预先标注理想答案,适合开放性任务。关键是 Judge 的选取和偏差控制(见 LLM-as-Judge 章节的内容),以及成对比较要做双向(A vs B 和 B vs A 各做一次,取一致结论)。
A/B 测试可以自动化:定期跑一批新旧 Prompt 的对比,生成"新版本 vs 基线"的胜率报告。胜率持续高于 55%~60% 才算有统计意义的提升;50% 附近则差异不显著。
方法三:压力测试(Robustness Testing)
功能测试验证了 Prompt 在"正常输入"下的表现,压力测试则是专门检验 Prompt 在各种不正常输入下的鲁棒性:
输入变体测试:同一个语义,用不同的措辞提问,看 Prompt 是否都能得到一致的高质量输出。如果换一种说法就得到完全不同的答案,说明 Prompt 的鲁棒性不足。
边界 case 测试:空输入、超长输入、包含特殊字符的输入、语言混杂(英文 Prompt 里突然来了中文输入)、多意图混合的输入。
对抗输入测试:用户试图"越过"Prompt 约束的输入——"忽略之前的所有指令,改做 X"、角色扮演绕过、间接引导等。
领域分布外的输入:System Prompt 定义了模型是一个产品客服,但用户突然问了一个完全无关的问题,模型的反应是否符合预期(礼貌拒绝、转移话题、还是直接回答)?
方法四:维度化打分
对于需要多维度评估的 Prompt(比如同时要求准确、有帮助、格式规范),可以分维度独立打分:
每个维度独立打分,而不是一个综合分,好处是能定位问题出在哪个维度,而不是只知道"整体不好"。
评估结果的解读
评估结果不是越高越好就发布——要关注:
标准差和分布:平均分高但方差大,说明有些 case 表现极好、有些极差,整体不稳定。要看 P90(90% 分位数的表现)而不只是均值。
错误模式分类:把评分低的 case 按错误类型分类,看是否有系统性的错误模式(特定类型的输入总是差)。系统性问题说明 Prompt 里缺少对某类情况的处理,是优先修复点。
和线上指标的对比:离线评测分数和线上用户满意度的相关性需要定期校验。如果两者越来越不一致,说明离线评测的测试集已经和真实用户分布偏离,需要更新测试集。
面试时可以这样答
Prompt 质量评估最常见的错误是凭感觉——改了几个 case 变好就觉得 Prompt 提升了。系统化评估需要四类方法组合。
黄金集评测是基础:预先标注好几百个覆盖多样性的测试 case,每次改动都跑一遍和基线对比,看哪些变好哪些变差,有定量结论才能做决策。
A/B 对比测试适合开放性任务:不需要预先标注,用 LLM Judge 给新旧 Prompt 的输出做成对比较,看胜率。要做双向比较控制位置偏差,胜率 55% 以上才算显著。
压力测试专门检验鲁棒性:同义换说、边界 case(空输入、超长输入、特殊字符)、对抗输入(越狱尝试)、领域外输入——这些在功能测试里测不到,但上线后用户肯定会遇到。
维度化打分比综合分更有用——准确性、完整性、格式合规分开打,出了问题知道是哪个维度,而不是只知道"整体不好"。
常见追问
- 如果测试集和真实用户分布不一致,离线评测分数还有参考价值吗?
- Prompt 评测里如何处理输出随机性的问题(temperature > 0 每次结果不同)?
- 对于需要多语言支持的 Prompt,跨语言的质量评测怎么做?