Prompt Engineering
Prompt Engineering 的目标不是写漂亮句子,而是让模型在真实产品里稳定、可控、可评测地工作。
Prompt 的本质
Prompt 不是一句“咒语”,而是任务接口。它把业务目标、上下文、约束和输出格式翻译成模型能执行的指令。
一个工程化 Prompt 应该满足三点:
- 可复用:不同输入下结构一致。
- 可测试:有样例可以判断好坏。
- 可维护:修改原因、版本和效果能追踪。
如果一个 Prompt 只能靠某个人现场解释才能用,它就还不是一个可靠的工程资产。
一个好的 Prompt 应包含什么
- 角色:模型正在扮演什么专家
- 任务:它需要完成什么
- 背景:可用信息和业务上下文
- 约束:不能做什么,必须遵守什么
- 输出格式:JSON、Markdown、表格或自然语言
- 示例:必要时给少量高质量样例
- 失败处理:信息不足时如何回答
Prompt 分层
在真实应用里,Prompt 通常不是一整段字符串,而是多层信息组合:
| 层级 | 内容 | 是否经常变化 |
|---|---|---|
| 系统规则 | 角色、安全边界、总体原则 | 很少变化 |
| 任务模板 | 当前功能的目标、步骤、输出格式 | 中等频率 |
| 业务上下文 | 产品规则、用户状态、文档片段 | 经常变化 |
| 用户输入 | 用户当前问题 | 每次变化 |
| 示例 | 少量高质量输入输出样例 | 偶尔变化 |
分层的好处是便于测试和替换。比如你可以单独评测任务模板,也可以比较不同上下文检索策略。
推荐模板
你是一个{角色}。
任务:
{明确任务}
背景:
{上下文信息}
约束:
- {约束 1}
- {约束 2}
输出格式:
{格式要求}
如果信息不足:
{澄清或拒答策略}
更适合生产的结构化模板
角色:
你是一个{业务场景}中的{助手类型}。
目标:
{一句话说明任务成功标准}
可用信息:
{上下文、资料、工具结果}
必须遵守:
- 只基于可用信息回答
- 不确定时说明缺少什么信息
- 不输出内部推理过程
- 不执行权限之外的建议
输出格式:
{JSON schema 或 Markdown 结构}
失败处理:
如果无法完成,返回{固定失败格式},并说明原因。
生产场景要特别重视“成功标准”和“失败格式”。这会让后续评测和错误处理更容易。
新手最容易犯的错误
错误写法:
帮我总结一下这个文档。
更好的写法:
你是一个产品经理助手。请阅读下面文档,输出一份面向研发团队的需求摘要。
要求:
- 用项目符号输出
- 必须包含目标用户、核心需求、风险和待确认问题
- 不要编造文档中没有的信息
- 如果信息不足,请写在“待确认问题”里
区别在于:后者明确了角色、读者、输出格式、边界和失败处理。
常用技巧
- 把复杂任务拆成多个小任务
- 对输出使用 schema,而不是只写“请输出 JSON”
- 对关键字段做后处理校验
- 给模型提供反例,减少错误模式
- 把业务规则写在代码里,模型只负责语义判断
Few-shot 示例怎么写
Few-shot 是给模型少量示例,让它模仿格式和判断标准。示例不需要多,但要有代表性。
好的示例应该覆盖:
- 一个标准成功案例。
- 一个边界案例。
- 一个应该拒答或标记为未知的案例。
- 一个容易误判的反例。
不要放太多相似示例,否则会浪费上下文。示例也要和真实线上输入接近,不要只写理想化样例。
Chain-of-thought 和可解释输出
在产品里不一定要让模型输出完整思考过程。更推荐让模型输出“简洁理由”或“依据字段”,例如:
{
"category": "billing",
"confidence": 0.82,
"reason": "用户询问发票和扣款问题",
"need_human_review": false
}
这样既能帮助人工复核,也不会把冗长、不稳定的推理过程暴露给用户或下游系统。
输出格式设计
如果输出要给程序使用,尽量满足:
- 字段名固定。
- 类型明确。
- 枚举值有限。
- 可空字段有说明。
- 错误状态有统一结构。
示例:
{
"answer": "string",
"sources": [
{
"title": "string",
"url": "string",
"chunk_id": "string"
}
],
"cannot_answer": false,
"missing_info": []
}
好的 schema 会减少很多后处理麻烦。
项目检查点
- 是否有 prompt 版本管理
- 是否有失败样例库
- 是否能对比不同 prompt 的效果
- 是否把输出格式校验放进代码
- 是否记录 prompt、输入、输出和用户反馈
Prompt 版本管理
当项目变复杂后,Prompt 应该像代码一样管理:
- 每个 prompt 有名称和版本
- 每次修改写变更原因
- 关键 prompt 有测试样例
- 线上记录 prompt 版本
- 不同模型切换时重新评测
Prompt 评测方法
Prompt 改动后,不要只看一个样例。至少准备三类测试:
| 类型 | 目的 |
|---|---|
| 正常样例 | 确认常见输入能稳定完成 |
| 边界样例 | 检查信息不足、歧义、超长输入 |
| 失败样例 | 检查拒答、格式错误、越权请求 |
记录每次改动前后的通过率、失败原因和示例输出。这样 Prompt 才能像代码一样迭代。
适合结构化输出的任务
- 简历信息抽取
- 工单分类
- 合同条款识别
- 客服对话打标
- 会议纪要结构化
- 商品评论情感分析
不适合只靠 Prompt 解决的问题
- 数据权限控制
- 复杂业务规则判断
- 高风险自动操作
- 大规模稳定批处理
- 需要严格数学正确性的任务
这些问题应该结合代码、规则、工具、评测和人工复核一起解决。
实战练习
- 把一个“帮我总结文档”的模糊 Prompt 改造成结构化 Prompt。
- 为客服工单分类设计 JSON schema,包含类别、置信度、理由和是否人工复核。
- 准备 10 条测试输入,比较两个 Prompt 版本的输出稳定性。
- 给一个 RAG 回答 Prompt 增加“只能基于引用资料回答”的拒答策略。