
如果你最近在做多智能体应用应该刷到过 AgentScope 这个名字。我最早以为它只是又一个 Agent 框架直到在项目里接进去跑通一整套多角色协作流程才意识到它真正值钱的地方不是能跑模型而是把多智能体之间的消息流、编排、RAG 检索这些脏活做成了工程化的东西。所谓推荐不是因为它名字好听而是因为它确实帮我解决了一个具体问题多个模型同时参与任务时怎么让它们不乱、不重复、不死循环。这篇文章会从实际使用者的角度聊聊 AgentScope 到底解决了什么问题、和手搓/其他编排框架比有什么差别、怎么快速做出一个三角色协作的 Demo以及 AgentScope 2.0 里让我眼前一亮的新方向——把 RAG 直接做成服务。如果你正在纠结多个 Agent 怎么协作Java 系统怎么接进 Agent 生态中文模型能不能用那这篇内容大概率对你有用。我不打算给你一份逐行翻译的官方教程因为我吃过太多照着教程跑不起来的亏。下面写的东西都是我反复试过、踩过、最后稳定运行的经验你照着做可以少走很多弯路。1. AgentScope到底解决了什么问题从多个模型打架说起1.1 从一个模型不够用到多个模型更难用单模型做复杂任务的时候大家最常用的办法是加 Prompt。一个模型搞不定就把它拆成规划、执行、检查三个步骤每个步骤用不同的 Prompt 控制。这个思路没错但一旦任务复杂到需要多个角色来回沟通问题就冒出来了谁先发言、谁接收谁的消息、历史记录怎么保存、并发调用怎么限制、某个环节返回异常之后怎么重试。这些事看起来简单真用手写代码实现你会发现大部分时间不是在调模型而是在写一堆和业务无关的胶水代码。我在一个电商舆情分析项目里做过一次尝试用三个角色一个抓取和分类一个写摘要一个做风险判断。如果粗暴地用三份 Prompt 接一个主循环代码结构很快会变得混乱。因为每个角色不仅要看到自己的输入还要看到前一个角色的输出甚至要看到另一个角色的中间结果。稍微改一下流程就要动一堆 if else。那段时间我对多智能体这三个字产生了深深的怀疑。后来朋友推荐了 AgentScope。它的核心思路是不要直接手写循环而是把每个参与者都抽象成一个 Agent把一次协作抽象成一条有方向的消息流。所有 Agent 之间的交互都通过消息完成框架帮你管理消息的投递、转换和记录。我一开始觉得这只是换了个写法真正用起来才发现这套抽象把我之前最头疼的问题全解决了。1.2 AgentScope给多智能体世界定下的交通规则如果用一句话概括 AgentScope我会说它是一个多智能体交通规则系统。多智能体协作最怕的是没有规则大家乱发消息、乱收消息最后上下文一团糟模型自己也搞不清自己该干嘛。AgentScope 用一套统一的消息对象约束了所有 Agent 之间的通信格式。你可以把一个 Agent 理解成一个小型角色处理器。它接收一条消息内部调用大模型也好、调用普通函数也好处理完之后输出一条新消息。消息本身有明确的发送者接收者内容这些属性框架就可以依据这些属性做路由、并行、过滤、汇总。这样设计的最大好处是你可以像搭积木一样替换任意一个 Agent而不需要重写整套流程。我一开始以为这种框架会很重结果 AgentScope 允许用普通函数或者轻量类来定义 Agent。如果你只是要跑通一个简单任务甚至可以不用继承任何类用一个装饰器把一个普通 Python 函数变成 Agent。对刚开始接触多智能体的人来说这个设计非常友好不会把初学者挡在复杂的类继承外面。1.3 我理解的核心抽象Agent、Message、PipelineAgentScope 里最核心的三个概念就是 Agent、Message、Pipeline。Agent 是执行者Message 是传递的信息Pipeline 是编排的流程。我刚开始使用的时候习惯性地想流程是不是一个 Pipeline 对象后来发现不对在 AgentScope 的世界里流程更像是一条消息流。比如一个策划→文案→审校的三角色流程在 AgentScope 里不用硬编码谁调用谁只需要把初始消息发给策划 Agent策划输出后框架再把这条消息作为输入传给文案 Agent文案输出再传给审校 Agent。每一步的输出都是下一步的输入中间不需要你手工拼接对话历史。如果你希望两个角色可以并行那就在消息流里做一下 Fan-out/Fan-in这也天然是消息系统擅长的事。这个抽象让我的项目从面向过程编程变成了面向消息编程。调试的时候我只要盯着消息流看一遍就知道问题出在哪个环节是某个角色没理解指令还是消息漏传了。这种体验手写循环很难给你。2. 横向对比后我选择了它为什么不是手搓循环也不是其他编排框架2.1 和直接调模型手搓多角色循环相比最原始的方案是我自己维护一个 messages 列表不断往里 append 系统消息、用户消息、助手消息然后在合适的时候调用模型。单角色的时候还好多角色的时候你就得手动区分这段历史是给 A 角色看的还是给 B 角色看的甚至要手动裁剪历史。我之前的做法是用一个全局 history然后给每个角色加一个只看自己的历史的过滤逻辑。结果就是代码里到处是 list comprehension 和字符串拼接稍不留神就把别的角色的上下文混进去了。说完这句话模型就开始乱。AgentScope 把这条链路做成了框架内建能力。每个 Agent 可以自己维护独立的记忆上下文同时通过消息机制去接收其他 Agent 的输出。你不需要再手动过滤历史因为每个 Agent 收到的就是自己应该看到的消息。这是一个本质差别前者是所有历史混在一起人为让模型忽略后者是每个模型只看和它相关的消息这个差异在长任务里非常明显。2.2 和 LangGraph / AutoGen 这类编排框架比我更看重什么我用过一些其他编排框架各有各的好但 AgentScope 有几个点特别戳我。第一是它的源码可读性比较好出问题的时候我能直接翻源码定位不用靠猜。第二是它对国内模型兼容性做得比较早我手里的百川、通义、ChatGLM 之类的模型通过 OpenAI 兼容接口投进去就能用。我整理了一个简单的对比观点很主观但是基于我的实际体验对比维度手搓循环LangGraphAgentScope上手成本低但后期维护难概念较多需要理解状态机低函数级别的 Agent 也能跑消息管理完全自己维护由 Graph 状态传递内置 Msg 对象路由清晰调试体验看日志靠猜可视化不错消息流直观可回放对国产模型兼容自己写适配需要额外配置天然支持 OpenAI 兼容格式生产部署越写越脆弱相对稳定分布式支持服务化方便不是说其他框架不好而是我当前的项目更在意快速上线、稳定迭代、出了问题能快速定位AgentScope 在这三个维度上恰好都让我满意。2.3 真实项目里带来的收益说个具体例子。我的舆情分析项目原来是三套 Python 脚本串行跑每套脚本之间用文本文件传递中间结果跑一次要四五个小时经常因为中间格式不兼容而挂掉。改成 AgentScope 之后我把三个脚本包装成三个 Agent内部逻辑基本没动只把输入输出改成了 Msg然后用一条 Pipeline 把它们串起来。改完的收益很明显一是中间结果不再落盘省了一堆文件读写二是挂掉之后能追踪到具体是哪个 Agent 的哪条消息出了问题三是后面我要加一个汇总分析角色只需要在 Pipeline 里多加一个 Agent完全不用改动原本三个 Agent 的代码。作为对比如果还是原来的脚本方式我八成要从头重构。3. 二十分钟跑通一个三角色协作 Demo代码、消息流和运行逻辑3.1 环境准备别在版本上给自己挖坑安装 AgentScope 这件事本身不复杂pip install agentscope就行。但我要提醒你AgentScope 迭代非常快不同版本之间的 API 可能有差异。我在第一次安装的时候就因为装了最新版却按旧文档写代码折腾了一个晚上。所以请你务必固定一个版本。我的建议是如果你想照着下面这份代码跑可以先把版本锁在我用的这个主版本上如果你要用最新版请一定先去官方中文文档里确认当前版本的关键 API 长什么样。千万不要拿一个旧代码去怼新环境然后怀疑是模型有问题。环境方面Python 3.10 以上基本没问题另外需要一个可用的模型接口。本地没显卡也没关系我跑 Demo 时用的是 OpenAI 兼容的线上模型接口AgentScope 天然能对接这类接口只要在配置里写清楚model_type、model_name、api_key就可以。3.2 定义三个角色 Agent策划、文案、审校下面这段代码是我实际跑过的简化版。它定义了一个最基础的 Agent你只需要继承AgentBase实现reply方法在里面调用模型然后返回一条Msg就能工作from agentscope.agents import AgentBase from agentscope.msg import Msg class PlannerAgent(AgentBase): 策划角色负责输出活动方案。 def reply(self, x: Msg None) - Msg: prompt f你是一个资深活动策划。 用户需求{x.content} 请输出一份简短的初步方案包含主题、时间、流程三部分。 res self.model(prompt).text return Msg(nameself.name, contentres, roleassistant)文案和审校几乎一样只是 Prompt 不同。我不再重复代码但你要注意一个关键点每个 Agent 都需要一个不同的name这个name会出现在消息上方便后面对消息流做路由和追踪。审校 Agent 的模型调用可以加一个temperature0.2因为审校工作需要更稳定的输出。3.3 串联起来用最简单的消息循环驱动协作不需要额外引入复杂的 Pipeline 概念最直接的串联方式就是手动把上一条消息传给下一个人。我封装了一个极简的sequential函数逻辑上等价于 AgentScope 里的串行 Pipelinedef sequential_pipeline(agents, initial_msg: Msg) - Msg: current initial_msg for agent in agents: current agent(current) # AgentBase 支持直接调用 return current调用方式from agentscope.msg import Msg planner PlannerAgent(nameplanner, model_config_namemy_llm) copywriter CopywriterAgent(namecopywriter, model_config_namemy_llm) reviewer ReviewerAgent(namereviewer, model_config_namemy_llm) first_msg Msg(nameuser, content我们想做一个面向职场新人的线下分享会预算不高希望能有互动感。) final sequential_pipeline([planner, copywriter, reviewer], first_msg)为什么我建议你先这么写因为这个流程能让你把产品本身的抽象理解清楚上一轮的输出就是下一轮的输入每个 Agent 内部只负责完成自己的那一步。等这个流程跑通你再去看 AgentScope 提供的并行、条件分支这些能力会顺畅很多。3.4 运行效果和调参心得我运行后的典型输出是策划给出一个大致框架文案基于框架写出完整宣传文案审校指出预算约束没落到具体执行环节并要求返工优化。这种角色分工的效果靠一个长 Prompt 很难稳定达到因为你没法保证模型能记住多个角色的视角。如果你发现审校角色总是好好好没问题可以把它的系统 Prompt 调得尖锐一点明确要求它必须指出至少两个可改进的点。如果你发现策划输出太发散可以把temperature调低到 0.4。这些参数在 Agent 内部初始化模型配置时设置即可。有个细节容易忽略model_config_name不是随便写的它对应你初始化 Model 时注册的配置名。我在实际运行中经常把配置名写错导致报错信息特别像Agent 没定义其实是模型配置没匹配上建议你多留意一下控制台日志里有没有model config not found这类关键字。4. 2.0里最值得试的RAG as Service以及Java侧怎么接4.1 为什么 RAG 要服务化而不是每个 Agent 抱一个知识库多智能体项目跑到后面几乎所有角色都需要查询业务知识库。策划要知道公司历史办过哪些活动审校要知道品牌话术规范客服 Agent 还要知道售后政策。如果你在每个 Agent 内部都初始化一份知识库检索逻辑代码重复不说更麻烦的是知识更新时要同时改多个地方非常容易不一致。AgentScope 2.0 带来的一个值得关注的新方向就是把 RAG 能力直接服务化。你可以把一套知识库索引成一个检索服务任何 Agent 都能按需调用业务系统也能通过 HTTP 直接用。这相当于把原来每个 Agent 一个私人图书馆变成了整栋楼共用一座图书馆但有统一的借书台。这个转变在知识库频繁更新的场景下尤其重要。4.2 我把知识库变成服务的基本思路在 AgentScope 2.0 里我实际采用的方式大致是先用框架提供的能力把知识文档切块、向量化并写入索引库然后启动一个独立的检索服务进程。这个进程对外暴露一个 HTTP 接口接收检索请求返回相关片段。Agent 侧要做的事情只是配置一个检索工具的调用项把用户问题拼接成检索请求然后把返回片段注入上下文。我没有办法在这里给你一份逐行照抄的配置因为不同版本的知识库接入方式差异还挺大。但整体思路是通用的先确认你用的版本支持哪些检索后端再配置 Embedding 模型接口最后把检索服务的地址填到 Agent 工具配置里。如果某个版本的 RAG 服务化还不支持你要的向量库那就退一步用 AgentScope 的 HTTP 工具能力去调用一个自己写的检索接口效果也是一样的只是要多写一层胶水。4.3 Java 侧接入别硬搬 Python SDK用服务调用最稳热词里有不少人在搜agentscope java社区里也有相关文章在讨论 Java 到底怎么接 AgentScope。我的观点很直接你不需要在 Java 进程里跑 AgentScopePython 负责编排和 Agent 调度Java 业务系统负责提供查询入口两边通过 RAG 服务或者消息队列解耦这是最高效的接法。比如我有一个 Java 写的管理后台需要调用上面的检索知识库来给前端做一个智能问答入口。我在 Java 侧就只是发起一个 HTTP 请求HttpClient client HttpClient.newHttpClient(); HttpRequest request HttpRequest.newBuilder() .uri(URI.create(http://rag-service:8080/retrieve)) .header(Content-Type, application/json) .POST(BodyPublishers.ofString({\query\:\活动方案相关规则\,\top_k\:5})) .build(); HttpResponseString response client.send(request, BodyHandlers.ofString()); String result response.body();这样做的好处是Java 和 Python 两边可以独立迭代。Java 侧不需要关心 AgentScope 版本怎么升级Python 侧也不需要在 Java 的依赖里引入一堆 Python 运行时。如果你非要在一个 Java 进程里直接调用 AgentScope 的 Python 逻辑也不是不行但你要去和子进程、序列化、环境依赖打交道维护成本会高很多。4.4 为什么这个设计适合多团队协作服务化还有一个隐藏好处团队分工可以更干净。知识库团队只负责维护索引质量和检索服务的召回效果Agent 团队只负责研究怎么把检索片段写进 Prompt业务团队只负责开发前端界面和业务逻辑。三个团队不需要在同一个代码仓库里纠缠只需要一个经过约定的 API 文档。我在公司内部推这套方案的时候前端的同事最高兴因为他们不需要接触任何 Python 环境只需要对着 HTTP 接口文档写代码。这个模式我觉得是 AgentScope 2.0 在多智能体落地时最值得借鉴的设计之一。5. 实际生产环境里的坑中文模型、上下文失控和版本迭代5.1 中文模型与 AgentScope 的手工具调用格式要统一AgentScope 这个框架对不同模型的处理方式本质上是通过模型配置去适配各家 API。但国内很多模型虽然宣称兼容 OpenAI 格式在工具调用function call上却各有各的小毛病。最常见的问题是框架给了模型一段工具描述模型返回了格式不完美的工具调用参数导致解析失败。我遇到过一个案例一个查天气的工具模型多输了一个字段AgentScope 直接抛异常。排查到最后发现不是 AgentScope 的 bug而是那个模型在函数调用的惯用法上和 OpenAI 标准不完全一致。解决办法有两个一是换一个对 OpenAI 工具调用兼容性更好的模型二是关闭强制工具调用让模型输出可以被正则解析的纯文本你自己加一层解析逻辑。如果你要用中文模型跑 AgentScope我的建议是先把最小工具调用测试做掉只给模型一个工具让它调用一次看看返回结果能不能被框架正确解析。这一步过了再往上叠加复杂工具能省去后面大量排查时间。5.2 消息历史暴涨与 Token 预算失控多智能体协作跑得越久消息历史就越长。每个 Agent 都有自己的一份对话记忆如果任务链条很长Token 消耗会像滚雪球一样涨上去。我见过最夸张的一次一个任务跑完光历史 Token 就消耗了几十万账单直接爆了。我的解决方案是引入摘要节点每几轮交互之后用一个轻量模型把之前的消息历史压缩成一段摘要再把摘要作为后续上下文的开头。这个动作在 AgentScope 里可以做成一个特殊的 Agent插在 Pipeline 中间。摘要节点不需要特别强的模型关键是速度和成本。我踩过的一个坑是摘要节点如果太激进会把关键细节丢掉导致后面的 Agent 信息不足。所以我的经验是摘要只压缩过程性内容比如谁说过什么、讨论过什么分支但保留所有结论性内容和待办事项。这个策略执行下来Token 费用大概降了 60%任务质量没有明显下降。5.3 版本迭代快代码容易昨天还能跑今天就报错AgentScope 的版本迭代速度是比较快的这对老用户来说既是好事也是烦恼。好处是功能越来越完善坏处是旧代码经常要跟着改。我在一次升级之后发现以前用得很顺的一个 Pipeline 用法被改名了翻了半天文档才找到替代方案。应对这件事我有两个习惯。第一个习惯是项目里锁版本比如agentscope某个稳定版本不在生产环境追新。第二个习惯是每次升级前先去看官方中文文档里的Breaking Changes把改动的 API 提前列一个对应关系表再逐个替换。如果你刚接触 AgentScope更不要迷信 Github 上最新分支的 README文档版本和代码版本对不上是常有的事。另外我强烈建议跑通一个最小回归用例。我给自己定了一条规矩升级 AgentScope 之后必须把之前跑通的那个三角色 Demo 重跑一遍通过才允许合并代码。这个小成本的动作帮我拦住了好多次潜在的生产事故。5.4 分布式部署时别忽略消息中间件的稳定性当你的 Agent 数量变多单个进程可能扛不住并发。AgentScope 支持把不同 Agent 部署到不同进程或机器上这时候消息的传递就需要依赖中间件。我试过用 Redis 作为消息中间件整体跑起来很顺但也遇到过 Redis 连接突然中断导致消息积压的问题。如果你要在分布式模式上生产不要天真地以为中间件默认配置就足够。连接池大小、超时时间、重试策略都得单独调。我在上线前做过一次小小的混沌测试强制杀掉一个中间件连接看系统能不能自动恢复。结果发现 Agent 角色之间的消息丢了一条系统直接卡住了。后来加了消息确认和重发机制才真正稳定下来。这个坑官方文档里没有特别强调但分布式场景下几乎一定会遇到。最后再分享一点个人体会AgentScope 这个框架最值得学习的地方不是某个炫酷的 Agent 类而是它用消息流解耦多智能体协作的设计理念。我自己在做项目时已经养成了先画消息流图再写 Agent的习惯。你和团队在引入它之前也一定要先想清楚自己业务的流程里到底哪些节点需要人智协作、哪些节点只需要一个工具调用别为了上多智能体而上多智能体。先把流程理顺再用 AgentScope 把这个流程落地你会发现这个框架是真的能帮你省时间而不是给你制造新问题。