团队把同一项任务交给 AI 时,经常得到结构不同、结论越界或无法回查的结果。原因通常不是少写了一句“请专业回答”,而是任务没有明确输入是什么、必须产出哪些字段、哪些信息不能推断,以及信息不足时应如何停止。一个可复用提示词应更像接口合同:调用者知道要提供什么,执行者知道允许做什么,验收者也能判断结果是否合格。本文以代码审查为例,逐步构造一份最小合同,并说明如何用固定样例验证它。
提示词合同包含什么
一份最小合同可以拆成六部分:
| 部分 | 要回答的问题 |
|---|---|
| 任务 | 本次只解决什么问题 |
| 输入 | 哪些材料是事实来源 |
| 范围 | 允许分析什么,不分析什么 |
| 输出 | 必须返回哪些字段和顺序 |
| 证据 | 结论如何回指输入 |
| 失败条件 | 信息不足或输入无效时怎么处理 |
“角色”可以帮助确定术语和关注点,但不能代替这些约束。只有“你是资深工程师”而没有输出合同,仍然无法验收。
从一个模糊请求开始
下面的请求无法约束审查范围,也没有证据要求:
请作为资深后端工程师审查这段代码,给出专业建议。
模型可能讨论性能、命名、架构甚至业务需求。即使内容很多,也很难判断是否遗漏真正的缺陷。
写成可复核的最小合同
可以改成下面的模板:
任务:审查输入代码中的正确性和可维护性问题。
输入:
- language:编程语言和版本
- code:待审查代码
- expected_behavior:调用方声明的预期行为
范围:
- 检查会导致错误结果、异常或资源泄漏的问题
- 检查明显影响后续修改的结构问题
- 不推断未提供的业务规则
- 不评价与输入无关的技术选型
输出:
按严重程度列出发现。每项必须包含:
1. location:最小代码位置
2. problem:可观察的问题
3. condition:触发条件
4. consequence:实际影响
5. suggestion:最小修复方向
证据:
- 每项发现必须引用输入中的具体语句或控制流
- 没有足够证据时标记为“待确认”,不得写成确定结论
失败条件:
- code 为空时返回 INPUT_MISSING
- 无法判断语言时返回 LANGUAGE_REQUIRED
- 没有发现时返回 NO_FINDINGS,并列出尚未覆盖的风险
模板没有规定必须发现多少问题,也没有要求生成完整修复代码。这样可以减少为了满足数量而制造结论的倾向。
给输出增加机器可读结构
若结果还要进入自动化流程,可以约定 JSON 结构:
{
"status": "OK",
"findings": [
{
"severity": "high",
"location": "function_name:line",
"problem": "...",
"condition": "...",
"consequence": "...",
"suggestion": "...",
"confidence": "confirmed"
}
],
"limitations": ["..."]
}
结构化输出不等于内容正确。解析方仍要校验字段是否存在、枚举值是否合法,并处理模型在字段之外返回文本的情况。不要用正则表达式从任意自然语言中猜测关键状态。
用对照样例验证合同
至少准备三类固定输入:
正常样例
包含一个可以从代码直接证明的问题。验收重点是位置、触发条件和影响能否互相对应,而不是措辞是否一致。
无问题样例
输入一段范围内没有明显缺陷的代码。预期返回 NO_FINDINGS,而不是为了显得有用而提出无关重构。
无效输入样例
分别缺少代码、语言或预期行为。确认系统能按合同返回缺失状态,不凭空补全上下文。
每次修改提示词后重新运行同一组样例,记录输入版本、提示词版本和人工判定。仅凭一次“看起来不错”的结果,不能说明合同已经稳定。
把事实与偏好分开
编码规范、允许的依赖和输出格式属于团队约束,应作为显式输入或版本化规则传入。某次审查中的代码、报错和需求则属于任务输入。不要把临时项目事实写进长期通用指令,否则后续任务可能继承错误背景。
同样,不要在合同中写“永远使用某种框架”这类没有范围的偏好。应说明适用仓库、版本和例外处理方式。
变更提示词时控制变量
验证提示词变化时,保持模型、参数和样例不变;验证模型变化时,保持提示词和样例不变。否则结果发生变化后无法归因。对高风险流程,还应保存原始输入与输出的脱敏记录,供人工复查。
结论与限制
可复用提示词的核心不是堆叠技巧,而是建立输入、范围、输出、证据和失败条件。把任务写成最小合同,再用正常、无问题和无效样例反复验证,团队才能对输出建立一致的验收标准。
本文方法适合约束文本分析与结构化生成,不能保证模型事实无误,也不能替代编译、测试、静态分析或人工评审。涉及具体工具的系统指令、结构化输出能力和字段限制,仍需依据当前接口文档验证。