Chapter 06
第六章 框架开发实践
当你理解了 ReAct、Plan-and-Solve 和 Reflection,下一步就是使用框架组织更复杂的 Agent。本章对照 AutoGen、AgentScope、CAMEL、LangGraph 的思想,并用无外部依赖的模拟代码理解它们的核心机制。
6.1 从手动实现到框架开发
6.1.1 为何需要智能体框架
手写 Agent 适合理解原理,但复杂项目会遇到消息传递、角色协作、状态恢复、工具管理、并发执行和可视化调试等问题。框架的价值,是把这些共性问题抽象成可复用组件。
6.1.2 主流框架的选型与对比
| 框架 | 核心视角 | 适合场景 | 学习重点 |
|---|---|---|---|
| AutoGen | 多角色对话与协作。 | 软件团队、审查流程、任务分工。 | 角色、群聊、终止条件。 |
| AgentScope | 多智能体应用和游戏式交互。 | 角色扮演、仿真、并行决策。 | 消息结构、环境循环、角色状态。 |
| CAMEL | 角色扮演式自主协作。 | 写作、研究、专家协作。 | 任务设定、角色目标、对话推进。 |
| LangGraph | 状态图和条件路由。 | 长任务、可恢复流程、复杂工作流。 | State、Node、Edge、Router。 |
6.2 框架一:AutoGen
6.2.1 AutoGen 的核心机制
AutoGen 类框架把 Agent 看成多个可以互相发消息的角色。每个角色有职责、系统提示词、工具和停止规则。系统通过群聊或调度器推进协作。
6.2.2 软件开发团队
软件团队案例通常包含产品经理、工程师和审查员。产品经理拆需求,工程师实现,审查员检查风险。教学代码用 SoftwareTeamSimulator 展示这个结构。
class SoftwareTeamSimulator:
def run(self, task: str) -> list[TeamMessage]:
return [
TeamMessage("产品经理", f"需求拆解:{task}"),
TeamMessage("工程师", "实现方案:先写测试,再实现最小功能。"),
TeamMessage("审查员", "审查意见:补充边界条件和失败处理。"),
]
6.2.3 核心代码实现
最小实现由三部分组成:角色定义、消息结构和调度器。角色只负责生成自己的回复,调度器负责决定发言顺序、终止条件和最终汇总。不要把所有逻辑塞进单个 Prompt,否则很难调试哪个角色造成了错误。
messages = team.run("实现登录页")
for message in messages:
print(message.sender, message.content)
6.2.4 AutoGen 的优势与局限性分析
多角色对话非常适合把职责显式化,但如果没有明确终止条件和裁决者,角色会互相消耗上下文和成本。
6.3 框架二:AgentScope
6.3.1 AgentScope 的设计
AgentScope 类框架更强调多智能体应用结构,常见概念包括角色、消息、环境、并行决策和运行时管理。它适合构建游戏、模拟和多角色交互。
6.3.2 三国狼人杀游戏
教学代码用 AgentScopeGame 模拟“玩家投票”。虽然很小,但能体现环境向多个角色收集动作,再统一更新状态的思想。
class AgentScopeGame:
def __init__(self, players: list[str]) -> None:
self.players = players
def collect_votes(self) -> dict[str, str]:
return {player: self.players[(index + 1) % len(self.players)] for index, player in enumerate(self.players)}
6.3.3 AgentScope 的优势与局限性分析
它适合多角色、强环境循环的任务;但工程上要格外关注角色状态、消息可追踪性和并发带来的调试难度。
6.4 框架三:CAMEL
6.4.1 CAMEL 的自主协作
CAMEL 类方法强调让两个或多个角色在明确任务设定下自主对话。它常用于专家协作、内容生成和研究型任务。
6.4.2 AI 科普电子书
一个写作者 Agent 和一个专家 Agent 可以协作产出电子书。写作者负责结构和读者体验,专家负责准确性和知识深度。
class CamelRolePlay:
def run(self, topic: str) -> list[TeamMessage]:
return [
TeamMessage("写作者", f"请提供 {topic} 的章节结构。"),
TeamMessage("专家", "建议分为背景、核心概念、案例和练习。"),
TeamMessage("写作者", "我会把建议整理为电子书草稿。"),
]
6.4.3 CAMEL 的优势与局限性分析
角色扮演能提升产出覆盖面,但不等于事实正确。涉及专业知识时仍需要检索、引用和外部评估。
6.5 框架四:LangGraph
6.5.1 LangGraph 的结构梳理
LangGraph 的核心是状态图。你定义全局 State、节点函数和边,再通过条件路由控制下一步。它适合长任务、可恢复流程和有复杂分支的 Agent。
class StateGraph:
def add_node(self, name: str, fn) -> None:
self.nodes[name] = fn
def add_edge(self, source: str, target: str) -> None:
self.edges[source] = target
def run(self, start: str, state: GraphState) -> GraphState:
current = start
while current:
state = self.nodes[current](state)
current = self.edges.get(current, "")
return state
6.5.2 三步问答助手
三步问答助手可以拆成 planner、retriever、answerer 三个节点。本章配套代码为了保持简洁,只实现 planner 和 executor 两个节点。
当 StateGraph 增加条件路由后,节点不再只按固定边前进,而是根据状态决定下一步。例如 notes 为空时进入 retriever,已有检索结果时进入 answerer,遇到错误时进入 human_review。
完整代码见 framework_simulators.py。
6.5.3 LangGraph 的优势与局限性分析
状态图让流程更可控、更适合恢复和调试;代价是前期设计更重,需要明确 State schema 和节点边界。
6.6 本章小结
AutoGen 强在多角色协作,AgentScope 强在环境和多智能体应用,CAMEL 强在角色扮演式任务推进,LangGraph 强在状态图和条件路由。选框架前,先判断你的任务更像对话协作、环境模拟、专家共创,还是可恢复流程。
习题
- 练习 6.1:扩展软件团队。 给
SoftwareTeamSimulator增加测试工程师角色。 - 练习 6.2:改造游戏投票。 让
AgentScopeGame支持弃权票。 - 练习 6.3:增加 CAMEL 轮次。 让写作者和专家进行两轮对话。
- 练习 6.4:扩展状态图。 给
StateGraph增加 retriever 节点。
参考资料
- AutoGen:多 Agent 对话和协作框架。
- AgentScope:面向多智能体应用的框架。
- CAMEL:角色扮演式多智能体协作框架。
- LangGraph:基于状态图的 Agent 工作流框架。