1. ReAct 循环中 Thought→Action→Observation 的失败如何被 Agent 自察
在 ReAct 循环中,当 Thought→Action→Observation 的推理-行动-观察链条出现失败时,Agent 如何自我察觉失败并据此调整下一步行为?
- ReAct 循环的分步结构与失败发生的环节
- 失败自察的信号来源(工具报错、Observation 异常、结果不一致)
- 感知失败后如何调整:换工具、改参数、改策略或放弃
ReAct 的循环是 Thought(推理)→ Action(行动)→ Observation(观察)反复迭代。失败自察的核心是"Observation 与原计划/期望不符"这个信号。常见失败类型包括:工具调用报错(超时、异常、格式错误、参数非法)、Observation 为空或返回异常值、Action 直接失败(如 API 404)、以及 Observation 与上一轮 Thought 的假设相矛盾。Agent 需要在 Prompt 中显式要求"如果 Observation 异常,先分析原因而非盲目继续",配合工具层的结构化错误码(区分永久错误与可重试错误)让模型能读懂失败原因。自察后 Agent 应进入"纠错分支":改用备选工具、重试、修正参数、简化目标,或最终升级。关键局限是:如果 Observation 本身看起来正常但语义上是错的(如返回了错误但格式合法的数据),模型无法通过"格式"自察,需要额外的校验器或事实核对。
自察的本质是把"失败"变成可被模型消费的信号,而不是让模型在黑盒里碰运气。因此工程上要做的不是让模型"更聪明",而是把失败信息结构化为 Observation 的一部分(错误码、错误层级、可重试标志),并让循环具备明确的纠错与终止路径。
def react_loop(agent, task, max_steps=10):
observation = ""
for step in range(max_steps):
thought, action = agent.plan(task, observation)
if action.get("type") == "finish":
return action["answer"]
try:
observation = execute_tool(action) # 可能抛异常
except ToolError as e:
observation = f"TOOL_ERROR[{e.kind}]: {e.message} (recoverable={e.recoverable})"
if not e.recoverable:
return escalate_to_human(task, observation)
return {"status": "gave_up", "reason": "max_steps_exceeded"}