《Hello-Agents》第四至六章 核心知识 梳理总结
范围:第二部分「智能体构建实践」|PDF p82–205(第四章 p82–114、第五章 p115–170、第六章 p171–205)
全局知识地图:这三章在讲什么
| 章 | 回答的核心问题 | 与前后章节的关系 |
|---|---|---|
| 第四章 | 三种经典范式怎么从零手写出来 | 直接落地第 1 章的 Agent Loop 与 T-A-O 协议;是第 7 章自建框架、第 10 章多智能体的范式来源 |
| 第五章 | 不写代码能不能更快搭出智能体 | 与第四章构成"手写 vs 平台"的互补视角;结论是混合开发 |
| 第六章 | 用成熟框架怎么规范地构建 | 与第四章构成"手写 vs 框架"的对照;直接铺垫第 7 章「构建你的智能体框架」 |
一句话串联:先手写三种范式搞懂原理(第四章)→ 再用低代码平台提速(第五章)→ 再回到专业框架解决多智能体与复杂流程(第六章)→ 最终自己造一个框架(第七章)。
贯穿三章的一条暗线:第四章暴露的工程痛点(输出解析、工具失败重试、防死循环、状态管理、可观测性),正是第五章平台与第六章框架存在的理由。
前置主线回顾(衔接第 1–3 章)
第四章是前三章的实战落地,进入前需要带上的四块知识:
- 智能体定义与分类:智能体 = 通过传感器感知环境、通过执行器自主行动的实体;"智能"来自自主性而非算力。分类三维度——决策架构(反射 / 基于模型 / 基于目标 / 基于效用 / 学习型)、时间与反应性(反应式 / 规划式 / 混合式)、知识表示(符号 / 亚符号 / 神经符号)。现代 LLM 智能体是混合式 + 神经符号主义的实践:神经网络提供直觉,结构化的 Thought/Plan/Tool Call 提供可追溯的理性。
- 核心组件与运行循环:Agent Loop = 感知 → 思考(规划 + 工具选择)→ 行动 → 观察 → 循环;对外表现为 Thought / Action / Observation 三段式协议。
- LLM 的能力边界与局限:本质是"预测下一个词"的自回归模型,无内置事实核查模块 → 幻觉;知识有时效截止;还有偏见。这决定了工具、RAG、Reflection 三类补救手段的必要性。
- Prompt 工程关键原则(三章反复在用):角色设定 → 任务描述 → 格式规约(强制结构化输出)→ 动态上下文注入 → 终止条件;调试时通常把 temperature 设为 0 保证确定性;格式不稳定时加 few-shot 示例。
第四章 智能体经典范式构建(重点)
4.1 环境准备与基础工具定义
4.1.1 环境与密钥
- 依赖:
openai(LLM 调用)+python-dotenv(密钥管理);Python 3.10+。 - 密钥与模型信息统一放
.env,代码自动加载:LLM_API_KEY/LLM_MODEL_ID/LLM_BASE_URL。
4.1.2 封装 LLM 客户端:HelloAgentsLLM
class HelloAgentsLLM: # 优先用构造参数,缺失则回落到环境变量
def __init__(self, model=None, apiKey=None, baseUrl=None, timeout=None): ...
def think(self, messages: List[Dict[str, str]], temperature=0) -> str: ...
设计要点:
- 统一入口:所有范式只依赖
think(messages) -> str一个方法,换模型/换服务商都不改上层逻辑(依赖倒置)。 - 默认流式:
stream=True逐 chunk 收集后拼接成完整字符串;错误时返回None而非抛异常,由上层决定是否重试或降级。 - 强校验:model / apiKey / baseUrl 三者缺一即抛
ValueError,不让系统带病启动。 - 默认 temperature=0:保证输出确定性(对应第三章采样参数三档)。
4.1.3 工具的定义与管理
工具的三要素(⭐ 这是第四章最值得记住的一条):
| 要素 | 作用 |
|---|---|
| 名称(Name) | 简洁唯一的标识符,供 Action 调用,如 Search |
| 描述(Description) | 自然语言说明用途 —— 整个机制中最关键的部分,LLM 靠它判断何时该用哪个工具 |
| 执行逻辑(Execution Logic) | 真正干活的函数 |
工具执行器 ToolExecutor:维护 {工具名: {description, func}} 字典,提供 registerTool(注册,重名警告并覆盖)、getTool(按名取函数)、getAvailableTools(拼成格式化字符串注入提示词)。
本章的实战工具 search(基于 SerpApi) 的工程细节,是"工具该怎么写"的范本:
- 优先解析
answer_box/knowledge_graph等最精确的结果,没有才退回前 3 条有机结果摘要 —— 这叫智能解析,直接提高喂给 LLM 的信息质量。 - 内部
try/except兜住异常,把错误转成字符串返回(如"搜索时发生错误: ..."),因为返回的文本会作为 Observation 进入下一轮,让智能体自我纠正。
4.2 ReAct(Reasoning and Acting)
ReAct(Yao et al., ICLR 2023)范式:是最经典的一个智能体范式,把**推理(Reasoning)与行动(Acting)**显式结合,形成"思考—行动—观察"循环,边想边做、动态调整。
4.2.1 为什么需要它
- 纯思考型(如思维链 CoT):能推理,但无法与外部世界交互 → 容易产生事实幻觉。
- 纯行动型:直接输出动作,但缺乏规划与纠错能力。
- ReAct 的洞见:思考与行动相辅相成 —— 思考指导行动,行动的结果反过来修正思考。
形式化表达(只记含义,不记符号):在第 ttt 步,策略 π\piπ(即 LLM)根据初始问题 qqq 与历史所有(行动, 观察)对,生成本轮的思考和行动;工具执行行动后返回新观察;把新的(行动, 观察)对追加进历史,直到模型在思考中判断任务完成。

ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。为此,ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:
Thought (思考): 这是智能体的“内心独白”。它会分析当前情况、分解任务、制定下一步计划,或者反 思上一步的结果。
Action (行动): 这是智能体决定采取的具体动作,通常是调用一个外部工具,例如 Search[‘华为最新款 手机’] 。
Observation (观察): 这是执行 Action 后从外部工具返回的结果,例如搜索结果的摘要或API的返回 值。
智能体将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中, 形成一个不断增长的上下文,直到它在 Thought 中认为已经找到了最终答案,然后输出结果。这个过程形成 了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。
ReAct适用场景:需要外部知识的任务(实时信息查询)、需要精确计算的任务(交给计算器避免 LLM 算错)、需要与 API/数据库交互的任务。
4.2.2 提示词模板(ReAct 的机制基石)
请注意,你是一个有能力调用外部工具的智能助手。
可用工具如下:
{tools}
请严格按照以下格式进行回应:
Thought: 你的思考过程,用于分析问题、拆解任务和规划下一步行动。
Action: 你决定采取的行动,必须是以下格式之一:
- `{tool_name}[{tool_input}]`:调用一个可用工具。
- `Finish[最终答案]`:当你认为已经获得最终答案时。
现在,请开始解决以下问题:
Question: {question}
History: {history}
四部分各自的作用:
| 部分 | 作用 |
|---|---|
| 角色定义 | “有能力调用外部工具的智能助手”,设定 LLM 的角色 |
工具清单 {tools} | 告诉 LLM 它有哪些"手脚" |
| 格式规约(Thought/Action) | ⭐ 最重要:强制输出结构化,代码才能用正则精确解析意图 |
动态上下文 {question} / {history} | 注入原始问题与不断累积的交互历史 |
4.2.3 核心循环与五个工程细节 ⭐
循环主干:格式化提示词 → 调用 LLM → 解析输出 → 执行工具 → 整合 Observation,直到任务完成或达到 max_steps。
| 细节 | 做法 | 为什么 |
|---|---|---|
| ① 最大循环次数 | while current_step < self.max_steps(默认 5) | ⭐ 防死循环的安全阀,防资源耗尽 |
| ② 正则解析 | Thought:\s*(.*?)(?=\nAction:|$) 与 Action:\s*(.*?)$,Action 再用 (\w+)\[(.*)\] 拆出工具名与输入 | 从纯文本中精确提取意图 |
| ③ 截断与兜底 | 解析不出 Action 就打印警告并终止;工具不存在返回 "错误:未找到名为 X 的工具。" | 把失败转成可被模型理解的文本 |
| ④ 工具分发 | tool_executor.getTool(name) 取函数后执行 | 工具名与实现解耦 |
| ⑤ 终止条件 | 识别 Finish[...] 并 return 最终答案 | 明确"什么时候算做完" |
闭环的关键一步:把本轮的 Action: ... 与 Observation: ... 追加进 self.history,下一轮生成提示词时模型就能"看到"上一步的结果 —— 这就是第 1 章的 Agent Loop 在代码里的样子。
4.2.4 ReAct 的特点、局限与调试
三个特点:
- 高可解释性:Thought 链让每一步"心路历程"可见,便于理解、信任与调试。
- 动态规划与纠错:走一步看一步,搜索结果不理想就下一步修正搜索词。
- 工具协同:LLM 运筹帷幄(规划推理),工具解决具体问题(搜索、计算),突破单一 LLM 在知识时效性与计算准确性上的局限。
四个固有局限(面试常问):
- 强依赖 LLM 自身能力:推理、指令遵循或格式化输出能力不足时,容易在 Thought 环节规划错误、在 Action 环节格式跑偏。
- 执行效率:每步都要调 LLM,串行循环带来高延迟与高费用。
- 提示词脆弱性:模板微小改动甚至用词差异都可能影响行为;并非所有模型都能稳定遵循格式。
- 可能陷入局部最优 / 原地打转:步进式决策缺乏全局长远规划。
五条调试技巧(实用):
- 调用 LLM 前,打印完整提示词(含所有历史)——追溯决策源头。
- 解析失败时,打印原始未处理文本——区分是模型没守格式还是正则写错。
- 验证工具的输入输出格式是否匹配。
- 加 few-shot 示例:在提示词中放入一两个完整的 T-A-O 成功案例。
- 换更强模型或把 temperature 设为 0。
4.3 Plan-and-Solve(先规划,后执行)
Plan-and-Solve(Wang et al., 2023)范式:为**解决思维链在多步复杂问题上容易"偏离轨道"**而生。它将任务处理明确地分为两个阶段:先规划 (Plan),后执行 (Solve)。
类比:ReAct 像侦探,据现场线索一步步推理随时调整;Plan-and-Solve 像建筑师,先绘蓝图再严格施工。许多大模型的 Agent 模式都融入了这一设计。
4.3.1 两阶段工作流

| 阶段 | 做什么 | 产物 |
|---|---|---|
| 规划阶段(Planning) | 接收完整问题,先分解问题并制定分步骤行动计划(本身也是一次 LLM 调用的产物) | 结构化计划 P=(p1,p2,...,pn)P=(p_1, p_2, ..., p_n)P=(p1,p2,...,pn) |
| 执行阶段(Solving) | 严格按计划逐一执行,每步可能是一次独立 LLM 调用 | 第 iii 步结果 sis_isi,依赖 (原始问题, 完整计划, 前面所有步骤结果);最后一步即最终答案 |
核心收益:保持目标一致性,避免在中间步骤迷失方向。
适用:多步数学应用题、需整合多信息源的报告撰写、代码生成(先构思结构再逐个实现)—— 即结构性强、可清晰分解的任务。
4.3.2 规划器 Planner
提示词的关键设计(保证输出可解析):
- 角色设定:“你是一个顶级的 AI 规划专家”。
- 任务描述:把复杂问题分解成简单步骤。
- 格式约束:⚠️ 强制输出被
python包裹的 Python 列表字符串,如["步骤1", "步骤2", "步骤3"]—— 比解析自然语言稳定可靠得多。
解析侧:切出代码块 → 用 ast.literal_eval 安全转成 Python 列表(⚠️ 不用 eval)→ isinstance(plan, list) 校验类型;ValueError / SyntaxError / IndexError 全部捕获并返回空列表,同时在日志里打印原始响应。
4.3.3 执行器 Executor 与状态管理
执行器的提示词必须包含四项信息:原始问题(不忘最终目标)、完整计划(知道当前步骤的位置)、历史步骤与结果(当前步骤的直接输入)、当前步骤(明确现在要解决哪一个)。并要求仅输出该步骤的答案,不输出解释。
for i, step in enumerate(plan): # 严格按序执行
response_text = llm.think(prompt(question, plan, history, step))
history += f"步骤 {i+1}: {step}\n结果: {response_text}\n\n" # ⭐ 状态就是这段历史文本
final_answer = response_text # 最后一步的结果即最终答案
PlanAndSolveAgent 的设计:本身不含复杂逻辑,只是协调者(Orchestrator),内部持有 Planner 与 Executor —— 这是"组合优于继承"原则的教科书示例。
4.3.4 局限与延伸
- 计划是静态的:一次性生成、不可修改。若执行中发现某步无法完成或结果不符预期,需要"动态重规划"机制(教材习题 4 原题)。
- 与 ReAct 的取舍:任务路径可预判 → Plan-and-Solve;路径依赖外部实时反馈 → ReAct。
- 分层规划(习题延伸):先生成高层抽象计划,再为每个高层步骤生成详细子计划 —— 兼顾全局与可执行性。
4.4 Reflection(自我反思与迭代优化)
Reflection 机制(源自 Reflexion,Shinn et al., NeurIPS 2023):为智能体引入事后(post-hoc)自我校正循环,让它像人类校对初稿、验算数学题一样审视并修正自己的输出。
4.4.1 三步循环 ⭐

| 步骤 | 谁来做 | 做什么 |
|---|---|---|
| ① 执行(Execution) | 用 ReAct 或 Plan-and-Solve 完成任务 | 生成"初稿" |
| ② 反思(Reflection) | 独立的、或带特殊提示词的 LLM 实例,扮演"评审员" | 按多维度评估并生成结构化反馈 |
| ③ 优化(Refinement) | LLM 把"初稿 + 反馈"作为新上下文 | 生成"修订稿" |
反思的四个评估维度:事实性错误、逻辑漏洞、效率问题、遗漏信息。
循环可重复多轮,直到反思认为无需改进或达到迭代次数上限。
三点价值:
- 提供内部纠错回路 —— 不再只依赖外部工具的反馈(ReAct 的 Observation),能修正更高层的逻辑与策略错误。
- 把一次性执行变成持续优化过程,显著提升复杂任务成功率与答案质量。
- 为智能体构建临时的短期记忆:"执行—反思—优化"的完整轨迹本身就是宝贵经验;且记忆可以是多模态的(代码、图像等),为多模态智能体奠基。
4.4.2 Memory 模块:迭代的前提
Reflection 的核心在于迭代,而迭代的前提是能够记住之前的尝试与获得的反馈。
class Memory:
def __init__(self): self.records = [] # 按序存放所有记录
def add_record(self, record_type, content): ... # 'execution' 或 'reflection'
def get_trajectory(self): ... # ⭐ 核心:把轨迹序列化成可插入提示词的文本
def get_last_execution(self): ... # 取最新"初稿"供反思
设计要点:get_trajectory() 是核心 —— 它把记忆序列化为"— 上一轮尝试 (代码) —“与”— 评审员反馈 —"交替的连贯文本,直接嵌入后续提示词。这也是第 8 章记忆系统的最小雏形。
4.4.3 三套提示词Prompt(Reflection 的灵魂)
| 提示词 | 角色设定 | 关键约束 |
|---|---|---|
| 初始执行 | “资深 Python 程序员” | 代码须含完整签名、docstring、遵循 PEP 8;直接输出代码,不要解释 |
| 反思 | ⭐ “极其严格的代码评审专家和资深算法工程师,对性能有极致要求” | 专注找算法效率瓶颈;分析时间复杂度;只有算法层面已最优时才允许回答"无需改进" |
| 优化 | “资深 Python 程序员” | 上一轮代码 + 评审反馈 → 生成优化版;同样要求签名/docstring/PEP 8、不输出解释 |
⭐ 角色设定直接决定优化方向:把"极致要求效率"换成"注重可读性的开源项目维护者",产出会完全不同(教材习题 6 原题)。
4.4.4 终止条件与运行实例
- 终止条件:反馈中出现"无需改进",或达到
max_iterations(默认 3)。 - 实例(生成"找出 1 到 n 之间所有素数"):初版试除法 O(nn)O(n\sqrt{n})O(nn) → 反思指出瓶颈并建议埃拉托斯特尼筛法 → 优化为 O(nloglogn)O(n \log\log n)O(nloglogn) → 第二轮反思认可效率并提及分段筛法等进阶方向,但判定"一般情况下无需改进" → 收敛终止。
- 这个案例说明:Reflection 的价值不仅是修复错误,更是驱动方案在质量和效率上阶梯式提升。
4.4.5 成本收益分析(必考)
| 成本 | 收益 |
|---|---|
| 模型调用开销:每轮至少额外 2 次 LLM 调用(反思 + 优化),多轮成倍增加 | 质量跃迁:把"合格"的初稿迭代成"优秀"的最终方案 |
| 任务延迟显著提高:串行过程,实时性差 | 鲁棒性增强:自我纠错循环能发现并修复逻辑漏洞、事实错误、边界情况 |
| 提示工程复杂度上升:要为执行/反思/优化三阶段分别设计调试提示词 |
结论:Reflection 是典型的"以成本换质量"策略。适合对质量/准确性要求极高、对实时性要求宽松的场景(关键业务代码、技术报告、科研推演、决策支持);反之应选更轻量的 ReAct / Plan-and-Solve。
4.5 三种范式对比与选型 ⭐
| 维度 | ReAct | Plan-and-Solve | Reflection |
|---|---|---|---|
| 组织方式 | 思考与行动融合在每一步,边想边做 | 思考与行动解耦为两阶段,先谋后动 | 在任意范式之上叠加执行—反思—优化迭代 |
| 外部交互 | 强依赖(每步都要 Observation) | 本章实现中不使用工具,纯提示词驱动推理 | 可选;依赖初稿来源 |
| 核心优势 | 环境适应性、动态纠错 | 结构性、目标一致性(不迷路) | 质量与鲁棒性跃迁 |
| 主要代价 | 串行循环 → 延迟与费用高 | 计划静态,遇阻需重规划 | 每轮至少 +2 次调用,延迟高 |
| 典型任务 | 实时信息查询、API/数据库操作、需精确计算 | 多步数学题、报告撰写、代码生成 | 关键代码/报告、科研推演 |
| 终止条件 | 输出 Finish[...] 或达 max_steps | 计划执行完毕 | 反馈"无需改进"或达 max_iterations |
| 记忆需求 | 历史文本(History) | 历史步骤与结果 | ⭐ 必须有 Memory 存储完整轨迹 |
选型口诀:探索性、依赖外部反馈 → ReAct;步骤可预判、需稳定执行 → Plan-and-Solve;输出质量要求高、可迭代 → Reflection。
可以组合(习题 1):例如 Planner 用 Plan-and-Solve 出计划 → Reader 用 ReAct 按步执行与外部交互 → Reviewer 用 Reflection 审查产出。这正是学习计划中 RepoGuard 项目 Planner–Reader–Reviewer–Reporter 四智能体的范式分配思路。
第四章小结
本章以第三章的 LLM 知识为基,亲手造轮子实现了三种经典范式。
ReAct 用"思考—行动—观察"的动态循环让智能体能与外部世界交互,赢在环境适应性与动态纠错,代价是串行低效与可能陷入局部最优,其工程骨架是提示词模板 + 正则解析 + 工具分发 + max_steps 安全阀。
Plan-and-Solve 把流程解耦为先规划后执行,靠"输出 Python 列表 + ast.literal_eval 解析"换取结构性与目标一致性,代价是计划静态、需另配动态重规划。
Reflection 在此之上叠加"执行—反思—优化"循环,用Memory 模块记住完整迭代轨迹、用三套角色化提示词驱动自我批判,以"每轮 +2 次调用、串行延迟"换取质量与鲁棒性的阶梯式提升。
三者的取舍可概括为:ReAct 赢在灵活,PS 赢在稳定,Reflection 赢在质量;工程上它们不是互斥选项,而是可以组合成多智能体流水线的三种基本节拍。
第五章 基于低代码平台的智能体搭建
本章定位:与第四章构成"手写 vs 平台"的对照。只需记住为什么需要平台、四平台各自定位、以及"混合开发"这个结论。
5.1 为什么需要低代码平台
四条价值:降低技术门槛(业务专家也能参与)、提升开发效率(数分钟验证原型)、更优的可视化与可观测性(节点级数据流与耗时一目了然)、标准化与最佳实践沉淀(预设 ReAct 模板、优化过的检索引擎)。
核心观点:低代码平台并非要取代代码,而是提供更高层次的抽象,让人聚焦"思考与行动的逻辑"本身。
5.2 四个平台的定位对比 ⭐
| 平台 | 核心定位 | 特点 | 适用人群 |
|---|---|---|---|
| Coze(字节) | 零代码 / 低代码 Agent 构建 | 拖拽式"搭积木";插件库丰富;一键发布到抖音/飞书/微信等平台 | AI 入门用户、产品经理、运营 |
| Dify | 开源、全栈式 LLM 应用开发与运营平台 | 融合后端服务与模型运营理念;支持 Agent 工作流、RAG Pipeline、数据标注与微调;插件市场 8000+;可私有化部署 | 有技术背景的开发者、企业级团队 |
| FastGPT | 开源知识库问答平台 + Agent 构建工具 | ⭐ 对 RAG 知识库场景极致优化(数据导入→分块→向量化→检索全链路);Flow 可视化编排;模型中立;可对接企微/钉钉/飞书 | 需私有知识库问答、智能客服的团队 |
| n8n | 开源工作流自动化工具(非纯 LLM 平台) | ⭐ 强在"连接":数百个预置节点串联 SaaS/数据库/API,在其中嵌入 LLM 节点;学习曲线较陡 | 需把 AI 深度嵌入现有业务流程的团队 |
本章四个配套案例(知道即可):Coze → 每日 AI 简报;Dify → 超级智能体个人助手(含问题分类器做多智能体路由、MCP 工具集成);FastGPT → 智能投顾助手;n8n → 智能邮件助手。
5.3 各平台主要局限
- Coze:不支持 MCP 协议,且无法导出标准化配置文件。
- Dify:学习曲线较陡,高并发场景有性能挑战。
- FastGPT:模板生态相对薄弱,免费版额度有限。
- n8n:⚠️ 内置存储非持久(Simple Memory / Simple Vector Store 都在内存,服务重启即丢,生产必须换 Redis/Pinecone 等外部存储);版本控制与多人协作不如 git 成熟;超高并发下节点调度有性能开销。
5.4 选型建议与混合开发
- 快速原型验证、非技术用户 → Coze
- 企业级应用、复杂业务逻辑、多模态生成 → Dify
- 基于私有知识库的问答系统、智能客服 → FastGPT
- 深度业务集成、通用自动化流程 → n8n
⭐ 结论(原文):低代码平台不取代代码开发,而是互补。混合开发才是智能体工程化的最佳实践:用低代码平台快速验证想法,用代码实现精细化控制;用平台处理标准化流程,用代码处理特殊逻辑。
第五章小结
第五章把视角从"手写代码"切到"平台化开发",用 Coze / Dify / FastGPT / n8n 四个平台演示了同一件事的另一条路径:把 API 调用、状态管理、并发控制封装成可拖拽的节点,换取门槛降低、效率提升与端到端可视化。
四者分工清晰——Coze 赢在零代码与分发生态,Dify 赢在企业级全栈能力,FastGPT 赢在 RAG 知识库细节,n8n 赢在通用业务"连接"。
它们共同的短板是持久化、高并发与版本控制,因此本章的最终结论不是"选平台还是选代码",而是混合开发:平台负责标准化流程与原型验证,代码负责特殊逻辑与精细控制。
第六章 框架开发实践(重点)
6.1 从手动实现到框架开发
6.1.1 为什么需要框架 ⭐
第四章的代码为教学而生,能完成特定任务,但构建多个复杂智能体时会遇到瓶颈。框架的本质是提供一套经过验证的"规范",把所有智能体共有的重复工作抽象封装:
- 提升代码复用与开发效率:通用 Agent 基类/执行器封装 Agent Loop,无论 ReAct 还是 Plan-and-Solve 都能基于标准组件快速搭建。
- 实现核心组件的解耦与可扩展性(框架会强制分离关注点):
| 层 | 职责 | 可替换性 |
|---|---|---|
| 模型层 Model Layer | 与 LLM 交互 | 轻松换 OpenAI / Anthropic / 本地模型 |
| 工具层 Tool Layer | 标准化的工具定义、注册、执行接口 | 新增工具不影响其他代码 |
| 记忆层 Memory Layer | 短期与长期记忆 | 可切换滑动窗口 / 摘要记忆等策略 |
- 标准化复杂的状态管理:处理上下文窗口限制、历史持久化、多轮对话状态跟踪 —— 第四章的
Memory只是最简单的开始。 - 简化可观测性与调试:内置**事件回调(Callbacks)**机制,在
on_llm_start、on_tool_end、on_agent_finish等关键节点自动记录日志/上报,远优于手动 print。
6.1.2 四框架总览 ⭐

| 框架 | 核心隐喻 | 协作机制 | 控制方式 |
|---|---|---|---|
| AutoGen | 群聊 / 圆桌会议 | 多角色"可对话"智能体通过自动化消息传递协作 | 涌现式(定义角色与规则,流程自然发生) |
| AgentScope | 智能体操作系统 | 消息驱动,MsgHub 作消息中枢 | 工程化 + 并发 / 分布式 |
| CAMEL | 两个专家对谈 | 角色扮演 + 引导性提示,双智能体自主对话 | 涌现式(最少人类干预) |
| LangGraph | 有向图 / 状态机 | 节点与边构成工作流 | 显式控制(预定义每步与跳转条件) |
6.2 AutoGen —— 以对话驱动协作
设计哲学:把复杂任务解决流程映射为不同角色智能体之间的一系列自动化对话(Wu et al., COLM 2024)。本章以 0.7.4 版本为例,它代表从类继承设计转向组合式架构的一次重大重构。
6.2.1 核心机制
① 分层 + 异步优先:
autogen-core:底层基础,封装 LLM 交互与消息传递,保证稳定与扩展性。autogen-agentchat:基于 core 的高级接口,简化对话式应用开发。- 异步优先(async/await):多智能体场景中网络请求是主要耗时,异步避免线程阻塞,显著提升并发能力。
② 核心智能体组件:
AssistantAgent:任务主要解决者,内部封装 LLM,靠不同系统消息赋予不同"专家"角色。UserProxyAgent:双重角色 —— 既是人类的"代言人"(发起任务、传达意图),又是可靠的执行器(执行代码/调用工具)。这清晰地区分了**“思考”(Assistant)与"行动"(UserProxy)**。
③ 从 GroupChatManager 到 Team:新架构引入更灵活的 Team 概念,典型如 RoundRobinGroupChat(轮询群聊):按预定义顺序依次激活智能体发言,直到最大对话轮次或满足终止条件。适用于流程固定的任务。
6.2.2 案例:模拟软件开发团队(比特币价格显示应用)
角色划分(多智能体系统设计的关键一步):
| 角色 | 职责 | 系统消息中的"交接语" |
|---|---|---|
| ProductManager(产品经理) | 需求分析、技术规划、风险评估 | 分析完成后说"请工程师开始实现" |
| Engineer(工程师) | 技术实现、编写代码、异常处理 | 完成后说"请代码审查员检查" |
| CodeReviewer(代码审查员) | 质量、安全性、最佳实践审查 | 完成后说"代码审查完成,请用户代理测试" |
| UserProxy(用户代理) | 代表用户发起任务、执行验证 | 测试完成后回复 TERMINATE |
协作三要素:participants(列表顺序 = 发言顺序)、termination_condition=TextMentionTermination("TERMINATE")(消息含关键词即终止)、max_turns=20(安全阀)。运行用 await Console(team_chat.run_stream(task=task)) + asyncio.run(...)。
⭐ 关键洞察:定义智能体的核心在于编写高质量的系统消息(System Message) —— 它既是"行为准则"也是"专业知识库",规定了角色、职责、工作流程乃至与其他智能体的交互方式。“通过系统消息进行提示工程,是设计高效多智能体应用的核心环节。”
6.2.3 优势与局限
优势:① 无需设计复杂状态机,把开发流程自然映射为角色对话,降低建模门槛——开发者只需关注"谁(角色)“与"做什么(职责)”,而非"如何做(流程控制)";② 角色高度专业化且可跨项目复用;③ UserProxyAgent 天然提供"人类在环(Human-in-the-loop)"接口,保证自动化始终受人类监督。
局限:① 基于 LLM 的对话本质不确定,可能偏离预期分支甚至陷入循环;② "对话式调试"难题 —— 出错时得到的不是清晰错误堆栈,而是一长串对话历史。
非 OpenAI 模型配置补充:需在 OpenAIChatCompletionClient 中传入 model_info 字典,显式声明 function_calling / max_tokens / context_length / vision / json_output / structured_output 等能力项 —— 告诉框架模型的能力边界。
6.3 AgentScope —— 工程化优先的多智能体平台
由阿里巴巴达摩院开发,面向大规模、高可靠的多智能体应用,内置分布式部署、容错恢复、可观测性等企业级特性。
类比:AutoGen 像灵活的"对话工作室",AgentScope 则是完整的"智能体操作系统"。
6.3.1 设计:分层架构 + 消息驱动
四层架构:
| 层 | 内容 |
|---|---|
| 基础组件层 | Message(统一消息格式,支持多模态)、Memory(短期/长期记忆)、Model API(抽象不同 LLM)、Tool |
| 智能体基础设施层 | 预构建智能体(浏览器、深度研究等)、ReAct 范式、智能体钩子、并行工具调用、状态管理;原生支持异步执行与实时控制 |
| 多智能体协作层 | ⭐ MsgHub(消息中心,负责路由与状态管理)+ Pipeline(顺序/并发等编排模式) |
| 开发与部署层 | AgentScope Runtime(生产级运行时)+ AgentScope Studio(可视化开发工具链) |
消息驱动的四个优势:异步解耦(收发双方时间上解耦,天然高并发)、位置透明(不关心对方在本地进程还是远程服务器,路由自动处理)、可观测性(每条消息可记录追踪分析)、可靠性(消息可持久化与重试,故障后保证最终一致性)。
统一消息结构:Msg(name=发送者, content=内容, role=角色, metadata={timestamp, message_type, priority})。
智能体生命周期:统一基类 AgentBase,开发者只需实现核心的 reply(x: Msg) -> Msg(思考与回应)与可选的 observe(x: Msg)(观察,通常写入记忆)—— 分离了内部逻辑与外部通信。
MsgHub 三大能力:灵活路由(点对点/广播/组播)、消息持久化(SQLite/MongoDB,支持长期任务状态恢复)、原生分布式(跨进程/跨服务器部署时由 RPC 自动处理通信,对开发者透明)。
6.3.2 案例:三国狼人杀(理解消息驱动与并发)
三层设计:游戏控制层(ThreeKingdomsWerewolfGame 维护全局状态、推进阶段、裁定胜负)+ 智能体交互层(完全由 MsgHub 驱动)+ 角色建模层(每个玩家是 DialogAgent 实例,提示词注入"游戏角色"与"三国人格"双重身份)。
两个最值得记的技术点:
- 用消息频道代替状态机:狼人阶段通过
async with MsgHub(self.werewolves, enable_auto_broadcast=True, announcement=...)动态创建一个临时私密频道;讨论阶段广播协商,投票阶段set_auto_broadcast(False)后用fanout_pipeline并行收集决策。游戏逻辑被表达为"在特定上下文中以何种模式交换消息",而非一连串僵硬的状态转换。 - 用结构化输出约束游戏规则:为每个行为定义 Pydantic 模型(如
DiscussionModelCN{reach_agreement, confidence_level(ge=1,le=10), key_evidence}、WitchActionModelCN{use_antidote, use_poison, target_name}),把游戏规则直接转化为代码层面的字段约束与验证(女巫不能同时对同一目标用解药和毒药、预言家每晚只查一人)。
并发与容错:fanout_pipeline(...) 并行向所有智能体发消息并异步收集响应(模拟"同时投票");关键环节 try/except 捕获异常后构造默认响应(如 confidence_level=5)保证流程不中断。
6.3.3 优势与局限
优势:消息驱动优雅替代僵硬状态机;结构化输出把规则变成可验证的代码约束;原生并发 + 单点异常不影响整体流程。
局限:⚠️ 架构复杂、技术门槛高(需理解异步编程与分布式通信);简单对话场景下有**“过度工程化”**风险;作为较新的框架,生态与社区资源有待完善。更适合生产级大规模系统,快速原型应选更轻量的框架。
6.4 CAMEL —— 角色扮演式的轻量协作
CAMEL初始目标:探索如何在最少人类干预下,让两个智能体通过"角色扮演"自主协作解决复杂任务(Li et al., NeurIPS 2023)。
6.4.1 两大基石 ⭐
① 角色扮演(Role-Playing):两个互补角色的智能体协作 ——
- AI User用户:提出需求、下达指令、构思任务步骤。
- AI Assistant助理:执行具体操作、提供解决方案。
典型设定(股票交易策略分析工具):AI User = 懂市场但不懂编程的"资深股票交易员";AI Assistant = 精通编程但不懂股票的"Python 程序员"。任务解决过程被自然转化为两位跨领域专家的对话。

② 引导性提示(Inception Prompting):⭐ CAMEL 最核心的技术 —— 对话开始前分别注入给两个智能体的结构化初始指令,确保它们"待在自己的角色里"并朝共同目标前进。四要素:
- 明确自身角色:“你是一位资深的股票交易员……”
- 告知协作者角色:“你正在与一位优秀的 Python 程序员合作……”
- 定义共同目标:“你们的共同目标是开发一个股票交易策略分析工具。”
- 设定行为约束与沟通协议(最关键):要求 AI User"一次只提出一个清晰具体的步骤"、AI Assistant"在完成上一步之前不要追问更多细节"、双方用特定标志(如
<SOLUTION>/<CAMEL_TASK_DONE>)标识完成。
6.4.2 案例:AI 科普电子书(心理学家 × 作家)
- 角色分配:
user_role_name="作家"(对话推动者、需求方,负责结构规划与可读性)、assistant_role_name="心理学家"(执行者、方案提供方,负责专业知识)。 - API:
RolePlaying(assistant_role_name, user_role_name, task_prompt, model=...);init_chat()自动生成开场(无需人工写),step(input_msg)驱动一轮完整交互(作家提需求 + 心理学家给内容),并把上一轮 assistant 的输出作为下一轮输入。 - 终止:达到
chat_turn_limit(30 轮)或任一方输出<CAMEL_TASK_DONE>。 - 观察到的四个自发阶段:框架搭建与目标对齐(1–5 轮)→ 核心内容生成与知识转译(6–20 轮,“请求—响应"循环,心理学家提供硬核知识、作家做"翻译官”)→ 迭代优化与质量保证(21–25 轮,作家看流畅性、心理学家做事实核查)→ 总结与升华。
6.4.3 优势与局限
优势:⭐"轻架构、重提示"—— 相比 AutoGen 的复杂对话管理与 AgentScope 的分布式架构,靠精心设计的初始提示就能实现高质量协作,自然涌现的协作往往比硬编码工作流更灵活高效。现已有多模态、工具库、多模型后端,并与 LangChain / CrewAI / AutoGen 互操作。
局限:① 对提示工程高度依赖(设计门槛高、调试难定位、不同 LLM 理解不一致);② 协作规模受限(缺 AutoGen 式对话路由、缺 AgentScope 式分布式状态管理、缺冲突仲裁);③ 任务边界(严格流程控制 → LangGraph 更合适;大规模并发 → AgentScope 更优;复杂多方决策 → AutoGen 群聊更灵活)。
6.5 LangGraph —— 用状态图精确控制流程(本章重点)
LangGraph 是 LangChain 生态系统的扩展。LangGraph 与基于"对话"的框架不同,它将智能体的执行流程建模为一种状态机 (State Machine),并将其表示为有向图(Directed Graph)。在这种范式中,图的**节点(Nodes)代表一 个具体的计算步骤(如调用 LLM、执行工具),而边(Edges)**则定义了从一个节点到另一个节点的跳转逻 辑。
LangGraph设计的革命性之处在于它天然支持循环,使得构建能够进行迭代、反思和自我修正的复杂智能体工作 流变得前所未有的直观和简单。
6.5.1 三个基本构成要素 ⭐
| 要素 | 定义 | 要点 |
|---|---|---|
| 全局状态 State | 用 TypedDict 定义的共享状态对象(对话历史、中间结果、迭代次数、当前步骤标记等) | 所有节点都能读、都能更新 |
| 节点 Node | def node(state) -> dict,接收状态、返回要更新的字段增量 | 执行具体工作的单元;是纯函数,便于单测 |
| 边 Edge | 连接节点;含常规边与条件边(Conditional Edges) | ⭐ 条件边通过函数判断状态、动态决定跳向哪个节点 —— 实现循环与分支的关键 |
class AgentState(TypedDict): # ① 状态
messages: List[str]; current_task: str; final_answer: str
def should_continue(state) -> str: # ③ 条件边函数
if len(state["messages"]) < 3: return "continue_to_planner"
return "end_workflow"
workflow = StateGraph(AgentState)
workflow.add_node("planner", planner_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()
for event in app.stream(inputs): print(event) # 运行
6.5.2 案例:三步问答助手(理解 → 搜索 → 回答)
状态设计的关键:SearchState 同时包含 user_query(LLM 理解后的需求总结)与 search_query(优化后用于搜索引擎的关键词)—— 让智能体先把自然语言提问优化成精炼关键词,显著提升搜索质量;另有 step 字段标记当前步骤,供下游节点做条件判断。
三个节点:
| 节点 | 职责 | 工程细节 |
|---|---|---|
| understand | 意图理解 + 生成搜索关键词 | 提示词要求按"理解:… / 搜索词:…"格式输出,再按分隔符切出关键词 |
| search(Tavily) | 真实联网搜索 | ⭐ try/except 捕获异常,失败时把 step 置为 "search_failed"(把失败写进状态,供下游决策) |
| answer | 生成最终答案 | ⭐ 检查 state["step"]:失败则回退为基于 LLM 自身知识回答并告知用户;成功则用带实时结果的提示生成有据可依的答案 |
图结构:START → understand → search → answer → END;编译时可传入 checkpointer=InMemorySaver() 获得持久化与多轮交互能力。
6.5.3 优势与局限
优势:① ⭐ 高度可控与可预测 —— 可精确规划每一步行为,对高可靠性、可审计的生产级应用至关重要;② 对循环的原生支持 —— 条件边可轻松构建"反思—修正"与"失败回退"路径;③ 模块化(每个节点是独立 Python 函数);④ 插入"等待人工审核"节点非常直接 → 天然的 Human-in-the-loop。
局限:① 样板代码多(Boilerplate),简单任务显得繁琐;开发者要更多思考"如何控制流程(how)“而非"做什么(what)”;② ⭐ 缺少"涌现式"的动态交互 —— 强项是执行确定的可靠流程,而非模拟开放式社会协作;③ 调试要求对整图有全局理解(问题可能在节点内部逻辑、节点间状态异变、或边条件判断)。
6.6 四框架对比与选型 ⭐

| 维度 | AutoGen | AgentScope | CAMEL | LangGraph |
|---|---|---|---|---|
| 协作模式 | 群聊(RoundRobin / Team) | MsgHub 消息中心 + Pipeline | 双智能体角色扮演 | 有向图 + 状态机 |
| 控制方式 | 涌现式(定角色与规则) | 消息驱动 + 工程化 | 涌现式(引导性提示) | 显式控制(预定义节点与边) |
| 并发/分布式 | 异步优先 | ⭐ 原生分布式、高并发 | 弱 | 依赖 LangChain 生态 |
| 循环支持 | 间接(靠对话轮次) | 靠消息模式 | 靠对话轮次 | ⭐ 原生支持(条件边) |
| 人类在环 | ⭐ UserProxyAgent 天然支持 | 支持 | 弱 | ⭐ 插入人工审核节点即可 |
| 上手成本 | 中 | 高(需懂异步/分布式) | 低(提示词驱动) | 中(样板代码多) |
| 典型场景 | 流程固定的多人协作(软件开发团队) | 大规模生产级、高并发 | 创意/深度协作(写作、研究) | 需可审计、可回溯的严谨流程 |
两条设计权衡主线(原文结论):
- ⭐ “涌现式协作” vs “显式控制”:AutoGen 与 CAMEL 通过定义"角色"与"目标"让协作行为从简单对话规则中涌现,贴近人类交互但难预测、难调试;LangGraph 要求明确定义每个步骤与跳转条件,牺牲了涌现的惊喜,换来可靠性、可控性与可观测性。
- ⭐ 工程化维度:AgentScope 揭示了第二重挑战 —— 无论选哪种协作范式,从实验原型推向生产都必须面对并发、容错、分布式部署,这代表"从能运行到能稳定服务"的关键跨越。
选型速答(对应教材习题 6):
- 高并发客服(1000+ QPS、7×24、需水平扩展)→ AgentScope(原生并发与分布式)。
- 科研论文辅助写作(两智能体多轮深度讨论、自主推进)→ CAMEL(角色扮演 + 引导性提示)。
- 金融风控审批(严格流程、明确分支、可追溯可审计)→ LangGraph(显式图结构 + 条件边)。
第六章小结
本章用四个框架回答了同一个问题:多智能体与复杂流程该怎么规范地构建。
AutoGen 把协作抽象成一场自动进行的"群聊",让开发者只需定义角色与职责,其核心价值是"系统消息即提示工程"与 UserProxyAgent 带来的人类在环;
AgentScope 走工程化路线,用统一的 Msg 消息、MsgHub 消息中枢与 AgentBase.reply 生命周期把并发、分布式、容错与可观测性做成基础设施,并用 Pydantic 结构化输出把业务规则变成可验证约束;
CAMEL 反其道而行,以"轻架构、重提示"的角色扮演 + 引导性提示,用最少代码激发两个专家智能体的深度自主协作;
LangGraph 则回到底层的状态机模型,以 State / Node / Edge(尤其是条件边) 三要素赋予开发者对工作流的精确控制,原生循环为可反思、可修正的智能体铺平道路。
四者的取舍最终收敛到两条主线:一是**"涌现式协作"与"显式控制"的权衡**,二是从原型到生产的工程化跨越——理解这两点,才算真正读懂框架,也才能在第 7 章造出属于自己的框架。
附录:速查表
| 概念 | 一句话 |
|---|---|
| ReAct | 边想边做:Thought → Action → Observation 循环,赢在动态纠错 |
| Plan-and-Solve | 先谋后动:规划器出 Python 列表计划,执行器按步执行并传递历史结果 |
| Reflection | 执行 → 反思 → 优化;靠 Memory 记轨迹,以成本换质量 |
| 工具三要素 | 名称 / 描述(最关键,决定 LLM 选谁) / 执行逻辑 |
| max_steps / max_iterations / max_turns | 防死循环的三道安全阀 |
Finish[...] / “无需改进” / TERMINATE | 三种范式的显式终止信号 |
| 结构化输出 | 强制 python包裹或 Pydantic 模型;用 ast.literal_eval 解析,绝不用 eval |
| 组合优于继承 | Agent 持有 LLM/Planner/Executor,而非继承它们 |
| 框架的三个解耦层 | 模型层 / 工具层 / 记忆层 |
| AutoGen | 群聊驱动;System Message 定义角色;UserProxy = 人类在环 + 执行器 |
| AgentScope | 消息驱动;MsgHub 路由 + 持久化 + 分布式;reply 定义智能体 |
| CAMEL | 角色扮演 + 引导性提示;AI User 提需求、AI Assistant 给方案 |
| LangGraph | State + Node + Edge;条件边实现循环;节点是纯函数 |
| 涌现 vs 控制 | AutoGen/CAMEL 涌现式;LangGraph 显式控制 |
| 低代码四平台 | Coze 零代码分发 / Dify 企业级全栈 / FastGPT 极致 RAG / n8n 通用连接 |
| 混合开发 | 平台快速验证 + 代码精细控制,才是最佳实践 |
更多推荐




所有评论(0)