Rust 多 Agent 协作:从“一个聪明 Agent”到“Agent 组织”
392 字·3 分钟阅读
RustAI Agent
如果你已经跟完前四篇,你会发现一个事实:
👉 Agent 越做越复杂,越不像“一个人”, 👉 越像“一个团队”。
这不是偶然,而是复杂系统的必然演化。
单 Agent 的天花板在哪里?
哪怕你已经有了:
- DAG 执行器
- 长期记忆
- 并发调度
单 Agent 依然有三个绕不过去的瓶颈:
❌ 认知负载过高
一个 Agent 既要:
- 理解目标
- 拆任务
- 调度执行
- 处理失败
- 总结结果
LLM 非常容易在长流程中“思维退化”。
❌ 任务类型混杂
同一个 Agent 同时在做:
- IO 密集任务
- 推理密集任务
- 规则性处理
这是架构层面的错误。
❌ 扩展性极差
你很难说清楚:
“这个 Agent,到底负责什么?”
一旦需求变复杂,prompt 会迅速腐化。
多 Agent 不是“更多 Agent”,而是角色分工
真正可落地的多 Agent 系统,几乎都会收敛到这个模型:
┌─────────────┐
│ Supervisor │
│ (Planner) │
└──────┬──────┘
│
┌──────────┴───────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│Worker │ │Worker │ │Worker │
│ (IO) │ │ (IO) │ │(Logic)│
└───────┘ └───────┘ └───────┘一句话概括:
Supervisor 负责“想清楚” Worker 负责“把事做完”
这是“工程世界”早就验证过的模式
如果你有工程背景,会发现这个模型并不陌生:
| 系统 | 对应关系 |
|---|---|
| Kubernetes | Controller / Pod |
| 数据系统 | Coordinator / Executor |
| 编译器 | Planner / Pass |
| 数据库 | Optimizer / Operator |
Agent,只是 LLM 加持下的再一次复现。
Rust 中的核心抽象:Agent ≠ LLM
我们先做一个非常重要的工程级抽象:
pub trait Agent {
async fn handle(&self, input: AgentInput) -> AgentOutput;
}Supervisor Agent
pub struct Supervisor {
llm: Arc<dyn LlmClient>,
}职责只有三个:
- 理解目标
- 生成 Task Graph
- 分配给 Worker
Worker Agent
pub struct Worker {
executor: Arc<AgentExecutor>,
}职责非常纯粹:
- 不规划
- 不反思
- 不总结
- 只执行
Supervisor 的输入与输出:不是“对话”,而是“结构”
Supervisor Input
pub struct SupervisorInput {
pub goal: String,
pub context: Vec<Observation>,
}Supervisor Output
pub struct SupervisorPlan {
pub graph: TaskGraph,
pub assignment: HashMap<TaskId, WorkerId>,
}👉 注意关键词:assignment(分配)
Worker 为什么必须“去智能化”?
这是一个非常关键、但反直觉的点。
❌ Worker 越“聪明”,系统越不稳定 ✅ Worker 越“愚钝”,系统越可靠
Worker 的理想特性
- 无状态
- 可重试
- 可并发
- 可替换
impl Agent for Worker {
async fn handle(&self, input: AgentInput) -> AgentOutput {
self.executor.run_task(input.task).await
}
}📌 不要让 Worker 再去问 LLM“我该怎么做?”
Agent Pool:让 Worker 成为“资源”
一旦 Worker 无状态,你就可以:
pub struct AgentPool {
workers: Vec<Worker>,
semaphore: Semaphore,
}- 并发上限
- 成本可控
- 自动负载均衡
let worker = pool.acquire().await;
let result = worker.handle(task).await;
pool.release(worker);这一步,你已经在写一个 Agent Runtime 了。
多 Agent 通信:消息,而不是函数调用
在真实系统里,Agent 不应该“互相调用方法”。
而是通过结构化消息:
pub enum AgentMessage {
Task(Task),
Result(TaskResult),
Control(ControlSignal),
}你可以用:
- Tokio channel(单机)
- Kafka / Redis(分布式)
📌 通信协议 > Prompt 技巧
失败处理:Supervisor 才有“决策权”
Worker 报告失败:
{
"task": "C",
"status": "failed",
"error": "timeout"
}Supervisor 决定:
- 重试?
- 降级?
- 修改 DAG?
- 终止?
match failure {
Timeout => retry_subgraph(),
RateLimit => reduce_concurrency(),
LogicError => replan(),
}👉 “想怎么办”和“怎么做”彻底解耦
多 Agent + Memory:组织级学习
现在记忆的层级变成了:
- Worker:无长期记忆
- Supervisor:拥有 Semantic Memory
Supervisor 可以学到:
- 哪类任务适合哪个 Worker
- 哪种 DAG 结构成功率最高
- 哪些策略成本最低
这一步,你已经进入:
Agent ≈ 自优化系统
到这里,你已经写出了什么级别的东西?
如果你把这五篇能力叠加:
你现在拥有的,实际上是:
一个 LLM 驱动的任务操作系统(Agent OS)
而不是“玩 Prompt 的脚本”。