繁

从模型、工具和指令理解单 Agent 的执行,再分析 Manager 与 Handoff 怎样组织协作,以及 Guardrails 和人工介入怎样约束行动。

从架构到一个真正的 Agent:Model、Tools、Instructions 与 Orchestration
32 分钟
6474 字

上一篇讨论的是系统结构:哪些步骤由程序提前组织,哪些行动交给模型根据反馈决定。这一篇把视角放到 Agent 内部,看看它怎样从理解请求走到实际执行,又怎样与其他 Agent 协作。

结合 OpenAI 的 《A practical guide to building agents》,本文从三个层次展开:

  • 组成与执行: Model、Tools、Instructions 各自负责什么,怎样配合完成一次单 Agent 的执行。
  • 协作方式: 什么时候需要拆分为多个 Agent,Manager 与 Handoff 分别怎样委派工作和转交处理权。
  • 行动边界: Guardrails 怎样约束操作,哪些情况需要 Human Intervention(人工介入)。

下面用一个假设的订单售后场景贯穿全文:用户说“包裹一直没到,帮我看看能不能退款”。沿着这条请求,逐步说明这三层关系。

一、一个 Agent 怎样完成任务h2

OpenAI 将 Agent 的基本组成归为 Model、Tools 和 Instructions。可以分别理解为:负责判断的模型、连接外部系统的工具,以及指导处理过程的指令。

这三个组成不能互相替代。模型能够理解“我想退款”,不代表它知道这笔订单的真实状态;能查询订单,也不代表它有权修改订单;有了修改工具,仍然需要知道什么情况下应该使用。

1. Model:依据当前信息,决定下一步h3

面对售后请求,模型首先要处理的是判断问题:用户是在询问物流,还是已经明确要求退款?现有信息足够吗?应该先问订单号,还是可以查询当前账号的订单?

这些判断会影响后面的工具调用。如果订单还在运输途中,接下来可能需要查物流;如果已经退回仓库,就要结合售后规则判断下一步。模型的作用不只是组织回答,而是把当前信息转化为下一步行动。

因此,评价模型是否适合这个任务,不能只看它回答得是否流畅。还要看它能否识别缺失信息、选对工具,并根据工具结果调整判断。例如,查询返回“未找到订单”时,是否会请求核实订单号,而不是继续编出一个物流状态。

模型能力、延迟与成本也需要放在具体任务中看。OpenAI 建议先用能力较强的模型建立效果基线,再尝试用较小模型承担能够胜任的部分。这样才能区分:问题出在模型能力,还是工具和指令本身没有设计清楚。

2. Tools:让判断连接真实信息和操作h3

模型可以根据用户的话提出退款建议,但订单状态、物流记录和退款结果,都需要从外部系统获取。Tools 承担的就是这层连接。

在这个例子里,可以按用途理解几类能力:

工具用途假设的工具提供什么能力
Data:读取信息get_order、get_delivery_status获取订单和物流状态
Action:执行操作submit_refund_request向售后系统提交申请
Orchestration:委派工作调用专门的物流 Agent让另一个 Agent 完成一部分任务

最后一类也是后面 Manager 模式的连接点:对调用者来说,另一个 Agent 可以表现为一个工具;区别在于,这个工具内部也会进行判断和执行。

工具定义是否清楚,会直接影响模型能否正确使用它。假设同时存在 refund_order 和 submit_refund_request,但没有解释两者的差别,模型就可能把“提交申请”误当成“直接完成退款”。

更清楚的定义应该交代:什么时候用、需要哪些参数、会产生什么效果,以及结果代表什么。例如,submit_refund_request 返回申请编号,只能说明申请已经受理,不能据此回复“退款已经到账”。

这也说明,调用成功和业务完成是两回事。工具不仅要能被调用,还要让返回结果足以支持下一步判断。

3. Instructions:把处理规则写成可执行的指导h3

“你是一名专业的售后助手”只规定了角色,没有解释售后请求应该怎样处理。真正影响执行的是更具体的规则:需要先查什么,缺少信息怎么办,哪些条件下可以继续,哪些情况必须停止。

例如,可以把这个场景的指导写成:

  1. 缺少订单信息时,先请求用户补充,不猜测订单。
  2. 查询订单及物流状态,依据返回的信息说明当前情况。
  3. 按现行售后政策判断可用的处理方式,不自行承诺例外。
  4. 提交申请前确认用户意图;需要人工批准的操作先暂停。
  5. 根据工具返回的实际状态答复,区分申请受理、退款处理中和退款完成。

这几条分别说明了信息缺失、正常处理、业务条件、操作边界和结果表达。它们比单纯要求“认真负责、准确回答”更容易落实到具体行动。

已有的业务政策、操作文档和客服流程,可以成为指令的基础,但不能只是整段塞进上下文。整理时需要把条件和动作对应起来:遇到什么情况,应该做什么;不能继续时,又该怎样处理。

不过,指令仍然是在指导模型。把“不要操作其他人的订单”写进 Prompt,不等于完成了订单访问控制。真正的权限校验,需要由工具和业务系统落实。这一点会在第三部分继续串起来。

4. Single-Agent:三种组成怎样协同执行h3

有了模型、工具和指令,接下来要解决的是执行怎样持续推进,也就是 Orchestration(编排)。它不是与前三者并列的第四种基础组件,而是把这些能力组织起来的方式。

单 Agent 可以连续进行多次判断和工具调用,并不等于“一次模型调用”。对于这条售后请求,一段执行可能是:

识别用户意图 → 查询订单 → 读取物流结果 → 判断可用的处理方式 → 答复用户或请求确认

如果用户没有提供订单号,就先等待补充;如果查询失败,就依据失败信息决定是否重试。下一步依据当前状态决定,不要求每一条请求都完整走过同样的步骤。

图 1 · 单 Agent:指令提供规则,模型决定下一步,工具返回实际信息
单 Agent 中 Model、Tools 与 Instructions 的协作 用户请求进入模型。指令提供处理规则,模型选择查询工具,读取工具结果后继续判断。可以继续查询,也可以答复用户或暂停等待。 Instructions目标、处理步骤与异常规则 用户请求查询订单售后 Model依据当前信息决定下一步 需要补充信息 Tools查询获准访问的订单与物流 结果返回继续判断 可以答复或需等待 答复用户 / 暂停等待完成当前处理,或请求补充与确认
图中展示信息查询。涉及修改状态的操作,还需要执行前检查。窄屏可在图内左右滑动查看。

这里还有一个容易忽略的区别:模型决定下一步做什么,运行程序负责真正执行工具、记录结果并控制是否继续。 最大轮次、调用失败和等待用户输入等退出条件,不能只靠模型自由发挥。

所以,单 Agent 已经可以包含完整的判断与执行过程。新增一项查询能力,首先可以考虑增加定义清楚的工具,而不是立即增加一个 Agent。

二、多个 Agent 怎样协作h2

5. 什么时候单 Agent 需要拆分?h3

OpenAI 的建议是先充分发挥单 Agent 的能力,再考虑 Multi-Agent。这个顺序很重要:拆分应该解决已经出现的职责复杂度,而不是为了让架构看起来更完整。

可以从两个具体问题判断。

第一,处理规则是否已经难以集中表达。 如果同一个 Agent 同时承担物流查询、退款争议和商家申诉,大量条件分支混在一起,不同任务的指令就可能互相干扰。可以先整理共用规则,把变化的政策抽成模板参数;这些方式仍然难以管理时,再按职责拆分。

第二,工具之间是否持续发生混淆。 关键不只是数量,而是名称、用途和参数有没有明显重叠。先改进工具定义;如果模型仍然频繁把某一领域的工具用于另一领域,就可以让不同 Agent 只接触各自需要的工具。

拆分后的价值,应该能够说清楚:哪个 Agent 负责什么,它需要哪些信息,向谁交付什么结果。如果这些问题没有答案,只是把原来的一大段 Prompt 分成几段,复杂度未必真的下降。

而且,职责分开也会带来新的工作:上下文如何传递、结果怎样汇总、失败由谁处理。Multi-Agent 是重新分配职责,同时也重新分配了协调成本。

6. Manager:委派工作,再接回结果h3

假设一个售后请求需要综合物流情况和退款规则,但最终仍希望由同一个负责人向用户解释。可以让一个 Manager Agent 委派具体工作,再读取结果、继续判断。

例如,Manager 调用物流 Agent,获得包裹状态;必要时再调用售后规则 Agent,获得可用方案。随后由 Manager 综合这些信息,决定是解释物流、请求确认,还是提出需要批准的操作。

被调用的 Agent 完成的是一项委派工作,结果会返回 Manager。 Manager 仍然负责整体处理,不是把用户交出去后就退出。

这就是 agents as tools 的含义。专门 Agent 内部可以调用自己的工具、进行多步处理,但对 Manager 暴露的是一项可调用的能力。

这种结构适合需要统一组织结果的任务。相应地,Manager 也必须正确理解子任务的返回结果:物流 Agent 说“信息不足”,不能被汇总成“包裹已丢失”;规则 Agent 说“满足申请条件”,也不等于退款已经执行。

7. Handoff:把后续处理交给接手者h3

另一种情况是,入口 Agent 只负责识别请求类型。确认这是订单售后问题后,后面的追问、查询和答复,都可以由售后 Agent 独立完成。

这时使用 Handoff(交接) 更贴切:接待 Agent 转交相关上下文与执行控制,由接手者继续处理。

它与 Manager 的区别不在于有没有分类,也不在于用了几个 Agent,而在于:专门 Agent 是返回一份结果,还是接过后续处理权。

图 2 · Manager 接回结果,Handoff 转交后续处理
Manager 与 Handoff 的区别Manager 调用专门 Agent,专门 Agent 返回结果,同一个 Manager 继续处理并统一答复。Handoff 则由接待 Agent 把处理权交给售后 Agent,接手者继续与用户交互,不隐含自动返回。 Manager · 调用专门能力,结果返回负责人 调用返回结果 Manager委派物流查询 物流 Agent完成委派工作 同一 Manager综合结果、继续处理 用户仍由 Manager 统一答复 Handoff · 转交处理权,由接手者继续推进 交接继续 接待 Agent识别请求类型 售后 Agent接收上下文与处理权 继续处理接手者直接答复用户 不会自动回到接待 Agent;再次交接需要显式安排
两个模式的核心差别是处理权怎样流动。窄屏可在图内左右滑动查看。

Handoff 本身不隐含“做完再回来”。如果售后 Agent 处理过程中发现需要转回接待 Agent,应该明确设计另一次交接,而不是把它当作普通函数返回。

把两种关系放在一起,可以这样对照:

对比项ManagerHandoff
专门 Agent 的职责完成委派工作并返回结果接手后续处理
谁继续组织任务Manager接手的 Agent
谁面向用户通常由 Manager 统一答复接手者可以继续与用户交互
适合的情况需要综合多份结果、保留统一负责人某项职责可以交给专门角色独立推进

同一套系统也可以组合两种模式。接待 Agent 先把请求交给售后 Agent;售后 Agent 再以 Manager 的方式调用物流查询能力。要看清的是每一次调用和交接的含义,不是给整个系统贴一个固定标签。

三、Agent 的行动边界怎样确定h2

8. Guardrails:提出操作,不等于获准执行h3

前两部分解决了怎样判断、怎样执行和怎样分工,但还有一个独立问题:模型提出的操作,是否可以真正执行?

同样是工具调用,查询物流与修改收款账户的风险显然不同。即使模型认为“这样能够满足用户要求”,系统也需要检查它是否有权这么做、是否符合业务规则,以及是否需要额外批准。

我更愿意沿着一次处理过程理解 Guardrails(防护约束):

  • 接收请求时: 识别越界请求或试图改变系统行为的恶意指令。
  • 执行操作前: 检查身份、资源访问权限、业务条件,以及必要的批准。
  • 生成答复时: 检查敏感信息和实际结果,避免泄露他人数据或错误宣称操作已完成。

这是从执行过程组织检查的位置,不意味着只需设置三道固定关卡。不同风险可能分别由程序规则、内容检查或模型判断处理;它们也不能替代业务系统原有的身份认证和权限控制。

例如,指令可以要求“只处理当前用户的订单”,但查询工具仍应验证订单归属。否则,一旦模型传入别人的订单号,单靠一句指令就无法阻止数据被读出。

类似地,涉及资金的操作如果要求人工批准,就必须先取得批准,再执行工具。事后检测到违规,不能撤销已经发生的所有影响。 有些普通检查可以并行进行,但不应把这种做法直接套到必须先获准的高风险操作上。

图 3 · 高风险操作:先检查必要条件,再决定执行、拒绝或等待人工
高风险操作的执行前约束模型提出操作后,系统先检查身份、权限、规则和必要批准。不允许则拒绝;需要人工批准则等待,将审批结果带回重新检查;全部通过才执行工具。之后核对结果,答复实际状态。 模型提出操作 执行前检查身份、权限、规则、必要批准 不允许全部通过需要批准 拒绝执行 调用工具执行获准操作 等待人工此时不执行操作 带回审批结果,重新检查 核对实际结果 答复实际状态
人工批准后,仍需满足当前权限与业务条件;拒绝批准则不执行。窄屏可在图内左右滑动查看。

9. Human Intervention:知道什么时候交给人h3

人工介入不只是“模型答错以后找人补救”。它也可以是正常处理过程中的明确安排:有些事情允许 Agent 准备信息和提出建议,但最后的决定必须由人作出。

第一类情况是无法继续可靠推进。例如订单系统连续查询失败,或者反复确认仍无法识别用户要处理哪一笔订单。继续重试不一定增加有效信息,反而可能消耗时间或产生重复操作。系统需要设置尝试上限,达到条件后停止并转交。

第二类情况是操作风险本身要求人工决定。例如存在争议的退款或不可逆操作,即使模型已经给出清楚的理由,也不代表可以省略必要的批准。

交给人时,真正有用的不是一句“处理失败”,而是一份能够接着往下工作的说明:用户想解决什么、已经查到什么、尝试过哪些操作、卡在哪里,以及需要人决定哪件事。

这也与前面的 Handoff 不同。Handoff 是 Agent 之间转交执行;人工介入是把特定决定或后续处理交给人。两者都涉及控制权变化,但接手者的责任和可执行权限并不相同。

把组成、协作与边界连起来h2

从这条售后请求回看整套结构,Model 依据当前信息判断下一步,Tools 连接订单与物流系统,Instructions 说明处理规则。单 Agent 可以把它们组织成完整执行;职责复杂到需要拆分时,再明确是由 Manager 接回结果,还是通过 Handoff 交出处理权。

而无论由哪个 Agent 处理,提出一个操作都不等于获得执行许可。权限校验、防护检查与人工批准,需要约束真正发生的行动。

理解一个 Agent,既要看它如何作出决定,也要看决定如何被执行、由谁继续负责,以及什么情况下必须停下来。 这几层关系清楚了,组件和编排方式才能对应到具体任务,而不只是停留在架构图里的名称。

几个关键问题,串起组成、协作与边界h2

沿着前面的售后场景,可以把这些关系归纳成几个问题。

模型已经能理解用户意图,为什么还需要 Tools 和 Instructions?

理解“我想退款”,不等于知道订单状态,也不等于知道这笔订单适用什么规则。Model 负责依据已有信息判断,Tools 提供实际信息和操作能力,Instructions 说明处理目标与规则。三者解决的是不同问题:换一个更强的模型,不能替代缺失的订单接口;增加退款工具,也不能替代清楚的处理规则。

模型决定下一步,为什么还需要程序控制执行?

模型可以提出“查询物流”或“提交退款申请”,但真正调用工具、接收结果、保存状态和限制重试次数,仍需要运行程序完成。这里要区分行动决策和执行控制:模型决定想做什么,程序控制这个动作如何发生、是否允许发生,以及执行何时暂停或结束。Orchestration 组织的正是这些关系,而不是与 Model、Tools、Instructions 并列的第四种基础组件。

一个 Agent 的工具越来越多,就应该拆成多个 Agent 吗?

工具多只是现象,要看它是否造成持续的职责冲突或选择混淆。如果工具定义清楚、处理规则一致,单 Agent 仍然可以完成多步任务;如果不同领域需要不同规则、工具和权限,拆分才可能让职责更清晰。判断拆分是否有价值,不只看子 Agent 是否更专注,还要看增加的上下文传递、结果汇总和失败处理成本是否值得。

同样是找另一个 Agent 帮忙,Manager 和 Handoff 到底差在哪里?

看交出去的是一项工作,还是后续处理权。Manager 请物流 Agent 查包裹,拿到结果后仍由自己继续处理和答复;Handoff 则把请求交给售后 Agent,由接手者继续追问、查询和回应。前者返回的是子任务结果,后者改变的是当前负责人。Handoff 不隐含自动返回,如果还要交回原 Agent,需要明确安排另一次交接。

Instructions 已经写了“不能越权”,为什么还要做执行前检查?

指令是在指导模型的判断,权限校验是在限制系统实际能执行的操作。即使模型传入了别人的订单号,工具也应该拒绝读取,而不是依赖模型记住一句“只处理当前用户的订单”。同样,需要批准的退款必须在调用工具前暂停。描述一条规则,与在操作发生的位置执行这条规则,是两回事。 Guardrails 需要与身份认证、权限控制配合,不能替代它们。

转交另一个 Agent、继续重试和交给人工,分别解决什么问题?

转交 Agent 解决的是职责归属,例如把售后请求交给专门角色;重试适合预期能够恢复的临时失败,但必须有次数或时间上限;人工介入则用于需要人作出决定,或系统已无法可靠推进的情况。订单查询暂时超时,可以有限重试;达到上限后,应交代已有信息和失败位置;退款需要人工批准时,则应直接等待批准,不能靠重试或换一个 Agent 绕过去。

参考资料h2