我以为会写 Prompt,结果 Agent 一直在转圈——3个核心差异让你的 Agent 真正跑起来
我以为会写 Prompt,结果 Agent 一直在转圈——3个核心差异让你的 Agent 真正跑起来
上周我在调试一个竞品分析 Agent,把之前给 ChatGPT 用的 Prompt 直接塞进 instructions 字段,满怀期待地按下运行。
然后,它卡住了。
不是报错,是在第二步——"搜索竞品官网"——反复调用、反复输出、反复重试,整整转了 20 分钟,最后吐出一段"我已经完成了信息收集,但还需要进一步确认……"的废话,什么报告都没有。
那一刻我才意识到:我以为会写 ChatGPT Prompt 就会写 Agent 指令,但这根本是两件事。
ChatGPT 是一个等你发话的助手,你说一句它答一句;Agent 是一个要自己做决策的"自动驾驶系统",你给它一个目标,它要自己规划路线、调用工具、判断是否完成。
这两件事的底层逻辑不同,写法自然不同。踩了几次坑之后,我整理出了 3 个最关键的差异,配上对照表和可直接复用的指令模板。
不是理论课,是踩坑后的实战总结。
---
第一个坑:目标描述的"粒度"完全不同
ChatGPT 可以接受模糊目标,Agent 不行
给 ChatGPT 写"帮我整理一份竞品报告",它会脑补你的意图——大概知道你想要什么格式、什么维度,然后给你一个八九不离十的结果。因为这是一次对话,你不满意可以立刻追问,成本极低。
但 Agent 不一样。Agent 拿到任务之后要自主执行,中间不会来问你"这样可以吗"。如果目标模糊,它就不知道什么叫"完成",会陷入两种死法:
1. 无限重试:觉得任务没做好,一直循环调用工具
2. 提前停止:随便输出一段就认为完成了
我的 Agent 转圈 20 分钟,就是第一种死法的经典案例。
错误写法 vs 正确写法
❌ ChatGPT 风格(直接搬过来就翻车):agent = Agent(
name="竞品分析师",
instructions="""
你是一个竞品分析专家。
帮用户整理竞品报告,内容要全面、有洞察。
"""
)
这段指令给 ChatGPT 完全够用,但给 Agent 就是灾难——"全面"是什么?"有洞察"怎么算达到?Agent 无法判断,只能乱跑。
✅ Agent 指令正确写法(加入可验证的终止条件):agent = Agent(
name="竞品分析师",
instructions="""
你是一个竞品分析专家。
【任务目标】
针对用户指定的竞品,生成一份结构化分析报告。
【终止条件 — 满足以下所有条件才算完成】
1. 已收集目标竞品的官网信息、定价页、核心功能列表(至少3项)
2. 已完成与用户产品的横向对比表格(至少5个维度)
3. 已输出"机会点"和"威胁点"各至少2条
4. 最终报告已以 Markdown 格式输出
【禁止行为】
- 不得在未收集完信息前输出报告
- 不得重复搜索同一个 URL 超过2次
"""
)
核心原则:Agent 指令里必须有"完成标准",让 Agent 自己能判断任务是否结束。
这一点是 ChatGPT Prompt 和 Agent 指令最根本的差异。写 Agent 指令之前,先问自己:"Agent 怎么知道它完成了?" 如果你答不上来,指令就还没写好。
---
第二个坑:角色设定的"作用域"不一样
ChatGPT 的 System Prompt 管全程,Agent 的角色有范围
给 ChatGPT 写 System Prompt,设定"你是一个严谨的数据分析师,回答简洁直接",这个人格会贯穿整个对话,不会变。
但在 Agents SDK 2.0 的多 Agent 架构里,你会有主 Agent 和通过 Handoff 触发的子 Agent。这时候角色设定就有了"作用域"的问题。
翻车现场:客服 Agent + 数据分析子 Agent
我曾经搭了一个客服系统:主 Agent 负责接待用户、回答问题,当用户问"我的账单怎么这么高"时,Handoff 给数据分析子 Agent 去查数据。
错误配置是这样的:
# ❌ 错误:子 Agent 没有独立角色定义,继承了主 Agent 的人格
customer_service_agent = Agent(
name="客服小美",
instructions="""
你是客服小美,说话温柔亲切,多用"亲"、"感谢您的耐心"。
当用户询问账单问题时,转交给数据分析师处理。
""",
handoffs=[data_analyst_agent]
)
data_analyst_agent = Agent(
name="数据分析师",
instructions="""
分析用户账单数据,找出异常消费点。
"""
# 没有明确的角色定义
)
实际输出日志(模拟):
[data_analyst_agent] 亲~感谢您的耐心等待!
我帮您查了一下账单数据,发现您在3月份的消费
比上个月高了很多呢~可能是因为您使用了更多服务哦!
如果有任何疑问,请随时告诉小美~
数据分析子 Agent 说话变成了客服风格,"亲~"满天飞,完全失去了分析师该有的专业感。
✅ 正确配置:每个 Agent 独立定义角色,明确作用域:customer_service_agent = Agent(
name="客服小美",
instructions="""
【角色】你是客服小美,负责接待用户、回答通用问题。
说话温柔亲切,多用"亲"、"感谢您的耐心"。
【作用域边界】
- 账单数据查询、消费异常分析:转交数据分析师
- 转交时,只传递用户的原始问题,不要加入你的语气风格
""",
handoffs=[data_analyst_agent]
)
data_analyst_agent = Agent(
name="数据分析师",
instructions="""
【角色】你是数据分析师,风格严谨、简洁、数据驱动。
禁止使用"亲"、"哦"等口语化表达。
【任务】分析用户账单数据,用数字和图表说话。
输出格式:问题定位 → 数据依据 → 建议操作
"""
)
核心原则:在多 Agent 架构里,每个 Agent 都要有独立的、明确的角色定义。Handoff 是角色切换,不是角色继承。
---
第三个坑:对"工具调用"的指令方式根本不同
ChatGPT 里说"你可以搜索一下",Agent 里这句话没用
给 ChatGPT 写"如果需要,你可以搜索最新信息",ChatGPT 会根据语境判断要不要用搜索工具,这是合理的——因为你随时可以纠正它。
但给 Agent 写同样的话,就会出问题。Agent 面对模糊的工具指令,会产生两种极端行为:
- 工具滥用:每一步都调用搜索,哪怕已经有了足够的信息
- 工具漏用:觉得"可以"不等于"必须",干脆不用,直接靠自己的知识输出——然后产生幻觉
工具调用指令:三段式写法
Agent 的工具指令必须明确三件事:什么时候必须调用、什么时候禁止调用、调用失败怎么办。
❌ ChatGPT 风格(建议性,Agent 不适用):你可以使用搜索工具来获取最新信息。
✅ Agent 工具调用指令模板(三段式):
agent = Agent(
name="市场研究员",
instructions="""
【工具使用规则 — web_search】
▶ 必须调用的情况:
- 需要竞品的实时定价信息
- 需要近30天内的行业新闻
- 用户明确要求"最新"数据
▶ 禁止调用的情况:
- 已在本次任务中搜索过同一关键词(避免重复搜索)
- 问题可以通过已收集的信息直接回答
- 搜索词过于宽泛(如"AI行业"),必须先细化再搜索
▶ 调用失败回退策略:
- 若搜索返回空结果:换一个更具体的关键词重试,最多重试2次
- 若重试2次仍失败:在报告中标注"该数据暂无法获取",继续完成其他部分
- 禁止因工具失败而编造数据
""",
tools=[web_search_tool]
)
这套三段式写法,本质上是在给 Agent 写行为约束,而不是给人类写"建议"。Agent 是执行者,不是建议的接受者。
---
一张表总结 + 万能 Agent 指令框架
对照表:ChatGPT Prompt vs Agent 指令
| 维度 | ChatGPT Prompt | Agent 指令 | | 目标描述 | 可以模糊,模型自己脑补 | 必须包含可验证的终止条件 | | 角色设定 | System Prompt 管全程,一次生效 | 每个 Agent 独立定义,Handoff 时不继承 | | 工具调用 | 建议性("你可以……") | 强约束(必须调用/禁止调用/失败回退) | | 失败处理 | 不需要,用户可以立刻纠正 | 必须写明,Agent 无法自行请示 | | 输出格式 | 可以在 Prompt 末尾随意提 | 必须精确定义,否则格式会漂移 | | 容错空间 | 高,一问一答可以迭代 | 低,自主执行不能中途干预 |万能 Agent 指令框架(带注释,可直接复用)
# Agent 指令模板 v1.0
适用于 Agents SDK 2.0 的 Agent(instructions=...) 字段
---
【角色定义】
你是 [具体角色名],专注于 [核心职责]。
风格:[沟通风格,如"严谨简洁"/"友好亲切"]
禁止:[不符合角色的行为,如"禁止使用口语化表达"]
↑ 为什么这样写:明确角色边界,防止多 Agent 场景下人格漂移
---
【任务目标】
用户目标:[用一句话描述用户想要什么]
【终止条件 — 满足以下所有条件才算完成】
1. [可验证的条件1,如"已收集至少5个竞品数据"]
2. [可验证的条件2,如"已生成对比表格"]
3. [可验证的条件3,如"已以指定格式输出"]
↑ 为什么这样写:Agent 必须能自己判断"完成",否则会死循环或提前停止
---
【工具使用规则】
工具名称:[tool_name]
- 必须调用:[触发条件]
- 禁止调用:[禁止条件]
- 失败回退:[失败时的处理方式]
↑ 为什么这样写:模糊的工具指令会导致工具滥用或漏用
---
【输出格式】
最终输出必须包含:
- [格式要求1]
- [格式要求2]
使用语言:[中文/英文]
输出格式:[Markdown / JSON / 纯文本]
↑ 为什么这样写:精确的格式要求防止输出漂移,便于下游处理
---
【异常处理】
- 若无法获取某项数据:标注"暂无数据",继续完成其他部分
- 若任务超出能力范围:输出"[ESCALATE]"并说明原因
- 禁止:编造数据、无限重试、提前停止
↑ 为什么这样写:Agent 的 Plan B 必须写在指令里,不能靠它自己发挥
---
💡 想直接上手验证这套框架?
>
文中的 Agent 指令模板已经在 GPT-5.1 / o3 系列上测试过。如果你还没有稳定的 API 访问渠道,可以试试 [api.884819.xyz](https://api.884819.xyz) —— 支持 Agents SDK 2.0 所需的全部接口,按量计费,调试期间成本可控。新用户注册即送体验 token,国产模型(Deepseek、通义千问等)完全免费,没有月租。
>
把上面的框架复制进去,改改任务描述,10 分钟就能看到你的第一个 Agent 跑通。
---
写 Agent 指令的本质,是给"自动驾驶"写行车规则
有一个类比让我想清楚了这件事:
给 ChatGPT 写 Prompt,像是坐副驾驶跟司机说"我想去吃火锅"——司机会问你哪家、几点、几个人,你们可以一路聊着调整。
给 Agent 写指令,像是给自动驾驶系统编程——你要提前告诉它目的地、路线偏好、遇到红灯怎么办、如果高速封路走哪条备用路线、到了停哪里。你不能坐在车里随时纠正,因为它会自己开。
指令写得不好,不是 Agent 笨,是你没给够规则。我现在每次写 Agent 指令之前,都会先问自己三个问题:
1. Agent 怎么知道它完成了?(终止条件)
2. 如果有多个 Agent,每个的角色边界在哪里?(作用域)
3. 工具什么时候必须用、什么时候不能用、用失败了怎么办?(工具约束)
把这三个问题回答清楚,再动笔写指令,Agent 跑偏的概率会大幅下降。
---
📌 下一篇预告
搞清楚怎么写指令只是第一步。
下一篇我会拆解一个更隐蔽的坑:当 Agent 调用工具失败时,你的"错误处理指令"写得够不够好?
90% 的 Agent 项目在生产环境翻车,不是因为 Prompt 写错了,而是因为根本没写"Plan B"——工具超时、返回空值、网络抖动,这些情况 Agent 一个都扛不住。
下周我会用真实的失败日志,拆解错误处理指令的完整写法。
🔔 关注不迷路,下周见。
---
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI教程 #AgentsSDK #Prompt技巧 #AI开发 #ChatGPT #人工智能 #8848AI #Agent开发