XBSTACK XBSTACK
小白 / Xiaobai

小白 / Xiaobai

开发者 · 产品构建者

持续构建 AI 工程系统、开发者工具与长期数字资产。

关于作者与 XBSTACK →
AI Agent Planning 实战:任务拆解、计划校验、重规划与失败恢复:AI AGENT 工程文章封面

AI Agent Planning 实战:任务拆解、计划校验、重规划与失败恢复

AI Agent Planning 实战:系统拆解 AI Agent Planning 的生产级设计方法,覆盖任务拆解、计划生成、工具选择、执行循环、计划校验、重规划、循环控制、失败恢复与评估指标,帮助开发者构建更稳定的智能体执行系统。

发布 · 2026-04-2417 分钟阅读XBSTACK 原创
#ai-agent-planning#reasoning-loop#react-agent#replanning#failure-recovery

适合谁读

  • 正在从单 Agent 工作流转向复杂多 Agent 协同体系的系统架构师。
  • 关注多智能体在分布式环境中通信时延、网络开销与调试日志的一线开发人员。
  • 需要评估多智能体应用在具体垂直业务场景下落地价值与成本消耗的技术决策者。

一、 推理深水区:为什么你的 Agent 总是跑偏

大模型 Planning 的难点不在于如何生成一个看似合理的待办清单,而在于如何控制智能体在面对未知外部环境时的执行状态与自愈路径。

在智能体(Agent)的开发中,我们常用一个公式:Agent = 大语言模型 + 规划(Planning) + 记忆(Memory) + 工具调用(Tool Use)。其中,规划是大脑的导航仪。如果缺乏稳定的规划机制,智能体就只是一个听话但盲目的指令执行器,一旦任务链条变长,或者工具执行抛出非预期的网络波动,它就会陷入逻辑漂移,或者在同一个错误上原地打转。

一个典型的长任务失败场景是:计划要求依次读取多份文档,其中一份 PDF 已损坏或解析器持续失败。如果编排层没有错误分类、停止条件和 Replanning,Agent 可能机械重复同一步;如果状态管理又不清晰,后续节点还可能在缺少关键证据的情况下继续生成报告。

这类问题不需要虚构“某次生产事故”才能说明。Planning 的工程目标就是把计划、状态、错误、停止条件和重新规划变成可检查对象,让失败能够被分类、被熔断,并决定是修正参数、换路径、保留部分成果还是转人工。

二、 推荐规划拓扑:生产级 Agent Planning 架构设计

生产级 Planning 架构必须将目标解析、步骤校验、任务分派以及动态重规划进行模块化隔离。

为了让智能体在执行长链条任务时不跑偏,我将整个 Planning 引擎设计为以下核心拓扑架构:

用户总目标 (User Goal)
  │
  ▼
目标解析器 (Goal Parser)
  │
  ▼
任务拆解器 (Task Decomposer)
  │
  ▼
计划校验器 (Plan Validator - 防御性拦截)
  │
  ▼
状态管理器 (State Store) ◄─────────┐ (状态更新/回滚)
  │                                 │
  ▼                                 │
工具/动作选择器 (Tool Selector)      │
  │                                 │
  ▼                                 │
步骤执行器 (Step Executor) ─────────┼─► 重规划引擎 (Replanner - 异常时触发)
  │                                 │
  ▼                                 │
停止控制器 (Stop Controller) ───────┘ (熔断判断)
  │
  ▼
最终输出 (Final Answer)

在这套拓扑中,用户的原始输入首先被解析并拆解为强类型的子步骤(Task Steps)。在执行前,计划校验器会过滤掉无效或者高危的动作。每一个步骤在执行后,都会将结果(Observation)更新至状态管理器(State Store)。如果执行引擎检测到工具返回了严重报错,它不会直接中断,而是将错误上下文传给重规划引擎(Replanner),在保留已完成步骤(Checkpoint)的前提下,动态修正剩余的步骤计划。

三、 任务拆解:将非结构化目标提炼为强类型步骤

任务分解必须输出包含依赖关系、工具映射以及风险控制的结构化 JSON,而非零散的自然语言。

很多 Demo 让模型输出一段自然语言待办清单,然后直接把它当执行计划。这样很难做依赖、权限、参数和恢复校验,也没有必要要求模型暴露内部 chain-of-thought。

更合适的是让模型输出面向执行的结构化计划:step id、目标、候选工具、依赖、输入 Schema、预期输出和风险等级。内部推理过程不需要进入日志或执行协议。

以下是我在 Python 规划引擎中使用的结构化步骤数据模型示例:

from typing import List, Dict, Any, Optional
from pydantic import BaseModel, Field

class TaskStep(BaseModel):
    step_id: str = Field(..., description="子步骤唯一标识,如 step_1")
    step_goal: str = Field(..., description="本步骤的明确动作目标")
    required_tool: str = Field(..., description="执行本步骤需要调用的物理工具名称")
    input_arguments: Dict[str, Any] = Field(default_factory=dict, description="工具调用入参字典")
    expected_output: str = Field(..., description="本步骤预期回传的数据结构说明")
    dependency_id: Optional[str] = Field(None, description="本步骤所依赖的前置步骤 ID")
    risk_level: str = Field("low", description="本步骤的操作风险评级 (low, medium, high)")
    status: str = Field("pending", description="步骤状态 (pending, running, completed, failed)")

有了这样一套强类型的步骤字典,我们的执行引擎就可以做很多前置验证。比如,检查 dependency_id 是否在之前的步骤中已经成功执行;验证 required_tool 是否注册在当前的工具库(Tool Registry)中;核对 input_arguments 中的入参类型是否符合工具的 JSON Schema 定义。这在代码层保证了规划的可靠性。

四、 计划校验:在工具执行前执行防御性检测

计划校验是防范智能体滥用高危权限和执行无效动作的第一道防线,必须在任务下发前完成。

在长链条任务拆解完成后,我们绝对不能直接把计划扔给执行器(Executor)。大模型在规划时,很容易因为对本地工具的描述理解不透彻,而生成错误的参数,或者在被恶意注入的提示词引导下,拆解出高危的操作(例如删除根目录、越权下载敏感文件)。

因此,必须部署一个独立的计划校验器(Plan Validator),在计划生成后、执行前,对所有的 TaskStep 进行以下硬性校验:

1. 参数完整性与格式审查

校验器解析每一个步骤的 input_arguments,核对其是否缺少必要参数(如查询订单详情步骤中是否确实提取到了 order_id)。如果参数缺失,校验器直接在本地退回计划,让大模型重新提取,而不去真正调用数据库接口,防止产生无效的网络延迟。

2. 权限与高危动作拦截

如果大模型拆解出的步骤中包含了高风险操作(如 risk_level 评级为 high,或者试图执行写数据库、退款、发送群组通知等工具),校验器会强制将该步骤的执行挂起,自动向控制层申请人工确认(HITL),阻止智能体自主完成危险操作。

3. 工具可用性核对

检查计划中大模型自发填写的 required_tool 是否存在于系统的白名单中。如果模型幻觉出了一个不存在的工具(如 auto_reboot_server),校验器会在本地捕获并返回报错信息,强制大模型进行自省(Self-Correction)并重新规划。

五、 执行与推理循环:走一步、看一步、更新一步

Planning 不是一次性的静态工作流,而是一个基于实时观察(Observation)并动态修正的推理环。

在大模型规划算法的演进中,静态规划(One-shot Planning)在面临长链条任务时往往表现糟糕。因为现实物理环境是高度动态和不确定性的。例如,你第一步计划抓取一个网页,但该网页返回了 403 访问受限。如果是静态计划,系统会硬着头皮继续执行第二步的数据分析,最终输出一堆无意义的空报告。

因此,生产环境必须采用动态的“ReAct 推理环”设计(思维 -> 动作 -> 观察 -> 状态更新):

  1. 思维阶段 (Thought):模型根据当前的全局计划与当前会话状态,思考接下来应该干什么。
  2. 动作阶段 (Action):调用本地工具或执行特定的子任务。
  3. 观察阶段 (Observation):捕获工具执行回传的真实物理结果(成功数据、报错文本或超时状态)。
  4. 状态更新 (State Update):将 Observation 追加到状态管理器中,更新已完成步骤的缓存。
  5. 决策分支 (Decision):控制器判断任务是圆满完成(完成所有步骤),还是需要重规划(当前步骤失败且置信度低),亦或是直接熔断(达到最大步数上限)。

通过在执行的每一步中引入动态的 Observation 反馈,我们就把大模型的黑盒推理套在了一个可以通过程序实时拦截和观测的轨道上,极大地提高了执行的安全系数。

六、 选型决策:ReAct、Plan-and-Execute 与 混合编排的选择

根据不同的时延限制与逻辑分支,必须在 ReAct、静态规划、自适应重规划以及 Workflow 之间进行权衡。

在实际项目落地中,不同的规划算法有着截然不同的通信开销与适用场景。我将常见的规划方案整理为了如下的选型决策表,供你在架构设计时参考:

规划模式 (Planning Mode)核心原理 (Core Logic)推理时延 (Latency)Token 成本 (Cost)最佳适用场景 (Best Use Cases)缺点与限制 (Limitations)
ReAct根据 Observation 逐步决定下一动作取决于模型调用轮次与工具耗时取决于上下文、模型与轮次探索性任务、调试、下一步强依赖工具结果需要明确终止与无进展检测,历史上下文可能持续增长
Plan-and-Execute先生成结构化计划,再执行/校验步骤取决于执行过程中是否还需模型判断取决于计划生成、验证和失败修复目标较清晰、依赖关系能提前描述的任务外部条件变化后需要重新校验或重规划,不能假定原计划永久有效
自适应重规划 (Replanning)新 Observation 改变剩余路径时修正计划比纯执行多出重规划开销与触发频率和上下文大小相关长链路、外部依赖不稳定、需要保留部分成果的任务状态、幂等和新计划验证更复杂
Workflow + Agent代码定义确定性骨架,局部节点使用 Agent常能减少不必要的模型决策,但需实测由 agentic 节点数量和任务决定审批、交易、合规、确定性 SOP + 局部语义判断需要维护业务路由与 Agent 两套边界
Multi-Agent Planning多个专业 Agent 分工、handoff 或相互校验通常增加调用与协调,但并非固定倍数取决于 team pattern、并行度和终止策略单 Agent 已证明不足的跨领域复杂任务调试、权限、状态和成本归因更复杂

七、 动态重规划:失败后的自适应路径重构

当工具发生超时或返回非预期数据时,智能体必须具备基于最新上下文重新修正原计划的自愈能力。

在生产环境中,最常见的问题是工具调用失败。比如,Agent 计划使用 search_google 获取最新的数据,但是搜索引擎 API 突然返回了限流报错(Rate Limit Exceeded)。 在简易的 Agent Demo 中,它可能只会机械地重试,直到 Token 被耗尽。而一个具备 Replanning 能力的生产系统,应当这样处理:

  1. 捕获工具返回的物理报错状态。
  2. 保持已完成步骤(如 step_1, step_2)的状态不变。
  3. 触发重规划引擎,将当前失败的步骤 ID、具体的失败原因(如 API 限流)以及剩余的任务目标作为上下文,重新问询大模型。
  4. 大模型根据最新限制,生成一份修正版的新计划(例如放弃 search_google,改用本地只读数据库缓存,或者调用 search_bing 作为 Fallback 替代方案)。
  5. 执行引擎加载新计划,将执行指针指向新步骤,继续向下传导。

这种“失败后路径重构”的价值在于:当新证据真的改变剩余路径时,系统能够保留已确认成果并重新计算后续计划。它是否提高成功率、提高多少,必须在同一任务集上比较有/无 Replanning 的结果;不能预设从 70% 提升到 95%。

八、 停止条件与物理熔断:防范智能体陷入无限循环

为了防范 Agent 规划因遇到逻辑漏洞而陷入死循环,必须部署强力的全局步数与资源额度熔断器。

如果大模型在重规划阶段没有收到清晰的指导,或者新生成的计划依然依赖一个已经坏掉的工具,它就会陷入重规划的死循环(Planner Loop): 规划计划 -> 执行报错 -> 触发重规划 -> 生成相同的计划 -> 执行相同的报错

为了限制无进展循环和成本,编排层应配置 Stop Controller,但阈值必须从任务基线与失败成本校准:

  • 最大执行步骤/模型调用:按正常任务的步骤分布与硬业务预算设置,不统一写死 15 步。
  • 相同工具/参数重复失败:出现无进展重复时应停止该路径、重新分类错误或转人工;3 次可以是示例起点,不是统一标准。
  • 最大重规划次数:根据任务长度和 Replanning 成本设置;连续生成等价计划时应提前触发 no-progress 熔断。
  • Token / 费用 / wall-clock 预算:以模型价格、用户价值、SLO 和任务类型配置,不能把 10 万 Token 当成通用红线。

更稳妥的停止策略是组合多个信号:max_stepsmax_model_callstimeout、重复 Tool+Args、连续 state hash 无变化、Token/费用预算和外部 cancellation。

停止后,系统不能只是粗暴地抛出一个 500 异常,而是应当输出结构化的诊断结果:已经完成了哪些步骤、在哪一步因为什么原因而卡死、需要用户手动补充什么信息或参数,从而为人工接管提供清晰的审计材料。

九、 失败恢复与状态回滚:构建带 Checkpoint 的自愈系统

高可信度的 Planning 系统必须具备状态回滚能力,允许 Agent 在遇到临时网络抖动时退回到上一个检查点。

在执行长链条的复杂规划时,最让开发者头疼的是数据的一致性。例如,Agent 的计划是: 第一步:在本地数据库创建新用户 (SQL Write) -> 第二步:在第三方服务商注册 API Key (网络调用) -> 第三步:发送激活邮件给客户

如果第二步的网络调用由于超时失败了,大模型在进行重规划或者原地重发时,如果从头来过,就会在第一步重复执行 SQL Write,从而在数据库里产生垃圾脏数据。

为了解决这个问题,我们的 Planning 引擎必须支持状态检查点(Checkpoint)和回溯机制:

  1. Checkpoint 机制:每次子步骤成功执行并完成状态更新后,系统在数据库中保存当前租户会话的状态快照(包含当前的变量字典和已调用工具的返回值哈希)。
  2. 本地幂等性校验:所有的物理写入类工具(如 create_user)必须在代码端实现幂等性设计(通过检查唯一的外部业务标识,若发现已存在则直接返回成功,不重复写入)。
  3. 恢复与补偿:步骤失败后,从最近一个已确认持久化的 Checkpoint 恢复 workflow state;但这不是数据库事务回滚。已经发生的 SQL/API/邮件等副作用必须通过业务幂等账本查询、补偿操作或人工确认处理,不能只把执行指针退回去就认为外部世界也恢复了。

十、 Planning 评估指标体系

对规划能力的评估必须细化到计划合理性、工具命中率和重规划成功率等多维度的技术与业务指标中。

为了判断 Planning 改动到底有没有提升,应在固定任务集和固定成功标准下记录下面这些指标,而不是先设一个看起来“生产级”的百分比:

1. 规划技术度量 (Technical Metrics)

  • 计划合法率 (plan_validity_rate):生成计划通过 Plan Validator 的比例,包括格式、工具存在、参数和依赖关系。发布门槛应从当前基线与业务风险确定,不统一要求 97%。
  • 逻辑漂移率 (loop_rate):Agent 发生重复执行、无进展步骤或明显偏离目标的任务占比。
  • 重规划成功率 (replan_success_rate):触发 Replanning 后,最终仍完成原始目标的比例。应按错误类型和模型/版本分层记录,不再使用无实验资产支撑的“Sonnet 3.5 做到 88%”。
  • 平均/分位步骤数 (steps_per_task):用于发现异常长链路,但步骤越少不一定越好;还要同时看成功率、工具调用、成本和结果质量。

2. 规划业务度量 (Business Metrics)

  • 任务最终成功率 (task_completion_rate):智能体自主规划执行最终达成用户预期目标的任务比例。
  • 部分成功率 (partial_success_rate):当任务中途因物理限制无法继续时,系统能够成功返回已完成阶段性成果的比例。我们鼓励局部成功,而不是全盘报错。
  • 单任务平均消费 (cost_per_completed_task):成功完成一次复杂规划平均消耗的美元金额。

十一、 常见设计误区与报错排查 (Error Logs)

设计不当的规划引擎极易遭遇逻辑漂移、递归爆炸和死循环烧钱等典型报错,需要建立精准拦截。

下面三组是用于 Planning 回归测试和排障设计的构造性失败场景,不是 XBSTACK 声称经历过的生产事故。日志中的步数、相似度阈值和上下文长度只是示例,实际规则应替换成你的 Trace 与任务基线:

1. Logic Drift (任务逻辑漂移异常)

  • 现象:智能体在执行步骤超过 8 步后,完全偏离了用户最初的任务目标,开始在一些无关的边缘支线工具中疯狂打转。
  • 报错文本:
    Warning: [LOGIC_DRIFT_DETECTED] Task 'task-1012' current thought similarity to raw user_goal 'Generate Q2 Budget Report' has fallen below threshold 0.40. Current focus: 'Translating read_file debug comments to French'.
    
  • 根本原因:随着执行步骤和 Observation 日志的不断累加,模型的上下文窗口被大量工具的返回细节填满,大模型原生的 Attention 机制发生了衰减,忘记了最初的 Goal。
  • 排查对策:在每一轮的 Reasoning Loop 提示词模板中,强制将用户的 raw_user_goal 放在 Prompt 的最底部(近模型输出区);并在 Thought 阶段增加断言提示:请核对当前动作与用户最终目标的关系。如果计算出当前动作与原始目标的余弦相似度低于阈值,强制截断上下文,仅保留 Task Steps 骨架和当前 Observation,重新注入主目标。

2. Vague Observation Loop (模糊 Observation 导致的死循环)

  • 现象:工具执行发生错误返回了模糊的报错(如 Error 500),Agent 在 Thought 阶段因无法判定错误原因,机械地不断尝试重复调用该工具。
  • 报错文本:
    Error: [PLANNER_RETRY_LOCK] Agent repeated step_3 'query_postgres' 3 times with identical arguments. Reason: Tool returned 'Internal Server Error (500)'.
    
  • 根本原因:本地工具在设计时,没有对报错信息进行语义化包装,直接把原始的 HTTP 状态码或空指针异常丢给了模型。大模型在没有足够“线索”的情况下,无法进行有效的自省和参数调整。
  • 排查对策:在编写工具(Tool)函数时,必须将底层的 exceptions 进行包装,返回含有明确语义的错误说明。例如,不要直接返回 500,而是返回:工具执行失败:Postgres SQL 查询超时,原因是表中缺少索引导致全表扫描,请尝试添加 Limit 限制或优化 WHERE 字段。 只有提供这种带有技术诊断的 Observation,大模型才能在 Replanning 阶段生成正确的自愈方案。

3. Recursive Decomposition Explosion (递归拆解爆炸)

  • 现象:大模型将一个原本非常简单的任务(如“给用户发送一封包含发票的邮件”)过度拆解为几十个极小的原子步骤,导致 Context 在几秒钟内爆掉,产生高昂的账单。
  • 报错文本:
    Fatal: [CONTEXT_OVERFLOW] Planning step count reached 24. Task decomposition generated nested sub-plans. Context window exceeded 128,000 tokens at step 'step_18_verify_cc_email_format'.
    
  • 根本原因:拆解 Prompt 中没有限制拆解层级与步骤粒度,大模型表现出了过度严谨的“神经质”偏好,把每一个辅助的格式校验都独立为了一个步骤。
  • 排查对策:限制拆解层级与粒度,把邮箱格式、文件名、Schema 等确定性校验留在代码中,不让模型把每个机械校验都规划成独立步骤。步骤数可以设预算,但不应把 3–8 步当成所有任务的固定最佳范围;应根据同类任务的正常分布与成功率校准。

十二、 继续阅读

要在生产中落地高可信度的智能体,你需要进一步学习如何在各个流程层级引入健壮的治理规范。

站外参考:

专题入口 / AI Agent Hub

从单个 Agent 问题继续进入完整生产体系

AI Agent 专题统一组织架构、记忆、工具调用、评测、安全、部署和多智能体协作,让每篇文章都回到明确的主题主页面。

继续阅读

返回专题 →
OpenAI Agents SDK 重复 Tool 名称:为什么后注册工具会覆盖前一个?OpenAI Agents SDK 重复 Tool 名称:实测 openai-agents 0.19.2:两个 FunctionTool 使用同名 lookup 时,SDK 校验不会报错,Agent 仍把两个工具交给模型,而本地分发表只保留后注册工具。本文给出离线复现、风险边界、启动前校验和修复方案。OpenAI Agents SDK Tool Approval 如何恢复?RunState 跨进程与 v0.19.3 流式 Resume 实测OpenAI Agents SDK RunState 如何恢复 Tool Approval?本文对比 openai-agents 0.18.3 与 0.19.3,实测跨进程批准/拒绝、流式 Resume 丢失已批准 Tool Output 的回归与修复,并验证重复投递、业务幂等和 Context 秘密边界。AI Agent Memory Retrieval 实战:混合检索、重排、时效性与冲突消解系统拆解 AI Agent 记忆召回链路,覆盖身份与作用域过滤、结构化查询、向量召回、混合检索、多信号重排、时效性、冲突消解、Prompt 预算、可观测性与回归测试。AI Agent 生产化治理:评估、可观测性、部署、成本控制与人工审批闭环AI Agent 生产化治理:系统拆解 AI Agent 从 Demo 走向生产环境所需的治理能力,覆盖任务评估、Trace 可观测性、工具调用审计、状态管理、部署架构、任务队列、模型路由、成本控制、人工审批、灰度发布和回滚机制,帮助开发者构建可上线、可监控、可复盘的智能体系统。

AI 工程周报

只发真正改变工程判断的变化、故障、实验和新资产。

评论与补充证据

参与讨论

问题、验证与勘误

登录后可发表评论。所有新评论先进入审核;审核期间仅评论者本人和管理员可见,通过后才公开。

登录评论 审核后公开
正在加载评论区…