ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于ALARA原则构建可移植、可组合的多智能体协作框架

基于ALARA原则构建可移植、可组合的多智能体协作框架 1. 项目概述从“牧猫”到构建可移植的智能体团队最近在折腾一个挺有意思的项目名字听起来有点玄乎叫“Herding CATs”。这可不是真的去牧场赶猫而是我们团队内部的一个黑话全称是“Context-Agent-Tool”的缩写。说白了这就是一个关于如何高效、安全地“驾驭”和“编排”多个AI智能体Agent让它们像一支训练有素的队伍一样协同工作的工程实践。项目的核心目标是打造一个可移植、可组合的多智能体团队框架并且在整个工程实践中我们严格遵循一个叫做ALARA的原则。ALARA你可能听着耳熟它原本是辐射防护领域的一个黄金法则意思是“在合理可行的前提下尽可能降低”。我们把它引入到智能体工程里指的是在构建和运行多智能体系统时在保证功能实现的前提下尽可能降低系统的复杂性、延迟、风险和资源消耗。这听起来像是每个工程师的梦想但在多智能体这个新兴且复杂的领域真正做到这一点挑战巨大。为什么需要“牧猫”想象一下你手头有几个各有所长的AI智能体一个擅长数据分析Data Analyst Agent一个精通代码生成Coder Agent还有一个是沟通专家Coordinator Agent。你想让它们合作完成一个从数据清洗到生成报告再到自动部署的完整流程。如果让它们“放养”各自为政那场面绝对比赶一群不听话的猫还混乱——通信错乱、任务重复、资源争抢、安全漏洞百出。Agent Harness智能体驾驭/缰绳工程就是为解决这个问题而生的。它是一套方法论和工具集目的是为这些智能体套上“缰绳”定义清晰的交互协议、任务分工、状态管理和安全边界让它们能够有序、高效、可控地协作。而这个项目的特别之处在于“Portable Composable”可移植可组合。我们不希望这个“缰绳”系统是绑死在某一个云平台、某一种模型或者某一种任务上的。它应该像乐高积木一样核心的协作逻辑、通信总线、安全机制是通用的、可移植的而具体的智能体积木块则可以按需组合、替换快速适配不同的业务场景。无论是云端推理、边缘设备还是混合部署这套“驾驭”体系都能运转良好。这就是我们正在啃的硬骨头也是我认为未来多智能体能否大规模落地的关键。2. 核心设计思路ALARA原则如何贯穿智能体工程把ALARA原则从理论落到智能体系统的钢筋水泥里需要我们在架构设计的每一个环节都反复拷问自己这是最简单的方案吗这里的延迟可以优化吗这个组件的耦合度是否过高风险是否可控2.1 以“尽可能低”的复杂度定义智能体交互协议多智能体系统的第一个混乱之源就是通信。如果每个智能体都用自己的“方言”说话或者通信路径像蜘蛛网一样交织系统很快就会变得无法理解和维护。我们的设计起点是定义一个极度精简、语义明确的通用交互协议。我们放弃了设计一个无所不包的、重型的中控调度器Orchestrator的想法。那种中心化的调度器虽然控制力强但极易成为性能瓶颈和单点故障源并且会随着智能体种类和任务复杂度的增加而变得无比臃肿违背了ALARA的“A”As Low As Reasonably Achievable。取而代之的我们采用了基于消息总线的发布-订阅Pub-Sub模式结合轻量级工作流引擎。消息总线作为信息高速公路所有智能体都连接到同一个消息总线比如用RabbitMQ、Redis Pub/Sub或更轻量的ZeroMQ实现。它们不直接彼此呼叫而是向特定的“主题”Topic发布消息或订阅感兴趣的主题。例如Data Analyst Agent完成任务后会向topic://task/data_processed发布一条消息里面包含处理后的数据ID和元数据。工作流引擎定义任务剧本一个轻量级的工作流引擎我们选用并简化了Camunda也可以是用Python写的简单状态机负责定义任务的宏观剧本。它不负责具体执行只负责在关键时刻“点火”。比如当它监听到topic://task/data_processed有消息并且消息的project_id匹配当前流程实例时它就触发下一个节点向topic://command/code_generate发布一条命令消息。Coder Agent订阅了这个主题收到命令后开始工作。协议本身极其简单每条消息都是一个JSON对象强制包含几个核心字段msg_id唯一ID、sender发送者、timestamp、intent意图如notify_completion,request_action、payload负载数据和context会话上下文ID。智能体只需要理解这几个字段和有限的几种intent就能参与到协作中。注意这里的关键是“协议”而非“中心控制器”。智能体之间是松耦合的它们通过协议“听懂”彼此而不是被一个强大的中心大脑所指挥。这大大降低了系统的整体复杂度和智能体个体的认知负担。2.2 构建可组合的智能体单元从“全能战士”到“专业模块”遵循ALARA我们坚决反对把智能体设计成“全能战士”。一个既要做自然语言理解又要做数据库查询还要调用外部API的巨型智能体其内部状态复杂、调试困难、性能不可预测且难以复用。我们的策略是功能单一化与接口标准化。每个智能体只做一件核心事情并且把它做到极致。同时每个智能体都暴露出一个统一的、标准化的“服务接口”。这个接口在代码层面可能就是一个继承了基类的execute方法在部署层面就是一个统一的HTTP/gRPC端点或消息处理回调函数。标准化接口每个智能体都必须实现BaseAgent接口核心方法就是async def execute(task_context: TaskContext) - ActionResult:。TaskContext包含了当前任务的所有输入、历史、环境变量和工具访问权限。ActionResult是一个标准结构包含成功/失败状态、输出数据、消耗的Token数、执行时间等可观测性指标。动态注册与发现我们有一个轻量的Agent Registry智能体注册中心。每个智能体启动时向注册中心注册自己的元信息名称、能力描述、输入输出Schema、健康检查端点。工作流引擎或其它智能体需要协作时通过查询注册中心来找到合适的智能体而不是硬编码依赖。这使得智能体可以像插件一样被热插拔。工具Tool作为能力的延伸智能体本身不直接处理复杂操作如写文件、查数据库、调用第三方API而是通过调用“工具”来完成。工具也是一个标准化接口。例如Coder Agent在生成代码后会调用CodeExecutorTool来在沙箱中运行代码Data Analyst Agent会调用QueryDatabaseTool来获取数据。工具的管理也是统一和安全的有严格的权限和审计日志。这种设计使得组合Composition变得非常自然。要构建一个新的业务流程你不需要重写智能体只需要用工作流引擎画一个新的流程图将已有的标准化智能体节点像搭积木一样连接起来。要替换某个环节比如把OpenAI的智能体换成Claude的你只需要在注册中心替换一个实现相同接口的新智能体业务流程无需改动。这就是“可组合”的魅力也是降低长期维护复杂性的关键。2.3 实现可移植性的核心环境抽象与配置驱动“可移植”意味着这套系统能相对轻松地从我的笔记本开发环境部署到公司的K8s集群甚至到客户的私有化服务器上。这里最大的挑战是环境差异性模型API的地址不同、数据库连接串不同、文件存储路径不同、网络策略不同。我们的解决方案是彻底的环境抽象和配置驱动。配置中心化所有环境相关的变量模型端点、API密钥、数据库URL、服务端口绝对不硬编码在智能体代码中。它们统一存放在一个配置中心如Consul、etcd或者简单的环境变量配置文件。每个智能体启动时从配置中心拉取自己所需的配置。依赖注入容器我们引入了一个轻量级的依赖注入DI容器。智能体所依赖的工具、客户端如OpenAI客户端、数据库连接池都由容器在初始化时注入。当部署环境改变时我们只需要在容器配置中绑定不同的实现例如开发环境绑定一个Mock的数据库客户端生产环境绑定真实的MySQL客户端智能体本身的代码一行都不用改。基础设施即代码IaC整个系统的部署——包括消息队列、注册中心、工作流引擎、各个智能体容器——都用Docker Compose或Kubernetes Helm Chart定义。移植到新环境基本上就是修改一下Chart里的values.yaml配置文件里面指向新的配置中心地址、镜像仓库等然后一条部署命令。这确保了环境的一致性也使得CI/CD流水线可以无缝集成。实操心得在早期我们图省事把API密钥直接写在了智能体的Python文件里。结果在需要交付给客户做私有化部署时差点酿成安全事故。后来强制推行“配置中心密钥管理服务”后不仅安全了部署效率也提升了数倍。ALARA中的“风险尽可能低”在这里得到了充分体现。3. Agent Harness工程化的核心组件拆解“驾驭”一群智能体光有思路不够需要实实在在的工程组件。下面我拆解几个我们框架里的核心模块看看它们是如何具体工作的。3.1 消息总线与通信层系统的中枢神经消息总线是整个多智能体系统的血液循环系统。它的选型和设计直接影响到系统的性能延迟、可靠性和可扩展性。我们对比了几种方案Redis Pub/Sub轻量、简单、性能极高对于中小规模、消息无需持久化的场景是绝佳选择。但它的问题是如果订阅者离线消息就丢了属于“fire-and-forget”。RabbitMQ功能强大支持多种消息模式、持久化、确认机制可靠性高。但相对重一些管理和运维成本稍高。Apache Kafka吞吐量巨大持久化能力强适合海量数据流。但对于我们这种RPC风格的任务调度通信显得有些杀鸡用牛刀且延迟相对较高。基于ALARA尽可能降低复杂度和延迟我们最终选择了一个混合方案核心的任务指令和状态同步使用RabbitMQ因为它需要确保关键指令不丢失持久化队列且能被确认ACK机制。而对于一些非关键的、高频的日志流、性能指标流我们使用Redis Pub/Sub以获得极致的速度。在通信层之上我们封装了一个统一的MessagingClient。这个客户端对智能体开发者隐藏了底层是RabbitMQ还是Redis的细节。开发者只需要调用client.publish(topic, message)或client.subscribe(topic, callback)。这个客户端还内置了重试、序列化/反序列化JSON/MessagePack、和简单的消息去重功能。# 示例一个智能体订阅任务并处理的简化代码 class MyAgent(BaseAgent): async def initialize(self): # 初始化时订阅自己关心的主题 await self.messaging_client.subscribe(topic://task/my_specialty, self._handle_task) async def _handle_task(self, message): # 解析消息 task_ctx TaskContext.from_message(message) # 执行核心逻辑 result await self._do_my_job(task_ctx) # 发布完成通知 await self.messaging_client.publish(topic://notification/complete, result.to_message()) async def execute(self, task_context): # 这是对外暴露的标准接口也可能被直接调用 return await self._do_my_job(task_context)3.2 上下文Context管理智能体的短期记忆与会话灵魂在多轮、多智能体协作中“上下文”就是团队的短期记忆和共享工作区。如果上下文管理不好智能体就会失忆对话就会错乱。我们的Context管理设计遵循两个原则隔离性和可追溯性。会话隔离每个独立的用户请求或业务流程实例都有一个唯一的session_id。所有围绕这个会话产生的消息、任务、中间结果都通过这个session_id进行关联。这样不同用户的任务绝不会相互干扰。链式上下文我们引入了context_id和parent_context_id的概念。当一个智能体产生一个新任务比如Coder Agent需要Tester Agent帮忙检查代码它会基于当前上下文创建一个新的子上下文。这形成了一棵树使得整个协作链条清晰可追溯。上下文存储上下文本身是一个键值存储可以存放任何JSON可序列化的数据。我们使用Redis作为上下文存储后端因为它速度快并且支持TTL生存时间可以自动清理过期会话。上下文对象不仅包含数据还包含元数据如创建者、创建时间、最后更新时间、访问权限标签等。智能体视角每个智能体在执行时传入的TaskContext对象其实是全局上下文的一个“视图”。这个视图可能只包含了该智能体被授权访问和需要知道的那部分数据。这既保证了信息共享又实现了数据最小权限原则符合安全要求。3.3 工具Tool框架安全、可控的能力边界工具是智能体与真实世界交互的桥梁也是最容易出安全问题的地方。一个不受控的工具调用可能导致数据泄露、系统破坏或产生高额费用。我们的工具框架设计核心是沙箱化和声明式权限。工具注册与描述每个工具都需要在一个中心目录注册并提供详细的描述包括工具名称、功能说明、输入参数JSON Schema、输出JSON Schema、以及权限标签如read_db:customer_data,write_file:/tmp/,call_api:payment。动态权限绑定在工作流定义或智能体注册时我们会声明该智能体可以访问哪些权限标签的工具。例如Report Agent可能被授予read_db:*和write_file:/reports/的权限。系统在运行时会根据这些声明动态地为智能体装配可用的工具集。沙箱执行对于执行不确定代码如Python代码执行、访问敏感系统或进行高风险操作的工具我们强制要求它们在沙箱环境中运行。我们使用Docker容器作为沙箱每个工具调用都启动一个干净的、资源受限的临时容器执行完毕即销毁。这确保了即使工具被恶意利用其破坏范围也被严格限制在沙箱内。审计与配额所有工具调用都被详细记录谁调的、什么时间、输入输出是什么、消耗了多少资源CPU/内存/时间。同时可以为每个智能体或会话设置工具调用配额防止滥用或无限循环。# 工具定义的YAML示例 tools: - name: query_customer_db description: 查询客户数据库 module: tools.database class_name: QueryTool input_schema: type: object properties: sql: type: string required: [sql] permission_tags: [read_db:customer] timeout: 30 # 超时时间 sandbox: false # 此工具不需要沙箱因为是纯查询4. 性能与延迟优化实战让多智能体协作“快”起来多智能体系统最被人诟病的就是延迟高。串行调用多个智能体每个都去请求一次大语言模型LLM总延迟是指数级增长的。在“Herding CATs”项目中我们把性能优化提到了和功能同等重要的位置。4.1 并行化与异步流水线最直接的优化就是把能并行的任务并行化。我们的工作流引擎支持定义并行网关Parallel Gateway。例如在生成一份市场分析报告时DataFetcher Agent获取数据后可以同时触发TrendAnalyst Agent分析趋势和ChartGenerator Agent生成图表两者并行执行最后再由ReportComposer Agent汇总。但这不仅仅是画个并行框那么简单。关键在于异步非阻塞的编程模型。我们整个框架基于asyncioPython构建。每个智能体的execute方法都是异步的。消息总线的客户端也是异步的。这意味着当一个智能体在等待LLM返回结果这是一个I/O密集型操作时它不会阻塞事件循环CPU可以去处理其他智能体的消息或任务。这极大地提高了单机上的资源利用率和吞吐量。4.2 上下文缓存与智能预加载LLM调用是延迟的主要贡献者。我们发现很多智能体在协作中会反复向LLM提交相似或包含大量重复上下文的提示词Prompt。例如Coder Agent和CodeReviewer Agent可能都需要知道项目的技术栈和需求文档。为此我们引入了多级提示词缓存。一级缓存内存缓存对于完全相同的提示词直接返回上一次的LLM响应结果。我们使用LRU缓存设置合理的TTL和大小。二级缓存向量语义缓存对于语义相似但不完全相同的提示词我们使用嵌入模型如text-embedding-3-small将提示词转换为向量并存入向量数据库如Chroma。当新的提示词进来时先进行向量相似度搜索。如果找到高度相似余弦相似度0.95的历史提示词及其结果并且该结果在业务逻辑上可复用就直接返回缓存结果。这能大幅减少对LLM的调用尤其适用于那些创造性要求不高、更注重准确性的任务。上下文预加载在工作流启动时系统可以分析流程预加载一些可能被多个智能体共享的静态上下文如项目规范、API文档并注入到共享的上下文存储中。智能体需要时直接从本地缓存读取避免了重复的网络传输和LLM上下文窗口的占用。4.3 模型调用优化与降级策略不是所有任务都需要调用最强大、最昂贵的模型如GPT-4。ALARA原则要求我们“合理可行”地降低消耗。智能路由我们实现了一个Model Router。它根据任务的属性复杂度、创造性要求、对准确性的容忍度以及当前系统的负载和预算动态决定将请求路由到哪个模型。例如简单的文本格式化或分类任务可能路由到便宜的gpt-3.5-turbo甚至更小的开源模型而需要复杂推理的代码生成任务则路由到GPT-4或Claude-3 Opus。流式响应与渐进式处理对于生成内容较长的任务如写文章、生成长代码我们支持LLM的流式响应。Coder Agent可以一边接收生成的代码一边就将其片段发送给CodeReviewer Agent进行实时检查而不是等全部生成完再审查。这形成了流水线减少了端到端的感知延迟。降级与熔断当某个模型API出现高延迟或故障时Model Router会自动降级到备用模型。如果所有外部模型服务都不可用框架可以降级到使用本地部署的轻量级模型如Phi-3、Qwen2.5-Coder来提供基本服务保证系统的韧性。5. 安全、监控与运维让系统稳定可靠驾驭多智能体安全性和可观测性不是可选项而是生命线。一个失控或不可观测的智能体系统是灾难性的。5.1 多层次的安全防线输入输出净化与验证所有来自用户或外部系统的输入在进入智能体处理前都必须经过严格的验证和净化Sanitization防止提示词注入Prompt Injection攻击。同样智能体的输出在返回给用户或传递给下一个系统前也要进行内容安全过滤如过滤敏感信息、检查恶意代码。工具调用的白名单与沙箱如前所述工具调用是最大的风险点。我们采用白名单机制智能体只能调用预先声明并授权了的工具。高风险工具必须在沙箱中运行。基于角色的访问控制RBAC整个平台有完整的RBAC。不同的用户或API密钥有权启动的工作流类型、能访问的数据上下文、能调用的智能体集合都是不同的。审计日志会记录下“谁在什么时候通过哪个智能体做了什么”。会话隔离与资源限额每个用户会话在资源层面CPU、内存、LLM Token消耗、工具调用次数都被严格限制防止恶意用户发起拒绝服务攻击或造成意外的高额费用。5.2 全面的可观测性体系我们为系统接入了完整的可观测性三件套日志Logging、指标Metrics、追踪Tracing。结构化日志每个智能体的每次执行、每条消息的流转、每次工具调用都产生结构化的JSON日志统一收集到ELK或Loki中。便于搜索和关联分析。关键指标监控我们暴露了丰富的Prometheus指标包括各智能体的请求量、成功率、平均延迟、Token消耗分布消息队列的堆积情况工作流各节点的执行时间和状态分布。基于这些指标我们设置了告警规则例如“Coder Agent的95分位延迟超过10秒”或“Data Analyst Agent失败率突然升高”。分布式链路追踪我们集成了OpenTelemetry。从一个用户请求进入系统开始到触发工作流再到流经各个智能体、工具调用、LLM请求整个过程形成一个完整的分布式追踪链路。在Jaeger或Tempo的UI上我们可以清晰地看到一个请求的生命周期快速定位延迟瓶颈或故障点。这对于调试复杂的多智能体交互场景至关重要。5.3 部署与运维实践基于容器化和Kubernetes我们的运维变得相对标准。健康检查与就绪探针每个智能体服务都提供/health和/ready端点。K8s通过探针自动管理容器的生命周期确保不健康的实例被替换。水平自动伸缩HPA我们根据智能体的CPU使用率或消息队列的待处理消息数为每个智能体部署配置了Horizontal Pod Autoscaler。当负载增加时自动扩容实例负载下降时自动缩容以节省资源。配置与密钥管理使用K8s的ConfigMap和Secret来管理配置和环境变量。对于敏感信息如API密钥我们集成外部的密钥管理服务如HashiCorp Vault。蓝绿部署/金丝雀发布对于智能体本身的更新我们采用蓝绿部署策略。先将新版本的智能体部署到一组新的Pod并通过注册中心将其流量权重慢慢从0调至100%。同时密切观察新版本的错误率和性能指标。如果出现问题可以瞬间将流量切回旧版本实现无损回滚。6. 常见问题与实战排坑记录在开发和运维这套系统的过程中我们踩了无数的坑。这里分享几个最典型的问题和我们的解决方案。6.1 智能体间的“死锁”与循环依赖问题描述在早期我们设计了一个工作流Agent A需要Agent B的结果才能开始而Agent B又需要Agent A的某个输出作为输入。这就导致了经典的死锁。另一种情况是由于消息路由配置错误两个智能体互相发送消息形成无限循环快速耗尽系统资源。解决方案工作流静态分析在工作流部署前增加一个静态分析阶段检查图中是否存在循环依赖。这是一个经典的图论问题可以用拓扑排序算法检测。消息TTL与跳数限制为每条消息设置一个生存时间TTL和一个“跳数”计数器。每经过一次转发跳数加1。当TTL超时或跳数超过阈值比如10跳时消息被自动丢弃并记录告警。这防止了消息因路由错误而永无止境地循环。超时与熔断机制为每个智能体的执行设置超时。如果一个智能体长时间未返回工作流引擎会将其标记为超时并可以根据预定义策略执行替代路径如调用备用智能体或直接失败避免整个流程卡死。6.2 上下文膨胀与LLM Token超限问题描述在多轮复杂协作中上下文会不断累积聊天历史、中间结果、工具输出。当这个庞大的上下文被塞进LLM的提示词时很容易触发Token长度限制导致调用失败或丢失重要信息。同时过长的上下文也会增加成本和延迟。解决方案上下文摘要与压缩我们开发了一个ContextSummarizer Agent。它的职责就是定期或在关键时刻对当前的会话上下文进行智能摘要。它使用LLM提取关键决策点、核心事实和当前状态生成一个简短的摘要并用这个摘要替换掉冗长的原始历史。后续的智能体主要基于摘要工作必要时可以按需查询详细上下文。分层上下文管理我们将上下文分为“会话记忆”高密度摘要、“工作区”当前任务相关的中等粒度数据和“档案库”完整的原始数据存储在外部数据库。智能体默认访问“会话记忆”和“工作区”只有明确需要时才去“档案库”按ID提取特定数据块。选择性上下文注入在构造LLM提示词时不是把整个上下文都扔进去。我们根据当前智能体的任务从上下文中选择性地提取最相关的片段进行注入。这需要定义一套元数据标签系统给上下文中的每段数据打上标签如涉及模块:用户认证,数据类型:错误日志方便检索。6.3 工具调用中的“幻觉”与安全问题问题描述LLM智能体在决定调用工具时可能会“幻觉”出一些不存在的工具参数或者生成有安全风险的参数如SQL注入、路径遍历。例如智能体可能生成一个包含DROP TABLE的SQL语句。解决方案严格的Schema验证在工具被调用前框架会使用工具注册时定义的JSON Schema对智能体生成的调用参数进行严格的验证。类型不匹配、缺少必填字段、存在未定义字段等情况都会在调用实际工具代码前被拦截并返回错误。参数化与模板化对于高风险工具如数据库查询、shell命令我们强制使用参数化调用。智能体不直接生成完整的SQL或命令字符串而是生成一个参数对象。工具内部使用安全的预编译语句或参数化查询来执行。例如# 智能体输出 tool_call { name: query_db, args: { query_template: SELECT * FROM users WHERE age ? AND status ?, params: [18, active] # 参数化值 } } # 工具内部安全执行 cursor.execute(tool_call[args][query_template], tool_call[args][params])运行时沙箱与资源限制再次强调对于执行动态代码的工具沙箱是必须的。在Docker沙箱中我们严格限制网络访问只允许访问必要的服务、文件系统挂载只读或临时目录、CPU和内存使用量。即使智能体被诱导执行了rm -rf /破坏范围也仅限于那个即将被销毁的临时容器。6.4 分布式系统中的一致性与状态管理问题描述当智能体团队规模扩大部署到多个节点上时状态管理变得复杂。比如工作流引擎实例A在节点1上它派发了一个任务给在节点2上的Agent X。如果节点2宕机了如何保证任务不丢失如果多个工作流引擎实例同时运行如何避免同一个任务被重复执行解决方案消息队列的持久化与确认机制我们使用RabbitMQ的持久化队列和消息确认ACK机制。任务消息被标记为持久化写入磁盘。Agent X只有在成功处理完任务并手动发送ACK后消息才会从队列中删除。如果Agent X在处理中崩溃连接断开RabbitMQ会将未ACK的消息重新投递给其他可用的消费者实例。分布式锁与乐观并发控制对于需要全局唯一性的操作如“标记某个任务为进行中”我们使用Redis分布式锁。工作流引擎在派发任务前先尝试获取该任务ID对应的锁获取成功后才派发。对于上下文更新我们采用乐观锁机制在更新时检查版本号防止并发写入冲突。工作流引擎的高可用部署我们使用Camunda的分布式部署模式多个引擎实例共享同一个数据库。引擎通过数据库的事务锁来协调流程实例的执行天然避免了重复执行。数据库本身则通过主从复制或集群来保证高可用。构建“Herding CATs”这样的系统是一个在强大能力与可控复杂性之间不断寻找平衡的艺术。ALARA原则是我们的罗盘时刻提醒我们不要被技术的可能性冲昏头脑而是始终以务实、优雅、可持续的方式去设计和实现。这套框架目前已经在内部几个数据分析、自动化运维和客户服务场景中稳定运行效果远超最初的预期。最大的体会是当把每个智能体都约束在明确的职责、清晰的接口和安全的边界内时它们所涌现出的协作智能既强大又可靠。
返回列表