提示工程在 Agent 中的应用
提示工程(Prompt Engineering)在 Agent 场景下有着比一般 LLM 应用更复杂的要求。Agent 的系统提示不仅要定义模型的行为风格,还要规范工具使用、决策逻辑、输出格式和错误处理。本章深入讲解 Agent 场景下的提示工程最佳实践。
提示工程(Prompt Engineering)在 Agent 场景下有着比一般 LLM 应用更复杂的要求。Agent 的系统提示不仅要定义模型的行为风格,还要规范工具使用、决策逻辑、输出格式和错误处理。本章深入讲解 Agent 场景下的提示工程最佳实践。
建议完成第 04、05 章
Agent 系统提示的结构、工具使用提示技巧、错误处理提示
系统协同 · 大模型与智能体协同
文章导航
点击图中节点可定位到对应正文。
引言
提示工程(Prompt Engineering)在 Agent 场景下有着比一般 LLM 应用更复杂的要求。Agent 的系统提示不仅要定义模型的行为风格,还要规范工具使用、决策逻辑、输出格式和错误处理。本章深入讲解 Agent 场景下的提示工程最佳实践。
1. Agent 系统提示的结构
1.1 标准结构模板
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 1. 身份定义 ─────────────────────────────────────┐
│ 你是谁、你的角色和专长 │
├─ 2. 核心目标 ─────────────────────────────────────┤
│ 你的主要任务是什么 │
├─ 3. 行为准则 ─────────────────────────────────────┤
│ 行动原则、优先级、禁止事项 │
├─ 4. 工具使用指南 ─────────────────────────────────┤
│ 何时使用哪个工具、使用顺序、错误处理 │
├─ 5. 输出格式 ─────────────────────────────────────┤
│ 回答的结构和格式要求 │
├─ 6. 约束与边界 ───────────────────────────────────┤
│ 不能做什么、何时拒绝、何时请求帮助 │
└───────────────────────────────────────────────────┘1.2 完整示例
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
工具使用顺序:
1. 问题场景:monitor_query → log_search → 诊断 → kubectl/aws_cli → 验证
2. 部署场景:确认 → kubectl apply → monitor_query 观察 → 报告根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 输出格式
- 问题诊断使用结构化格式:现象 → 原因 → 解决方案 → 执行
- 命令操作前说明目的和影响
- 操作后验证结果并报告2. 工具使用提示技巧
2.1 工具选择引导
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 是否需要实时数据?
→ 是: 使用 query_database 或 search_web
→ 否: 使用已有知识回答根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
2. 是否需要执行操作?
→ 是: 使用对应的执行工具(execute_command, send_email)
→ 否: 直接回答根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
3. 是否需要计算?
→ 是: 使用 run_python 进行精确计算
→ 否: 直接回答根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
4. 是否需要多个工具协作?
→ 是: 按依赖关系顺序调用,前一个的输出作为后一个的输入
→ 否: 调用单个工具2.2 工具参数生成
# 参数生成规则
调用工具时,参数必须准确且完整:
1. SQL 查询:
- 必须指定表名和条件
- 大表查询必须加 LIMIT(默认 100)
- 时间查询使用标准格式 YYYY-MM-DD
2. 代码执行:
- 代码必须完整可运行
- 必须包含必要的 import
- 添加适当的错误处理
3. API 调用:
- 检查必需参数是否齐全
- 使用正确的数据类型(数字不要加引号)
- 包含认证信息3. 错误处理提示
3.1 工具失败处理
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 仔细阅读错误信息
2. 判断错误类型:
a. 参数错误 → 修正参数后重试
b. 权限错误 → 告知用户需要授权
c. 超时错误 → 等待后重试,最多 3 次
d. 服务不可用 → 告知用户,提供替代方案3.2 幻觉防护
# 防止幻觉
核心原则:不知道就说不知道
具体规则:
1. 不要编造不存在的 API 或工具
2. 不要编造数据——所有数据必须来自工具查询
3. 不要猜测不确定的信息——使用搜索工具验证
4. 不要假装执行了操作——必须实际调用工具
5. 引用信息时注明来源
当不确定时的回答模板:
"关于 {topic},我没有确切的信息。我可以:
1. 使用搜索工具查找最新信息
2. 查询数据库获取准确数据
3. 承认我不确定并建议您咨询相关专家
请选择。"4. 多轮对话管理
4.1 状态追踪提示
# 对话状态追踪
在每轮对话中,你需要追踪:
1. 当前任务进度
- 用户最初要求什么
- 已经完成了哪些步骤
- 还剩什么未完成
2. 关键上下文
- 用户提到的偏好和约束
- 已经获取的数据和结果
- 已经做出的决策
3. 待确认事项
- 需要用户确认的操作
- 不确定的假设
每次回复前,先在内部更新这些状态。4.2 上下文切换
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 检测到新话题
→ 告知用户:"我注意到您切换到了新话题 {new_topic}"
→ 询问:"需要我先完成之前的 {old_task} 吗?"根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
2. 保存旧上下文
→ 记录旧任务的进度
→ 以便之后可以恢复根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
3. 处理新话题
→ 完全投入新话题
→ 不要在新旧话题间混淆5. 高级提示技巧
5.1 思维链(CoT)在 Agent 中
# 推理要求
在处理复杂任务时,你必须展示推理过程:
<reasoning>
1. 用户的真实需求是什么?(区分表面需求和深层需求)
2. 我需要哪些信息?(已有 / 需要获取)
3. 最佳工具组合是什么?
4. 可能的风险是什么?
5. 如何验证结果的正确性?
</reasoning>
<action>
基于推理,执行具体操作
</action>5.2 Few-Shot 示例
# 示例:如何处理数据分析请求
## 示例 1:简单查询
用户: "上个月的销售总额是多少?"
思考: 需要查询数据库获取销售数据
操作: query_database(sql="SELECT SUM(amount) FROM sales WHERE month='2024-11'")
结果: 1,234,567
回答: "2024年11月的销售总额为 **1,234,567 元**。"
## 示例 2:需要多步分析
用户: "为什么上个月的销售下降了?"
思考: 需要先获取数据,再对比分析
操作 1: query_database(sql="SELECT * FROM monthly_sales WHERE year=2024")
结果 1: [1月:1200万, ..., 10月:1500万, 11月:1234万]
思考: 11月确实比10月下降了18%,需要进一步分析原因
操作 2: query_database(sql="SELECT category, SUM(amount) FROM sales WHERE month IN ('2024-10','2024-11') GROUP BY category")
结果 2: [A类下降30%, B类持平, C类增长5%]
回答: "上月销售下降的主要原因是 A 类产品下降了 30%..."
## 示例 3:工具调用失败
用户: "查询实时库存"
操作: query_database(sql="SELECT * FROM inventory")
错误: "Connection timeout"
思考: 数据库连接超时,可能是网络问题
操作: query_database(sql="SELECT * FROM inventory")(重试)
结果: 成功
回答: "当前库存数据..."(附注:第一次查询超时,重试后成功)6. 提示模板管理
6.1 版本管理
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def get(self, name: str, **kwargs) -> str:
version = self.current_version[name]
template = self.prompts[f"{name}:{version}"]
return template.format(**kwargs)6.2 动态提示组装
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def build_agent_prompt(base_prompt: str, context: dict) -> str:
"""根据上下文动态组装提示"""7. 本章小结
| 维度 | 最佳实践 |
|---|---|
| 系统提示 | 身份 + 目标 + 准则 + 工具指南 + 格式 + 约束 |
| 工具使用 | 决策树 + 参数规则 + 错误处理 |
| 幻觉防护 | 不知道就说不知道,数据必须来自工具 |
| 推理 | 使用 CoT 展示推理过程 |
| 示例 | 提供 few-shot 示例说明期望行为 |
| 版本管理 | 提示词也要版本控制和 A/B 测试 |
相关章节
- 提示工程(Prompt Engineering) — 提示工程的通用方法与基础
- 规划与推理 — Agent 提示背后的推理范式
- 什么是智能体 — 提示工程服务的应用主体
- 对齐技术(SFT-RLHF-DPO) — 决定模型行为的基础训练
延伸阅读
- OpenAI (2024). "Prompt Engineering Guide". platform.openai.com
- Anthropic (2024). "Prompt Engineering for Claude". docs.anthropic.com
- Liu, P. et al. (2023). "Pre-train, Prompt, and Predict: A Systematic Survey". ACM Computing Surveys