帖子
Powerpei
Powerpei
大家都在卷云端Agent,我却把多Agent做进了桌面端 在技术社区,多Agent系统的文章越来越多,但大多数都围绕框架展开: ➢LangChain ➢AutoGen ➢CrewAI 我这次想讲的不是框架,而是一个更实际的问题: 如果不搭云端基础设施,只靠一个桌面应用,能不能从零构建一个“活的”多 Agent 协作系统? 答案是:可以 --- 而且它不是Demo 这套系统,长在一个真实的桌面Web3应用里,已经集成了: -EVM / Solana 双链监控 -SWAP 聚合交易 -链上新币追踪 -交易仪表盘 -AI 深度解读 多Agent不是从PPT里设计出来的,而是在生产环境中自然演化出来的。 --- 在讨论多Agent技术实现之前,我先回答一个方向性问题: 为什么我最后选的是桌面端,而不是更主流的云端部署,或者更轻的浏览器插件方案? 这个选择的本质,不是“谁更先进”,而是三条技术路径之间的权衡。 --- 云端部署,是当下最主流的多Agent实现方式。 它的优势很明显: 可以随时为Agent团队加GPU 模型升级不需要用户干预 服务端可以维护全局共享记忆 但代价同样明显: 用户数据必须经过服务器中转 链上交易往往要对服务器开放私钥访问权限 而且会持续产生部署和维护成本 --- 浏览器插件,是另一条轻量路线。 它可以直接注入页面,读取DOM,模拟用户操作,对单一自动化任务非常高效。 但问题也很直接: >它运行在浏览器沙箱里 >缺少持久化存储能力 >缺少长时间运行的后台线程 >很难支撑复杂的记忆系统 >也很难支撑Agent与Agent之间的异步互动 --- 桌面应用则处在一个独特的位置。 它拥有完整的系统资源访问权限: ➢可以自启动后台线程 ➢可以读写本地文件系统 ➢可以建立持久化数据库连接 这些能力,恰恰是多Agent系统真正需要的底层设施 代价当然也有: 它依赖本地算力,模型推理通常仍要调用云端 API 它需要完整 Python 环境 更新和分发也比网页应用更复杂。 --- 所以,选择桌面端构建多Agent,本质上是在用分布式能力,换取数据隐私和调度效率。 这不是绝对优势,而是场景决定的选择。 对加密货币交易、链上分析、监控这类系统来说,数据隐私要求远高于常规应用: >钱包地址 >交易历史 >持仓数据 这些信息落在云服务器上,本身就是风险面。 --- 更重要的是调度效率 在单体桌面应用里,主Agent调度子Agent执行任务,不需要走HTTP / RPC这类网络协议,而是可以直接进程内调用。 这意味着: →网络开销被彻底消除 →调用延迟从毫秒级压到微秒级 对高频分析、链上监控、交易辅助这种场景来说,这种差异会直接影响系统的时效性。 --- 多Agent系统的第一个核心挑战,其实不是“怎么让它们聊天”,而是“怎么把它们隔离开” 主Agent、合约分析Agent、安全审计Agent,再加上用户,如果聊天记录和记忆混在一起,身份就会混淆。 而一旦混淆,信息丢失和错误推理的代价,随时会发生。 --- 我的做法是: 代码模板统一,运行数据隔离 所有子Agent共用同一套 ` 引擎,但通过动态表名,实现物理级的数据隔离: `table_name = f"chat_history_{self.agent_id}"` 然后自动创建对应表。 也就是说: trader Agent会生成 `chat_history_trader` 审计 Agent 会生成自己的 `chat_history_xxx` 主 Agent 也有自己的独立聊天表 这不是逻辑隔离,而是数据库层面的物理隔离。 --- 反思笔记也是同样的设计。 每个子 Agent 都会记录自己的反思键: `reflection_key = f"auto_reflection_{self.agent_id}"` `self.api._agent_remember("master_insight", reflection_key, summary)` 这样每个Agent只积累自己的长期反思, 不会污染其他Agent的记忆。 这套方案最精髓的地方在于: 一次设计,终身复用。 --- 后面再新增第三个、第四个Agent,不需要改任何核心代码。 只需要复制目录结构,补上配置文件。 模板引擎就会自动为它生成: →独立数据库表 →独立反思键 →独立聊天存储区 这让我越来越相信一件事: 好的架构,不一定更复杂, 但一定更容易复用。 --- 接下来是调度问题。 在分布式系统里,主Agent调子Agent,通常要依赖: -HTTP / RPC 通信 -服务发现 -负载均衡 但在单体桌面应用里,我把这件事简化成了一个直接函数调用: `sub = self.sub_agents[agent_id]` `result = sub.process(task, save_history=False)` 这就是“命令而非请求”。 --- 这种“传话式调度”有两个好处: 第一,延迟从毫秒级降到微秒级,所有数据都留在本地流转 第二,主 Agent 不需要知道子 Agent 的内部实现细节,只需要知道: “它可以处理什么类型的任务” 这其实就是清晰的职责边界。 --- 为了让主Agent真正会“派活”,我把所有子Agent的能力清单,动态注入进主Agent的系统提示词。 例如: 合约分析 Agent:可用工具 `get_contract_market_data`、`run_contract_risk_check` 安全审计 Agent:可用工具 `check_token_security`、`check_token_audit_binance` 这样主Agent接到用户指令后,就能自动判断任务类型,并选择合适的子Agent执行。 --- 权限控制,是整个多Agent系统里最核心的安全问题之一。 主Agent持有26个Web3专属工具,覆盖: SWAP 报价 链上分析 安全检测 数据查询 但每个子Agent只应该使用自己那一小部分工具。 所以第一层,我在代码层做了严格白名单过滤: `return [t for t in all_tools if t["function"]["name"] in self.allowed_tools]` --- 但只有代码过滤还不够。 因为大模型会产生“幻觉”,它可能尝试调用未授权工具。 所以第二层,我在系统提示词末尾,直接写入“工具使用铁律”: 你只拥有以下这些工具,绝对不能越界。 如果任务需要其他工具,必须明确告诉老板你没有权限。 代码层负责“不能看到” 提示词层负责“不会越界” 这是我在权限隔离上做的双层防护。 --- 还有一个我自己很喜欢,但最不显眼的设计: 我给整个Agent 团队,单独做了一个茶水间 市面上多数多Agent系统,只做“用户 -> Agent”的交互。 Agent 之间互不交流。 但我单独设计了一个 `agent_interactions` 空间,让 Agent 和 Agent 之间也能异步互动。 --- 它的触发机制甚至很简单: `selected_id = random.choice(list(api.sub_agents.keys()))` `selected_sub = api.sub_agents[selected_id]` 每次触发时,引擎随机选人,动态生成一轮对话,再写回数据库,前端实时渲染。 我还额外加了后台检查线程和防无限循环机制: 每隔 2-3 分钟检查最后一条消息 如果最近 3 条都是自动回复,就自动暂停 避免它们半夜自己聊到停不下来。 --- 这个“茶水间”的价值不在于直接创造业务收益,而在于一种潜移默化的系统人格塑造。 它不强调自己的存在, 却在悄悄维持 Agent团队的凝聚力、性格关系和健康状态。 你几乎感觉不到它, 但系统会因为它,变得更像一个“活着的团队”。 --- 在记忆层设计上,我最后没有引入向量数据库,而是继续深度定制 SQLite。 不是因为技术保守,而是因为工程决策必须在约束条件下做权衡。 对桌面应用来说,多一个依赖,就多一个故障点、多一个安全风险面、多一个打包负担。 结果是: >几张SQLite表 >动态表名 >结构化JSON字段 就支撑起了3个乃至更多Agent的独立记忆系统。 --- 这套记忆系统现在已经形成了一条完整链路: 短期对话记忆(20条) -> 长期反思笔记(6小时一次) -> 结构化 JSON 记录 而我还在继续推进8个方向: ➤上下文延续 ➤记忆结构化 ➤记忆驱动行为 ➤心理学三类长期记忆 ➤团队协作记忆 ➤动态进化记忆 ➤知识图谱记忆 ➤记忆压缩与高效检索 我的目标,不是让Agent记住你说过什么 而是让它从记住你说过什么的工具,慢慢进化成能理解你、预测你、协同你的长期伙伴 GitHub: 作者:Powerpei(萧楠)

免责声明:欧易星球内容仅供参考。 了解更多

回复

暂无评论,快来抢沙发!