给 Agent 写任务描述,你用的根本不是正确的打开方式

我把之前写 ChatGPT 的 Prompt 直接复制进去,Agent 跑了三分钟,给我输出了一句"请问您需要我继续吗?"

——我当时就想把电脑扔出去。

这不是个例。几乎每个第一次上手 Agent 开发的人都会经历这个阶段:把精心打磨过的 ChatGPT Prompt 丢进去,满怀期待地等待,然后看着 Agent 要么原地发呆、要么无限循环、要么第一步就跑到完全不相关的方向上去。

问题出在哪?不是 Agent 太笨,是你用错了思维模型。

---

第一章:你以为自己在写 Prompt,其实你在招聘一个员工

ChatGPT 是服务员,Agent 是承包商——这两种角色,你跟他们说话的方式完全不同。

对服务员,你说"来份宫保鸡丁"就够了。他接收指令,执行,结束,等你下一句话。

对承包商,你得给他图纸、验收标准和预算上限。他要自己判断用什么材料、遇到问题怎么处理、什么时候算"完工"。你给他一句"把这个做好",他要么做错方向,要么做到一半来问你,要么永远做不完——因为他不知道"好"是什么意思。

这就是为什么你的 ChatGPT Prompt 在 Agent 里跑不起来。

ChatGPT 的 Prompt 是"一次性指令",Agent 的任务描述是"岗位说明书"。

岗位说明书包含什么?角色定义(你是谁、你的权限边界)、执行流程(怎么做、用什么工具)、终止条件(什么情况算完成、什么情况要上报)。

这三个要素,缺一不可。缺了角色定义,Agent 不知道自己能做什么决策;缺了执行流程,Agent 自己瞎猜步骤;缺了终止条件,Agent 就会无限循环或者在第一步就停下来等你。

核心框架:任务描述 = 角色定义 + 执行流程 + 终止条件

接下来我用5种写法的实测对比,让你直观感受这个框架的威力。

---

第二章:5种写法实测对比

测试场景:让 Agent 自动完成"监控指定网站的价格变化,发现降价超过20%时发送通知"这个任务。

测试环境:OpenAI Agents SDK 2.0,每种写法各跑5次,统计一次跑通率和平均步骤数。

---

写法①:直接复制 ChatGPT Prompt

agent = Agent(

name="价格监控助手",

instructions="""

监控以下网站的商品价格,当价格下降超过20%时通知我。

目标网站:https://example-shop.com/product/12345

"""

)

运行结果: Agent 抓取了一次价格数据,然后输出"已获取当前价格为 ¥299,请问您需要我继续监控吗?"——然后停住了。 问题所在: 没有时间间隔定义,没有"继续"的触发条件,没有通知方式。Agent 完成了它能理解的部分,然后理性地停下来等人类决策。 | 指标 | 结果 | | 一次跑通率 | 0/5 | | 平均步骤数 | 1.2步 | | 主要问题 | 第一步后停止等待确认 |

---

写法②:加了"请自动完成所有步骤"

agent = Agent(

name="价格监控助手",

instructions="""

请自动完成所有步骤,监控以下网站的商品价格,

当价格下降超过20%时通知我。不需要询问,自动执行。

目标网站:https://example-shop.com/product/12345

"""

)

运行结果: Agent 进入循环,每隔几秒就抓取一次价格,不停地记录、比对、记录、比对……跑了47步之后 token 耗尽被强制终止。全程没有触发通知,因为它不知道"通知"意味着什么操作。 问题所在: "自动完成"给了 Agent 自主权,但没有给终止条件,也没有定义工具。Agent 用自己的理解无限执行"监控"这个动作。 | 指标 | 结果 | | 一次跑通率 | 0/5 | | 平均步骤数 | 47步(强制终止) | | 主要问题 | 无限循环,token 耗尽 |

---

写法③:加入明确的步骤编号

agent = Agent(

name="价格监控助手",

instructions="""

按以下步骤执行价格监控任务:

Step 1: 访问 https://example-shop.com/product/12345,获取当前价格

Step 2: 与基准价格(¥399)对比,计算降幅

Step 3: 如果降幅超过20%,发送通知

Step 4: 等待1小时后重复Step 1

""",

tools=[fetch_price_tool, send_notification_tool, wait_tool]

)

运行结果: 明显改善。Agent 能按步骤执行,价格抓取和对比都正确。但遇到网站返回异常状态码时,Agent 不知道该用哪个工具处理,随机选了 send_notification_tool 发送了一条"价格获取失败"的通知——虽然有通知,但内容完全不对。 问题所在: 步骤清晰了,但工具优先级和异常分支没有定义。 | 指标 | 结果 | | 一次跑通率 | 2/5 | | 平均步骤数 | 8.4步 | | 主要问题 | 异常情况下工具选择错误 |

---

写法④:加入终止条件 + 工具使用优先级

agent = Agent(

name="价格监控助手",

instructions="""

## 角色

你是一个价格监控 Agent,负责监控商品价格并在满足条件时触发通知。

## 执行流程

Step 1: 使用 fetch_price 工具获取目标商品价格

Step 2: 与基准价格 ¥399 对比,计算降幅百分比

Step 3: 如果降幅 >= 20%,立即调用 send_email 工具发送通知,然后终止任务

Step 4: 如果降幅 < 20%,调用 wait 工具等待3600秒,然后回到Step 1

## 工具优先级

- 价格获取:优先使用 fetch_price,失败时使用 fetch_price_backup

- 通知发送:使用 send_email

## 终止条件

- 成功发送降价通知后终止

- 连续失败3次后终止并记录错误

""",

tools=[fetch_price_tool, fetch_price_backup_tool, send_email_tool, wait_tool]

)

运行结果: 跑通率大幅提升。正常情况下完全符合预期,工具调用路径清晰。但遇到网站返回非标准 HTML 时,价格解析失败,Agent 判断为"获取失败"并触发了备用工具,但备用工具也解析失败,最终在第3次失败后正确终止——但没有输出任何错误信息,调试起来很困难。 | 指标 | 结果 | | 一次跑通率 | 4/5 | | 平均步骤数 | 6.1步 | | 主要问题 | 异常处理逻辑存在,但输出不规范 |

---

写法⑤:完整版(角色+流程+边界+异常处理+输出格式)

agent = Agent(

name="价格监控助手",

instructions="""

## 角色声明

你是价格监控 Agent。你的决策范围:价格抓取、数据对比、通知发送。

你不能做的:修改任何数据库记录、发送非通知类邮件、访问目标URL以外的网站。

## 工具清单与优先级

1. fetch_price(主要)→ fetch_price_backup(备用,主要失败时使用)

2. send_email(通知工具,仅在降价条件满足时调用)

3. wait(等待工具,单次等待上限3600秒)

4. log_error(错误记录工具,任何异常必须调用)

## 执行流程

Step 1: 调用 fetch_price 获取 https://example-shop.com/product/12345 的价格

Step 2: 解析价格数值(格式:¥数字,如 ¥299)

Step 3: 计算与基准价格 ¥399 的降幅,公式:(399 - 当前价格) / 399 * 100

Step 4: 判断分支:

- 降幅 >= 20%:执行通知流程(见下方),然后【终止任务】

- 降幅 < 20%:调用 wait 等待3600秒,回到Step 1

- 价格解析失败:调用 log_error 记录,失败次数+1,回到Step 1

## 终止条件

- 【正常终止】:成功发送降价通知

- 【异常终止】:连续失败次数达到3次

- 【超时终止】:总运行时间超过72小时

## 异常处理

- fetch_price 失败:等待60秒后尝试 fetch_price_backup

- fetch_price_backup 也失败:调用 log_error,记录失败,失败计数+1

- send_email 失败:等待300秒后重试一次,仍失败则调用 log_error 并【终止任务】

## 输出规范

每次循环结束输出 JSON:

{

"cycle": 循环次数,

"current_price": 当前价格数值,

"discount_rate": 降幅百分比,

"action_taken": "wait" | "notify" | "error",

"next_action": 下一步操作描述

}

任务终止时额外输出:

{

"status": "completed" | "failed" | "timeout",

"reason": 终止原因,

"total_cycles": 总循环次数

}

""",

tools=[fetch_price_tool, fetch_price_backup_tool, send_email_tool, wait_tool, log_error_tool]

)

运行结果: 5次测试,4次一次跑通,完全符合预期。1次因外部 API 超时触发重试逻辑,重试后成功,行为符合预期。每次循环都有结构化输出,调试时一眼看出问题所在。 | 指标 | 结果 | | 一次跑通率 | 4/5(1次触发重试后成功) | | 平均步骤数 | 5.8步 | | 主要问题 | 无(重试属于预期行为) |

---

5种写法汇总对比: | 写法 | 一次跑通率 | 平均步骤数 | 核心问题 | | ①直接复制ChatGPT Prompt | 0/5 | 1.2步 | 第一步后停止 | | ②加"自动完成" | 0/5 | 47步 | 无限循环 | | ③加步骤编号 | 2/5 | 8.4步 | 异常分支失控 | | ④加终止条件+工具优先级 | 4/5 | 6.1步 | 输出不规范 | | ⑤完整版 | 4/5(+1次重试成功) | 5.8步 | 无 |

---

第三章:让 Agent 少跑偏的4个黄金原则

从5种写法的对比中,我提炼出4个核心原则。

原则1:写"什么情况下停"比写"做什么"更重要

Agent 最常见的死亡原因是不知道任务何时结束

"做什么"是起点,"什么时候停"是终点。没有终点的任务,Agent 要么无限跑、要么随机停。你的任务描述里,终止条件要比执行步骤更早想清楚。

每个 Agent 任务至少要定义三种终止:正常终止、异常终止、超时终止。

原则2:工具调用要给优先级和 fallback

不要让 Agent 自己猜用哪个工具。当你有多个功能相似的工具时,必须明确写出"先用A,A失败再用B"的优先级顺序。

没有优先级,Agent 会在多个工具之间随机选择,每次运行结果都不一样,调试时你会发疯。

原则3:用"断言式输出"代替"描述式输出"

不要写"请生成一份报告"——这是描述式输出,Agent 不知道"报告"长什么样。

要写"输出 JSON,字段包含 summary/confidence/next_action,其中 confidence 为0到1的浮点数"——这是断言式输出,结果可验证、可解析、可调试。

描述式输出给人看,断言式输出给程序用。 Agent 的输出通常需要被下游程序处理,格式不确定就是定时炸弹。

原则4:把人类决策点显式标注出来

哪些步骤 Agent 可以自主,哪些步骤必须 human-in-the-loop,要在任务描述里写死,不能让 Agent 自己判断"这件事要不要问人类"。

一个常见的错误:让 Agent 自主决定"是否需要人类确认"。结果是 Agent 要么什么都问、要么什么都不问,取决于当次的随机性。

---

第四章:一份可以直接复制的任务描述模板

基于上面的实测经验,我整理了一个通用模板。六个模块,必填项用 [必填] 标注。

## 角色声明 [必填]

你是 [Agent名称],负责 [核心职责一句话描述]。

你的决策权限:[可以自主做的事]

你不能做的:[明确的边界]

工具清单 [必填]

1. [工具名称]:[用途]([使用条件])

2. [工具名称]:[用途](备用,当工具1失败时使用)

[按优先级排列]

执行流程 [必填]

Step 1: [具体操作,指定使用哪个工具]

Step 2: [具体操作]

Step N: 判断分支:

- 条件A:[执行什么,然后跳转到哪一步或终止]

- 条件B:[执行什么,然后跳转到哪一步或终止]

终止条件 [必填]

  • 【正常终止】:[具体条件]
  • 【异常终止】:[具体条件,如连续失败N次]
  • 【超时终止】:[时间限制](可选,但建议加上)

异常处理 [建议加]

  • [工具名]失败:[处理方式]
  • [特定异常]:[处理方式]
  • 未知异常:[默认处理方式,如记录日志并终止]

输出规范 [必填]

[定义每个关键节点的输出格式,推荐JSON]

示例:

{

"step": 当前步骤,

"status": "success" | "failed" | "pending",

"result": 操作结果,

"next": 下一步操作

}

最小可用版本: 如果任务很简单,可以只保留「角色声明」「执行流程」「终止条件」三个模块,其他模块随任务复杂度逐步添加。

---

如果你想直接上手测试这些写法,不想在本地折腾环境配置,可以用 [api.884819.xyz](https://api.884819.xyz) 直接调用 API——我自己测试5种写法时用的就是这个,省去了大量环境搭建的时间,专注在任务描述本身的调优上。新用户注册即送体验 token,国产模型完全免费,按量付费,没有月租。

---

第五章:什么时候用 Agent,什么时候老老实实用 ChatGPT

Agent 不是银弹。用错场景,它比直接用 ChatGPT 更慢、更贵、更难调试。

Agent 的甜点区:
  • 多步骤:任务需要3步以上的连续操作
  • 有工具调用:需要访问外部 API、数据库或文件系统
  • 结果可验证:有明确的成功/失败标准
  • 需要重复执行:同样的流程要跑很多次
老老实实用 ChatGPT 的场景:
  • 一次性创意任务(写文案、头脑风暴)
  • 需要大量人类判断的决策(策略规划、风险评估)
  • 输出结果高度不确定、难以验证的任务
快速决策树:
你的任务需要多步骤操作吗?

├── 否 → 用 ChatGPT,直接问

└── 是 → 需要调用外部工具/API吗?

├── 否 → 用 ChatGPT + 手动操作

└── 是 → 结果有明确的成功标准吗?

├── 否 → 慎用Agent,先定义清楚验收标准

└── 是 → 用 Agent,按本文框架写任务描述

---

Agent 跑偏,99%是因为你给的任务描述在偷懒。

写清楚它,它才能帮你真正省力。

这不是复杂的事,就是把你脑子里隐含的假设,老老实实写出来——你以为 Agent 会猜到的那些"显而易见"的东西,它一个都猜不到。

把角色、流程、边界、终止条件写进去,你会发现 Agent 突然就"聪明"了——不是它变聪明了,是你终于把话说清楚了。

---

说完了怎么写任务描述,下一个问题自然来了:Agent 在执行过程中出错了,你怎么 debug?

>

运行日志看不懂、工具调用失败没有报错、结果看起来对但其实悄悄跑偏了……这些问题比写任务描述更让人抓狂。

>

下一篇我会整理一套 Agent 调试方法论,包括我踩过的5个最隐蔽的坑——其中有一个坑,我排查了两天才发现,原因简单到让人想哭。

>

关注我,不要错过。

---

本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。

#AI教程 #Agent开发 #OpenAI #Prompt技巧 #人工智能 #8848AI #AI工程师 #AgentsSDK