Wood Chen

AI Agent 如何做计划:从任务拆解、动态重规划到搜索与状态机

0 评论1 阅读3.9k 字

给 AI Agent 一个目标,比如“分析一批客户反馈,找出主要问题并生成报告”,它需要决定先读哪些数据、怎样分组、什么时候补充信息,以及什么结果才算完成。

这些决策组成了 Agent 的规划过程。把目标写成几条待办,只完成了其中一部分。真正进入执行后,还要处理依赖、失败、环境变化和权限边界。

理解 Agent Plan,可以沿着四个问题展开:计划怎样产生,执行怎样推进,偏离后怎样修正,系统允许它走到哪里。先规划再执行、反馈与重规划、多路径搜索、SOP 与状态机,分别提供了不同的处理方法。它们可以组合使用,不是一套互斥的标准分类。[1][2]

1. 计划要回答哪些问题

以“分析客户反馈”为例,一份粗略计划可能是:读取反馈、归纳问题、生成报告。

这份计划便于展示进度,却不足以直接驱动执行。读取哪个时间段的数据?归纳结果是否需要保留原始反馈编号?没有足够证据的问题能否进入报告?遇到权限不足,是重试还是暂停?

设计可执行计划时,可以为每个任务记录:

  • 具体目标和输入来源。
  • 依赖哪些前置任务。
  • 允许调用的工具及权限。
  • 预期产物和验收条件。
  • 失败后的处理方式。

例如,下面是一个示意性任务结构,不对应某个框架的固定接口:

{
  "id": "cluster_feedback",
  "depends_on": ["load_feedback"],
  "input_ref": "artifacts.feedback",
  "allowed_tools": ["analyze_text"],
  "expected_output": "带原始反馈编号的问题分组",
  "acceptance": [
    "每条输入都有明确归属或被标记为未分类",
    "每组结论能追溯到原始反馈"
  ],
  "on_failure": "保留已完成结果,提交失败原因"
}

这里的 acceptance 仍然需要执行器或验证器落实。把验收条件写进 JSON,不等于系统已经会检查它。

LangChain 介绍的 LLMCompiler 就把工具、参数和依赖放进任务图,由调度器在依赖满足后执行任务。这说明规划的输出可以是供程序调度的数据结构,而不只是自然语言清单。[2]

2. Plan-and-Execute:把规划与执行分开

Plan-and-Execute 的基本结构是由 Planner 生成多步骤计划,再交给 Executor 执行。一个执行任务可以包含多次工具调用,也可以由局部 Agent 完成。[2]

例如,客户反馈分析可以先生成这样的计划:

  1. 获取指定时间范围的反馈。
  2. 清理重复记录,保留原始编号。
  3. 对问题进行分组。
  4. 汇总频率并选取代表性案例。
  5. 生成报告,检查结论是否有数据支持。

它适合“目标清楚、任务可以提前拆解”的场景。显式计划也便于检查是否漏掉必要步骤。

规划器和执行器是两种职责,不要求它们必须使用不同模型。可以让能力较强的模型规划,再让小模型处理简单子任务;也可以使用同一个模型,甚至把某些步骤交给普通程序。节省成本的前提是子任务确实能由更便宜的执行方式完成。[2]

代价在于前期规划本身需要时间。如果计划基于错误假设,后续步骤会受影响。任务越依赖尚未取得的信息,就越不适合提前把所有细节写死。

一种设计办法是先确定阶段目标,把下一阶段的操作留到取得结果后再细化。例如,先读取代码库并定位问题,再根据实际结构安排修改,而不是在没有读代码时猜出所有文件路径。

它与 ReAct 的关系

ReAct 把推理与行动交织起来,根据环境反馈决定下一步。它同样包含规划和调整,只是通常没有把完整计划作为一个独立产物交出来。[3]

两者可以嵌套:外层 Planner 安排“定位问题、修改、测试、交付”,内层 Executor 采用 ReAct,在定位阶段反复读文件、搜索符号和检查调用链。

因此,选择显式计划还是逐步决策,重点是任务需要多大范围的预先协调。无需把它们理解为两种只能选一个的能力。

3. 反馈与动态重规划:执行结果改变后面的路

计划形成时,Agent 掌握的信息有限。工具执行后,新的事实可能使剩余计划失效。

比如,原计划要求读取整月反馈,但数据源只保留最近七天。系统应先记录数据缺口,再决定改用备用来源、缩小分析范围,或等待补充数据。继续生成“整月报告”会把计划中的假设当成事实。

LangChain 的 Plan-and-Execute 示例已经包含重新规划环节:根据执行结果决定结束,或生成后续计划。因此,动态重规划可以直接加入 Plan-and-Execute,不必另建一种完全不同的架构。[2]

flowchart TD
    A[目标与约束] --> B[生成或更新计划]
    B --> C[执行任务]
    C --> D[验证结果]
    D -->|继续| C
    D -->|需要调整| B
    D -->|条件满足| E[交付]
    D -->|需要授权或补充信息| F[暂停等待]

重试、重规划和反思处理的是不同问题

接口暂时超时,原来的方法仍然合理,可以做有限重试。数据源不存在,继续请求没有意义,需要改变计划。若希望后续尝试避免同类错误,还可以保存一段基于结果的经验总结。

Reflexion 研究的是后一类机制:Agent 根据任务反馈生成文字反思,将其保存在记忆中,影响后续尝试;这一过程不靠更新模型权重来完成。[4]

工程上可以据此分开处理错误:短暂故障走重试,方法失效走重规划,权限不足或目标不明确则暂停等待。不要让模型对所有错误都给出同一个“再试一次”。

反思需要可以检查的依据

让模型评价自己的答案,可以提供修改建议;是否真正解决问题,还要看外部结果。

代码任务可运行测试,数据任务可检查行数、字段和统计结果,发布任务可回读已保存的内容。开放式内容则可以用明确的评分规则和人工抽查。Anthropic 的 Agent 评估指南把程序判定、模型判定和人工判定作为不同工具,并指出模型判定需要校准。[5]

反思的触发频率也应按成本设计。一个可采用的办法是普通步骤做轻量检查,在阶段结束、关键假设变化或任务失败时,再调用模型评估。每次读文件都增加一轮长篇反思,会让简单任务变慢。

4. 多路径搜索:同时保留几种可能的解法

有些任务的困难在于“第一条路线很可能选错”。数学推导、组合问题,或具有明确测试标准的代码修复,可以考虑生成多个候选,再逐步筛选。

Tree of Thoughts 让模型生成和评价中间候选,并结合搜索方法探索、回溯。LATS 则把树搜索、行动、环境反馈和反思放在同一框架中。[6][7]

例如,修复一个解析器错误时,可以先提出三种假设:输入预处理错误、状态转换遗漏、边界判断错误。每条路径分别收集证据;与失败用例不符的路径被淘汰,剩余路径再继续细化。

这里要设计的是搜索过程,而不只是要求模型“给三个方案”:

  • 一个节点代表什么,是假设、部分解还是环境状态?
  • 候选如何产生,如何判断重复?
  • 评分依据是什么,是否能够运行测试?
  • 每次保留多少分支,最多搜索多久?
  • 什么时候结束,失败时怎样回退?

这些问题决定搜索是否值得它的额外开销。

搜索图、任务图和流程图不是同一个东西

搜索图记录候选解法,可能只选一条路径执行。任务依赖图记录必须完成的工作,例如先获取数据,再并行统计不同字段。状态转换图记录系统允许的流程,例如申请必须经过审核才能进入执行。

它们都可以画成图,但含义不同。LangGraph 提供图式编排能力,并不意味着用它编写的 Agent 自动具备多路径搜索;搜索仍需设计候选生成、评分和探索逻辑。[2][8]

分支得分不等于真实成功概率

模型说某条路径“更有希望”,只是评价信号。候选生成可能漏掉好解法,评估器也可能判断错误。在有限搜索预算下,应把目标设为提高找到可接受解的机会,而不是承诺全局最优。[6][7]

搜索还要求环境适合探索。草稿、沙箱代码和可回滚状态比较容易试错;真实付款、发送邮件和删除数据,不应为了比较路线就重复执行。可以先搜索操作方案,再由权限与审批机制控制实际动作。

5. SOP 与状态机:把业务边界写进程序

有些流程本来就明确,例如客服工单必须先核实信息,再判断问题类型,最后进入允许的处理分支。这里应先表达业务规则,再决定哪些节点需要模型。

Anthropic 区分了预定义代码路径驱动的 workflow,与由模型动态决定过程的 agent。SOP 和状态机通常更接近前者,也可以在局部节点中嵌入自主 Agent。[1]

下面是一个示意性工单流程:

flowchart LR
    A[接收工单] --> B[核实信息]
    B --> C{信息完整}
    C -->|否| D[等待补充]
    D --> B
    C -->|是| E[分类与拟定处理方案]
    E --> F[规则检查或人工审核]
    F -->|通过| G[执行允许的操作]
    F -->|未通过| H[人工处理]

模型可以帮助分类、提取字段和拟定方案;程序负责检查必填字段、校验身份、限制操作范围和控制状态转换。

LangGraph 的官方介绍包含持久化、人类介入和确定性步骤与 Agent 步骤的组合能力。它适合表达这类流程,但合规规则仍需要业务代码、权限系统和审计机制落实。[8]

固定流程的代价是维护成本。规则调整要更新流程,出现未覆盖情况要有人工处理或明确的异常分支。系统需要给例外留出口,而不是让模型私自绕过规则。

6. 四种思路怎样选择和组合

思路 主要解决的问题 可优先尝试的场景 需要承担的代价
Plan-and-Execute 提前协调多个子任务 目标清楚、步骤可拆解的长任务 初始计划可能依赖错误假设
反馈与重规划 根据新事实修正后续行动 调研、排障、环境变化较多的任务 验证和重规划增加开销
多路径搜索 避免过早押注一种解法 有清晰评估标准、可探索的难题 分支增长、评分误差和搜索成本
SOP 与状态机 限定允许的业务流程 稳定业务、审批和权限边界明确的流程 流程维护及例外处理

这张表是选型建议,不是性能排名。具体系统可以用真实任务评估后,再决定增加哪一层机制。

比如,一个处理客户反馈的系统可以用固定流程限定数据权限;在“分析”节点内由 Planner 拆分任务;对独立分组并行处理;在发现样本不足时重规划;最终由程序检查引用编号,再由人工审核报告。

多模型和多 Agent 都不是前提。先让一个模型、一组工具和一个执行循环完成任务,再根据实际瓶颈拆分角色,会更容易定位问题。这与 Anthropic 提倡先采用简单、可组合方案的建议一致。[1]

7. 生产系统还需要计划之外的保障

保存执行状态,不只保存待办清单

建议分别记录计划版本、任务状态、工具结果引用和失败原因。任务状态至少能区分未开始、执行中、成功、失败、等待输入和取消。

重新规划时,保留已经验证的产物,只修改受影响的后续任务。否则一次失败可能把整段工作重新跑一遍。

LangGraph 通过检查点保存执行状态,但恢复执行可能重新进入节点,不能假设每条外部操作都恰好执行一次。官方恢复机制说明,暂停恢复会从节点开头重新执行逻辑。[9]

有副作用的动作要单独保护

一个值得预先测试的故障是:外部系统已经接受请求,本地却没有收到响应。此时直接重试,可能重复发送或重复创建。

处理办法应与外部接口能力匹配:优先使用幂等键;缺少幂等支持时,先查询操作状态,再决定是否重试。检查点记录、业务操作记录和外部状态之间,也需要明确的一致性处理。

权限与预算由运行时强制执行

计划中写了“需要审批”,还要在工具调用入口拦住未审批的动作。重规划不能成为扩大授权范围的办法。

建议设置最大工具调用次数、超时、失败重试上限和搜索预算。达到边界后,应保存当前产物并说明未完成部分,避免无限循环。

工具返回内容可以影响事实判断,但不应被当成新的系统授权。检索到的网页、邮件和日志都可能含有要求改变行为的文字,执行器仍应遵守原来的权限范围。

8. 如何判断规划真的有用

评估时应比较最终结果和执行过程。计划看起来完整,不代表任务完成得更好。

可以准备一组有明确验收条件的任务,再加入几类故障:数据缺失、工具超时、权限拒绝、执行中途恢复,以及工具成功但本地未记录结果。

建议跟踪任务成功率、总耗时、单任务成本、无效工具调用、人工介入和错误动作。对结果正确性使用程序检查,对开放式质量使用评分规则和人工抽查。Anthropic 的评估指南也建议将能力评估与回归评估分开,避免改善一类任务时破坏已有能力。[5]

若加入显式规划后,成功率没有提高、耗时却明显增加,就应减少规划粒度或退回更简单的循环。若大多数错误来自无效工具参数,则先改工具接口和校验,比继续增加规划角色更直接。

Agent Plan 最终要解决的是如何组织并完成工作。显式拆解帮助协调任务,反馈机制修正错误假设,搜索比较候选解法,状态机限定业务边界。落地时还需要可验证的结果、可恢复的执行状态,以及不会被模型绕开的权限控制。

参考资料

[1] Anthropic:Building effective agents

[2] LangChain:Plan-and-Execute Agents

[3] ReAct:Synergizing Reasoning and Acting in Language Models

[4] Reflexion:Language Agents with Verbal Reinforcement Learning

[5] Anthropic:Demystifying evals for AI agents

[6] Tree of Thoughts:Deliberate Problem Solving with Large Language Models

[7] Language Agent Tree Search

[8] LangChain:Open source agent stack

[9] LangGraph:interrupt 参考文档

相关文章

评论 0