手写主从式多智能体:主 Agent 编排子 Agent
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇咱们把多智能体的架构地图铺开了:单体 Agent 的三个结构性天花板、一个 Agent 的四要素、Google 的四种范式、DeepMind 论文的选型结论,最后落到比特严选——人设差异大、跨品类可分解、要错误可控,值得上中心化主从式。地图画完了,团队也画好了:商品咨询、售后服务、IoT 搭配三个专家。
这一篇开始动手。不过在敲代码之前,咱们先花小半篇把这套系统在脑子里跑一遍:它运行起来到底长什么样、凭什么比单体强、什么时候该用、代码上比单体多了什么。把这张图先刻进脑子,后面写代码就是照着图纸施工。
先说一个结论:主从式几乎没引入什么新机制,就是把咱们前面二十多篇攒下的积木换了个搭法。
动手之前:先把主从式想明白
这一部分不写代码,就做一件事:把主从式在脑子里拆开看——长什么样、比单体强在哪、什么时候该用、代码上多了什么。想通了再动手,省得后面一行行硬啃。
1. 先在脑子里跑一遍:主从式长什么样
假设你是比特严选的用户,在对话框里敲了这么一句:
比特 AirX 和 BandPro 两款耳机哪个好?我通勤用。另外我刚买了 Phone S1,想再配一套运动装备,预算 3000。
这句话要是丢给上一篇讲的单体 Agent,它得一 个人把耳机对比和运动装备搭配两件性质不同的事都扛下来。而在主从式里,处理它的不是一个大脑,是一个小团队。咱们先不看代码,把这句话在团队里走一遍,看看四拍下来都发生了什么。
第一拍,编排者读题。 请求先落到主 Agent(Supervisor)手里。在这套系统中,它扮演编排者角色。编排者自己不查规格、不算搭配价,它干的是读题、派活、收尾这三件事。它一眼看出这句话其实是两桩活:一桩是耳机对比(商品咨询的活),一桩是给 Phone S1 配运动装备(IoT 搭配的活)。
第二拍,把第一桩活派给商品专家。 编排者把对比 AirX 和 BandPro 这个子任务交给商品专家,顺手把用户通勤这个背景一起塞过去。商品专家接过活,关起门来跑自己的推理——查规格、逐项比、结合通勤场景下判断,得出通勤更推荐 AirX 的结论,再交回编排者。这一整套推理发生在商品子 Agent 的内部循环里,编排者在外面等结果,不掺和它具体怎么比。
第三拍,把第二桩活派给 IoT 专家。 编排者拿到耳机结论后,接着把为 Phone S1 搭配运动装备、预算 3000 这个子任务交给 IoT 专家。IoT 专家同样关起门跑自己的循环——按基础机型和预算算组合,得出一套运动健康套装和组合价,再交回编排者。它和商品专家互相看不见对方干了啥,各跑各的。
第四拍,编排者收尾。 两份结果都回到编排者手里,编排者做最后一件事:核对、去重、把打架的地方捋顺,综合成一段连贯回复。用户看到的是整合过的答复,而不是两个专家各自甩出来的半截话。
把这四拍画成一张图,主从式的骨架就清楚了:

看完这张图,先记住三个直觉,后面写代码全靠它们:
- 编排者不直接处理领域任务,只负责调度。它的价值在读题、派活、收尾这三步,尤其是最后的综合校验——上一篇说的中央校验瓶颈就在这儿,也是主从式把错误率压下来的关键。具体任务都交给领域专家,也就是子 Agent。
- 每个专家都是一个独立的子 Agent。这里的子只表示它位于主 Agent 下游、接受主 Agent 编排,不代表能力缩水;它仍然有自己独立的上下文、工具和循环。商品专家跑推理时,眼里只有编排者交给它的那段子任务,根本看不到 IoT 专家处理过什么——上一篇说的领域隔离,在这儿就落到了运行时。
- 你会看到循环套循环。主 Agent 有一个大循环(派完一个子 Agent、看了结果再决定派下一个,直到收工),每个子 Agent 内部又各有一个小循环(查这个工具、看了结果再查那个)。等会儿跑 Demo 看控制台,心里有这张图就不会被绕晕。
说到底,这套拆 → 派 → 干 → 汇总的流程不是主从式发明的新玩意儿,就是一个会调度的大脑带着几个各司其职的专业大脑。
2. 主 Agent vs 单体到底强在哪
看完流程你八成会犯嘀咕:绕这么一大圈,比单体一个大脑硬扛到底强在哪?值不值这份周折?
就拿刚才那条既要对比耳机、又要给 Phone S1 配运动装备的请求,把两种打法摆到一张桌上看看。
单体是怎么啃这句话的?一个大脑,一份塞满了导购话术、售后政策、IoT 搭配规则的大 System Prompt,工具箱里的 工具全摊开。它得在同一条上下文里,既盘算怎么对比耳机、又惦记着搭配预算,查完规格接着算组合价,所有中间产物全压在同一条消息链上。请求一复杂,上一篇讲的那几个老毛病就容易冒头:注意力被稀释(一不留神漏掉预算 3000)、工具选串(候选一多就容易挑错)、人设打架(导购的热情和售后的严谨搅在一份 prompt 里,语气忽软忽硬)。
编排者是怎么分这句话的?主 Agent 自己这条上下文干干净净,只装着识别两桩活、分别派给谁、结果怎么综合这些调度信息;耳机参数只在商品专家的上下文里,组合报价只在 IoT 专家的上下文里,谁也不挤谁。每个子 Agent 一份聚焦的人设、一套最小的工具子集,选错工具、串味的概率都低了一截。最要紧的是收尾那道综合——子 Agent 的结论不是直接甩给用户,而是先回到编排者手里过一遍筛,上一篇说的中央校验瓶颈就在这一步。
一张表把差别摆清楚:
| 对照维度 | 单体一个大脑硬扛 | 主 Agent + 子 Agent 团队 |
|---|---|---|
| 上下文 | 各领域中间结果堆在一条链上,一长就 Lost in the Middle(上下文越长,中间位置的信息越容易被模型忽略) | 主 Agent 只留调度信息,各子 Agent 上下文互相隔离 |
| 工具选择 | 工具全摊开,候选多、易选错 | 每个子 Agent 只带自己那几个,候选少、更准 |
| 人设 | 导购 / 售后 / 搭配三种调性挤一份 prompt,互相打架 | 一个子 Agent 一份聚焦人设,不串味 |
| 错误控制 | 没有独立校验环节,错了直接输出给用户 | 主 Agent 收尾再综合校验,拦得住一部分错 |
| 独立调优 | 动一处 prompt 牵一发而动全身 | 售后不给力只调售后专家,不惊动其他人 |
不过话得说回来,别把这张表读成主 Agent 架构处处碾压单体。主 Agent 适合处理横跨多领域、又对出错敏感的复合请求;请求一旦简单——比如只问退货政策有几天——编排者那套读题、派活、综合的开销全成了纯浪费,反倒是单体一步到位,又快又省。主 Agent 的强,是有前提的强。那到底什么样的请求,才配得上编排者这套排场?
3. 什么时候该上主从式
上一节那句横跨两个领域的请求,确实值得编排者带着整个团队处理。但真实的客服流量里,这种复合请求只是一小撮,更多的是询问退货政策时限、查询订单 88231 进度这类一句话一个意图的简单问题。要是不管三七二十一都走一遍主 Agent 的编排流程,token 和延迟就全白烧了。
所以进代码之前,得先在脑子里立一把尺子:一个请求进来,到底配得上多重的打法?顺着上一篇那把奥卡姆剃刀(如无必要,勿增实体),就两档。
第一档,一个 Agent 自己就够。请求简单、只落在单一知识点、也不跨领域,比如询问七天无理由的适用范围、推荐一款千元档手机、查询订单 88231 的进度。这类活,前面二十篇手写的那个单体 ReActAgent 自己就能办完,一份人设加几个工具足矣。上一篇的 45% 阈值和 P0 原则说的就是它:单体基线够用,就别为了架构好看硬拆。这一档本篇不再实现。
第二档,主 Agent 编排多个子 Agent(领域专家),也就是 LLM Supervisor(编排者)。请求一句话横跨多个领域,需要拆成几个子任务、按依赖顺序派活、最后把多方结果综合校验成一段回复。上一节的耳机对比加运动装备搭配请求就是典型。只有这一档,才需要主 Agent 跑编排循环,才用得上调度这道校验工序。
这两档不是两种独立的架构,而是同一支子 Agent 团队的两种用法,按需取用:
| 打法 | 请求特征 | 比特严选举例 | 谁来处理 | 为什么够 / 为什么要 |
|---|---|---|---|---|
| 第一档 · 单体 Agent | 单一意图、不跨领域 | 询问七天无理由的适用范围、查询订单 88231 的进度 | 一个通用 ReActAgent | 简单场景基线够用,硬拆反而降效(45% 阈值) |
| 第二档 · LLM Supervisor | 一句话横跨多领域,需拆解 + 编排 + 综合 | 对比耳机并为 Phone S1 搭配运动装备 | 主 Agent 循环编排多个子 Agent + 综合校验 | 复合请求要有人拆活、对齐、消解冲突 |
分寸得说清楚:第二档比第一档多的不只是一点编排开销——主 Agent 每一圈都要读全部 agent 身份和历史、每个子 Agent 各跑一轮 ReAct 循环,token 和延迟都翻倍地涨。只有当一句话真的横跨好几个领域、需要有人在最后把多方结论对齐时,第二档才值回它多烧的那些 token。能用单体解决的,别急着上 Supervisor,这依然是那把剃刀。
落到代码,第一档你已经会了(就是前面的单体 ReActAgent);本篇要动手写的是第二档——LLM Supervisor。不过写之前,还得看一个问题:主从式看着新鲜,代码上到底比单体多出了什么?