实现 MediX Agent Swarm,先抓住这条主线
做 Agent 项目时,最容易掉进去的坑,就是一上来先盯每个 Agent 的 prompt、工具和分工。
这样当然也能做,但很容易越做越碎。因为看到的是一堆局部能力,却不知道整套系统到底要怎么把一个问题接住、拆开、做完、再把结果存回去。
实现 MediX Agent Swarm 时,更自然的切法不是先盯某个 Agent,而是先把整条主线拉出来。仓库地址放这里:yongfufuufu-ops/medix-agent-swarm。
先把主流程顺一遍
把它压成一句话,大概就是:
用户问题先进 SwarmCoordinator,系统先做记忆检索,再交给 LeadAgent 判断该单 Agent 处理还是走 Swarm,多 Agent 执行完以后再统一汇总,最后把这次会话写回记忆。
这条主线里最重要的几个点是:
SwarmCoordinator不是干活的人,它更像入口和调度者- 记忆检索发生在真正处理问题之前,而不是回答完以后才补记
LeadAgent决定要不要拆任务、怎么拆、分给谁- 单任务就走普通
AgentLoop - 多任务就走
SharedContext+ 多 Agent 并行 - 最终回答出来以后,还会保存短期和长期记忆
所以这套系统本质上不像“一个超级 Agent”,而更像“一个会诊系统”。
真正把系统托住的,不是业务 Agent,而是 Harness
MediX Agent Swarm 里有个很值得记住的词叫 Harness。
它不是医疗能力本身,也不是某个业务 Agent 的 prompt。它更像一组护栏,确保 Agent 在可控范围内工作。
| 组件 | 它在解决什么问题 | 在 MediX Agent Swarm 里的落点 |
|---|---|---|
Context | 给 Agent 足够但不过量的信息 | 短期记忆、长期记忆、上下文拼装 |
Constraints | 不让 Agent 乱跑 | 工具白名单、输出规则、任务分解规则 |
Feedback | 让系统知道自己有没有做对 | 运行时校验、自动修复、测试回归 |
Entropy | 避免上下文越来越胖 | 去重、压缩、清理过期记忆 |
一句话记就够了:
Context 喂信息,Constraints 设边界,Feedback 做纠错,Entropy 控体积。
很多 Agent 项目真正难的地方,不是“会不会调模型”,而是有没有这些护栏。没有护栏,系统刚开始可能很灵,跑久了就会越来越飘。
记忆这块,关键在“读取时压缩”
MediX Agent Swarm 的记忆分两层:
- 短期记忆保存当前会话里的历史、工具结果和最终回答
- 长期记忆保存的是会话总结,而不是整段原始对话
短期记忆的用途,是让当前会话还能接得上。长期记忆的用途,是下一次用户再来时,系统能先去搜相似历史,把曾经发生过的东西捞回来。
这里有个很关键的设计点:压缩不是写入时覆盖,而是读取时压缩。
也就是说,流程更像这样:
ShortTermMemory.get_history()先取原始历史MemoryEntropyManager.auto_clean()先去重- 超过阈值后,再把更早的部分压成摘要
- 摘要只进入当前 prompt,不会回写覆盖原始记录
这个设计很实用,因为它同时满足了两件事:
- 给 LLM 的上下文变短了
- 原始消息还保留着,没有被不可逆改写
很多系统一说“压缩记忆”,大家会以为数据库里的老消息被直接重写了。这里不是。它更像“给模型看的临时瘦身版”。
约束和反馈,才是它真正的安全带
MediX Agent Swarm 里的约束主要落在:
constraints/agent_constraints.yamlconstraints/swarm_constraints.yamlconstraints/validator.py
它们约束的不是一个点,而是整条执行链:
- 工具能不能调
- 输出是不是越界
- 医疗免责声明有没有带上
- 任务拆分是不是合理
- 某些问题是不是必须交给特定 Agent
更重要的是,约束不是“写在那里看着安心”,而是会在运行时真的检查。
在 AgentLoop 里,工具调用前会校验,最终输出前也会校验,必要时还能自动修复。再往外一层,还有 examples/test_all.py 这种回归测试,帮你确认记忆、约束和 Swarm 协作到底有没有按设计串起来。
这部分很像工程系统里的双保险:
- 运行时护栏负责当场拦
- 测试反馈负责事后验证整个链路有没有坏
它叫 Swarm,但核心其实不是“去中心化”
很多人看到 swarm 这个词,会先想到 Agent 之间彼此讨论、动态抢任务、持续协商。
MediX Agent Swarm 不是这个路子。
它更像:
- 中心化拆分
- 并行执行
- 集中汇总
具体来说就是:
SwarmCoordinator.process()先做记忆检索LeadAgent用 LLM 把问题拆成带assigned_agent的子任务- 如果子任务只有一个,就直接走单 Agent
- 如果子任务足够多且开启
enable_swarm,就创建SharedContext - 每个 worker 只拿自己的子任务去做
- 完成结果写回
SharedContext - 最后再由
LeadAgent汇总成最终回答
所以它更准确的理解方式,不是“完全自治的 Agent 群体”,而是“多 Agent 并行会诊框架”。
这个区别很重要,因为它决定了实现时该把注意力放在哪里:
- 不要先找 Agent 之间怎么互相辩论
- 先找任务是谁拆的
- 再找任务是怎么分配出去的
- 最后看结果是怎么被汇总回来的
如果顺着实现往下拆,顺序可以这样走
更自然的顺序是先抓主线,再补局部:
main.pyswarm/swarm_coordinator.pyswarm/lead_agent.pyswarm/shared_context.pycore/agent_loop.pyagents/base_agent.pymemory/short_term.pymemory/long_term.pymemory/entropy_manager.pyconstraints/validator.py
这个顺序的好处是,你先看见“系统怎么跑”,再回头看“某个 Agent 会什么”,不会一开始就淹死在细节里。
如果你想进一步练手,也可以直接跑两种问题:
- 先问一个简单问题,看它走单 Agent 路径
- 再问一个复杂问题,看它怎么进
LeadAgent拆分,再走 Swarm 汇总
对照日志去追,会特别清楚:
- 记忆从哪来
- 任务怎么拆
- 工具怎么调
- 结果怎么汇总
- 会话最后怎么存回长期记忆
最后记住一个判断
做这类项目时,最好一直区分两件事:
- 设计目标想实现什么
- 当前仓库实际上已经跑通了什么
MediX Agent Swarm 这套实现最值钱的地方,就在于它把这条主线提前拉直了。这样就不用一开始掉进每个子目录,而是先知道系统到底靠什么串起来。
如果只留一句总结,可以写成:
MediX Agent Swarm 真正的核心,不是 Agent 多不多,而是它有没有把“入口调度、记忆检索、任务拆分、并行执行、结果汇总、会话沉淀”连成一条闭环。