Rust 多 Agent 协作:从“一个聪明 Agent”到“Agent 组织”

  • King
  • 发布于 1天前
  • 阅读 23

如果你已经跟完前四篇,你会发现一个事实:👉Agent越做越复杂,越不像“一个人”,👉越像“一个团队”。这不是偶然,而是复杂系统的必然演化。单Agent的天花板在哪里?哪怕你已经有了:DAG执行器长期记忆并发调度单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>,
}

职责只有三个:

  1. 理解目标
  2. 生成 Task Graph
  3. 分配给 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 ≈ 自优化系统


到这里,你已经写出了什么级别的东西?

如果你把这五篇能力叠加:

1. Agent Loop 2. Executor + 并发 3. 长期记忆 4. DAG 调度 5. 多 Agent 协作

你现在拥有的,实际上是:

一个 LLM 驱动的任务操作系统(Agent OS)

而不是“玩 Prompt 的脚本”。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论