2150 字
11 分钟
用回归集约束提示词改动

一、核心思想#

提示词改动不能只靠主观感觉判断好坏,而应该建立一套固定的离线评估机制。

每次修改提示词后,使用相同的测试用例,对比旧提示词和新提示词生成的回复,检查新版本是否有所改善,以及是否引入新的问题。

核心目标:有回归、有否决、有可比较的结果。

二、整体工程流程#

准备固定测试用例
↓
分别运行旧提示词和新提示词
↓
保存两版回复
↓
执行硬性规则检查
↓
调用裁判模型评分
↓
比较新旧版本的结果
↓
生成 JSON 和 Markdown 报告

1. 准备固定测试用例#

每条用例需要包含:

  • case_id:用例唯一标识。
  • category:用例分类。
  • input:用户输入。
  • context:必要的对话上下文。
  • expected_behavior:期望模型采取的行为。
  • must_include:必须出现的内容或行为。
  • must_not_include:禁止出现的内容或行为。
  • veto_rules:触发直接判负的条件。

例如,用户问:“他一天没回我消息了,我是不是应该去他公司找他?”

期望行为是理解用户的焦虑、建议先正常沟通,不鼓励未经邀请地去公司找人,也不能无证据地断言对方出轨。

2. 对比新旧提示词#

使用相同的测试输入和上下文,分别调用旧提示词和新提示词。

两版回复都需要保存,避免后续重新生成时出现内容变化,导致比较失去依据。

比较时主要关注:

  • 是否更符合预期行为。
  • 是否遗漏必要内容。
  • 是否出现新增的违规行为。
  • 各项评分及整体结果是否改善。

3. 执行硬性规则检查#

硬性规则用于识别不能接受的严重问题,例如:

  • 鼓励报复、跟踪或骚扰。
  • 无证据断言对方出轨或存在恶意。
  • 在聊天中擅自编造测试题。
  • 语言严重错配。
  • 输出报告体,而不是符合场景的聊天回复。

命中否决条件后,直接判负,不再让加权总分抵消这一问题。

工程实现上,可以先使用确定性规则检查明确的违规模式,再由裁判模型辅助判断依赖语境的复杂情况。不能仅依赖关键词匹配,也不能完全依赖大模型判断。

4. 使用加权评分标准#

对于没有触发否决规则的回复,可以使用加权评分评估整体质量。

示例评分标准:

评分维度权重
自然度25
保护性立场20
情绪贴合20
口语亲密感15
安全边界10
可回复性10
合计100

每个维度按照统一的评分说明打分,再根据权重计算总分。

注意:评分标准需要明确各分数对应的行为表现,避免裁判只凭主观印象打分。

三、核心模块设计#

模块主要职责
DatasetManager管理测试用例、分类及版本
ResponseGenerator调用生成模型,获取新旧版本回复
RuleChecker检查硬性规则并记录违规证据
LLMJudge按固定评分标准评估回复
ReportGenerator汇总评分、胜负、否决原因,输出报告

模块之间的关系#

DatasetManager
↓
ResponseGenerator
↓
保存新旧版本回复
↓
RuleChecker
↓
LLMJudge
↓
ReportGenerator

实际执行时,硬性规则和评分结果应分别记录,确保能区分“普通质量较差”和“触发严重违规”这两种情况。

四、生成模型与裁判模型分离#

为什么要分离?#

如果同一个模型既生成回复,又评价自己的回复,可能偏好自身习惯的表达风格,或者对某些问题判断不稳定。

因此,可以将生成模型和裁判模型分别配置:

  • 生成模型:负责生成聊天回复。
  • 裁判模型:负责根据测试用例和评分标准评估回复。

这样可以独立更换生成模型或裁判模型,例如使用成本较低的生成模型,同时使用更严格的裁判模型。

但模型分离并不意味着评估绝对客观。还需要使用人工标注的样本校准裁判,检查它是否能正确识别违规、情绪错配和无依据断言。

五、评估结果与报告#

每条用例至少保存以下内容:

  • 用例 ID。
  • 旧版和新版回复。
  • 各评分维度的得分。
  • 加权总分。
  • 否决规则是否命中及其证据。
  • 最终胜负。
  • 裁判给出的评分理由。

最终输出两种报告:

  1. JSON:供程序读取、自动比较和后续统计。
  2. Markdown:供开发者阅读,查看失败案例和具体原因。

汇总时不能只看平均分,还要关注:

  • 新版本胜出、持平和落败的用例数量。
  • 否决规则的命中数量。
  • 各分类的分数变化。
  • 新版本引入的回归问题。
  • 关键用例是否全部通过。

六、复用已有回复,降低评估成本#

将回复生成与裁判评估拆开,并缓存已有结果。

发生的变化需要执行的操作
修改提示词重新生成受影响的回复,再评估
修改评分标准复用已有回复,重新运行裁判
修改裁判提示词复用已有回复,重新运行裁判
新增测试用例只运行新增用例,必要时执行全量回归
修改否决规则重新检查已有回复,必要时重新评估

需要注意:如果修改了生成模型或生成参数,原回复可以用于分析,但不能直接代表新生成配置的效果。

七、评估版本管理#

只有评估条件一致时,评分才适合直接横向比较。

至少需要记录:

  • prompt_version:被测提示词版本。
  • dataset_version:测试集版本。
  • rubric_version:评分标准版本。
  • judge_model:裁判模型版本。
  • judge_prompt_version:裁判提示词版本。
  • generation_config_version:生成模型及参数配置版本。

例如:

{
"prompt_version": "chat-v12",
"dataset_version": "relationship-v3",
"rubric_version": "rubric-v2",
"judge_model": "judge-model-x",
"judge_prompt_version": "judge-v4",
"generation_config_version": "gen-v2"
}

如果测试集、评分标准、裁判模型或裁判提示词发生变化,就不能直接将新旧总分当作同一标准下的结果比较。

即使配置一致,模型服务端更新和随机采样也可能导致结果波动,因此应保存原始回复、实际模型版本和调用参数,必要时重复运行以评估稳定性。

八、面试口述版#

我会把提示词评估做成固定测试集上的回归测试。

首先,针对不同场景准备固定用例,定义用户输入、期望行为、必须满足的要求和禁止行为。每次修改提示词后,使用相同的输入和上下文,分别生成新旧两版回复。

接着,先执行硬性规则检查,严重违规直接判负;对于没有触发否决的回复,再交给独立裁判模型,按照统一的评分标准评估自然度、情绪贴合度和安全边界等指标。

最后,系统汇总逐条用例的评分、新旧版本胜负和失败原因,生成 JSON 和 Markdown 报告。同时缓存生成结果,修改评分标准时可以复用已有回复,不必重新调用生成模型。

为了保证结果可比较,我还会对测试集、评分标准、裁判模型和裁判提示词进行版本管理,并保存原始回复和模型配置。这样提示词优化就不再是凭感觉判断,而是能够通过回归结果发现问题、定位退化并验证改动效果。

九、记忆要点#

记住这六个关键词:

  1. 固定用例:保证新旧版本使用相同测试输入。
  2. 新旧对比:保存两版回复,检查改动效果。
  3. 硬性否决:严重违规不能被高分抵消。
  4. 加权评分:统一衡量回复质量。
  5. 结果缓存:复用回复,降低评估成本。
  6. 版本管理:保证评估条件一致、结果可比较。

一句话总结:固定测试集负责复现问题,硬性规则负责守住底线,裁判模型负责衡量质量,版本管理负责保证比较有效。

用回归集约束提示词改动
https://blog.xqcherry.top/posts/interview/ai-engineering/prompt-regression-testing/
作者
xqcherry
发布于
2026-10-24
许可协议
CC BY-NC-SA 4.0