30 秒看懂
智能体让模型选择下一步行动,因此比代码控制的工作流更灵活,却也更难预测和评估。斯坦福讲师 Michael Ryan 对比了五种工作流模式与 ReAct、Reflexion、CodeAct 和先计划再执行等设计。他还介绍如何通过事件日志、摘要、观察结果遮蔽及独立子智能体管理上下文,并分析精简框架 Pi 的取舍。
- 1控制流位置区分工作流与智能体工作流由程序规定步骤,智能体由模型根据观察结果选择行动。Ryan 说,这体现了可预测性与适应性的权衡。
- 2五种工作流模式可以组合使用提示链、路由、并行化、编排器与工作者、评估器与优化器分别解决任务的不同部分。反馈循环需要有用且可靠的评估。
- 3STORM 结合多种视角、搜索与并行分支系统一边直接生成提纲,一边从动态生成的多个视角开展研究对话,再利用证据完善提纲。
- 4ReAct 将推理与工具使用交替进行模型推理、行动、观察,再决定下一步。Ryan 将其与 Reflexion 对比,后者把之前尝试的反馈存成记忆。
- 5CodeAct 将一组工具调用写成程序生成的程序可以循环处理各国价格、税费和运费,再返回答案;Ryan 将它与逐次发出文本或 JSON 调用进行比较。
- 6上下文管理既要聚焦,也不能丢失连续性事件日志保留历史;记忆、压缩、观察结果遮蔽和独立子智能体则控制输入模型的内容。
- 7Pi 的小型默认工具集带来安全取舍Ryan 说该框架默认启用四个工具,没有内建权限弹窗;他认为在某些应用中这有风险。
要点建议
- 步骤可重复时选择代码控制的工作流;需要根据观察结果调整下一步时再考虑智能体。
- 根据任务和预算组合提示链、路由、并行处理、动态委派和反馈循环。
- 对反思步骤做基准测试:Ryan 指出,没有外部反馈的自我纠正可能让结果变差。
- CodeAct 将多个工具操作写成代码;先计划再执行则能运行依赖图,不必每一步都由模型重新决策。
- 保留完整事件日志,同时选择、压缩或隔离输入模型的上下文。
- Ryan 认为 Pi 精简且易于扩展,但警告默认缺少权限检查在某些场景下存在风险。
按章节阅读整理后的全文
根据任务选择控制流
Ryan 区分由代码控制的工作流与由模型控制的智能体。模式有助于做设计决策,但需要适配具体应用。
设计模式为开发者提供思考智能体系统的可复用方法,但它们是不完整的方案,需要根据环境调整。Ryan 介绍工作流、智能体推理和上下文管理模式,最后分析 Pi 智能体框架。
被问到哪些模式可能保持稳定时,Ryan 提到持续流行的推理与行动循环,以及越来越常用于组织工具的 MCP。他说,这个领域仍然很新,约定还在演变。
工作流与智能体的实际区别在于控制流位于哪里。工作流由程序规定编排,即使其中包含分支和循环也是如此;智能体则让模型根据观察结果选择下一个工具或行动。

代码控制的工作流通常更可预测、更容易评估;智能体更灵活,却更难调试和优化。分类工单、检索政策并起草回复可以使用工作流;调查并解决问题则可能需要智能体。
Ryan 强调,工作流仍然可以分支、路由和循环。区别不在于系统是否使用语言模型,而在于下一步由程序逻辑还是模型决定。
组合五种工作流模式
提示链、路由、并行、动态委派和评估循环各有取舍。STORM 将其中多种模式组合起来研究并撰写文章。

Ryan 介绍五种工作流模式:提示链、路由、并行化、编排器与工作者,以及评估器与优化器。实际系统往往会组合使用,而不是只选一种。
提示链把任务拆成多次调用,并可在步骤之间设置检查关口。先从邮件中提取日程、再选择表情,比使用一个大提示更容易理解,但连续调用模型通常会增加延迟。
路由先分类输入,再将其交给合适的模型或下游工作流。简单数学题可以交给小模型,前沿难题交给更强的模型,以此权衡质量、成本和时间。
路由示例用小模型处理简单问题,用更大的模型处理难题。前置分类器相当于一个选择下游路径的开关。
并行化既可以拆分独立工作,也可以多次运行同一任务后投票。例如,生成回复的同时运行安全分类器;也可以汇总一道数学题的多个答案,或并行评估十项评分标准。
在编排器与工作者模式中,系统动态决定需要哪些子任务和多少个工作者,这不同于预先固定的并行分支。复杂软件项目可以拆成界面、颜色选择器等部分。
评估器与优化器循环先生成答案,再评估并反馈修改意见。Ryan 说,只有质量标准能够清楚表达、评估者又能可靠判断时,这种方法才有帮助;如果目标是模型难以评估的人类偏好,人工反馈可能更合适。
STORM 展示了如何组合这些模式。输入 2024 年花莲地震之类的主题后,它会研究资料并生成带引用的维基百科风格文章。整项工作结构明确,适合实现为工作流,但比一次模型调用复杂。

STORM 调查相关文章,识别居民、政界人士和地震学家等视角。它为每个视角生成问题、搜索答案并形成对话;另一条分支直接起草提纲,再用研究结果完善提纲。
视角数量可以动态生成,因此这一部分类似编排器与工作者模式。问答循环类似评估和迭代;各分支内部使用提示链,直接起草与研究分支则并行运行。
系统可以搜索互联网。Ryan 说,相比直接生成提纲,研究分支试图获得更广泛、更多样的覆盖。对话长度受配置的上限约束,但模型也可以自行表示完成。
Ryan 说,研究对话旨在呈现直接提纲可能遗漏的视角。对话长度是一个设计参数,系统可以设置上限。
比较多智能体系统时,Ryan 建议先明确成本、准确率等指标。更多智能体可能提高准确率,也可能增加成本;较大的监督模型可以审查小模型的工作,但他没有说 STORM 使用了这一额外循环。
评估器可以是检查小模型工作成果的更强模型,但 Ryan 提醒,这类额外循环会增加开销。如何比较取决于预算和质量指标。
Ryan 说,展示的 STORM 结果表明,相比所列基线,它生成的文章与人工文章更相似,在模型评估的趣味性、组织、相关性和覆盖度上也得分更高。这解释了为什么要收集多个视角,而不是只直接起草。
用 Archon 搜索工作流
Archon 在预算约束下针对基准测试推理技术与模型的不同组合。Ryan 用数学流程解释其组件。

Archon 采用另一种方法:搜索工作流架构。输入包括目标基准、推理预算、可用模型,以及生成器和验证器等组件。系统测试候选架构并不断优化。
这些组件各司其职:生成器提出答案,融合器组合候选结果,评论器描述优缺点,排序器排列答案,验证器推理并可纠正答案。测试生成和评估则提供明确标准。
Archon 的验证器先对候选答案推理,再可重新生成经过纠正的答案。测试组件可以表达简洁性或解释是否充分等标准。
论文通过提示现成模型来承担这些角色。Ryan 提醒说,排序效果取决于上下文:模型可能善于比较少量候选项,却难以排列一千项。架构还必须让生成器实际完成并给出答案。
一个通过搜索得到的数学流程从不同模型采样多个答案,进行评论和排序,分组合并,再验证并再次合并。答案的多样性很重要:如果所有候选答案都相同,生成多个方案的价值就会大幅下降。
流程最后的融合器本身也是一个选定的模型;它负责组合已经排序的候选答案,并不一定只处理同一家模型的输出。
Ryan 并不建议把这条流程当作解数学题的默认方法。它展示的是如何通过搜索针对具体场景优化工作流;论文报告,在足够的 token 预算下,搜索得到的架构在其实验中超过了当时的前沿数学基线。
推理、行动、反思与规划
Ryan 对比 ReAct、Reflexion、CodeAct 和先计划再执行,并讨论反馈、成本及额外反思可能带来的负面效果。
智能体反复调用模型、与环境交互、接收反馈并决定何时停止。设计智能体需要决定模型如何推理、采取行动和处理随之而来的观察结果。
ReAct 将推理和行动交替进行。例子中,智能体搜索 Apple Remote,了解到 Front Row 软件,针对歧义调整搜索,最终发现键盘功能键也能控制它。推理帮助它根据上一步结果选择下一次搜索。

Ryan 指出,原始 ReAct 论文发现,在其实验条件下简单提示并未胜过所有更大模型的基线,而用推理与行动轨迹微调可以改善表现。他认为,面向智能体能力的后训练如今已很常见。
Reflexion 加入先前尝试的经验。执行模型生成轨迹,评估器进行判断,再把反思结果存起来供后续尝试使用。在括号匹配示例中,测试失败揭示:仅统计左右括号数量无法确认顺序正确。

在括号示例中,反馈记录第一次方案失败的原因,让后续尝试同时检查数量平衡和顺序。Ryan 借此说明反思如何成为可复用的经验。
Ryan 介绍的结果显示,在过往轨迹之外加入反思,比只提供轨迹更能提升表现。但另一篇论文发现,没有外部反馈时,提示强模型自我纠正有时反而会降低数学和常识题表现。他建议对额外步骤做评测,不要假设它一定有用。
Ryan 补充说,部分关于自我纠正无效的发现早于较新的推理模型。实用的设计问题是:显式反思步骤是否能改善正在测量的具体系统。
回答提问时,Ryan 说早期 Reflexion 系统通过提示要求模型反思。现代推理模型可能已经执行部分自我纠正,因此团队应结合自己的评测和数据比较不同方案。
CRITIC 论文为验证器提供工具,让它与环境交互,而不是只依赖自身判断。Ryan 说,论文报告的提升说明,外部反馈有时比单纯要求模型自我评价更有用。
CodeAct 将行动表达为可执行代码。在比较各国手机价格时,模型不必为每个国家分别发出 JSON 或文本工具调用,而可以编写程序,循环调用价格与换算函数并选出最低值。
在手机价格示例中,可用函数包括汇率、税费、商品价格和运费估算。程序可以组合这些操作,再把结果返回给智能体。
代码可以在一轮中执行多个操作;如果结果不足,智能体还可以继续编写代码。Ryan 说,论文在所测模型上通常发现,代码行动比文本或 JSON 行动成功率更高、所需轮次更少。
先计划再执行把决定步骤与运行步骤分开。ReWOO 先生成引用前序输出的计划,再由工作者执行有依赖关系的调用,最后生成答案。模型不必在每次观察后重新选择下一步。
ReWOO 计划用占位符表示尚未取得的证据。工作者取得结果后,再将其填入下一个依赖步骤。
LLMCompiler 同样创建依赖图,使独立调用能够并行执行;验证失败时可以重新规划。Ryan 说,代码生成往往能更灵活地表达相同思路,但规划在编排中仍然有用。
保留正确上下文,同时维持连续性
事件日志保存历史,记忆、压缩、遮蔽和隔离控制模型输入。各种方法的成本与延迟各不相同。
上下文工程决定每次调用时模型能看到什么。Ryan 说,需要谨慎选择长对话历史、文档、指令和工具输出:目标是保持上下文聚焦,同时保留需求、约束和进度。
聚焦的上下文应包含当前任务所需内容;连续性则意味着在调整上下文时保留目标、需求、约束和进度。移动较早的文本还会影响缓存复用。
OpenHands 展示了持久事件日志:用户消息、智能体行动和工具观察结果都记录为事件;每次模型输入都从记录重建。可以改变呈现给模型的上下文,而不删除底层历史,日志也可供监控钩子使用。

每次重新调用模型时,系统会过滤事件流并转换成消息。即使呈现的视图省略或压缩旧内容,原始记录仍然完整。
记忆卸载将事实保存在当前上下文之外,并在需要时检索。Ryan 举了个人助理的例子:生日和伴侣姓名可以保存起来供日后使用,不必将所有过去的对话一直放在模型窗口里。
上下文压缩会在内容过长时总结较早的推理、行动和观察结果。简单实现是在固定阈值处生成摘要;更复杂的智能体流程可以在压缩时检索信息,但会增加延迟。

观察结果遮蔽是另一种选择:缩短或移除旧工具输出,而不是让模型总结所有内容。Ryan 指出,观察结果可能占据大量 token,尤其是工具返回长文档或程序输出时;完整事件日志仍可保留这些内容。
修改过去的上下文可能使模型的键值缓存失效,因此系统可以每隔若干轮再遮蔽观察结果,而不是持续修改。Ryan 说,所引研究发现,这种方式的任务表现与模型摘要大致相当,程序化遮蔽更简单,也无需等待生成摘要。

上下文隔离可以把搜索密集型任务交给拥有独立窗口的子智能体,再向主智能体返回简要结果。渐进披露是另一种方法:预先提供技能名称,只在需要时才把详细指令加入上下文。
子智能体可以在自己的上下文中读取大量文档和搜索结果,只返回简短摘要,避免协调智能体携带每个中间观察结果。
Ryan 区分了技能和工具:技能提供指令与上下文,工具则在环境中执行行动。记忆、压缩、事件日志、遮蔽和隔离可以组合使用;系统应避免无关上下文,同时保持任务连续性。
Pi 用精简框架包装模型
这个案例结合 ReAct 循环、少量工具和可扩展的上下文管理。Ryan 指出缺少权限检查带来的安全取舍。
Pi 是一个精简、可扩展的智能体框架。Ryan 说,它默认启用 read、bash、edit 和 write 四个工具;基础设计没有子智能体、权限检查、计划模式和后台 bash 等功能。
Pi 使用 ReAct 风格循环,一次 bash 调用本身可以运行脚本,类似以代码作为行动。它将上下文存成可从早期节点分支的树,也支持技能和压缩:保留最近对话原文,总结较早部分。
压缩时,Pi 总结某个截点之前的记录,并原样保留之后的记录。下一次模型调用会收到系统提示、摘要和近期对话。
Ryan 说,Pi 使用其进程拥有的权限,执行危险命令前不会弹窗询问。他认为,根据应用场景,这确实可能带来安全风险。他还认为,更强的模型可以配合更简单的框架,较弱的模型可能需要更多结构;这种权衡需要测试。
同频道的其他文章
1:17:14EN → 简体中文
1:40:43EN → 简体中文
1:19:15EN → 简体中文
1:11:21EN → 简体中文
1:16:31EN → 简体中文
1:03:19EN → 简体中文