Prompt Engineering 高阶技巧
在 Agent 工程中,Prompt 不是"写一句话让模型回答",而是通过文本编程来控制模型的行为、推理路径和输出格式。掌握高阶 Prompt Engineering 技巧,是让 LLM 在复杂工作流中稳定运作的核心能力。
系统提示(System Prompt)
系统提示是设定模型"角色"与"行为边界"的最高优先级指令。它位于用户消息之前,权重高于后续所有对话内容。
设计原则
角色定义要具体:不要只说"你是一个助手",而是明确界定职责范围。例如:
你是一个数据分析 Agent,只负责从用户提供的数据中提取统计指标,不负责数据采集或可视化。约束条件要穷举:模型不会自动理解你的隐含边界。列出所有"不要做的事"比列出"要做的事"更重要:
不要: - 编造不存在的数据 - 离开数据分析话题进行闲聊 - 输出未经计算验证的数字输出格式要预设:在系统提示中定义输出模板,比在用户消息中临时指定更稳定:
输出格式: { "metric_name": string, "value": number, "confidence": "high" | "medium" | "low", "source": string }分层结构优于线性叙述:用标题、分隔符、编号等结构组织系统提示,让模型更容易定位和遵循每个指令段落。
结构化输出(Structured Output)
Agent 系统需要 LLM 的输出能被下游代码直接解析。纯自然语言输出在自动化流程中是灾难性的。
JSON 模式
在系统提示中要求 JSON 输出,并给出完整的 schema 示例。关键技巧:
- 给出完整示例而非只描述格式:模型从示例学习比从规则描述学习更可靠
- 指定
response_format参数(OpenAI API):使用response_format: { type: "json_object" }强制 JSON 输出 - 在 Claude 中使用 XML 标签包裹输出:
<result><metric>...</metric></result>比 JSON 更抗干扰
防御性设计
模型有时会在 JSON 中嵌入"思考过程"或注释,破坏解析。防御策略:
- 在系统提示中明确声明:
直接输出 JSON,不要包含任何解释文字 - 使用
"""json\n{...}\n"""这样的围栏格式减少嵌入干扰 - 在后端代码中做二次清洗(截取第一个
{到最后一个}之间的内容)
思维链(Chain-of-Thought, CoT)
思维链让模型先展示推理过程,再给出最终结论。这对多步推理任务的效果提升是显著的——GPT-4 在数学推理上的错误率在使用 CoT 后可降低 40% 以上。
基础 CoT
最简单的触发方式是在 prompt 结尾加上:请逐步思考后再给出答案。
自洽性 CoT(Self-Consistency)
生成多条推理路径,取多数一致的结论。实现方式:
- 设置
temperature > 0生成 N 个回答 - 对最终结论做聚类或投票
- 选择出现频率最高的结论
这种方法在数学与逻辑推理任务上效果最好,代价是调用次数倍增。
强制结构化 CoT
要求模型按固定格式输出推理步骤:
思考过程:
1. [识别问题类型]
2. [列出已知条件]
3. [制定解题步骤]
4. [逐步执行计算]
5. [验证结果合理性]
最终答案:...
这种格式在 Agent 系统中尤其有用——你可以解析中间步骤,在特定节点插入人工审核或工具调用。
Few-shot 示例
Few-shot 通过在 prompt 中提供少量示例来传递隐含的模式规则。关键技巧:
示例选择策略
- 多样性优于数量:3 个覆盖不同类型的示例,比 5 个同类型示例更有效
- 难度递增:从简单示例开始,逐步展示复杂场景,帮助模型渐进理解
- 包含边界案例:至少一个示例展示"不该怎么做"或边缘情况的处理
示例格式
示例 1:
输入:简单的销售数据
输出:{"total": 1500, "trend": "up", "confidence": "high"}
示例 2:
输入:缺失部分数据的销售报表
输出:{"total": "N/A", "trend": "inconclusive", "confidence": "low", "missing_fields": ["week3"]}
示例 3:
输入:包含异常值的数据集
输出:{"total": 1500, "trend": "up", "confidence": "medium", "outliers": ["week5: 50000"]}
注意示例 2 和 3 展示了非理想情况的处理——这在 Agent 系统中至关重要,因为真实输入永远不会总是完美的。
ReAct 模式
ReAct(Reasoning + Acting)将推理与工具调用交织进行,是 Agent 系统中最常用的 prompt 模式:
思考:我需要查询用户最近的订单数据来计算退款金额
行动:call_database_query({"table": "orders", "user_id": "12345"})
观察:[工具返回的数据]
思考:根据返回数据,退款金额应为 299 元
行动:call_refund_process({"amount": 299, "order_id": "ORD-789"})
这种模式让 Agent 的每一步决策都可追踪、可审计、可中断——这是生产级 Agent 系统的基本要求。
组合使用原则
在实战中,这些技巧不是独立使用的。一个高效的 Agent prompt 通常组合了:
- System Prompt 设定角色、约束、输出格式
- Few-shot 传递具体行为模式
- CoT / ReAct 控制推理与行动的展开方式
- Structured Output 确保结果可被代码解析
组合顺序建议:System Prompt → Few-shot 示例 → 当前任务描述 → CoT/ReAct 指令
本章小结
| 技巧 | 核心作用 | 使用场景 |
|---|---|---|
| System Prompt | 设定角色、约束、输出格式 | 所有 Agent 任务的底层配置 |
| Structured Output | 强制模型按指定格式输出 | 需要被下游代码解析的场景 |
| Chain-of-Thought | 引导模型展示推理过程 | 数学、逻辑、多步推理任务 |
| Few-shot | 通过示例传递隐含规则 | 输出格式固定、模式明确的任务 |
| ReAct | 将推理与工具调用交织 | 需要多步环境交互的 Agent |
组合公式:System Prompt(地基) + Few-shot(示例) + CoT/ReAct(推理控制) + Structured Output(格式锁定)
📖 延伸阅读
- OpenAI Prompt Engineering Guide —— 官方最佳实践
- Anthropic Prompt Engineering —— Claude 专用技巧
- Chain-of-Thought Prompting Elicits Reasoning in LLMs —— CoT 原论文
- ReAct: Synergizing Reasoning and Acting in Language Models —— ReAct 原论文
⚠️ 重要提醒:Prompt Engineering 不是"调参魔法",而是系统工程。每次修改 prompt 后,务必用 20+ 个测试案例验证稳定性。
