它是如何将思维链和行动结合起来,以完成复杂任务的
1️⃣ 考察意图
面试官想考察你对 ReAct(Reasoning + Acting)范式 的深度理解,而非简单背诵概念。这是 P1 进阶题,刁钻点在于:能否清晰解释“推理”与“行动”如何交替驱动任务完整流程,并对比纯 CoT 的优劣。答好了能展示你对 Agent 系统设计的实战经验,包括提示词工程、循环控制、错误恢复等硬实力,而非纸上谈兵。
2️⃣ 标准答
ReAct 的核心是让 LLM 在 推理(Thought) 和 行动(Action) 之间交替循环,通过 Observation 反馈来驱动下一步,从而完成复杂任务。这比纯 CoT(Chain-of-Thought)多了一个“外部交互”维度,能减少幻觉并利用实时信息。
1. 框架拆解:Thought → Action → Observation 循环
- Thought:LLM 生成自然语言推理步骤,例如“用户想查天气,我需要调用天气 API,参数是城市名”。
- Action:执行具体操作,如调用
get_weather(city="Beijing"),通常通过函数调用(Function Calling)或工具(Tool)实现。 - Observation:获取外部结果,如“天气:晴,25°C”,然后 LLM 基于此继续推理下一步(如“是否需要提醒带伞”)。
- 循环终止:当 Thought 判断任务完成(如“已给出建议”),或达到最大步数(如 10 轮)时停止。
2. 关键设计:提示词与停止条件
- 提示词模板:典型 ReAct 提示词包含示例,格式如:
Thought: 我需要查询天气。 Action: get_weather: Beijing Observation: 晴,25°C Thought: 天气好,无需带伞。最终答案:... 这通过 few-shot 学习引导 LLM 遵循结构。
- 停止条件:必须定义清晰。常用方法:检测输出中是否包含“最终答案”标记(如
Final Answer:),或设置最大迭代次数(如 5 轮)防止无限循环。实际落地中,我遇到过 LLM 在 Observation 后重复生成相同 Thought 的死循环,解法是加入“重复检测”逻辑:如果连续 3 轮 Thought 内容相似度 > 0.9,则强制终止并返回错误。
3. 工程取舍:推理 vs. 行动的成本
- Trade-off:每轮循环都调用 LLM,推理成本高(GPT-4 一次调用约 $0.03)。优化策略:在 Thought 中批量规划多个 Action(如“先查天气,再查交通”),减少 LLM 调用次数。但批量规划可能因中间 Observation 变化导致计划失效,需权衡。
- 实际坑:Action 执行可能失败(如 API 超时)。解法:在 Observation 中返回错误信息(如“API 返回 500”),让 LLM 在 Thought 中决定重试或换工具。例如,我曾在客服 Agent 中遇到天气 API 限流,LLM 自动切换为“查询历史数据”工具,提升了鲁棒性。
4. 对比纯 CoT:为什么 ReAct 更优?
- 纯 CoT:仅靠内部知识推理,容易产生幻觉(如编造天气数据)。ReAct 通过 Observation 引入外部事实,准确性更高。
- 局限性:ReAct 依赖工具可用性,且 Observation 延迟可能拖慢任务。例如,实时股票查询需 1 秒 API 响应,而 CoT 直接推理只需 0.1 秒。因此,简单任务(如数学题)用 CoT,复杂任务(如多步骤信息检索)用 ReAct。
5. 实现细节:LangGraph 示例
- 用 LangGraph 构建 ReAct Agent:定义
State(包含messages和step),节点agent(LLM 生成 Thought/Action),节点tools(执行 Action 并返回 Observation),边条件判断是否终止。代码片段:
def agent(state): response = llm.invoke(state["messages"]) return {"messages": [response]} def tools(state): action = parse_action(state["messages"][-1]) observation = execute_tool(action) return {"messages": [observation]} 这实现了 Thought-Action-Observation 的循环,直到检测到 Final Answer。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,ReAct 框架的核心是 Thought-Action-Observation 循环,Thought 提供推理上下文,Action 执行外部操作,Observation 反馈驱动下一步。第二,关键设计包括提示词模板和停止条件,比如用‘最终答案’标记终止,并加入重复检测防死循环。第三,对比纯 CoT,ReAct 能利用外部信息减少幻觉,但成本更高,需权衡批量规划。总结一句:ReAct 通过推理与行动的交替迭代,让 Agent 在复杂任务中兼具逻辑性和实时性。”
4️⃣ 高频追问 & 应对
追问 1:如果 Observation 返回空或错误,ReAct 怎么处理?
应对策略:在提示词中明确要求 LLM 处理异常。例如,在 Action 后加规则:“如果 Observation 为空,则生成 Thought 分析原因,并尝试重试或换工具”。实际落地中,我设计了一个“错误恢复”节点:当 Observation 包含错误码(如 500),LLM 自动生成“重试最多 3 次”的 Thought,若仍失败则返回“服务不可用”给用户。这需要给 LLM 提供错误类型列表(如超时、限流、参数错误),并在提示词中嵌入示例。
追问 2:ReAct 和 Tool-Use Agent(如 OpenAI Function Calling)有什么区别?
应对策略:ReAct 是更通用的框架,强调推理与行动交替,而 Tool-Use Agent 是具体实现,通常由 LLM 直接输出函数调用(如 JSON 格式)。区别在于:ReAct 的 Thought 是自然语言,可解释性强,但 Token 消耗大;Tool-Use 的 Action 是结构化调用,效率高,但缺乏中间推理。实际中,我常将两者结合:用 Tool-Use 执行 Action,用 ReAct 的 Thought 做决策。例如,在 LangChain 中,AgentExecutor 默认使用 ReAct 风格,但 Action 部分调用 OpenAI 的 function_call。
追问 3:如何评估 ReAct Agent 的性能?
应对策略:用两个指标:任务完成率(Success Rate)和平均轮次(Average Steps)。例如,在 MultiWOZ 数据集上,ReAct Agent 的完成率通常比纯 CoT 高 15-20%,但轮次多 2-3 轮。评估时需注意:定义“完成”标准(如用户是否得到正确答案),并排除死循环情况。我常用 LangSmith 记录每轮 Thought/Action/Observation,人工标注错误类型(如推理错误、工具调用失败),以定位瓶颈。
5️⃣ 避坑 · 常见错误答法
- ❌ 只背定义:“ReAct 就是推理加行动,交替进行。” → ✅ 深入细节:“ReAct 通过 Thought 生成推理步骤,Action 调用工具,Observation 反馈结果,循环直到任务完成。关键设计包括提示词模板和停止条件,比如用‘最终答案’标记终止,并加入重复检测防死循环。”
- ❌ 忽略工程取舍:“ReAct 总是比 CoT 好。” → ✅ 指出 trade-off:“ReAct 成本高,简单任务用 CoT 更高效;复杂任务用 ReAct 减少幻觉。实际中需根据任务复杂度选择,或混合使用。”
- ❌ 不提错误处理:“Observation 总是正确的。” → ✅ 强调鲁棒性:“Observation 可能失败,需在提示词中嵌入重试逻辑,或设计错误恢复节点,比如 API 超时后自动切换工具。”
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“ReAct 在 RAG 中的应用”切入,例如“在客服 Agent 中,我用 ReAct 交替检索文档和推理,解决了多跳问题(如‘查张三的订单状态’需先查用户 ID 再查订单),任务完成率提升 20%”。
- 如果你只做过传统 NLP:用“类比迁移”策略,例如“传统 NLP 的序列标注类似 ReAct 的 Thought-Action 循环,但 ReAct 多了外部交互。我通过实现一个简单 ReAct Demo(如天气查询 Agent),理解了推理与行动的协作”。
- 如果你是校招无项目:聚焦“论文复现”,例如“我复现了 ReAct 论文(Yao et al., 2023),用 HotpotQA 数据集测试,发现 ReAct 比 CoT 准确率高 12%,并分析了停止条件对性能的影响”。
- ReAct: Synergizing Reasoning and Acting in Language Models (Yao et al., 2023)
- LangGraph 官方文档:Agent 构建指南
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (Wei et al., 2022)
- Toolformer: Language Models Can Teach Themselves to Use Tools (Schick et al., 2023)
- 博客:ReAct Agent 实战——从零构建客服机器人(LangChain 教程)