ReAct Pattern — 评审
Source: Dev.to
空结果——接下来会发生什么?
Klover: 一个代理调用搜索工具却得到空结果。请讲一下在 ReAct 循环中接下来会发生什么——Thought 步骤会是什么样子,可能出现的两种错误是什么?
Me: Thought 步骤会分析接下来该怎么做。一个失败情况:它可能会用相同的查询再次调用工具,仍然得不到结果,最终陷入无限循环。
Klover: 这是第一种——无限重试循环。第二种是什么?
Me: 我不太确定第二种是什么。
Klover: 第二种是 幻觉。Thought 步骤看到没有结果,却没有尝试不同的办法,代理直接编造答案。它“推理”自己可能已经足够了解,生成一个自信但虚构的回复。这很危险,因为用户根本不知道信息并非基于实际工具输出。
代理应该实际做什么?
Klover: 那么,当搜索返回空结果时,一个设计良好的 ReAct 代理应该怎么做?
Me: 接下来的推理步骤应该识别出出现了问题——可能是查询太具体或用了错误的词汇——并尝试别的办法。或者如果重试无效,就向用户报告未能找到信息。
Klover: 正确。Thought 步骤应明确承认失败并转向。关键洞见在于——Thought 步骤是代理决定是 适应 还是 优雅放弃 的地方。两者都是有效的。幻觉永远不应该出现。
T‑A‑O 循环
Klover: 快速检查:循环的正确顺序是什么,每个字母代表什么,代理在哪里决定是给出最终答案还是继续进行?
Me: T — Think,A — Act,O — Observe。顺序就是这样。决定发生在 Think 步骤。
Klover: 完全正确。每一次 Thought 步骤,代理要么决定执行(选择工具、执行它、观察结果),要么决定已经完成(输出最终答案并退出循环)。这也是为什么 Thought 是最关键的步骤。
谁生成 Observation?
Klover: Action 和 Observation 有什么区别?具体来说——谁或什么生成每一个?
Me: Action 是外部工具调用或 API。Observation 是 LLM 对该工具调用输出的处理。
Klover: 接近但不完全正确。Action——是的,LLM 决定调用哪个工具,工具在外部执行。但 Observation 是工具/环境返回的原始输出。它是输入的数据,而不是 LLM 对其的思考。LLM 对该输出的分析发生在 下一个 Thought 步骤。
完整流程如下:
- Thought → LLM 推理
- Action → LLM 选择工具,环境执行它
- Observation → 环境返回结果(LLM 只接收)
- Thought → LLM 分析 Observation,决定下一步
Observation 是唯一不是由 LLM 生成的部分。它是现实世界的反馈。
Me: 是的,这样就清楚了。我之前把 Observation 和对它的推理混在一起了。
失败模式回顾
Klover: 列出我们已经讨论过的失败模式,并为每个提供一句话的缓解措施。
Me:
- 上下文窗口溢出 — 通过摘要进行缓解。
- 无限循环 — 限制工具调用的总次数。
- 注意力稀释 — 通过摘要进行缓解。
Klover: 未提示回忆三项全中。再加上之前提到的幻觉。你正确指出了权衡——摘要有助于解决上下文膨胀和注意力稀释,但它是有损压缩,可能会丢失后续重要信息。
复习会话:2026 年 2 月 8 日。仍在开发阶段。已回忆出 4 种失败模式中的 3 种(幻觉在提示下才提到)。已纠正 Observation 为环境输出而非 LLM 推理。下次复习目标是未提示回忆全部 4 种失败模式。