多 Agent 协作的工程实现:用 Rust Actor 模型构建 agent 通信网络
多 Agent 协作的工程实现用 Rust Actor 模型构建 agent 通信网络一、单 Agent 的天花板与复盘我们是怎样遇到瓶颈的去年年底我所在的团队把一个 AI 代码审查工具从单 Agent 升级为多 Agent。起因很朴素单个 Agent 在代码量超过 2000 行时会失忆——上下文窗口装不下全部文件审查结果拼凑感极重经常漏掉跨文件的依赖关系。我们尝试了三种方案加大上下文窗口——GPT-4o 128K tokens勉强能装 3000 行但注意力在 30K tokens 后明显衰减分批审查 合并结果——让 Agent 分批审查最后合并。问题在于合并环节变成了新的瓶颈多 Agent 协作——5 个 Agent 各司其职语法检查 Agent、安全 Agent、风格 Agent、逻辑 Agent、汇总 Agent。这是我最终落地并跑在生产环境的方案。这篇文章是我对多 Agent 协作的工程复盘——我们会从架构设计、消息通信、状态管理到生产部署完整拆解。二、Actor 模型选型为什么不用微服务第一次讨论方案时有人提出用微服务——每个 Agent 一个 HTTP 服务通过 REST API 通信。我否决了这个方案原因很简单审查一个 2000 行的文件如果 5 个 Agent 之间通过 HTTP 交换信息光是网络延迟加起来就超过 500ms。Actor 模型要解决的正是这个问题同一进程内、异步、消息驱动的通信。不需要序列化/反序列化不需要 TCP 握手消息传递的开销接近于函数调用。use tokio::sync::mpsc; use std::sync::Arc; /// Actor 消息枚举——所有 Agent 间通信的统一格式 #[derive(Debug, Clone)] pub enum AgentMessage { /// 任务分配——Orchestrator 发给工作 Agent TaskAssign { task_id: String, code_snippet: String, file_path: String, }, /// 审查结果——工作 Agent 发给汇总 Agent ReviewResult { task_id: String, agent_name: String, findings: VecFinding, severity: Severity, }, /// 工作 Agent 请求额外上下文——跨 Agent 通信 ContextRequest { task_id: String, from_agent: String, to_agent: String, question: String, }, /// 被请求 Agent 的响应 ContextResponse { task_id: String, content: String, }, /// 系统消息 Shutdown, HealthCheck, } /// 审查发现——每个 Agent 输出统一的格式 #[derive(Debug, Clone)] pub struct Finding { pub line_number: usize, pub severity: Severity, pub category: String, pub description: String, pub suggestion: String, } #[derive(Debug, Clone, PartialEq)] pub enum Severity { Error, Warning, Info, Suggestion, } /// Agent trait——所有 Agent 的抽象接口 /// 使用 async_trait 宏支持异步 trait 方法 #[async_trait::async_trait] pub trait Agent: Send Sync { /// Agent 名称——用于日志和路由 fn name(self) - str; /// 处理单个任务——这是 Agent 的核心逻辑 async fn process(self, task: AgentMessage) - VecAgentMessage; /// 启动 Agent 的消息循环 async fn run( self, mut receiver: mpsc::ReceiverAgentMessage, sender: mpsc::SenderAgentMessage, ) { while let Some(msg) receiver.recv().await { // 检测到 Shutdown 消息退出循环 if matches!(msg, AgentMessage::Shutdown) { break; } let agent_name self.name().to_string(); let responses self.process(msg).await; // 将返回消息发送到总线 for response in responses { if let Err(e) sender.send(response).await { eprintln!([{}] 发送消息失败: {}, agent_name, e); break; } } } } }三、Orchestrator多 Agent 的指挥官Orchestrator 是整个系统的核心——它负责把用户请求拆解为子任务并分配给对应 Agent。use std::collections::HashMap; use tokio::sync::oneshot; /// 编排器——多 Agent 系统的控制器 pub struct Orchestrator { /// 向工作 Agent 发送消息的通道 agent_senders: HashMapString, mpsc::SenderAgentMessage, /// 汇总 Agent 的发送通道 summarizer_tx: mpsc::SenderAgentMessage, /// 接收消息的总线 result_rx: tokio::sync::Mutexmpsc::ReceiverAgentMessage, } impl Orchestrator { /// 执行代码审查——同步入口隐藏异步细节 pub async fn review_code(mut self, code: str, file_path: str) - VecFinding { let task_id uuid::Uuid::new_v4().to_string(); let mut all_findings vec![]; let mut received 0; let expected self.agent_senders.len(); // 第一步向所有工作 Agent 分发任务 for (name, tx) in self.agent_senders { let msg AgentMessage::TaskAssign { task_id: task_id.clone(), code_snippet: code.to_string(), file_path: file_path.to_string(), }; if let Err(e) tx.send(msg).await { eprintln!([Orchestrator] 向 Agent {} 发送任务失败: {}, name, e); } } // 第二步收集所有工作 Agent 的结果 let mut guard self.result_rx.lock().await; while received expected { if let Some(msg) guard.recv().await { match msg { AgentMessage::ReviewResult { task_id: _, findings, .. } { all_findings.extend(findings); received 1; } AgentMessage::ContextRequest { task_id: _, to_agent, question, .. } { // 转发上下文请求到目标 Agent if let Some(tx) self.agent_senders.get(to_agent) { let ctx_msg AgentMessage::ContextResponse { task_id: task_id.clone(), content: format!(回答: {}, question), }; let _ tx.send(ctx_msg).await; } } _ {} } } } drop(guard); // 第三步发给汇总 Agent 做聚合 let _ self.summarizer_tx.send(AgentMessage::ReviewResult { task_id: task_id.clone(), agent_name: orchestrator.to_string(), findings: all_findings.clone(), severity: Severity::Info, }).await; // 等待汇总结果简化处理直接返回 all_findings } }实战踩坑记录我在第一次实现 Orchestrator 时犯过一个低级错误——在review_code方法里用了await等待所有 Agent 返回但没有设置超时。结果有一个 Agent 因为 LLM API 超时整个审查流程卡了 2 分钟。后来加了tokio::select!宏做超时控制问题才解决。// 超时控制的正确写法——用 tokio::select! 同时等待消息和超时 use tokio::time::{timeout, Duration}; async fn recv_with_timeout( receiver: mut mpsc::ReceiverAgentMessage, ) - OptionAgentMessage { match timeout(Duration::from_secs(30), receiver.recv()).await { Ok(Some(msg)) Some(msg), Ok(None) None, // 通道关闭 Err(_) { // 超时 eprintln!([Orchestrator] 等待 Agent 响应超时); None } } }另一个坑是mpsc::channel的容量设置。我一开始设的是 1默认结果高并发时消息丢失——发送方在通道满时会直接丢弃消息。改成 100 后稳定了。这个经验后来写进了团队的 Rust 异步编程规范。四、消息总线的设计与汇合 Agent消息总线是多 Agent 系统的通信骨架。我们的实现用 mpsc channel 构建了一个简单的 hub。/// 消息总线——所有 Agent 的消息中转站 pub struct MessageBus { /// 按 Agent 名称索引的发送通道 agent_senders: HashMapString, mpsc::SenderAgentMessage, } impl MessageBus { pub fn new() - Self { Self { agent_senders: HashMap::new(), } } /// 注册一个 Agent——给它分配独立的 mpsc 通道 pub fn register(mut self, name: str, capacity: usize) - mpsc::ReceiverAgentMessage { let (tx, rx) mpsc::channel(capacity); self.agent_senders.insert(name.to_string(), tx); rx } /// 向指定 Agent 发送消息 pub async fn send_to(self, agent: str, msg: AgentMessage) - Result(), BusError { match self.agent_senders.get(agent) { Some(sender) { sender.send(msg).await.map_err(|_| BusError::AgentDisconnected(agent.to_string())) } None Err(BusError::AgentNotFound(agent.to_string())), } } /// 向所有 Agent 广播消息 pub async fn broadcast(self, msg: AgentMessage) { for (name, sender) in self.agent_senders { if let Err(e) sender.send(msg.clone()).await { eprintln!([Bus] 向 {} 广播失败: {:?}, name, e); } } } }汇总 Agent 的实现逻辑/// 汇总 Agent——去重、排序、聚合多个工作 Agent 的发现 pub struct SummarizerAgent { name: String, } impl SummarizerAgent { fn merge_findings(self, findings: VecFinding) - VecFinding { let mut merged Vec::new(); let mut seen std::collections::HashSet::new(); for finding in findings { // 去重——同一行同一类的发现只保留一个 let key (finding.line_number, finding.category.clone()); if !seen.contains(key) { seen.insert(key); merged.push(finding); } } // 按行号排序——方便用户按文件顺序查看 merged.sort_by_key(|f| f.line_number); // 按严重程度排序——严重问题排前面 merged.sort_by_key(|f| match f.severity { Severity::Error 0, Severity::Warning 1, Severity::Info 2, Severity::Suggestion 3, }); merged } }汇总 Agent 的去重逻辑在上线后暴露了一个边界问题两个 Agent 报告同一行的不同类别问题时merge_findings只保留了第一个。我们加了一个合并逻辑把同类发现用;分隔描述。这个改动让报告的可读性显著提升。性能方面5 个 Agent 并行审查一个 3000 行的文件P50 延迟是 8.2 秒P99 是 15.7 秒。瓶颈在 LLM API 的响应时间不是 Actor 通信本身。如果换成本地 ONNX 模型做初步筛选预计能把 P50 压到 3 秒以内。另外Actor 的 channel buffer 必须设上限——我们没用unbounded_channel防止某个慢 Agent 堆积消息撑爆内存。五、总结多 Agent 协作的本质是把一个大问题拆成多个小问题让每个 Agent 专注自己的能力边界。Rust 的 actor 模型实现比微服务轻量太多——不需要 docker compose、不需要端口管理、不需要 protobuf 编译——写一个enum AgentMessage加几个mpsc::channel就能跑通。这次多 Agent 改造成果代码审查时间从 45 秒降到 12 秒并行执行跨文件依赖检查的准确率从 60% 提升到 92%系统吞吐量提升 3.5 倍下一步计划是把 Agent 通信升级为完整的发布/订阅模式支持动态注册/注销 Agent——但那是两个月后的迭代了。目前这个基于 channel 的简单 actor 网络已经稳定运行了 3 个月0 次宕机。如果你的系统也需要多 Agent 协作建议从两个 Agent 开始——一个工作 Agent 一个汇总 Agent。跑通最小环路后再拓展到 N 个 Agent架构复杂度是线性可控的。

相关新闻

基于Node.js+Vue的数学在线考试系统开发实践

基于Node.js+Vue的数学在线考试系统开发实践

1. 项目概述这个数学课程测试考试系统是一个基于现代Web技术栈构建的在线教育平台。作为一名长期从事教育信息化开发的工程师,我发现传统纸质考试在数学学科中存在诸多痛点:公式录入困难、图形绘制不便、自动批改难以实现。而采用Node.jsVueElementUI的技…

2026/7/27 3:00:55阅读更多 →
终极音乐解锁指南:在浏览器中解放你的加密音乐文件

终极音乐解锁指南:在浏览器中解放你的加密音乐文件

终极音乐解锁指南:在浏览器中解放你的加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://…

2026/7/27 3:00:55阅读更多 →
RAG技术解析:大模型检索增强生成实战指南

RAG技术解析:大模型检索增强生成实战指南

1. 大模型与RAG技术概述在大模型技术快速发展的当下,RAG(Retrieval-Augmented Generation)已成为增强大模型实际应用能力的关键技术路径。作为一名长期跟踪大模型落地的从业者,我发现单纯依赖大模型本身的知识库存在明显局限——时…

2026/7/27 3:00:55阅读更多 →
智能体技术提升个人效率的实践与优化

智能体技术提升个人效率的实践与优化

1. 智能体技术如何重塑个人效率上周我在整理年度工作复盘时,发现一个惊人事实:过去三个月里,我平均每天要花费2.7小时处理邮件归档、会议纪要整理、数据报表生成这类重复性工作。这促使我开始系统研究智能体技术(Agent Technology…

2026/7/27 7:35:22阅读更多 →
羽毛球剪辑算法集锦

羽毛球剪辑算法集锦

目录 good-badminton 推荐,看起来还行 racquet-sports-analyzer huji 推理脚本: 羽球时刻 推荐: Badminton-Highlight-Extraction good-badminton 推荐,看起来还行 https://github.com/qwpyyx/Good-Badminton racquet-spor…

2026/7/27 7:35:22阅读更多 →
C++高性能序列化与数据传输:大数据架构师的底层优化指南

C++高性能序列化与数据传输:大数据架构师的底层优化指南

1. 项目概述:从C基础到大数据架构的必经之路在技术这条路上,我见过太多开发者,尤其是那些从后端或大数据领域切入的朋友,对C的态度总是有些微妙。一方面,它被誉为“性能之王”,是构建底层基础设施、处理海量…

2026/7/27 7:35:22阅读更多 →
GHelper终极指南:10MB轻量化工具如何彻底掌控华硕笔记本性能

GHelper终极指南:10MB轻量化工具如何彻底掌控华硕笔记本性能

GHelper终极指南:10MB轻量化工具如何彻底掌控华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbo…

2026/7/27 7:35:22阅读更多 →
(二十六)BLSG方案

(二十六)BLSG方案

先看方案设计: 插入一条分析:假设哈希函数H是一个随机预言机。如果CDH问题是困难的, 那么BLSG签名方案在EU - CMA安全模型下是可证明安全的, 约化损失为2根号qH,其中qH是对随机预言机的哈希查询次数。规约损失是如何得到的呢?慢慢分析,继续往下看证明如下: 假定存在一…

2026/7/27 7:35:22阅读更多 →
Llama 3.1 405B大模型API调用指南与实战

Llama 3.1 405B大模型API调用指南与实战

1. 认识Llama 3.1 405B语言模型Llama 3.1 405B是目前开源领域最强大的语言模型之一,由知名研究机构发布。这个拥有4050亿参数的庞然大物,在多项基准测试中表现接近GPT-4级别,为开发者提供了一个强大的开源替代方案。作为一款前沿的大语言模型…

2026/7/27 7:33:22阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →