智能体协作框架Agent-Reach:构建高效多智能体系统的核心原理与实践
在分布式系统与微服务架构中,消息驱动和异步通信是解耦组件、提升系统可扩展性的关键技术。其核心原理在于通过发布-订阅、消息队列等模式,实现服务间松耦合的通信,从而支持复杂业务流程的灵活编排。这一技术价值在于能够将单体应用拆分为多个独立、可复用的功能单元,并通过标准化协议进行协同,显著提升开发效率和系统可靠性。在人工智能领域,随着大模型智能体应用的普及,如何让多个具备专业能力的智能体高效协作,成为工程
1. 项目概述:一个面向未来的智能体连接与协作框架
最近在探索智能体(Agent)应用落地的过程中,我发现了一个很有意思的现象:很多团队或个人开发者都能做出功能强大的单一智能体,比如一个能精准分析数据的Agent,或者一个擅长撰写文案的Agent。但当你想把这些“单兵作战能力”很强的智能体组合起来,去完成一个更复杂的业务流程时,问题就来了——它们之间怎么“对话”?数据怎么流转?状态怎么同步?一个任务失败了,整个流程是卡住还是能优雅降级?
这正是 Panniantong/Agent-Reach 这个项目试图解决的核心痛点。它不是一个具体的业务Agent,而是一个 智能体连接与协作框架 。你可以把它想象成一个智能体世界的“高速公路网”和“交通指挥中心”。它的目标不是替代某个具体的Agent,而是为这些Agent提供一个标准、可靠、高效的互联互通环境,让它们能够像乐高积木一样,被灵活地组装成各种复杂的应用。
我最初接触这个项目,是因为在尝试构建一个自动化内容生产流水线时遇到了瓶颈。我有负责搜集热点的Agent、有生成初稿的Agent、有进行SEO优化的Agent,还有排版发布的Agent。每个单独运行都没问题,但串联起来就变成了手动“搬砖”:我得把热点Agent的结果复制给写作Agent,再把写作Agent的稿子贴给优化Agent……效率低下且容易出错。Agent-Reach这类框架的出现,正是为了将开发者从这种低效的“胶水代码”工作中解放出来,让我们能更专注于智能体本身的能力建设与业务逻辑设计。
简单来说,如果你正在或计划开发涉及多个智能体协同工作的应用,比如自动化客服系统、智能研发助手、跨平台营销工具等,那么理解并掌握像Agent-Reach这样的框架,将成为你提升开发效率、构建稳健系统的关键一步。它解决的是智能体从“单体智能”迈向“群体智能”过程中,那些必不可少的基础设施问题。
2. 框架核心设计理念与架构拆解
2.1 从“烟囱”到“网格”:智能体协作范式的转变
在传统多智能体系统中,常见的架构是“中心调度式”或“点对点直连式”。前者有一个强大的中心节点负责任务分解、分配和结果汇总,后者则要求每个智能体都明确知道下一个对话者是谁并直接调用。这两种模式在简单场景下尚可应付,但随着智能体数量增多、交互关系复杂化,其弊端会迅速暴露:中心节点容易成为性能和可靠性的瓶颈;点对点连接则会导致系统耦合度极高,任何一个智能体的接口变更都可能引发“牵一发而动全身”的修改。
Agent-Reach的设计理念,在我看来,更接近于构建一个 去中心化的通信网格 。它引入了“通道”、“路由器”、“中间件”等概念,将智能体之间的通信抽象为消息的发布与订阅。每个智能体不再需要关心消息具体发给谁,它只需要将产出(消息)投递到某个通道(Channel),或者声明自己关心某类消息。框架内部的路由机制会负责将消息可靠地送达至一个或多个对此感兴趣的智能体。
这种设计带来了几个显著优势:
- 解耦 :智能体之间不直接依赖,它们只依赖消息的格式和语义。新增或移除一个智能体,对系统其他部分的影响降到最低。
- 灵活性 :工作流可以动态调整。通过改变消息的路由规则,我们可以轻松实现串行、并行、分支、循环等复杂流程,而无需修改智能体本身的代码。
- 可观测性 :所有交互都以消息形式流过框架,这使得对整个系统的监控、调试和日志记录变得异常清晰。你可以清楚地看到一条请求是如何被多个智能体协作处理的。
2.2 核心组件深度解析
为了理解Agent-Reach是如何工作的,我们需要深入其几个核心组件。
Agent(智能体) :这是框架中的基本计算单元。一个Agent通常封装了特定的能力,例如调用大语言模型API、执行代码、查询数据库等。在Agent-Reach的语境下,Agent需要实现标准的消息处理接口,它从输入端口接收消息,处理后将结果从输出端口发出。框架不限制Agent的内部实现,它可以是基于Python函数、独立进程,甚至是远程服务。
Channel(通道) :这是消息传输的管道,是解耦的关键。通道可以有多种类型,例如:
- 内存通道 :基于队列,速度快,适用于单个进程内的Agent通信。
- 消息队列通道 :集成RabbitMQ、Kafka等,提供持久化、高可靠性和跨进程/跨机器的通信能力。
- 发布订阅通道 :实现一对多的广播通信。
通道的选择直接影响系统的性能、可靠性和部署复杂度。对于快速原型或轻量级应用,内存通道足矣;对于生产环境,尤其是需要弹性伸缩和容错的场景,引入专业的消息队列是必然选择。
Router(路由器) :这是框架的“大脑”,负责消息的路由决策。路由器根据预定义的规则(Rules)或动态策略(Policy),决定将来自某个通道的消息,转发到哪一个或哪几个目标通道。规则可以基于消息内容(如 msg.type == “query” )、来源、甚至上下文状态进行匹配。高级的路由器还可能支持负载均衡、故障转移等特性。
Middleware(中间件) :这是实现横切关注点的利器。想象一下,你需要为所有流经系统的消息添加日志、进行权限校验、统一格式化或重试失败的消息。如果把这些逻辑分散到每个Agent里,将是灾难。中间件允许你在消息被Agent处理前后,插入统一的处理逻辑。Agent-Reach框架通常会提供一套常用的中间件,也支持用户自定义。
提示 :在设计你的第一个基于此类框架的应用时,不必追求大而全。从一个内存通道、一个简单路由器、两个Agent开始,亲手搭建一条完整的数据流,感受消息是如何被生产、路由和消费的。这个直观的感受比阅读十篇文档都重要。
3. 从零开始:搭建你的第一个智能体协作流水线
理论讲得再多,不如动手实践。让我们以一个简单的“智能内容助手”场景为例,构建一个由三个Agent组成的流水线: ReaderAgent (阅读并总结网页内容)、 WriterAgent (根据总结扩写文章)、 ReviewerAgent (检查文章语法和风格)。
3.1 环境准备与框架安装
首先,确保你的Python环境(建议3.8以上)已经就绪。Agent-Reach通常可以通过pip安装。由于这是一个示例,我们假设使用一个类似架构的简化实现(实际使用请参考Agent-Reach官方文档)。
# 假设框架包名为 agent_reach
pip install agent_reach
# 安装可能需要的额外依赖,如requests用于网页抓取
pip install requests
接下来,我们规划消息流。我们定义两种类型的消息:
UrlMessage: 包含一个url字段,由外部触发或上游Agent产生,发送给ReaderAgent。ContentMessage: 包含summary(摘要)和article(文章)字段。ReaderAgent产出带summary的消息,WriterAgent消费后产出带article的消息,ReviewerAgent最终消费并审核article。
3.2 定义智能体:实现核心业务能力
每个Agent都是一个独立的类,继承框架的基础Agent类,并实现其核心的 handle_message 方法。
import requests
from bs4 import BeautifulSoup
# 假设从框架中导入必要的基类和消息类
from agent_reach import Agent, TextMessage, register_agent
@register_agent(name="reader")
class ReaderAgent(Agent):
"""负责抓取并总结网页内容的智能体"""
async def handle_message(self, message):
# 假设message是UrlMessage类型,包含url字段
url = message.data['url']
print(f"ReaderAgent: 正在处理URL - {url}")
# 1. 抓取网页内容(简化版,生产环境需考虑异常和反爬)
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
# 简单提取正文文本,实际应用需要更健壮的提取逻辑
main_text = soup.get_text(separator=' ', strip=True)[:5000] # 限制长度
except Exception as e:
error_msg = TextMessage(data={"error": f"网页抓取失败: {e}", "url": url})
# 将错误消息发送到错误处理通道
await self.send(output_port="error", message=error_msg)
return
# 2. 调用LLM进行总结(这里用模拟函数代替实际LLM调用)
summary = self._simulate_summarize(main_text)
# 3. 构造新的ContentMessage,携带摘要
output_msg = TextMessage(data={"summary": summary, "source_url": url})
# 将消息发送到默认输出端口,由路由器决定下一步去向
await self.send(output_port="default", message=output_msg)
def _simulate_summarize(self, text):
# 模拟LLM总结过程
return f"这是对文本的模拟总结,原文长度:{len(text)}字符。"
@register_agent(name="writer")
class WriterAgent(Agent):
"""负责根据摘要扩写文章的智能体"""
async def handle_message(self, message):
summary = message.data.get('summary')
print(f"WriterAgent: 基于摘要进行扩写 - {summary[:100]}...")
# 模拟LLM扩写过程
article = f"# 根据摘要生成的文章\n\n**摘要**:{summary}\n\n这里是生成的详细文章内容。这部分内容由WriterAgent模拟生成,实际应接入如GPT-4、文心一言等大模型API。"
output_msg = TextMessage(data={"article": article, "original_summary": summary})
await self.send(output_port="default", message=output_msg)
@register_agent(name="reviewer")
class ReviewerAgent(Agent):
"""负责审核文章质量的智能体"""
async def handle_message(self, message):
article = message.data.get('article')
print(f"ReviewerAgent: 开始审核文章,长度:{len(article)}字符")
# 模拟审核逻辑,例如检查长度、关键词等
issues = []
if len(article) < 500:
issues.append("文章可能过短。")
if "模拟" in article:
issues.append("文章包含模拟内容,需替换为真实生成。")
audit_result = "通过" if not issues else f"需修改:{'; '.join(issues)}"
print(f"ReviewerAgent: 审核结果 - {audit_result}")
# 审核完成后,可以将最终文章发送到存储或发布通道
if audit_result == "通过":
final_msg = TextMessage(data={"final_article": article, "status": "approved"})
await self.send(output_port="publish", message=final_msg)
else:
reject_msg = TextMessage(data={"article": article, "issues": issues, "status": "rejected"})
await self.send(output_port="revision", message=reject_msg)
3.3 配置路由与组装流水线
智能体定义好了,但它们现在还处于“各自为政”的状态。我们需要通过配置,告诉框架消息应该如何流动。这通常在一個单独的配置文件中完成(如YAML格式)。
# pipeline_config.yaml
version: '1.0'
channels:
url_input:
type: memory
reader_to_writer:
type: memory
writer_to_reviewer:
type: memory
publish_output:
type: memory
error_channel:
type: memory
revision_loop:
type: memory
agents:
reader:
class: "my_agents.ReaderAgent" # 指向我们定义的类
inputs: ["url_input"]
outputs: ["reader_to_writer", "error_channel"]
writer:
class: "my_agents.WriterAgent"
inputs: ["reader_to_writer"]
outputs: ["writer_to_reviewer"]
reviewer:
class: "my_agents.ReviewerAgent"
inputs: ["writer_to_reviewer"]
outputs: ["publish_output", "revision_loop"]
routes:
- from: url_input
to: reader
rule: "always" # 无条件路由
- from: reader.default
to: reader_to_writer
rule: "has_field('summary')" # 仅当消息有summary字段时路由
- from: reader.error
to: error_channel
rule: "always"
- from: reader_to_writer
to: writer
rule: "always"
- from: writer.default
to: writer_to_reviewer
rule: "always"
- from: writer_to_reviewer
to: reviewer
rule: "always"
# 审核不通过的文章,回流到writer进行修改(这里简化了,实际可能需要更复杂的逻辑)
- from: revision_loop
to: writer
rule: "always"
这个配置定义了一个清晰的流水线: url_input -> reader -> reader_to_writer -> writer -> writer_to_reviewer -> reviewer -> publish_output 。同时,错误和需修订的文章也被导向了专门的通道。
3.4 运行与测试
最后,我们编写一个主程序来加载配置、启动框架并触发流程。
import asyncio
from agent_reach import Engine
import yaml
async def main():
# 加载配置
with open('pipeline_config.yaml', 'r') as f:
config = yaml.safe_load(f)
# 创建并启动引擎
engine = Engine(config)
await engine.start()
print("智能体流水线已启动。")
# 模拟外部触发:向url_input通道发送一个URL消息
initial_message = TextMessage(data={"url": "https://example.com/blog/some-post"})
await engine.send_to_channel("url_input", initial_message)
# 等待一段时间,让消息处理完成(生产环境应有更优雅的等待或触发机制)
await asyncio.sleep(5)
# 从发布通道获取最终结果(这里仅为演示,实际可能通过回调或监听方式获取)
# 假设引擎提供了监听或获取通道消息的方法
# final_result = await engine.get_from_channel("publish_output")
# print("最终生成的文章状态:", final_result)
await engine.stop()
if __name__ == "__main__":
asyncio.run(main())
运行这个程序,你将在控制台看到各个Agent被依次触发、处理消息的日志,直观地感受到消息在框架内的流动。至此,一个虽然简单但五脏俱全的多智能体协作流水线就搭建完成了。
注意 :以上代码为阐述原理的模拟实现,与Agent-Reach项目的具体API可能有所不同。实际开发时,务必查阅其官方文档,了解准确的类名、方法和配置格式。但核心概念——Agent、Channel、Router、基于消息的异步通信——是相通的。
4. 生产环境进阶:性能、可靠性与可观测性
当你将一个原型系统推向生产环境时,会面临一系列新的挑战。基于Agent-Reach这类框架构建的系统,也需要在以下方面进行强化。
4.1 通道选型与性能优化
内存通道虽然快,但一旦进程崩溃,所有在途消息都会丢失,且无法跨机器扩展。生产环境的首选是外部消息队列。
- RabbitMQ :成熟的AMQP协议实现,消息路由能力强大,适合对消息投递可靠性、顺序性要求高的复杂路由场景。对于智能体工作流,其Exchange、Queue、Binding的概念与框架中的Channel、Router可以很好地映射。
- Apache Kafka :高吞吐、分布式、持久化的日志系统。适合海量消息流、需要流式处理或消息回溯的场景。如果你的智能体协作涉及实时数据流分析(如监控日志、用户行为事件),Kafka是更佳选择。
- Redis Pub/Sub或Stream :如果你已经使用了Redis,其Pub/Sub模式可以实现轻量级的广播,Stream数据类型则提供了更持久化的、消费者组模式的消息队列功能,是一个折中的选择。
性能调优实践 :
- 批量处理 :如果单个消息处理成本高,可以考虑让Agent批量消费消息(如一次处理10条),减少网络和序列化开销。框架或消息队列客户端通常支持批量拉取。
- 并发度控制 :为每个Agent配置合适的并发工作者数量。不是越多越好,需要根据下游服务(如LLM API)的限流、数据库连接池大小等因素综合确定。
- 消息序列化 :默认的JSON序列化可能成为瓶颈。对于大型消息(如图片、长文本),考虑使用更高效的序列化方案(如MessagePack、Protobuf),或者只传递引用(如存储到对象存储后传递URL)。
4.2 错误处理与系统可靠性
分布式系统中的错误是常态。框架必须提供健全的错误处理机制。
- 重试机制 :这是最基本的容错手段。对于网络抖动、下游服务临时不可用等 瞬时故障 ,必须重试。框架应支持可配置的重试策略(如指数退避)。在Agent实现中,要对可能失败的操作(如HTTP请求、数据库调用)进行包裹。
# 伪代码:在Agent内部实现带退避的重试 async def call_llm_with_retry(prompt, max_retries=3): for attempt in range(max_retries): try: return await llm_client.generate(prompt) except TemporaryError as e: # 定义哪些异常是临时的 if attempt == max_retries - 1: raise wait_time = 2 ** attempt # 指数退避 await asyncio.sleep(wait_time) - 死信队列 :经过多次重试仍然失败的消息,不应被无限期重试或丢弃。应将其转移到专门的 死信队列 ,供运维人员后续排查。这能防止因为个别“毒药消息”阻塞整个通道。
- 事务性消息 :对于要求严格一致性的场景(如“扣减库存并生成订单”需要两个Agent协作),需要实现某种形式的事务补偿或Saga模式。框架可能不直接提供,但可以通过精心设计消息语义(如“预扣减-确认/取消”消息对)和Agent逻辑来实现最终一致性。
- 健康检查与熔断 :框架应提供Agent健康检查接口。对于严重依赖的外部服务(如某个LLM API),可以在Agent或中间件中实现熔断器模式,当失败率达到阈值时,暂时停止向该Agent发送消息,避免雪崩。
4.3 监控、日志与调试
当几十个Agent在网格中异步运行时,没有强大的可观测性工具,排查问题如同大海捞针。
- 结构化日志 :每个Agent在处理消息时,必须输出结构化的日志,至少包含:
message_id、agent_name、input_data_snapshot、processing_time、status(成功/失败)、error_detail。使用像JSON格式的日志,便于后续被ELK(Elasticsearch, Logstash, Kibana)或Loki等系统收集和检索。 - 分布式追踪 :这是理解消息在复杂工作流中流转路径的利器。为每个初始消息生成一个唯一的
trace_id,并在所有后续产生的消息和跨Agent调用中传递这个trace_id。这样,你可以在追踪系统(如Jaeger、Zipkin)中通过一个trace_id还原出整条调用链,看清延迟瓶颈出现在哪个环节。 - 指标度量 :通过框架的中间件或Agent基类,自动收集关键指标,例如:
- 各通道的消息流入/流出速率
- 各Agent的消息处理耗时(P50, P95, P99)
- 各Agent的处理成功/失败率
- 消息在队列中的等待时间 这些指标可以暴露给Prometheus,并在Grafana中绘制成仪表盘,用于性能监控和容量规划。
- 消息可视化 :如果框架能提供图形化界面,实时展示Agent的状态(运行中、空闲、错误)、通道的消息堆积情况、以及消息的实时流向,将极大提升运维和调试效率。这通常是此类框架高级版本或商业产品提供的功能。
5. 典型应用场景与架构模式探讨
掌握了基础构建和进阶运维后,我们可以看看Agent-Reach这类框架能在哪些场景下大放异彩,以及有哪些成熟的架构模式可以套用。
5.1 场景一:自动化客户支持与工单处理
这是一个经典的多智能体协作场景。一个用户问题进来后,可以被多个Agent协同处理。
ClassifierAgent:首先判断问题类型(技术问题、账单问题、一般咨询)。RouterAgent:根据分类结果,将问题路由到不同的专业队列。同时,可以并联一个SearchAgent,实时从知识库中检索相似问题和答案。SolverAgent(多个):专精于不同领域的解决Agent(如BillingAgent、TechSupportAgent)从各自队列消费问题,尝试解决。它们可以调用内部API、查询数据库或生成解决方案草稿。HumanInTheLoopAgent:如果SolverAgent置信度不高或问题过于复杂,将工单路由给人工坐席,并将Agent的分析结果作为参考附上。SummarizerAgent:在对话结束后,自动生成对话摘要和解决步骤,存入知识库。
在这个场景中,Agent-Reach的通道和路由能力使得工单可以根据内容动态流转,并行处理(搜索与分类可同时进行),并且很容易加入新的处理环节(如新增一个 SentimentAnalysisAgent 分析用户情绪)。
5.2 场景二:AI辅助研发流水线
在软件研发中,可以将多个AI助手串联起来,提升效率。
- 触发:代码提交到Git。
CodeAnalyzerAgent:分析提交的代码差异,识别潜在bug、安全漏洞、代码风格问题。将问题列表作为消息发出。TestGenAgent:根据代码变更,尝试生成或更新单元测试用例。DocUpdateAgent:检查是否有公开API或重要函数被修改,提示需要更新相关文档。PRDescriptionAgent:基于代码变更和上述Agent的分析结果,自动生成Pull Request的描述草稿。NotificationAgent:将汇总报告发送到团队聊天工具(如Slack、钉钉)。
所有Agent并行工作,最终结果汇聚成一个完整的代码审查报告。这比单一功能的AI代码助手强大得多。
5.3 架构模式:编排与协同
在使用这类框架时,通常会演化出两种主要模式:
- 中心化编排 :存在一个“指挥家”Agent(或称为Orchestrator)。它接收初始任务,负责将其分解为子任务,然后同步或异步地调用其他Worker Agent,并汇总结果。这种模式控制流清晰,但指挥家容易成为瓶颈和单点故障。
- 去中心化协同 :这也是Agent-Reach更擅长的模式。没有绝对的指挥中心,每个Agent都是对等节点,通过订阅感兴趣的消息类型来参与工作流。任务通过消息的流动和转换自然完成。例如,一个
TaskMessage被AgentA处理成SubTask1Message和SubTask2Message,分别被不同的Agent订阅处理,最终产出汇聚。这种模式扩展性好,但整体流程的监控和调试更复杂。
在实际项目中,常常是两种模式的混合。宏观工作流可能由编排器控制,而每个步骤内部的复杂处理则由一组协同的Agent完成。
6. 常见陷阱、排查技巧与最佳实践
在开发和运维基于Agent-Reach的系统时,我踩过不少坑,也总结了一些经验。
6.1 消息设计陷阱
- 消息过大 :将整个文件内容或大型数据集放入消息体,会急剧增加序列化/反序列化开销和网络传输压力,甚至撑爆消息队列。 最佳实践是传递引用 ,如文件存储后的URL、数据库记录的ID。
- 消息格式频繁变更 :这是分布式系统的噩梦。今天
WriterAgent期望的消息里有个title字段,明天你改成了headline,所有消费它的Agent都会失败。 必须对消息格式进行版本化管理 。可以在消息体中包含一个schema_version字段,或者使用像Protobuf这样有严格模式定义和向后兼容能力的序列化工具。 - 缺少唯一标识和上下文 :每条消息都应有一个全局唯一的
message_id,并且复杂工作流中,关联的消息(如同一任务的不同步骤)应共享一个correlation_id或trace_id。否则,当系统并发处理大量请求时,你根本无法追踪一个业务的完整生命周期。
6.2 性能与稳定性问题排查
当系统变慢或出现大量错误时,可以按照以下步骤排查:
- 检查消息堆积 :首先查看监控仪表盘,哪个通道的消息堆积最严重?堆积点的上游Agent就是潜在的瓶颈。
- 分析Agent处理耗时 :查看瓶颈Agent的处理延迟指标。如果P99延迟很高,可能是其依赖的下游服务(如LLM API)响应慢,或者是其内部逻辑有性能问题(如循环查询数据库)。
- 查看错误日志 :集中查看死信队列中的消息和对应的错误日志。是否是同一类错误集中爆发?可能是下游服务宕机,或收到了无法处理的异常消息格式。
- 资源监控 :检查服务器CPU、内存、网络I/O以及消息队列服务本身的健康状况。磁盘满了或网络带宽打满都会导致问题。
一个实用的技巧是,在开发阶段,就给每个关键Agent添加详细的性能日志,记录每个处理阶段的耗时。这比在生产环境再临时加日志要高效得多。
6.3 开发与运维最佳实践
- Agent设计原则:单一职责与无状态 :一个Agent最好只做一件事,并把它做好。尽量让Agent是无状态的,其处理逻辑只依赖于输入消息和外部服务(数据库、API),而不依赖于内存中的局部变量。这样Agent才能方便地水平扩展。
- 配置外置 :所有通道连接字符串、Agent参数(如重试次数、超时时间)、路由规则都应放在配置文件或配置中心,而不是硬编码在代码里。
- 完善的测试策略 :
- 单元测试 :测试单个Agent的业务逻辑,Mock掉所有外部依赖。
- 集成测试 :启动一个包含几个关联Agent的小型流水线,使用内存通道,测试消息能否正确流转并产生预期结果。
- 契约测试 :当多个团队负责不同Agent时,契约测试(如Pact)可以确保消息生产者(Producer)和消费者(Consumer)对消息格式的理解保持一致,防止因独立升级导致集成故障。
- 灰度发布与回滚 :更新某个Agent时,应逐步将流量从旧版本切换到新版本(例如通过路由规则按比例分流)。一旦新版本出现问题,能快速切回旧版本。这要求框架支持Agent的多版本共存和灵活的路由。
Agent-Reach这类框架,本质上是为AI应用从“单体”走向“微服务”架构提供了通信基础设施。它带来的最大价值是 关注点分离 和 系统韧性 。开发者可以专注于让每个“智能体微服务”变得更聪明、更专业,而框架则负责解决它们之间可靠、高效、灵活对话的难题。随着智能体应用日益复杂,这类框架的重要性会愈发凸显。开始可能觉得引入框架增加了复杂度,但当你的智能体数量超过三个,业务逻辑开始交织时,你会庆幸自己早早地搭好了这条“高速公路”。
更多推荐




所有评论(0)