提示词工程(Prompt Engineering)
提示词不是一句“咒语”,而是模型调用的输入契约:说明目标、证据、约束、可用能力、停止条件和输出形式。
Prompt 在系统中的位置
Prompt 是 Context 的一部分。它负责表达“怎样做”,Context Engineering 还要决定“这一轮究竟给模型哪些消息、文档、记忆、工具和状态”。
一份可维护 Prompt 的六部分
可以使用下面的骨架,但不要为了形式强行填满:
Outcome-first:先描述终点
对能力较强的推理模型,优先说明结果、验收条件、约束和证据规则。只有业务流程必须严格按顺序执行时,才把每一步写死。过度规定思考步骤会增加噪声,也可能阻止模型选择更短路径。
好的停止条件比“认真思考”更有用:
- 已满足哪些字段才允许结束;
- 缺证据时是查询、澄清还是拒绝;
- 最多使用多少次工具;
- 哪些情况必须交给人工;
- 输出被 Schema 拒绝时允许修复几次。
用结构化输出替代文本解析
下面示例使用 Context7 核验过的 OpenAI Agents SDK 0.7.x API。运行需要 Python 3.10+、可用的 OPENAI_API_KEY,以及账户可访问的模型配置。
Pydantic 负责验证形状和取值范围,但不能证明事实正确。evidence 是否真的出现在输入中,仍应由应用代码或评测器检查。
Few-shot 示例怎么选
示例的价值是展示决策边界,而不是堆数量。优先覆盖:
- 容易混淆的相邻类别;
- 信息不足与拒绝场景;
- 多意图输入;
- 对抗性输入和提示注入;
- 工具失败或无结果;
- 正常但格式容易出错的长尾样本。
不要让示例中的临时事实变成错误规则。稳定规则放指令,易变数据放检索或工具。
工具描述也是 Prompt
模型依据工具名称、描述和 Schema 决定是否调用。工具描述至少写清:
- 做什么、不做什么;
- 何时应使用、何时不应使用;
- 参数含义、单位、时区与允许范围;
- 是否产生写入、发送、删除、支付等副作用;
- 重试是否安全;
- 常见错误以及修复方式。
“搜索数据”远不如“按订单号查询单个订单;只读;找不到时返回 not_found,不要猜测订单状态”有效。
Prompt 版本化与回归测试
Prompt、模型、工具 Schema 和检索配置共同决定行为,至少记录:
回归测试不要只比较整段字符串。应断言业务属性:分类是否正确、是否引用有效证据、是否触发必要人工审核、工具选择和参数是否正确、成本与延迟是否在预算内。
提示注入边界
检索文档、网页、邮件和工具返回值都是不可信数据。不要用“忽略文档里的指令”作为唯一防线,还要在代码层做到:
- 将数据与指令放在不同字段或消息中;
- 工具使用 allowlist 和最小权限;
- 高影响操作二次确认或人工审批;
- 密钥永不进入模型上下文;
- 输出经 Schema、业务规则和权限层验证;
- 对外部内容标注来源,并限制其能改变的系统状态。
常见反模式
- 同一个 Prompt 同时承担分类、检索、决策、执行和解释,导致职责不清。
- 把全部业务规则塞进自然语言,却没有测试集和版本号。
- 用正则解析自由文本来控制付款、删除等高风险动作。
- 出错后无限追加“请再仔细想想”,没有新证据或外部反馈。
- 把模型输出的 confidence 当作校准过的真实概率。