Agent 速成笔记 · 第 6 章 框架开发实践
Agent 速成笔记 · 第 6 章 框架开发实践
源:Datawhale《Hello-Agents》第 6 章 | 定位:工程实现与框架选型 | 一句话:把 Agent 从"手写脚本"升级为"用框架搭建",搞清 AutoGen、AgentScope、CAMEL、LangGraph 各自的心智模型,以及该选谁。
0. 一章速览(30 秒)
- 一句话:框架的价值是把主循环、状态管理、工具调用、日志这些共性工作封装成"经过验证的规范";四大框架代表四种心智模型——AutoGen 是"群聊",AgentScope 是"消息总线 + 工程平台",CAMEL 是"双人角色扮演",LangGraph 是"状态机图"。
- 本章解决什么问题:读完能回答"一个多智能体项目该选哪个框架、为什么",并说清每个框架里 Agent / Message / Graph / State / Team 这些概念是怎么对应的。
- 必须记住的 5 个点:
- 四大框架的核心抽象:AutoGen 的
Team(群聊)、AgentScope 的Msg+MsgHub、CAMEL 的RolePlaying、LangGraph 的StateGraph。 - 编排只有两大流派:对话式(行为从规则中"涌现")与图式(每步显式声明);CAMEL 是第三类"轻架构、重提示"的角色式。
- 状态与记忆的三种落地:LangGraph 用共享 State 对象 + 检查点保存器;AgentScope 用消息持久化;AutoGen 用对话历史本身。
- 人机协同(Human-in-the-loop)的两条路:AutoGen 的
UserProxyAgent把人类放进对话,LangGraph 在图中插入等待审核的节点。 - 选型三问:要涌现式协作还是显式流程控制?要不要工程化(并发、容错、分布式)?协作规模是 2 人还是 N 人?
- 四大框架的核心抽象:AutoGen 的
1. 从手动实现到框架开发(6.1)
1.1 为什么需要框架
- 是什么:框架是一套经过验证的"规范"。它把所有智能体共有的、重复性的工作(主循环、状态管理、工具调用、日志记录)抽象并封装起来,让开发者只专注独特的业务逻辑。
- 为什么:第 4 章手写的 ReAct、Plan-and-Solve、Reflection 是为了教学和理解,它们能完成特定任务;但要拿它们构建多个、不同类型、逻辑复杂的应用,很快会撞上瓶颈——每换一个场景,主循环、记忆结构、工具注册都要重写一遍。
- 四条具体价值(怎么运作):
- 复用与效率:框架提供通用的
Agent基类或执行器,内部封装了 Agent Loop。无论 ReAct 还是 Plan-and-Solve,都能基于标准组件快速搭建,避免重复劳动。 - 解耦与可扩展:框架强制分离关注点——模型层(可换 OpenAI、Anthropic、本地模型)、工具层(标准化的定义/注册/执行接口,加新工具不影响其他代码)、记忆层(可切换滑动窗口、摘要记忆等策略)。
- 标准化状态管理:真实的长时运行应用要处理上下文窗口限制、历史信息持久化、多轮对话状态跟踪。手写的
Memory类只是起点,框架提供通用机制,不必每次重造。 - 可观测性与调试:通过事件回调(Callbacks),在
on_llm_start、on_tool_end、on_agent_finish等生命周期节点自动触发日志或数据上报,系统化地追踪完整运行轨迹——远比在代码里手插print高效。
- 复用与效率:框架提供通用的
- 工程要点:判断是否该上框架的标准是"这东西要不要被复用、被运维"。一次性脚本不需要框架;产品级、要长期运行的系统需要。
1.2 四个框架的定位
LangChain 和 LlamaIndex 定义了第一代通用 LLM 应用框架的范式;新一代框架则更专注解决特定领域的深层挑战,尤其是多智能体协作(Multi-Agent Collaboration)与复杂工作流控制(Complex Workflow Control)。本章聚焦四个代表:
| 框架 | 一句话定位 | 核心心智模型 |
|---|---|---|
| AutoGen | 以对话驱动协作 | 多个"可对话"智能体组成的群聊 |
| AgentScope | 工程化优先的多智能体平台 | 消息驱动的"智能体操作系统" |
| CAMEL | 轻架构、重提示 | 双智能体角色扮演 + 引导性提示 |
| LangGraph | 图式流程控制 | 状态机 + 有向图 |
四者的根本差别在于"任务解决过程被映射成了什么":AutoGen 映射成对话,AgentScope 映射成消息事件流,CAMEL 映射成两个人的人际协作,LangGraph 映射成一张流程图。
2. AutoGen:以对话驱动协作(6.2)
2.1 核心机制
版本锚点:以 0.7.4 为例。它是迄今最新版本,代表一次重要的架构重构——从类继承设计转向组合式架构。
- 分层设计:框架拆成两个核心模块。
autogen-core是底层基础,封装与语言模型交互、消息传递等核心功能,保证稳定性与扩展性;autogen-agentchat构建于 core 之上,提供开发对话式智能体应用的高级接口。分层使各组件职责明确、耦合度低。 - 异步优先:新架构全面转向
async/await。多智能体协作中网络请求(调 LLM API)是主要耗时操作,异步模式让系统在等待一个智能体响应时去处理其他任务,避免线程阻塞,显著提升并发能力与资源利用率。
两个核心智能体组件:
AssistantAgent(助理智能体):任务的主要解决者,核心是封装了一个 LLM,根据对话历史生成回复(提计划、写文章、写代码)。通过不同的系统消息(System Message)赋予它不同的"专家"角色。UserProxyAgent(用户代理智能体):功能最独特的组件,扮演双重角色——既是人类用户的"代言人"(发起任务、传达意图),又是可靠的"执行器"(可配置为执行代码或调用工具并反馈结果)。它清晰地切开了"思考"(由AssistantAgent完成)与"行动"。
从 GroupChatManager 到 Team:任务需要多智能体协作时,必须有人协调对话流程。早期版本由 GroupChatManager 承担,新架构引入更灵活的 Team / 群聊概念,例如 RoundRobinGroupChat(轮询群聊)——参与者按预定义顺序依次发言。
轮询群聊的工作流:创建实例并加入全部参与者 → 按预设顺序依次激活智能体 → 被选中者根据当前对话上下文响应 → 群聊把新回复写入历史并激活下一个 → 循环直到达到最大轮次或满足终止条件。开发者只定义"谁在什么时候说话",流程由群聊机制自主驱动。
2.2 实战骨架:一个"软件开发团队"
业务目标:开发一个实时显示比特币价格的 Web 应用。任务虽小,却完整覆盖需求分析、技术选型、编码、代码审查、测试的全环节。
角色设计:ProductManager(把模糊需求转成可执行计划)、Engineer(按计划写代码)、CodeReviewer(审查质量与健壮性)、UserProxy(发起任务、执行并验证最终交付)。
关键机制一:用系统消息做"角色专业化"。每个角色的系统消息规定职责与输出结构,还内嵌引导流程转向下一环节的指令——产品经理的提示词以"分析完成后说'请工程师开始实现'"结尾。这是让轮询顺序真正跑通的隐性粘合剂。
关键机制二:用团队配置声明协作规则。
team_chat = RoundRobinGroupChat(
participants=[product_manager, engineer, code_reviewer, user_proxy],
termination_condition=TextMentionTermination("TERMINATE"),
max_turns=20,
)
participants 的顺序决定发言次序;termination_condition 决定何时收尾(此处是任何消息里出现关键词 "TERMINATE",该指令由 UserProxy 在最终测试完成后发出);max_turns 是防止无限循环的安全阀。
关键机制三:异步启动。整个流程在异步函数中运行,用 Console(team_chat.run_stream(task=task)) 流式输出对话过程,最后由 asyncio.run() 执行。task 作为初始消息传入,第一位参与者(产品经理)先接收,自动化协作随即开始。
非 OpenAI 模型的配置补充:若用 DeepSeek、通义千问等模型,在 0.7.4 中需给 OpenAIChatCompletionClient 额外传一个 model_info 字典,字段包括 function_calling、max_tokens、context_length、vision、json_output、family、structured_output。它帮助 AutoGen 了解模型的能力边界,从而正确适配;该客户端可对接任何兼容 OpenAI API 规范的服务。
2.3 优势与局限
- 优势:把完整开发流程自然映射成角色之间的对话,无需设计复杂状态机或控制流,降低为复杂任务建模的门槛——开发者只需想"谁(角色)"和"做什么(职责)",不必想"如何做(流程控制)";角色通过系统消息高度专业化,可跨项目复用;
RoundRobinGroupChat对流程化任务给出可预测的协作顺序,而UserProxyAgent为人类在环提供了天然接口——它既是任务发起者,也可以是流程监督者和最终验收者,确保自动化系统始终处于人类监督之下。 - 局限:基于 LLM 的对话本质上有不确定性,智能体可能产生偏离预期的回复,把对话带向意外分支甚至陷入循环;出问题时调试十分棘手——拿到的不是清晰错误堆栈,而是一长串对话历史,这就是"对话式调试"难题。
3. AgentScope:消息驱动的工程化平台(6.3)
3.1 设计取向与分层架构
AgentScope 由阿里巴巴达摩院开发,专为构建大规模、高可靠性的多智能体应用设计。它与 AutoGen 的核心差异是消息驱动的架构设计与工业级工程实践:如果说 AutoGen 是一个灵活的"对话工作室",AgentScope 就是一个完整的"智能体操作系统",覆盖开发、测试到部署的全生命周期。它同样采用组合式架构(而非继承式),这是其并发与分布式能力的基础。
四层架构自下而上:
- 基础组件层:
Message定义统一消息格式(从简单文本到复杂多模态);Memory提供短期与长期记忆管理;Model API抽象对不同 LLM 的调用;Tool封装智能体与外部世界交互的能力。 - 智能体基础设施层:预构建智能体(浏览器使用智能体、深度研究智能体)、经典 ReAct 范式、智能体钩子、并行工具调用、状态管理,并原生支持异步执行与实时控制。
- 多智能体协作层:
MsgHub作为消息中心负责路由与状态管理,Pipeline系统提供工作流编排,支持顺序、并发等执行模式。 - 开发与部署层:
AgentScope Runtime提供生产级运行时,AgentScope Studio提供可视化开发工具链。
3.2 消息驱动:把函数调用换成消息
核心创新是所有智能体交互都被抽象为消息的发送与接收,而不是传统的函数调用。标准消息结构含发送者、内容、角色与元数据:
from agentscope.message import Msg
message = Msg(
name="Alice",
content="Hello, Bob!",
role="user",
metadata={"message_type": "text", "priority": "normal"},
)
把消息作为交互基础单元带来四个关键优势:异步解耦(收发双方在时间上解耦,无需相互等待,天然支持高并发)、位置透明(智能体不关心对方在本地进程还是远程服务器,消息系统自动路由)、可观测性(每条消息都可被记录、追踪、分析)、可靠性(消息可持久化存储与重试,系统故障时仍保证交互的最终一致性)。
3.3 生命周期、MsgHub 与记忆落地
生命周期:每个智能体都有明确的生命周期(初始化、运行、暂停、销毁),统一基于 AgentBase 实现,开发者通常只关注 reply 方法;observe 是可选钩子,用于把收到的消息写入记忆。
class CustomAgent(AgentBase):
def reply(self, x: Msg) -> Msg: # 核心:思考并回应
response = self.model(x.content)
return Msg(name=self.name, content=response, role="assistant")
def observe(self, x: Msg) -> None: # 可选:只观察,不回应
self.memory.add(x)
这种设计把智能体的内部逻辑与外部通信彻底分离。
MsgHub(消息中心) 是消息驱动架构的中枢,除路由分发外还集成持久化与分布式通信:
- 灵活路由:支持点对点、广播、组播等多种模式,可构建复杂的交互网络。
- 消息持久化:自动把所有消息存入数据库(如 SQLite、MongoDB)。这正是长期运行任务的"中断恢复"基础——状态可以从中恢复。
- 原生分布式:智能体可部署在不同进程或服务器,
MsgHub通过 RPC(远程过程调用) 自动处理跨节点通信,对开发者透明。
代价是开发者必须理解并适应消息驱动的异步编程范式。
3.4 实战骨架:"三国狼人杀"
案例把游戏逻辑分成三层,每层映射 AgentScope 的一组组件:
- 游戏控制层:
ThreeKingdomsWerewolfGame类作为主控制器,维护全局状态(存活列表、当前阶段)、推进流程、裁定胜负。 - 智能体交互层:完全由
MsgHub驱动,狼人夜间密谋与白天公开辩论都经消息中心路由分发。 - 角色建模层:每个玩家是基于
DialogAgent的实例,通过系统提示词注入"游戏角色 + 三国人格"的双重身份。
最核心的设计:用消息驱动代替状态机。 传统实现靠中心化状态机切换阶段,这里则把阶段建模为"在特定上下文中以何种模式交换消息"。例如狼人阶段不是函数调用,而是让 MsgHub 动态创建一个只含狼人的私密通信频道:
async with MsgHub(
self.werewolves,
enable_auto_broadcast=True,
announcement=await self.moderator.announce("狼人们,请讨论今晚的击杀目标。"),
) as werewolves_hub:
for _ in range(MAX_DISCUSSION_ROUND): # 讨论阶段
for wolf in self.werewolves:
await wolf(structured_model=DiscussionModelCN)
werewolves_hub.set_auto_broadcast(False) # 投票阶段:关闭广播
kill_votes = await fanout_pipeline(
self.werewolves, msg=..., structured_model=WerewolfKillModelCN,
enable_gather=False,
)
同一范式复用到白天全员广播讨论、预言家点对点查验等阶段。
用结构化输出约束游戏规则:为不同行为定义严格的 Pydantic 数据模型,例如 DiscussionModelCN 含 reach_agreement(是否达成一致)、confidence_level(信心 1–10,用 ge=1, le=10 约束)、key_evidence;WitchActionModelCN 含 use_antidote、use_poison、target_name。这带来两重收益:输出格式一致性,以及游戏规则的自动化约束——女巫无法对同一目标同时用解药和毒药、预言家每晚只能查验一人,这些都由字段定义与校验逻辑自动执行。
并发与容错:投票等"同时收集多方决策"的场景用 fanout_pipeline 并行发送同一消息并异步收集响应,既提效又模拟了真实狼人杀的"同时投票";关键环节用 try/except 兜底,出错时构造默认响应(如 DiscussionModelCN(reach_agreement=False, confidence_level=5, key_evidence="暂时无法分析")),保证单个智能体异常不会中断全局流程。
双重角色建模的观察:通过提示词把"游戏功能角色"(狼人、预言家)与"文化人格角色"(刘备、曹操)叠加。结果是同一游戏角色由不同人格扮演会呈现截然不同的策略与话风——扮演狼人的"曹操"更狡猾善于伪装,扮演狼人的"张飞"则更直接冲动。
3.5 优势与局限
- 优势:把复杂流程优雅地映射为并发、异步的消息传递事件,避免传统状态机的僵硬;结构化输出把规则变成代码级约束,提升稳定性与可预测性;异步架构带来原生并发优势,容错设计保证单点异常不破坏整体。
- 局限:工程化优势伴随复杂性成本——需要理解异步编程、分布式通信等概念;对简单多智能体对话场景存在"过度工程化"风险;作为较新的框架,生态与社区资源仍待完善。结论:适合大规模、高可靠性的生产级系统;快速原型或简单场景应选更轻量的框架。
4. CAMEL:角色扮演式自主协作(6.4)
4.1 两大基石
CAMEL 最初的核心目标,是探索在最少人类干预下让两个智能体通过"角色扮演"自主协作解决复杂任务。
基石一:角色扮演(Role-Playing)。一个任务由两个智能体协作完成,角色互补且明确定义:"AI 用户"(AI User)负责提出需求、下达指令、构思任务步骤;"AI 助理"(AI Assistant)负责按指令执行操作、提供解决方案。以"开发股票交易策略分析工具"为例,AI 用户是"懂市场但不懂编程的资深交易员",AI 助理是"精通编程但对股票一无所知的 Python 程序员",任务因此被转化为两位跨领域专家的对话。
基石二:引导性提示(Inception Prompting)。仅设角色不够,要保证两个 AI 在没有人类持续监督时始终不脱离角色且高效朝共同目标前进,靠的是对话开始前分别注入的、结构化的初始指令(System Prompt)。它相当于植入的"行动纲领",包含四部分:明确自身角色、告知协作者角色、定义共同目标、设定行为约束和沟通协议(最关键的一环)。约束例如:要求 AI 用户"一次只提出一个清晰、具体的步骤",要求 AI 助理"在完成上一步之前不要追问更多细节",并规定用特定标志(如 <SOLUTION>)标识任务完成。这些约束保证对话不偏题、不陷入无效循环,而是高度结构化地推进。
4.2 协作骨架与流程节律
案例是让"心理学家"与"作家"合作写一本关于拖延症心理学的短篇电子书。核心操作是创建一个 RolePlaying 会话实例——它封装了复杂的提示工程,只需传入两个角色名和任务:
role_play_session = RolePlaying(
assistant_role_name="心理学家", # assistant = 执行者、方案提供方
user_role_name="作家", # user = 推动者、需求方
task_prompt=task_prompt,
model=model,
with_task_specify=False, # 直接使用给定 task_prompt
)
角色分配有一处易错点:user 是"推动者/需求方",assistant 是"执行者/方案提供方",所以负责规划结构的"作家"要放在 user_role_name,负责专业知识的"心理学家"放在 assistant_role_name。
驱动循环:init_chat() 基于任务和角色自动生成开场消息(无需人工写开场白);step(input_msg) 驱动一轮完整交互,返回 (assistant_response, user_response);把上一轮助理的回复作为下一轮输入,形成环环相扣的创作链;循环持续到达轮次上限(示例 30 轮)或任一智能体输出 <CAMEL_TASK_DONE> 为止。task_prompt 是"任务说明书",它不只是目标,还会在幕后被 CAMEL 用来生成引导性提示,确保对话始终围绕核心目标。
协作节律(四阶段):① 约 1–5 轮,框架搭建与目标对齐——作家先提结构与章节设想,心理学家从专业角度补全核心学术模块,双方先对产出达成共识;② 约 6–20 轮,核心内容生成与知识转译——稳定的"请求-响应"循环:心理学家给硬核知识(时间折扣理论、执行功能缺陷)并引研究,作家充当"翻译官"把学术概念转成比喻与案例(如把"现在偏见"比作"只顾眼前糖果的任性孩子");③ 约 21–25 轮,迭代优化——角色互换,作家从读者体验提修改建议,心理学家任"事实核查员"确保科学性;④ 收尾——完成实用建议总结与全书回顾。
4.3 优势与局限
- 优势:"轻架构、重提示"的设计哲学。相比 AutoGen 的复杂对话管理和 AgentScope 的分布式架构,CAMEL 靠精心设计的初始提示就能实现高质量协作,且涌现出的协作行为往往比硬编码工作流更灵活高效。框架本身也在快速演进,已具备多模态能力(文本、图像、音频)、工具集成(搜索、计算、代码执行)、模型适配(OpenAI、Anthropic、Google、开源模型)与生态联动(与 LangChain、CrewAI、AutoGen 互操作)。
- 局限之一:高度依赖提示工程。提示设计门槛高(需同时懂目标领域和 LLM 行为特性);协作效果不佳时难以定位问题出在角色定义、任务描述还是交互规则;不同 LLM 对同一提示的理解存在差异。
- 局限之二:协作规模受限。缺少 AutoGen 那样的复杂对话路由机制,没有 AgentScope 那样的分布式状态管理能力,多个智能体意见分歧时也缺乏有效仲裁机制。
- 局限之三:任务适用性边界。需要精确步骤控制的任务应交给 LangGraph 的图结构;大规模并发场景 AgentScope 更有优势;复杂多方决策树则 AutoGen 的群聊更灵活。
5. LangGraph:状态机与图(6.5)
5.1 三个基本要素
LangGraph 是 LangChain 生态的扩展,代表了全新的方向:把智能体执行流程建模为状态机(State Machine),并表示为有向图(Directed Graph)。节点(Nodes)代表一个具体计算步骤(调 LLM、执行工具),边(Edges)定义节点之间的跳转逻辑。它的革命性在于天然支持循环——传统链式结构信息只能单向流动,而图结构让迭代、反思、自我修正的工作流变得直观简单。
三个基本构成要素:
其一,全局状态(State)。整个图的执行围绕一个共享状态对象进行,通常定义为 Python 的 TypedDict,可包含对话历史、中间结果、迭代次数等,所有节点都能读取并更新它。
class AgentState(TypedDict):
messages: list[str] # 对话历史
current_task: str # 当前任务
final_answer: str # 最终答案
其二,节点(Nodes)。每个节点是"接收当前状态为输入、返回更新后状态为输出"的 Python 函数,是执行具体工作的单元(如"规划者""执行者",前者把计划追加进 state["messages"],后者读取最新计划并追加执行结果)。
其三,边(Edges)。常规边指定某个节点的输出总是流向另一个固定节点;条件边(Conditional Edges) 才是 LangGraph 最强的能力——它通过一个判断函数读取当前状态,动态决定下一步跳向哪个节点,这正是实现循环与复杂分支的关键。判断函数的返回值必须与添加条件边时定义的路由映射键匹配。
组装方式像搭积木:
workflow = StateGraph(AgentState)
workflow.add_node("planner", planner_node)
workflow.add_node("executor", executor_node)
workflow.set_entry_point("planner") # 入口点
workflow.add_edge("planner", "executor") # 常规边
workflow.add_conditional_edges(
"executor", should_continue,
{"continue_to_planner": "planner", "end_workflow": END} # 返回路由
)
app = workflow.compile() # 编译成可执行应用
5.2 实战骨架:三步问答助手
案例构建一个流程固定的问答助手:理解(Understand)→ 搜索(Search)→ 回答(Answer)。
定义全局状态:SearchState 是一个贯穿全流程、在节点间传递的持久化上下文。一个关键设计是同时保留 user_query(LLM 理解后的需求总结)和 search_query(优化后的搜索关键词)两个字段——先让智能体把自然语言提问改写成更适合搜索引擎的精炼关键词,显著提升搜索质量。消息字段用 Annotated[list, add_messages] 声明,由 add_messages 负责归并策略。
class SearchState(TypedDict):
messages: Annotated[list, add_messages]
user_query: str
search_query: str
search_results: str
final_answer: str
step: str # 标记当前步骤,供后续节点做条件分支
三个节点(每个都"接收状态、返回更新后的字段字典"):
- 理解与查询节点:用一个结构化提示让 LLM 同时完成"意图理解"与"关键词生成"两件事,再把解析出的搜索词写入
search_query,并把step置为"understood",为精确定位搜索做准备。 - 搜索节点:调用 Tavily API 做真实互联网搜索(
search_depth="basic"、max_results=5、include_answer=True),整体包在try/except中;失败时把step置为"search_failed",这个状态将被下一个节点用来触发备用方案。 - 回答节点:检查
state["step"]执行条件逻辑——若搜索失败,走回退策略,让 LLM 基于自身知识作答并告知用户;若成功,则基于实时搜索结果生成有时效性、有据可依的回答。这是图中"弹性"的体现。
构建与编译:
workflow = StateGraph(SearchState)
workflow.add_node("understand", understand_query_node)
workflow.add_node("search", tavily_search_node)
workflow.add_node("answer", generate_answer_node)
workflow.add_edge(START, "understand")
workflow.add_edge("understand", "search")
workflow.add_edge("search", "answer")
workflow.add_edge("answer", END)
app = workflow.compile(checkpointer=InMemorySaver()) # 编译图 + 挂检查点
线性流程用 START / END 划定起点与终点;编译时挂上检查点保存器(InMemorySaver),使会话可被保存与延续,因此助手成为可以持续交互的对象,而不只跑一次。
5.3 优势与局限
- 优势:把完整流程显式定义为"状态 + 节点 + 边"构成的流程图,带来高度的可控性与可预测性,这对需要高可靠、可审计的生产级应用至关重要;最强大的特性是对循环的原生支持——通过条件边可轻松构建"反思-修正"循环与容错回退路径,这是构建能自我优化的智能体的关键;每个节点都是独立 Python 函数,模块化程度高;在流程中插入一个等待人类审核的节点非常直接,为实现可靠的人机协同提供了坚实基础。
- 局限:需要写更多前期代码(Boilerplate)——定义状态、节点、边对简单任务显得繁琐,开发者被迫多思考"如何控制流程(how)"而非"做什么(what)";工作流预先定义,行为可控但缺少对话式智能体那种动态"涌现"的交互,它的强项是执行确定可靠的流程,而非模拟开放式的社会性协作;调试仍有挑战——问题可能出在节点内部逻辑、状态数据异变或边跳转条件失误,要求对整张图的运行机制有全局理解。
6. 框架对比与选型(6.6)
6.1 四框架对照
| 框架 | 核心抽象 | 编排方式 | 状态 / 记忆落地 | 人机协同接口 |
|---|---|---|---|---|
| AutoGen | Team + 可对话 Agent |
对话式,轮询群聊 | 对话历史即上下文 | UserProxyAgent |
| AgentScope | Msg + MsgHub |
消息驱动、事件流 | 消息持久化到数据库 | 实时控制、异步介入 |
| CAMEL | RolePlaying 会话 |
角色扮演、双人对话 | 对话消息序列 | 最少人工干预 |
| LangGraph | StateGraph |
图式、条件边路由 | 共享 State + 检查点 | 插入人工审核节点 |
6.2 协作模式分类
同样的多智能体协作,四个框架给出的"拓扑"不同:
- 顺序 / 轮询:
RoundRobinGroupChat,发言顺序由participants列表顺序决定。适合流程固定的任务(需求 → 编码 → 审查 → 测试)。可预测性最强。 - 群聊 / 集中协调:早期由
GroupChatManager决定下一个发言人,新架构统一为Team概念。适合多方决策、需要动态选择发言者的场景。 - 角色扮演(双人):CAMEL 的
RolePlaying,AI 用户推动、AI 助理执行,靠引导性提示维持角色与节律。适合需要跨领域深度协作与创造性思维的任务。 - 集中调度 / 层级(监督者在上):三国狼人杀是典型样本——游戏控制层维护全局状态并裁定胜负,"主持人"负责公告、建立私密频道、收集决策,各角色智能体只负责本地回应。这种"一个监督者 + 若干执行者"的结构让流程不依赖智能体自觉。
- 条件路由(可表达任意拓扑):LangGraph 的图结构没有拓扑限制,顺序、分支、循环都能直接表达,代价是每一步都要显式声明。
6.3 选型标准
原文提炼出的第一个权衡是"涌现式协作"与"显式控制"之间的选择:AutoGen 和 CAMEL 更依赖定义智能体的"角色"和"目标",让复杂协作行为从简单对话规则中"涌现"出来,更贴近人类交互模式,但难以预测和调试;LangGraph 要求明确声明每一步与每个跳转条件,牺牲一部分"涌现"的惊喜,换来高度的可靠性、可控性与可观测性。
第二个同样重要的维度是工程化:无论选哪种协作范式,要从实验原型推向生产应用,都必须面对并发、容错、分布式部署这些挑战。AgentScope 正为此而生,它代表从"能运行"到"能稳定服务"的关键跨越。
按任务特征落地的判断规则:
- 需要流程严格、可追溯、可审计(多环节审批、有明确判断标准与分支逻辑)→ 选图式,用显式状态与条件边把每一步钉死。
- 需要高并发、7×24 稳定、水平扩展(大量用户请求、要求低延迟与长期运行)→ 重视工程化能力,看消息驱动与分布式支持。
- 需要两个专家深度协作、自主推进(如研究员 + 写作助手的多轮深度讨论)→ 轻量角色扮演范式最省事,靠提示而非架构。
- 需要多方决策、角色分工清晰但顺序固定(如模拟团队协作)→ 对话式群聊,只定义角色与顺序,流程自动驱动。
- 任务简单、只跑一次 → 不必上框架,手写循环更直接。
7. 高频考点 & 易错点速查
- 框架的四大价值:复用效率 / 分层解耦(模型层·工具层·记忆层)/ 标准化状态管理 / 可观测性(Callbacks 生命周期钩子)。
- AutoGen
0.7.4两大架构特征:分层(autogen-core+autogen-agentchat)与异步优先(async/await)。 AssistantAgent负责"思考",UserProxyAgent负责"行动"并承担 HITL 入口——两者职责不可混。RoundRobinGroupChat三个关键参数:participants(决定顺序)、termination_condition(如TextMentionTermination("TERMINATE"))、max_turns(防死循环的安全阀)。- 易错:非 OpenAI 模型在
0.7.4中必须补model_info字典,否则框架不知道模型的能力边界。 - AutoGen 的最大软肋是"对话式调试"——出错时没有错误堆栈,只有一长串对话历史。
- AgentScope 与 AutoGen 的根本差异:消息驱动 vs 对话驱动;四层架构自下而上是基础组件层、智能体基础设施层、多智能体协作层、开发与部署层。
- 消息驱动的四个收益:异步解耦、位置透明、可观测性、可靠性;
MsgHub是其中枢,靠 RPC 实现透明分布式,靠数据库持久化实现长期任务的状态恢复。 - 易错:AgentScope 的"状态恢复"来自消息持久化,LangGraph 的"中断恢复"来自检查点保存器,不要混为一谈。
- 结构化输出的双重作用:保证格式一致 + 把业务规则变成代码级约束(如女巫不能同目标解药毒药并用)。
- CAMEL 的两大基石:角色扮演 + 引导性提示;引导性提示的四要素:自身角色、协作者角色、共同目标、行为约束与沟通协议。
- 易错:CAMEL 的
user是"推动者/需求方",assistant是"执行者"——角色分配反了,协作节律就崩了。 - 易错:LangGraph 的条件边函数返回值必须与路由映射的键匹配,否则图无法编译或跳转失败。
- LangGraph 的三要素:State(
TypedDict共享状态)、Nodes(状态进、状态更新出)、Edges(常规边 + 条件边);compile后才得到可执行应用。 - 易混:
StateGraph(图容器)与SearchState(状态结构)不是一回事,前者绑定后者。 - 章末习题考点映射:①框架三维度对比与两种设计哲学 ②对话式协作的可控性改造(动态回退、加角色、质量监控)③消息驱动的优势与分布式一致性 ④角色扮演范式的边界(终止冲突、多智能体扩展)⑤状态机与循环(画图、加反思节点)⑥三类应用的选型标准。
8. 与前后章节的衔接
第 4 章手写实现了 ReAct、Plan-and-Solve、Reflection,第 5 章体验了低代码平台的便捷;本章站在"框架使用者"视角,把前两章的能力装进 AutoGen、AgentScope、CAMEL、LangGraph 四套规范里,并给出选型依据。下一章将反过来,从零开始亲手构建一个属于自己的智能体框架,把本章看到的抽象(状态、消息、图、协作拓扑)重新实现一遍,理论与实践在此汇合。

浙公网安备 33010602011771号