Q973Agent 架构真题解析Agent 架构AgentAlpha 社区真题库约 10 分钟更新 2026-09-29

为什么 CoT(思维链)不够?为什么需要 Action、Observation

为什么 CoT(思维链)不够?为什么需要 Action、Observation

1️⃣ 考察意图

面试官想考察你是否真正理解 LLM 作为“推理器”与“执行器”之间的鸿沟。这不是背概念题,而是系统设计取舍题。刁钻点在于:很多人只背了 CoT 能提升推理,却说不清它为什么在真实任务中“纸上谈兵”——CoT 生成的思考链无法改变外部世界,也无法感知执行结果。答好了能展示你对 Agent 完整流程(Think → Act → Observe)的工程理解,以及从“模型能力”到“系统可靠性”的认知跃迁。

2️⃣ 标准答

CoT 的核心缺陷:纯文本推理,无副作用

CoT(Chain-of-Thought)本质是让 LLM 在输出最终答案前,先生成一段中间推理步骤。这在数学题、逻辑谜题等封闭域任务中有效,因为所有信息都在 prompt 内。但一旦面对开放域任务(比如订机票、查数据库、控制机器人),CoT 就暴露出三个致命伤:

  1. 无法执行真实动作:CoT 只能“说”不能“做”。比如让模型“查询北京到上海的航班”,CoT 会写出“首先,我需要查询航班信息”,但模型没有能力真的调用 API 去查。它只是在生成一段看起来合理的文本,实际结果为空。
  2. 无环境反馈,思考永不修正:CoT 的推理链是单向的,一旦生成就固定了。如果第一步推理假设错了(比如“用户想坐高铁”),后续所有步骤都基于错误前提,但模型没有机制获取外部反馈来纠正。这就像闭着眼睛下棋,只能靠猜。
  3. 输出结构不可控:CoT 要求模型输出自然语言推理过程,但下游系统(比如一个自动化工作流)需要结构化指令(如 {"action": "search_flight", "params": {"from": "北京", "to": "上海"}})。CoT 的文本输出无法被可靠解析,导致工程上无法落地。

为什么需要 Action 和 Observation:从“思考”到“执行-感知”完整流程

ReAct 范式(Yao et al., 2022)正是为了解决上述问题。它把 Agent 的每一步拆解为三个组件:

  • Thought(思考):模型内部推理,决定下一步做什么。例如“用户想订北京到上海的机票,我需要先查询航班”。
  • Action(动作):模型输出一个可执行的结构化指令,比如调用 search_flights(city_from="北京", city_to="上海", date="2024-12-01")。这个指令会被一个执行器(executor)解析并实际调用 API。
  • Observation(观察):执行器返回结果,比如 [{"flight": "CA1234", "time": "08:00", "price": 1200}]。模型把这个观察结果拼回 prompt,作为下一轮思考的输入。

工程取舍:为什么不能只用 CoT + 后处理?

有人会问:“能不能让 CoT 输出自然语言,然后我用正则或 LLM 解析出动作?” 这就是一个典型的工程取舍:

  • 优点:对模型要求低,任何能 CoT 的模型都能用。
  • 缺点:解析不稳定。自然语言千变万化,比如“查一下北京到上海的航班”和“帮我搜搜从北京飞上海”可能解析出不同参数。一旦解析失败,整个流程就断了。而 ReAct 通过约束输出格式(比如强制模型输出 JSON 或特定函数调用),让解析成功率从 70% 提升到 99%+(实际工程经验)。

实际落地的坑 + 解法

  • 坑:Action 输出格式不稳定。即使你要求模型输出 JSON,它偶尔也会输出 Markdown 代码块或多余注释,导致解析器报错。
  • 解法:在 prompt 中明确给出 few-shot 示例,并设置重试机制:如果解析失败,把原始输出作为 Observation 返回给模型,告诉它“格式错误,请重新输出”,让模型自我修正。通常 1-2 次重试就能解决。
  • 坑:Observation 过长导致上下文爆炸。比如搜索返回 1000 条结果,直接塞回 prompt 会撑爆 token 限制。
  • 解法:对 Observation 做摘要或截断。比如只保留前 5 条结果,并加一句“共 1000 条结果,仅显示前 5 条”。或者用另一个 LLM 对 Observation 做压缩。

总结:CoT 是推理的骨架,Action 是执行的手脚,Observation 是感知的眼睛。三者缺一不可,才能构建一个能真正完成任务的 Agent。

3️⃣ 答题模板(30 秒电梯版)

“这个问题我从三个层面回答:第一,CoT 的局限——它只能生成文本推理,无法执行真实动作,也没有环境反馈来修正错误,且输出结构不可控。第二,Action 和 Observation 的必要性——Action 让模型能调用工具执行操作,Observation 提供环境反馈,形成‘思考-执行-感知’完整流程,使模型能根据实际结果调整后续行为。第三,工程取舍——虽然可以用 CoT + 后处理解析动作,但解析不稳定,而 ReAct 通过约束输出格式和重试机制,将成功率从 70% 提升到 99%+。总结一句:CoT 是推理引擎,Action 和 Observation 是执行和感知模块,三者组合才能构建可靠的 Agent 系统。”

4️⃣ 高频追问 & 应对

追问 1:如果模型在 Action 步骤中输出了错误的参数(比如日期格式不对),怎么处理?

这是典型的“动作纠错”问题。应对策略分三层:第一,格式校验:在 executor 端做参数校验,比如日期必须为 YYYY-MM-DD,如果不符合,直接返回“参数错误”作为 Observation。第二,重试机制:让模型根据 Observation 自我修正,通常 1-2 次重试就能纠正。第三,回退策略:如果重试 3 次仍失败,则回退到人工介入或预设的默认动作(比如“请用户重新输入”)。实际工程中,80% 的错误在第一次重试后就能解决。

追问 2:CoT 和 ReAct 在计算成本上有什么区别?为什么 ReAct 更贵?

ReAct 的每次迭代都需要调用 LLM 两次(一次生成 Thought+Action,一次处理 Observation),而 CoT 只需要一次。此外,Observation 可能很长(比如搜索结果),导致上下文膨胀,增加 token 消耗。工程上,可以通过限制最大迭代次数(比如 5 步)和对 Observation 做摘要来控制成本。一个典型 ReAct 任务(比如订票)的 token 消耗是纯 CoT 的 3-5 倍,但成功率从 30% 提升到 90%+,这是值得的 trade-off。

追问 3:如果 Observation 返回了错误信息(比如 API 返回 500),模型会怎么反应?

这考验 Agent 的鲁棒性。好的做法是:在 prompt 中明确告诉模型“如果 Observation 是错误信息,请重试或换一种方式”。比如 API 返回 500,模型可以输出“重试一次”或“换一个 API 端点”。实际工程中,需要给 Observation 加一个状态字段(如 status: "error"),让模型能区分正常结果和错误。如果错误持续,模型应输出“无法完成,请用户检查网络”,而不是无限重试。

5️⃣ 避坑 · 常见错误答法

  • ❌ “CoT 不够是因为它不能处理复杂任务,而 Action 和 Observation 可以处理复杂任务。”→ ✅ 正确切入:CoT 不能处理需要与外部世界交互的任务,比如调用 API、控制设备。复杂推理(比如数学题)CoT 反而擅长。关键是“交互”而非“复杂”。
  • ❌ “Action 就是让模型输出代码,Observation 就是看代码运行结果。”→ ✅ 正确切入:Action 可以是任何结构化指令(JSON、函数调用、SQL 查询),不限于代码。Observation 是环境反馈,不一定是代码运行结果,也可以是传感器数据、用户回复等。要强调“结构化”和“反馈完整流程”。
  • ❌ “ReAct 比 CoT 好,所以以后都用 ReAct。”→ ✅ 正确切入:ReAct 有成本高、延迟大、需要设计 prompt 等缺点。对于纯推理任务(比如数学题),CoT 更高效。要说明适用场景:ReAct 适合需要外部交互的任务,CoT 适合封闭域推理。

6️⃣ 简历呼应

  • 如果你有 RAG 项目:从“检索增强”切入。RAG 本质是 Action(检索) + Observation(文档片段)的简化版。可以对比:RAG 只有一次检索,而 ReAct 可以多轮检索和工具调用。强调你在项目中如何处理检索结果过长的问题(比如截断、摘要),这直接对应 Observation 的工程处理。
  • 如果你只做过传统 NLP:用“规则系统”类比。传统 NLP 的 pipeline(如分词→NER→分类)是固定的,而 ReAct 让模型自己决定下一步。你可以说:“我理解 CoT 就像传统 pipeline 中的中间结果,但缺少执行和反馈。Action 和 Observation 相当于把 pipeline 变成了一个可动态调整的循环。”
  • 如果你是校招无项目:聚焦论文复现。可以说:“我读过 Yao et al. 2022 的 ReAct 论文,并在一个 toy 任务(比如天气查询)上复现了它。我注意到 CoT 在需要调用 API 时完全失效,而 ReAct 通过 Thought-Action-Observation 循环解决了这个问题。我还尝试了不同的 prompt 格式,发现 few-shot 示例对 Action 输出格式的稳定性至关重要。”
  • Yao et al., 2022. "ReAct: Synergizing Reasoning and Acting in Language Models"
  • Wei et al., 2022. "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models"
  • Schick et al., 2023. "Toolformer: Language Models Can Teach Themselves to Use Tools"
  • 博客:Lilian Weng, "LLM Powered Autonomous Agents"(系统综述 Agent 架构)
  • 工具:LangChain 的 Agent 实现(ReAct 的工程化示例)

—— 本场面试完 ——

我们不做玩具级 Demo 教学。训练营的作业是开源项目和论文——我们想陪伴你,做出能改变生活、最后改变世界的项目。