第 3 章 · 03 handoffs 任务交接机制 本节摘要:本节讲透 AutoHedge 多 Agent 编排的「灵魂」——handoffs(任务交接)。Director 之所以能调度四大专家,靠的就是 这一个参数。本节先从代码层面看 handoffs 在 里如何声明(一行参数),再讲清它的语义:一个 Agent 把当前任务连同上下文整体交给另一个 Agent,后者接过控制权独立完成;这与「工具调用」有本质区别——工具是「Agent 调一个函数拿结果」,handoff 是「Agent 把活儿整个转给另一个 Agent」。
本节摘要:本节讲透 AutoHedge 多 Agent 编排的「灵魂」——handoffs(任务交接)。Director 之所以能调度四大专家,靠的就是
handoffs=ALL_AGENTS这一个参数。本节先从代码层面看 handoffs 在workers.py里如何声明(一行参数),再讲清它的语义:一个 Agent 把当前任务连同上下文整体交给另一个 Agent,后者接过控制权独立完成;这与「工具调用」有本质区别——工具是「Agent 调一个函数拿结果」,handoff 是「Agent 把活儿整个转给另一个 Agent」。本节还会说清 Director 如何决定交接(全靠 LLM 理解 system_prompt,无显式规则)、交接后的控制流(被交方产出回交、Director 综合),以及这种隐式交接在交易场景的风险。读完本节,你真正理解「多 Agent 协作」在代码里是怎么发生的。
内容来源:原项目源码
autohedge/workers.py、autohedge/prompts.py,结合 swarms 框架的 handoffs 语义,精读并套用体系化模板。
⚠️ 现实澄清:handoffs 的具体调度实现在
swarms框架内部(本仓库看不到源码),这里讲的是基于参数与 prompt 的可观测行为与语义模型,不深究 swarms 的内部实现细节。
阅读完本节,你应当能够:
workers.py 里如何声明。回到 workers.py 第 72-86 行,handoffs 的声明就两处:
ALL_AGENTS = [ sentiment_agent, risk_agent, execution_agent, quant_agent, ] director_agent = Agent( agent_name="Trading-Director", system_prompt=DIRECTOR_PROMPT + _SYSTEM_SUFFIX, model_name="gpt-4.1", max_loops=1, handoffs=ALL_AGENTS, # ← 唯一的关键参数 )
关键就是 handoffs=ALL_AGENTS——把四个专家 Agent 装进一个列表,赋给 Director 的 handoffs 参数。这是 swarms Agent 构造器提供的能力:声明「我可以把任务转交给这些 Agent」。
注意几个细节:
handoffs:四个专家彼此之间不能互相 handoff(它们的构造里没有 handoffs 参数)。也就是说,协作是星型的——Director 是中心,专家是叶子,专家不能直接找另一个专家。ALL_AGENTS 列表里四个 Agent 的顺序不影响行为。swarms 把它们注册成「可交接目标」,Director 凭 agent_name 与 prompt 自由选择。ALL_AGENTS 要存在,Director 才能引用它。handoff 不是「调函数」,而是「换 Agent 主控」。语义上:
当 Director 决定 handoff 给某专家时,它把当前任务连同上下文整体交给该专家;该专家用自己的 system_prompt、自己的模型、自己的工具,独立完成这一子任务;完成后把产出回交给 Director,Director 决定是否再 handoff 给下一个专家或综合输出。
可以把它类比成公司里的「转交」:
总监(Director)收到一个大任务 │ 「这块需要情绪分析,我交给情绪组」 ▼ 情绪组(Sentiment Agent)用自己的人(模型)/自己的工具(exa_search)做完 │ 把报告交回 ▼ 总监 看了报告,「再让风控组评估一下」 │ ▼ 风控组(Risk Agent)... │ ▼ 总监 综合所有报告,给最终答复
关键特征:专家独立工作——它用自己的 system_prompt(比如 risk_agent 那段「当收到消息时,它包含…请提供…」)、自己的模型(gpt-4.1)、自己的 max_loops(1)。Director 不能干预专家内部怎么想,只能给它输入、收它的输出。
这是初学者最容易混淆的点。对比:
| 维度 | 工具调用(Tool Call) | handoff |
|---|---|---|
| 被调对象 | 一个函数(如 exa_search) |
一个完整的 Agent(如 risk_agent) |
| 是否有 system_prompt | 无,就是普通函数 | 有,被交方用自己的 prompt 重置视角 |
| 是否换模型 | 不换,还是当前 Agent 的模型 | 可换(情绪用 mini,风控用 4.1) |
| 控制权 | 工具执行完,控制权回到原 Agent | 被交方接管子任务,完成后才回交 |
| 典型场景 | 取数据、算值、调 API | 把整块专业工作外包给专家 |
在 AutoHedge 里,两种机制同时存在:
exa_search(LLM 决定何时搜、搜什么)。💡 核心心法:工具是「Agent 的手」——延长 Agent 的能力边界;handoff 是「Agent 的同事」——把整块工作分工出去。一个 Agent 可以同时有手(工具)和同事(handoffs)。Director 有同事(四个专家)但没手(没 tools);情绪 Agent 有手(exa_search)但没同事(没 handoffs)。
这是 AutoHedge 最值得玩味的设计——Director 怎么知道该交谁? 答案是:没有显式规则,全靠 LLM 理解 system_prompt 自由判断。
看 DIRECTOR_PROMPT(第 4 章第 1 节详讲)里的关键句:
3. Collaborate with specialized agents to ensure a cohesive strategy.
这句「与专家 Agent 协作」配合 handoffs=ALL_AGENTS,swarms 在背后会把「可交接的专家清单」以一种 LLM 可理解的形式(通常是工具描述或系统消息)告知 Director。Director 的 LLM(gpt-4.1)据此自主推理:
但这些都是LLM 的语言理解,不是硬编码规则。代码里找不到任何 if "sentiment" in task: handoff to sentiment_agent 之类的逻辑。
隐式判断的好处:
隐式判断的代价:
⚠️ 现实澄清:在交易场景,这种隐式交接是重大隐患。一次错误的交接(比如该叫风控却没叫)可能让一笔危险交易漏过审查。生产级系统要么用显式规则(确定性 dispatch),要么至少给交接决策加日志与回放能力。AutoHedge 在这点上离生产很远。
一次典型的 handoff 控制流(基于 swarms 的语义模型):
1. director_agent.run(task="分析原油市场") 2. Director LLM 推理:"需要情绪分析" → 选择 handoff 给 sentiment_agent 3. swarms 把任务+上下文打包,调用 sentiment_agent.run(...) 4. sentiment_agent 用 gpt-4o-mini 推理,期间调 exa_search 取新闻 5. sentiment_agent 产出情绪打分,返回给 Director 6. Director 再推理:"需要风控评估" → handoff 给 risk_agent(带假设+情绪) 7. risk_agent 用 gpt-4.1 推理,产出风控评分 8. ... (可能继续 handoff) ... 9. Director 觉得够了 → 综合所有专家输出,产出最终回复 10. director_agent.run 返回最终回复给调用方(main.py)
注意几个要点:
max_loops=1:Director 单轮推理就产出。这意味着 swarms 内部在一次 run 里自行驱动了「handoff → 等专家 → 再 handoff → 综合」的多步流程,而不是靠 max_loops 迭代。这是 swarms 框架帮你做的事。main.py 里 director_agent.run(task=task) 的返回值,是 Director 综合所有 handoff 结果后的最终回答。注意到 AutoHedge 是星型结构(Director 中心,专家叶子),而非网状(专家之间也能互相 handoff)。这是有意的取舍:
| 结构 | 优点 | 缺点 |
|---|---|---|
| 星型(AutoHedge 选的) | 控制权集中、职责清晰、Director 全程知情 | Director 是瓶颈/单点故障 |
| 网状(专家互交) | 灵活、可并行 | 容易死循环、控制流难追踪 |
教学项目选星型是合理的——它把多 Agent 协作简化成「一个大脑 + 多个执行者」,便于理解。生产系统往往会加「专家间有限互交」或「二级编排者」来平衡。
handoffs=ALL_AGENTS 一行声明可交接给四个专家;只有 Director 设了,专家间是星型不能互交。run 内自行驱动「handoff→专家→回交→再 handoff→综合」的多步流程;最终输出方始终是 Director。下一节,我们退一步看 swarms 框架的
Agent与Conversation抽象——这五个 Agent 的「容器」与消息历史是怎么定义的。