
这几年AI Agent的话题越来越热几乎每隔几天就能看到新的框架、新的概念冒出来。但说实话单Agent的Demo好写真正难的是把Agent丢进生产环境让它跟其他Agent一起配合干活出问题还能恢复。我见过太多项目卡在同一个地方单个Agent很聪明两个Agent互相踢皮球三个以上直接乱成一锅粥。OpenRig就是冲着这个痛点来的——它是一套多智能体编排实践目标是把那些彼此独立的、各干各的离散AI Agent通过一个持久化协作层重新编织起来让它们像一支团队一样分工配合而不是临时拉个群一哄而散。名字里的Rig是“装配、作业平台”的意思OpenRig想表达的是给Agent搭一个能长期运转的作业平台。这套实践能解决的问题很具体跨Agent的任务流转怎么做、状态怎么保存、进程挂了怎么恢复、并发上来之后怎么不崩。适合正在做AI Agent项目、尤其是已经发现单Agent撑不住复杂业务的开发者参考。文章里我会把架构思路、核心设计取舍、落地细节和一些踩坑记录都摊开讲尽量让有需要的朋友能直接照着思路复现。1. 多智能体系统到底在解决什么问题1.1 单Agent的天花板串行、无状态、各自为战很多人刚开始接触AI Agent时都习惯用一个“全能Agent”包打天下——给它一堆工具让它在一次长对话里自己完成所有事。这种方式在小需求上确实爽一个问题丢进去Agent自己规划、自己调工具、自己输出答案看起来非常智能。但一旦任务复杂度上来问题就一个接一个地暴露。先说串行问题。单Agent本质上是“一个大脑加两只手”它一次只能处理一条逻辑链。假设一个从选题到发布的内容生产流程Agent需要先调研、再写作、再审核、再配图每一步都依赖上一步的结果整个过程就是一条长长的串行链路。任何一个环节回复慢一点整个流程都得等着任何一次模型调用超时前面全部白干。这个串行模型在真实业务里是非常脆弱的。再说无状态问题。单Agent的状态通常都藏在对话上下文里一旦进程重启、容器重建、或者上下文超过模型窗口被截断这个Agent对之前发生的事就完全失忆了。我见过不止一个项目Agent跑了一个多小时的任务因为一个网络抖动导致服务重启所有中间结果全部丢失只能从头再来。这种情况在Demo环境里还能忍在真实业务里是不能接受的。还有一个容易被忽略的问题职责混杂。你把太多的工具权限塞给一个Agent就会导致它的指令系统变得非常混乱。Agent一边要写代码一边要操作数据库一边还要对外发消息结果就是每件事都干得不够好甚至出现工具调错、权限误用的情况。相比之下多智能体的思路本质上是把“一个大而全的Agent”拆成“多个小而专的Agent”每个Agent只管自己最擅长的切片由编排层负责把它们拼成完整业务。1.2 三种常用协作拓扑接力、黑板与总线既然决定从单Agent走向多Agent下一个问题就是这些Agent之间到底怎么配合我梳理下来业界常用的协作方式基本可以归为三类每一类都有自己的适用场景。接力模式Pipeline最简单Agent A处理完把结果交给Agent BAgent B再交给Agent C一条链路走到底。优点是逻辑直观、好理解、好调试适合流程非常固定的场景比如数据清洗后做格式转换再入库。缺点是链路中任何一个环节失败整条流程都断掉而且一旦需求变化比如中间要插入一个新环节代码修改成本很高。黑板模式Blackboard是让多个Agent共享一块“黑板”谁有结果就往黑板上写由控制器或者全局信息决定下一步谁该上场。这种模式适合更开放的问题比如多方案分析、创意生成多个Agent可以并行往同一个问题上发力。但它的缺点也很明显黑板上的读写冲突很难管理控制器该听谁的、怎么裁决都需要非常精细的设计。总线模式Message Bus是目前大规模多Agent系统里用得最多的方案。每个Agent通过消息总线异步收发消息发布订阅互不直接依赖。这样Agent之间的耦合度最低新增一个Agent几乎不影响已有链路扩展性最好。但代价是消息顺序和状态一致性需要额外机制来保证。OpenRig最终的架构其实就是以总线模式为骨架局部流程用接力方式做固化两头兼顾。下面这张表可以帮大家快速对比协作拓扑结构特点主要优势主要劣势适合场景接力模式串行链路A完成后交给B简单直观、容易调试单点故障风险高、扩展不灵活固定流程、流水线作业黑板模式共享存储多个Agent并行读写灵活、支持并行探索读写冲突、裁决逻辑复杂分析类、创意类开放任务总线模式异步消息发布订阅解耦彻底、扩展性强消息顺序和一致性难保障长链路业务、跨系统协作1.3 OpenRig的定位不做Agent只做编排层聊清楚协作模式之后OpenRig的定位就很明确了它不重复造Agent框架不去封装模型调用更不想跟LangChain、Spring AI这类生态抢饭碗。OpenRig要解决的是Agent之上那一层的问题——路由、状态、恢复、并发、可观测。这些恰恰是单Agent框架通常不管或者管得很弱的部分。如果把整个多智能体系统比作一家公司Agent是各个部门的员工LangChain这类框架是员工手里的专业工具那OpenRig就是公司的组织架构和业务流程——什么时候让哪个部门介入、任务卡住了怎么上报、员工临时离职了工作怎么交接。没有这层编排每个员工都很能干但公司整体是乱的。也正因为定位在编排层OpenRig对底层技术栈保持中立。你可以用基于Rust语言的高性能Actor来实现Agent也可以用Python生态里的FastAPI加LangGraph甚至Java团队用Spring AI的方案来搭Agent最后接进OpenRig的编排体系里的方式是一致的。这套实践的主线是把“离散Agent”变成“系统的一部分”。2. OpenRig架构设计与持久化协作模型2.1 四层架构调度、通信、持久化、执行OpenRig的整体架构我习惯把它拆成四层来看调度层、通信层、持久化层、执行层。每一层职责单一替换成本低。调度层Dispatcher是整个系统的大脑。它负责任务路由——拿到一个任务之后判断接下来应该交给哪个Agent负责超时和重试——Agent没在预期时间内回复就重新发起调度还负责并发控制——避免下游Agent被突发流量打爆。调度层的设计原则是尽量保持无状态所有决策数据和任务状态都外置到持久化层这样调度器自己无论怎么扩容缩容都不影响系统正确性。通信层Message Bus是Agent之间互相传递消息的管道。OpenRig里我推荐用成熟的消息中间件来实现比如Redis Streams、RabbitMQ或者Kafka。选型高低取决于业务规模几十个Agent的小系统Redis Streams足够如果消息量很大、需要多消费者组Kafka更合适。通信层存在的意义是把Agent之间的“函数调用”变成“消息投递”让它们不再需要一个共同的进程才能协作。持久化层State Store是持久化协作系统的基石也是OpenRig和很多临时多Agent方案最核心的区别。它保存了三类数据任务状态机、Agent上下文快照、全量事件流。后面我会单独展开讲。执行层Workers就是Agent实际运行的容器。执行层的设计目标是无状态化——Agent自己不应该在内存里保存任何重要的业务状态所有状态都从持久化层读取。这样做的好处是任何一个Worker挂掉只要任务状态还在新的Worker可以立刻接管重新加载上下文继续跑。四层各司其职之后整个系统就具备了水平扩展的能力。缺哪一层都不行没有调度层任务就没人发号施令没有通信层Agent之间就是一堆只能背靠背的孤儿没有持久化层系统重启就是集体失忆没有执行层前面三层等于白搭。2.2 事件溯源加检查点让协作系统拥有记忆持久化层里最关键的机制我用两个词概括事件溯源加检查点。这两个概念不是OpenRig发明的但在多智能体协作场景里把它们组合起来用效果非常好。事件溯源的意思很直白系统里每一次状态变更都追加为一条事件不修改历史只新增。比如“策划Agent提交了选题方案”这是一条事件“写作Agent完成了初稿”这又是一条事件谁在什么时间做了什么决定全部记录在案。事件源头的价值在于它既是审计日志又是状态恢复的依据——任何时刻只要把事件从第一条重放到某一条就能精确还原那个时刻系统的全部状态。光有事件溯源还不够。如果任务跑了很久积累了几百上千条事件每次恢复都从头重放效率太低了。这时候就需要检查点在系统运行的某些安全节点把当前完整状态做一次快照。举个例子可以设定“每个Agent完成任务后”打一个检查点保存这个Agent的最终输出、所有相关上下文和当前任务状态。恢复的时候只需要加载最近一次检查点再重放之后新增的少量事件就能回到最新状态。这个机制放在多智能体系统里相当于给整个协作过程装了“自动存档”。拿打游戏类比事件溯源是全程录像检查点是存档点。录像可以复盘、可以追溯存档可以快速回到某个位置继续打。OpenRig之所以能被称为“持久化协作系统”核心就是这一套组合机制。有一点需要在系统设计之初就定清楚检查点什么该存、什么不该存。举例来说Agent的Chat History可以存但临时变量、内存里的数据对象不应该存任务输出的大文件不应该塞进检查点而是保存文件路径通过对象存储单独管理。2.3 三件套协议任务描述、调用声明与补偿动作多Agent系统一旦复杂起来最大的隐患就是Agent之间互相“自由对话”说着说着就跑偏了。OpenRig在设计上用一个三件套协议来给Agent之间的交互套上缰绳分别是任务描述、调用声明和补偿动作。任务描述解决的是“这个任务要做什么”的问题。它定义任务类型、输入输出的格式约定、质量验收标准。这个描述不是一段简单的文字提醒而是结构化的元数据甚至可以是JSON Schema。这样编排层就可以准确判断这个任务的输入是否符合格式要求输出是否达到了可以流转给下一个Agent的门槛。质量门槛很重要否则写作Agent写出一坨不知所云的初稿审核Agent又睁一只眼闭一只眼整个协作链路就形同虚设。调用声明解决的是“这个Agent和那个Agent怎么发生关系”的问题。它包括谁发起调用、谁接收调用、同步还是异步、超时多久、重试几次、需不需要人工审批。说白了这就是Agent之间的契约合同。有了这份合同索引到某个Agent不回复时是立刻重试还是转入人工处理系统都能按照既定规则执行而不是靠运气。补偿动作解决的是“Agent失败之后怎么办”的问题。在很多业务里一套流程走到一半发现某个Agent不能完成任务是需要回滚或者走备用路径的。比如内容生产流程里如果写作Agent连续三次生成质量都不达标补偿动作就是通知人工介入而不是无限重试烧token。在代码层面每个Agent的契约里都应该声明自己的补偿策略编排器统一执行。这三件套本质上把Agent之间的交互从“自由对话”变成了“合同制协作”。多Agent系统的崩溃和混乱绝大多数都源于合同不清。这里把协议定义清楚后面能省掉大量排查问题的时间。3. 核心难点并发、状态持久化与恢复3.1 AI Agent怎么扛并发模型IO密集型与异步化“AI Agent怎么扛并发”是我被问得最多的问题之一也是很多Agent项目从Demo走向生产时最难过的一道坎。要回答这个问题得先从Agent的负载类型说起。Agent在执行任务时大部分时间都在干什么不是在算CPU而是在等模型API返回。一次LLM调用短则几百毫秒长则十几秒甚至更久。这个期间进程既不消耗CPU也不消耗内存单纯就是在等待网络响应。所以AI Agent是典型的IO密集型负载对并发的痛点和传统Web后端高度相似——关键不在于用多少线程去硬扛而在于别让线程阻塞在那干等。理解了这一点选并发模型就顺理成章了。Python生态里asyncio配合FastAPI这种异步框架就可以用很轻量的协程来管理大量并发请求Rust生态里Tokio加Actor模型能提供更高的吞吐和更强的隔离性适合对性能和稳定性要求极高的场景Java团队则可以用Spring AI配合虚拟线程在已有的后端体系里平滑接入。所以“ai agent怎么扛并发”这个问题没有标准答案核心思路是先理解Agent是IO密集型的再用对应的异步方案去优化。还有一个关键参数并发上限。Agent并发不是越大越好。每个Agent都在调用模型API无脑把并发拉到100上游API配额一下就打爆到处都是限流报错。我在OpenRig里用信号量来约束并发全局设置一个同时运行Agent任务的上限比如10或者20具体的值通过压测确定。遇到队列积压先把任务搁在队列里等待调度而不是无限地喷发请求。3.2 状态持久化的正确姿势状态机优先很多多Agent项目翻车都是因为对“状态”的理解太浅。有人把对话历史存个Redis就算持久化了有人只在任务结束时记录一个“成功”或“失败”中间过程全不关心。这样做系统一旦出问题基本无处下手。正确的方式是使用状态机。每个任务从被创建开始就应该有一个明确的状态迁移路径待执行、执行中、等待子任务、成功、失败、补偿中、终态。这个状态机由编排层管理任何一次状态迁移都触发事件写入持久化层。这样我们随时可以回答两个问题这个任务现在在哪一步它是怎么走到这一步的状态存储的选型也需要谨慎。如果对强一致性要求高我建议用PostgreSQL这种关系型数据库来存任务状态事务能力强不容易出现并发下的脏读。Redis快是快但数据规模和处理能力有限更适合存放短期工作上下文比如一个Agent正在处理的任务临时数据。大批量的Agent上下文摘要或子任务的中间产物可以放对象存储把引用路径存进数据库就行。还有序列化的问题。设计持久化结构时我把Agent的上下文分成两部分一部分是完整原始内容比如这次任务相关的所有事件记录另一部分是压缩摘要比如对话历史经过摘要处理后的小文本。一次Agent执行完毕编排层会把摘要写进状态库原始内容可以选择性保留到对象存储。为什么这么做因为模型上下文窗口有限AI Agent token是要花钱的把所有历史都原封不动塞给模型既贵又容易撑爆上下文。把摘要和原文分离是兼顾成本和控制性的好方法。3.3 失败恢复中的幂等、重试与补偿多Agent系统运行得越久失败就越不是“偶发事件”而是“日常事件”。网络抖动、模型超时、Agent进程被调度器杀死、下游服务限流……任何一种都可能让任务中断。失败恢复的设计直接决定系统能不能真正留在生产环境里。第一个必须解决的问题是幂等。一个Agent收到任务后执行到一半网络断了编排器认为它失败了于是重新调度。新Worker接管后如果重新执行一遍就会导致重复操作——比如重复写数据库、重复扣费、重复发消息。解决办法是给每个任务分发一个全局唯一的task_idAgent在执行前先去状态库查一下这个task_id是不是已经成功执行过执行中把进度随时写回执行完再标记完成。这个“查重、执行、提交”三步走是老生常谈的幂等策略但在Agent系统里一样适用。第二个问题是重试策略的区分。不是所有失败都该重试。模型API超时、限流这类瞬时错误重试通常有效但参数格式错误、任务内容本身无法完成这类永久错误重试多少次都没用反而烧token。所以在OpenRig里每个Agent的调用声明里就会写明错误类型和对应的处理策略瞬时错误走指数退避重试重试上限由max_retries控制永久错误直接进入补偿流程。第三个问题是超时。多Agent链路互相等待容易出现“A等B、B等C、C又等D大家谁都不动”的集体死锁。OpenRig用三层超时来解决单步超时指单个Agent执行一次任务的最长耗时链路超时指整个业务流程的最长耗时兜底机制指超时后自动转入人工处理队列。这三层超时全部在编排器里统一配置而不是让每个Agent自己随意设置避免规则冲突。最后一层保护是死信队列。一个任务重试了N次仍然失败就把它丢进一个独立的“待人工处理”队列。这样既不会阻塞后续任务又不会让失败的任务悄无声息地消失还方便事后统一复盘。4. 实操从零搭建一个OpenRig编排系统4.1 技术栈选型与环境准备理论部分讲了不少接下来直接进入实操。我在本地的实践环境里选择了一套比较成熟并且好上手的组合Python 3.11为基础FastAPI做服务入口LangGraph做流程编排和状态机管理Redis做消息缓存和临时存储PostgreSQL做任务状态持久化。这套组合覆盖了“接口、编排、缓存、持久化”四个核心角色。如果你之前没有接触过LangGraph简单理解就是它把业务流程定义成一个图每个节点是一个Agent操作步骤节点之间有明确的连线系统负责按照这个图来调度执行。而且它自带Checkpointer机制可以把图的中间状态持久化到数据库里这跟OpenRig的检查点理念天然吻合。所以用的虽然是LangGraph承载的依然是OpenRig的架构思路。在开始之前先把依赖装好pip install fastapi uvicorn langgraph langchain-openai pydantic sqlalchemy redis psycopg2-binary环境里需要有一个Redis实例和一个PostgreSQL实例。如果本地有Docker可以用docker compose快速拉起来这里我假设两个服务已经就绪分别跑在本地的6379和5432端口。4.2 先定义Agent契约按照前面说的三件套协议第一步不是写Agent逻辑而是定义契约。我用Pydantic模型来表示一个Agent的注册信息from pydantic import BaseModel, Field from enum import Enum class AgentCapability(str, Enum): PLANNING planning WRITING writing REVIEWING reviewing class AgentContract(BaseModel): name: str description: str capabilities: list[AgentCapability] input_schema: dict Field(description任务输入格式约束) output_schema: dict Field(description任务输出格式约束) timeout_seconds: int 60 max_retries: int 3 needs_human_approval: bool False这些字段不是摆设。name是Agent在系统里的唯一标识之后编排路由全凭它找人capabilities声明了Agent擅长干什么调度器可以根据任务类型做匹配timeout_seconds和max_retries写明了这个Agent的超时和重试上限避免每个Agent各自为政。等系统里的Agent数量多了这个契约就是所有协作规则的源头。4.3 实现编排器核心订好契约之后写一个最简单的编排器。这个编排器不需要调用任何具体的Agent它只负责三件事注册Agent、接收任务、写入持久化存储。import uuid, asyncio from typing import Optional class LightOrchestrator: def __init__(self, state_store, bus): self.agents: dict[str, AgentContract] {} self.state_store state_store self.bus bus self.semaphore asyncio.Semaphore(10) def register_agent(self, contract: AgentContract): self.agents[contract.name] contract async def dispatch(self, task_type: str, payload: dict, trigger: Optional[str] None) - str: task_id uuid.uuid4().hex await self.state_store.create_task( task_idtask_id, task_typetask_type, payloadpayload, triggertrigger, statuspending ) await self.bus.publish(tasks, { task_id: task_id, task_type: task_type, payload: payload }) return task_id async def run_with_concurrency_limit(self, agent_name: str, payload: dict): contract self.agents[agent_name] async with self.semaphore: return await execute_agent(contract, payload)注意这段代码里的几个关键设计create_task先把任务状态写到持久化层再往消息总线里投递。这个顺序很重要——先落库后投递即使投递失败任务状态也已经存在可以由恢复机制重新投递不会出现任务凭空消失的情况。信号量则保证了并发上限可控。在这个最小实现里execute_agent函数是你连接真实Agent的接口。你要做的只是在这个函数里加载Agent的提示词、工具列表去调用模型API再把结果按output_schema格式返回。编排器完全不关心Agent内部实现它只要看到符合契约的输入输出就行。4.4 跑通一个三Agent协作流程为了让这套编排思路落地更直观我用一个内容生产场景来做演示策划Agent、写作Agent、审核Agent三个角色协作跑完一个从创意到审核的完整流程。流程很直接策划Agent接收一个选题需求输出选题方向、素材链接和文章大纲写作Agent拿到大纲后生成初稿审核Agent检查初稿如果质量合格就结束流程不合格就退回给写作Agent修改。用LangGraph来表示这个图代码长这样from typing import TypedDict from langgraph.graph import StateGraph, START, END class ContentState(TypedDict): brief: str outline: dict draft: str review: dict attempt: int def route_after_review(state: ContentState): if state[review][passed]: return END return writer graph StateGraph(ContentState) graph.add_node(planner, planner_agent) graph.add_node(writer, writer_agent) graph.add_node(reviewer, reviewer_agent) graph.add_edge(START, planner) graph.add_edge(planner, writer) graph.add_edge(writer, reviewer) graph.add_conditional_edges(reviewer, route_after_review) app graph.compile(checkpointercheckpointer)这个checkpointer是持久化的关键配置。LangGraph会把每次节点运行后的状态快照写入数据库下次重启服务app还能从上次的断点继续执行。这对于多Agent长流程任务可以说是救命功能——省掉了自己实现检查点机制的大量工作。跑完整个流程之后你可以直接查数据库的事件表看到任务从“pending”到“completed”的每一步迁移记录。我自己实际跑下来最大的感受是真正花时间的不是写Agent而是把Agent之间的边界定义清楚。策划Agent输出什么格式、写作Agent读什么字段、审核Agent打回的语义是什么这些契约一旦清晰代码逻辑会非常流畅。5. 常见问题与排查技巧实录5.1 高频问题速查表多Agent系统在运行过程中会遇到很多重复性很高的问题。下面这张表是从我实际调试经验里整理出来的高频问题列出来方便大家直接对号入座现象可能原因排查思路处理建议Agent长期无响应模型API超时、上下文过长、重试策略太激进看任务是否卡在“执行中”、查模型API日志收紧单步超时、加入熔断机制任务被重复执行缺少幂等机制、重试逻辑不当查相同task_id的执行记录引入幂等表执行前查重两个Agent同时改同一份数据共享写权限、状态归属性模糊检查事件流水看写入时间线数据归属单一Agent变更走事件上下文超限报错多个Agent结果累计太多看任务里的token统计引入摘要压缩和外部检索链路互相等待不推进存在循环依赖检查Agent调用关系图编译期检查依赖环超时兜底5.2 定位问题的方法排查多Agent系统问题和排查单体系统有个明显的区别单体系统挂了你往往能直接看到一个异常栈多Agent系统的问题则是分散在一堆事件和消息里的。所以第一步永远是让系统“讲清楚它发生了什么”。日志必须带完整的上下文标识。每个任务从创建到结束我要求所有日志都携带task_id、agent_id、trace_id这三个字段。task_id负责任务维度agent_id负责角色维度trace_id负责跨业务链路维度。有了这三个维度出问题时可以快速过滤出“这个任务经历了什么”。日志格式统一用JSON不要用乱七八糟的自由文本否则后面排查会痛不欲生。第二步是状态可视化。把事件流和历史状态画出来看往往比盯日志更直观。你可以写一个简单的管理页面拉取某个task_id的事件列表按时间线展示状态流转。这个管理页面不需要多好看能清楚地看到“什么时候由谁做了什么决定”就够了。也可以导出事件记录用绘图工具手工复现调用关系虽然原始但很多时候一眼就能看出循环依赖或者多余的来回踢皮球。第三步是重放。事件溯源机制的另一个大价值在于可以重放历史事件。把线上导出的真实事件输入到本地沙盒环境让同一个流程再跑一遍往往能复现线上偶现的问题。重点不是看能不能复现而是观察在重放过程中哪个Agent在哪一步开始出现异常行为。这个调试手段比猜测推断要高效得多。5.3 几条“别踩”的坑除了技术问题我还想分享几条边界之外的经验。第一条是不要一开始就追求“全自动自治”。很多人看到多Agent概念就觉得应该让Agent自己商量着来最后做成一个失控的群体。OpenRig的建议是早期先用确定性的流程DAG把任务流转路径写死跑稳之后再逐步放开自由协作的比例。自治是演化出来的不是一步到位的设计出来的。第二条是不要让Agent直接操作生产环境。Agent本身并不稳定它可能因为工具的随机性、模型的幻觉执行出你想象不到的操作。我见过有项目让Agent直连生产数据库结果一个工具调用写错参数把线上数据改错了。正确做法是给Agent暴露一层受限的工具API所有敏感操作全部走审批或自动化审核。第三条是不要无视token成本。多Agent系统的调用量和单Agent完全不在一个量级。一个任务里多个Agent来回调用token消耗是线性甚至超线性增长的。所以在设计恢复策略时重试次数一定要精确控制能走摘要就不要每次都带全量上下文。这些成本意识越早建立后面越不会被账单吓到。6. 还可以往哪个方向扩展6.1 动态Agent注册与服务发现OpenRig目前的编排器是启动时注册Agent。当系统规模变大Agent增加、下线、升级变成常态时就需要引入动态注册与服务发现机制。最简单的做法是让Agent启动时向注册中心发送自己的契约信息同时定期发送心跳编排器按需拉取注册表对不健康的Agent做下线隔离。动态注册带来的一个直接好处是路由更灵活。比如系统里并存两个写作Agent一个擅长技术写作一个擅长营销文案调度器可以根据任务内容选择更合适的那个Worker。这种“能力路由”在多Agent系统里价值巨大也是后期扩展最重要的方向之一。6.2 精细化可观测性用OpenRig跑了一段时间之后编排器的指标数据本身就是很有价值的内容。Agent成功率、平均执行时延、工具调用次数、token消耗、重试次数、进入死信队列的任务数量这些数据汇总起来可以帮助你判断系统瓶颈到底在哪个环节。比如你发现“审核Agent”的重试次数特别高那就说明上游写作Agent的输出质量和审核标准不匹配要么需要优化写作Agent要么需要调整审核门槛。没有这些数据所有优化都只能靠猜。我在自己的环境里用Prometheus加Grafana采集编排器的指标效果不错。如果不想引入额外的监控体系至少也要把关键指标打到日志里后续要用的时候有据可查。6.3 接入业务系统时的边界意识最后一个扩展点是和业务系统集成。OpenRig更适合作为一个内部编排服务存在暴露两类接口给业务方一类是同步的HTTP接口适合短耗时任务调用方等待结果返回另一类是异步的消息接口业务方往队列里投递任务请求OpenRig处理后通过回调通知业务方结果。这里要特别强调的是边界意识不要把编排器的内部细节暴露给外部业务。业务方不需要知道你的任务是被几个Agent协作完成的它只需要一个稳定的接口契约。编排器内部怎么调整、Agent怎么替换对业务方应该是透明的。边界清晰系统才能持续演进。最后说一句我的切身体会。多智能体编排项目里最难得往往不是模型能力而是协作纪律。我跑过不少项目翻来覆去遇到的无非是状态丢失、重复执行、边界模糊这些老问题。OpenRig这套实践本质上是用工程约束去收敛Agent的自由度。所以别追求让一堆聪明的模型在运行时即兴配合设计和约定做在前面落地时才能稳。这个体会我认为是比任何具体代码都值得先记住的东西。