清晨六点,一位刚出师的主厨小雷接到了一个棘手的订单:客人点了一道从未做过的“松茸东坡肉”。他没有慌,也没有一口气背完整个菜谱试图一次做对,而是把菜谱摊在灶台上,开始了自己的节奏——先看一眼菜谱的这一步(推理),再动手切肉下锅(行动),然后凑近锅边看火候闻香气(观察),确认状态后再翻到下一页菜谱,重复这个循环。直到汤汁收浓、肉块酥烂,他才关火装盘。 这个“边想、边做、边看”的循环,正是今天的主角——ReAct模式。它让AI不再像背答案的学生一样试图一次性回答复杂问题,而是像小雷一样,把大任务拆成一小段一小段的“思考-行动-观察”循环,每一步都踏实落地,直到最终目标完成。这套范式是AI Agent(智能体)能自主拆解并完成多步骤任务的心脏,也是你想理解智能体如何“自己干活”的第一块拼图。

岗位关联

学会ReAct模式,你就掌握了AI Agent能自主完成复杂任务的核心心法——这是从“调API的工程师”迈向“设计Agent架构的工程师”的复利型技能。

目录
  1. 可视化演示
  2. 范式缘起
  3. 推理循环
  4. 决策目标
  5. 行动接口
  6. 反馈解析
  7. 停止条件
  8. 实践价值
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示ReAct模式AI Agen的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ReAct模式AI Agen:ReAc ReAct模式的核心思想与推理 Thought-Action- 核心机制可视化 ReAct模式AI Agen整体架构与关键组件

范式缘起

小雷刚到后厨时,师傅给了他一道难题:“把这块冻肉变成端上桌的红烧肉。”年轻的小雷第一反应是默背菜谱——把焯水、炒糖色、炖煮的步骤全在脑子里过一遍,然后一股脑做完。结果糖色炒糊了,肉也炖过了头。师傅告诉他:“你以为做菜是背完再动手,其实真正的厨子是翻一页菜谱动一下手,再看一眼锅,再翻下一页。”这个点拨,就是ReAct模式的灵感。

ReAct这个词是 Reasoning(推理) 与 Acting(行动) 的合成。以往的AI问答模式像背书,你问一句它答一句,答案全靠“脑内推演”;而ReAct让AI在面对复杂任务时,不再试图一次性憋出完美答案,而是先推理出下一步该做什么,然后真去执行一个动作——比如调用搜索、查询数据库——拿到真实反馈后再继续推理。这种“想一下、做一下、看一眼”的交替,正是人类解决复杂问题的天然方式。

在学术上,ReAct模式首次由Yao等人于2022年提出,它的核心洞察是:大语言模型不光会“想”(推理),还应该会“做”(调用外部工具)——两者结合产生的效果远大于单独使用。它把Agent的能力从“纸上谈兵”升级为“躬身实践”,让模型不再是孤岛,而是能与世界交互的行动者。

就像小雷最终明白的:真正的大厨靠的不是背下整本菜谱,而是与灶台建立“手感对话”。ReAct模式,就是让AI与真实世界建立起这种循环对话。

ReAct=Reasoning⊕Acting\text{ReAct} = \text{Reasoning} \oplus \text{Acting}
这个公式表示ReAct模式的核心是“推理”与“行动”两种能力的结合,缺一不可。
  1. 推理(Reasoning)模型在脑子里“翻菜谱”——根据当前情况分析该做什么、为什么。
    Reasoning:分析现状→确定下一步\text{Reasoning}: \text{分析现状} \rightarrow \text{确定下一步}
  2. 行动(Acting)模型“动手下锅”——调用工具或产生一个具体动作。
    Acting:执行动作→触发环境改变\text{Acting}: \text{执行动作} \rightarrow \text{触发环境改变}
  3. 结合符号(\oplus)表示两者不是先后关系而是循环咬合关系,推理产生行动,行动反馈又激发新推理。
    ⊕:交替循环,互为驱动\oplus: \text{交替循环,互为驱动}

推理循环

小雷做菜时有个习惯——他在灶台边贴了三张便利贴:左边写“接下来做什么”(思考),中间写“动手去做”(行动),右边写“锅里变成啥样”(观察)。每完成一个动作,他就把三张便利贴往右挪一格,最右边的内容又变成新一轮“思考”的起点。这就是ReAct最核心的循环机制。

ReAct的完整循环由三个节点构成:Thought(推理)→ Action(行动)→ Observation(观察)。模型先输出一段推理文字,说明“我认为下一步该做什么,为什么”;接着输出一个具体的行动指令,比如工具调用;环境(比如搜索引擎或数据库)返回一个观察结果;这个结果又被拼接到模型的上下文中,作为下一轮推理的输入。如此往复,像滚雪球一样,把历史信息全部积累下来。

这个循环的关键在于上下文(context)的持续累积。每一轮的推理、行动和观察都被完整保留,模型在生成第 t+1 步的推理时,能看到从第 1 步到第 t 步的所有历史记录,这正是它能够记住“刚才查到了什么”“哪个方案失败了”的原因。

这个循环就像小雷锅边的三张便利贴:永远是从“想法”滑向“动作”,再从“观察”回到“新想法”。只要不停下来,雪球就会越滚越大,任务也越推越近。

Thoughtt+1=LLM([Thought1,Action1,Observation1,…,Observationt])\text{Thought}_{t+1} = \text{LLM}\Big( \big[\text{Thought}_1, \text{Action}_1, \text{Observation}_1, \dots, \text{Observation}_t \big] \Big)
这个公式说明:模型的每一次新推理,都是基于此前所有推理、行动和观察的完整历史来生成的。
  1. LLM(大语言模型)扮演主厨小雷的大脑,负责产生每一步推理。
    LLM:大脑模块,输出Thought\text{LLM}: \text{大脑模块,输出Thought}
  2. 中括号上下文把过去所有轮次的信息按顺序拼成一串文本,像小雷积累的烹饪笔记。
    [Thought1,Action1,Observation1,…]:完整历史记录\big[ \text{Thought}_1, \text{Action}_1, \text{Observation}_1, \dots \big]: \text{完整历史记录}
  3. 下标 t+1表示当前生成的是第 t+1 步推理,它建立在前 t 步的所有信息基础上。
    Thoughtt+1∣history=从这个历史中决定下一步\text{Thought}_{t+1} \mid \text{history} = \text{从这个历史中决定下一步}

决策目标

接到“四菜一汤”的订单时,小雷的第一反应不是一头扎进厨房,而是先把整桌菜在脑中排了个序:哪个菜等得起、哪个菜要趁热、哪道汤可以提前吊好。他把大任务拆成了一个个小目标,每个小目标又拆成具体动作——这就是ReAct中“推理”要做的事:决策目标。

在ReAct中,模型的Thought输出承担着“任务拆解师”的角色。面对一个复杂指令,模型要分析:这个任务需要哪些步骤?步骤之间有没有依赖关系?当前处于哪一步?这种拆解不是一次性完成的,而是随着观察到的反馈动态调整。比如小雷发现五花肉太肥,就会在“炖煮”子目标里插入“额外煸油”的步骤。

这种能力相当于给Agent装了“计划器”。模型在每一轮推理中输出的不只是“下一步动作”,还包括一个对整体进度的重新评估。它会在上下文里维护一份“心理清单”,根据反馈不断增删、调整后续步骤。这份清单让Agent在复杂任务中不会迷路。

拆解能力是Agent“看起来聪明”的关键。就像小雷能同时管理四菜一汤的节奏,ReAct让AI在复杂任务面前保持清醒——它永远知道自己在整个流程的哪个位置,下一步该朝哪个方向使劲。

Task=Step1→Step2→⋯→Stepn\text{Task} = \text{Step}_1 \rightarrow \text{Step}_2 \rightarrow \dots \rightarrow \text{Step}_n
一个复杂任务被拆解为按序执行的多个子步骤,每个子步骤都是一个“行动-观察”的小循环。
  1. 任务(Task)用户交给Agent的完整目标,比如“写一份市场分析报告”。
    Task:最终要完成的大目标\text{Task}: \text{最终要完成的大目标}
  2. 步骤(Step)拆解后的小目标,每个步骤可独立执行和验证。
    Stepi:大目标下的第i个子目标\text{Step}_i: \text{大目标下的第i个子目标}
  3. 箭头(\rightarrow)表示步骤的执行顺序或依赖关系,箭头连接形成一条路径。
    Step1→Step2:先做步骤1,再做步骤2\text{Step}_1 \rightarrow \text{Step}_2: \text{先做步骤1,再做步骤2}

行动接口

小雷的厨房里摆着各种趁手的工具:菜刀、砂锅、蒸笼、温度计。每当他决定要做某件事,就得从架子上取下对应的工具。“我要测油温”这个想法,落到行动上就是“拿起温度计插进油锅”。在ReAct中,模型的想法也要落到具体的行动接口(Action)上——这是模型与外部世界的“双手”。

ReAct的行动通常以结构化格式输出,最常见的是JSON。模型在Thought之后会生成一段类似 {"tool": "search", "query": "东坡肉的做法", "params": {"max_results": 5}} 的指令。这个指令会被框架解析,然后调用对应的工具函数,就像小雷拿起指定的厨具。除了工具调用,模型还可以输出 {"tool": "finish", "answer": "最终答案"} 来结束循环。

行动接口的设计决定Agent的上限。接口定义得好,模型就能灵活地组合各类工具——搜索、计算、数据库查询、代码执行——像大厨游刃有余地切换刀具和灶具。接口定义得生硬,模型就会像只拿一把勺子的大厨,再好的菜也做不出花样。

行动接口就像小雷的厨具架——决定了他能做多少种菜。ReAct的巧妙之处在于,它为模型配上了几乎无限扩展的“厨具架”,让大语言模型的“脑力”能通过工具变成实实在在的“行动力”。

Action={type:工具名, params:{参数}}\text{Action} = \{ \text{type}: \text{工具名},\ \text{params}: \{ \text{参数} \} \}
行动被格式化为一个结构化的指令,包含“用什么工具”和“传入什么参数”,让外部系统能可靠执行。
  1. 类型(type)指定调用哪个工具,是行动的分派依据。
    type:工具名,如 search / calculator / finish\text{type}: \text{工具名,如 search / calculator / finish}
  2. 参数(params)传给工具的具体输入,是行动的细节信息。
    params:{key:value} 工具执行所需的数据\text{params}: \{ \text{key}: \text{value} \} \ \text{工具执行所需的数据}
  3. 整体花括号表示整个行动是一个结构化对象,模型按固定格式输出,代码就能可靠解析。
    Action:标准化的指令格式,让"想法"能被"双手"执行\text{Action}: \text{标准化的指令格式,让"想法"能被"双手"执行}

反馈解析

小雷把肉下锅后,不会转身去沙发上等,而是立刻凑到锅边,看肉块的颜色、闻飘出的香气、尝一口汤汁的咸淡。这些感官信息回传到他脑子里,变成判断“下一步怎么做”的依据。ReAct循环里的观察(Observation),就是Agent的“感官系统”。

当行动被环境执行后,会返回一个结果——可能是搜索返回的文本列表、数据库查询的记录、代码运行后的输出,或者一个错误提示。这个结果会被当作Observation追加到上下文里。模型在下一轮生成Thought时,会先“读”这个反馈,判断上次行动是成功还是失败,等信息是否满足需求。

反馈解析的质量直接影响Agent是否聪明。如果模型无视Observation,只顾自己说,那它又变回了一个闭卷考试的学生。而ReAct给了Agent一个关键能力:根据真实世界的反馈修正自己。它可能发现原来的假设错了,于是调整计划;也可能发现信息已经足够了,于是提前终止。

小雷尝一口汤,就知道该加盐还是加水。ReAct的Observation正是这个“尝一口”的动作——它让AI不再闭门造车,而是用真实反馈校准自己的每一个决定。看得见反馈的Agent,才能在大事的迷雾中摸到正确的路。

Observationt=Environment(Actiont)\text{Observation}_t = \text{Environment}\big( \text{Action}_{t} \big)
观察结果就是环境对上一个行动的直接响应,它是模型感知世界的唯一窗口。
  1. 观察(Observation)环境返回的信息文本,代表行动产生的结果。
    Observationt:第t次行动后的环境反馈\text{Observation}_t: \text{第t次行动后的环境反馈}
  2. 环境(Environment)一切外部系统的总称——搜索引擎、数据库、计算器、代码解释器。
    Environment:Agent之外的真实世界\text{Environment}: \text{Agent之外的真实世界}
  3. 函数关系观察不是凭空来的,而是某个行动直接触发的响应,两者有因果关系。
    Observationt=Environment(Actiont):先有行动,后有观察\text{Observation}_t = \text{Environment}(\text{Action}_t): \text{先有行动,后有观察}

停止条件

再好的菜也有出锅的时刻,再难的题也有交卷的时候。ReAct循环的难点不只是“如何转”,更是“何时停”。小雷在厨房立了规矩:菜炖到筷子能轻易插透肉皮就关火。ReAct同样需要一套清晰的停止条件,否则Agent会像不停转圈的陀螺,在循环里空转。

最理想的停止条件是目标达成——模型判断任务已经完成,输出 finish 行动并给出最终答案。但现实世界中,模型可能误判结果,或者在错误的路径上越走越远,所以必须配套防御性停止条件。最常见的是步数上限:设定最大循环次数(如10轮),超过则强制终止并输出当前结果。此外还有重复检测:如果模型连续多次生成相同或高度相似的行动,说明它陷入了死循环,应当打断。

这些停止条件就像厨房里的安全网:主厨可以有创造力,但煤气也要有自动熄火保护。一个工程化的Agent系统,通常同时配置多个停止信号,任何一个触发都会结束循环,把控制权交还给用户或上级系统。

一道菜有火候,一个循环有边界。好的Agent不只会“埋头干活”,更知道“何时收手”。停止条件就是ReAct模式的刹车系统——它让Agent既能全力以赴,又不会失控狂奔。

State={Finish,if 目标已达成Continue,if t<Tmax⁡ 且未重复Abort,otherwise\text{State} = \begin{cases} \text{Finish}, & \text{if 目标已达成} \\ \text{Continue}, & \text{if } t < T_{\max} \text{ 且未重复} \\ \text{Abort}, & \text{otherwise} \end{cases}
Agent在每个循环中检查三种状态:达成目标就结束,未超上限就继续,否则强制中止,防止无限循环。
  1. 完成(Finish)当模型判断目标已实现,就输出最终答案并结束循环。
    Finish:正常终止,输出答案\text{Finish}: \text{正常终止,输出答案}
  2. 继续(Continue)当前步数未超过上限、行动也不重复,循环继续推进。
    Continue: t<Tmax⁡:步数未超上限,继续循环\text{Continue}: \ t < T_{\max}: \text{步数未超上限,继续循环}
  3. 中止(Abort)达到步数上限或检测到重复行动,强制结束,防止资源浪费。
    Abort:防御性终止,避免死循环\text{Abort}: \text{防御性终止,避免死循环}

实践价值

小雷从学徒变成主厨后,开始带自己的徒弟。他发现,用“看一步做一步”的方法教出来的徒弟,比“死记硬背菜谱”的徒弟要强得多——因为前者学会了应对意外,后者只会按部就班。这正是ReAct模式的实践价值所在。

第一,它能扛复杂任务。需要多步信息收集、多次判断的任务,比如“调研三个竞品的最新动态并给出对比报告”,传统单轮问答几乎不可能完成,而ReAct通过循环可以逐步收集、汇总。第二,过程可解释。模型每轮都会输出Thought(为什么这么做),整个决策链条被完整记录,开发者能清晰看到Agent是从哪一步走偏的,这比黑盒式的一锤子响应对调试友好得多。

第三,它是模型与工具的协同框架。ReAct让大语言模型的“大脑”连接上搜索、代码、数据库等“手和脚”,让模型不再局限在训练数据里。第四,它是更高级Agent的基座。如今复杂的分工式Agent、多Agent协作系统、AutoGPT类项目,其底层核心都长着ReAct的影子——理解ReAct,就是理解Agent架构进化树上的根节点。

小雷的徒弟学会了“翻一页、做一步、看一眼”的节奏,最终也能独立掌勺。ReAct对于AI开发者的意义也是如此:它不是某一个模型的能力,而是一套让AI“靠谱干活”的方法论——这套方法论,正撑起整个Agent应用落地的大厦。

Agent→ReAct 范式自主执行多步任务→反馈修正可靠的结果\text{Agent} \xrightarrow{\text{ReAct 范式}} \text{自主执行多步任务} \xrightarrow{\text{反馈修正}} \text{可靠的结果}
这个公式描述ReAct的因果链:用这套范式武装Agent,它就能自主执行多步任务,并通过反馈不断修正,最终得出可靠结果。
  1. Agent被ReAct范式改造的系统,从“问答工具”变成“行动体”。
    Agent:被赋能的智能体\text{Agent}: \text{被赋能的智能体}
  2. 自主执行(\xrightarrow{\text{ReAct 范式}})表示ReAct让Agent获得自主行动的能力。
    自主执行多步任务:从只能回答,到能够行动\text{自主执行多步任务}: \text{从只能回答,到能够行动}
  3. 反馈修正(\xrightarrow{\text{反馈修正}})循环中的Observation提供持续校正,保证路线正确。
    反馈修正:每个观察都是前进路上的校准点\text{反馈修正}: \text{每个观察都是前进路上的校准点}

AI 应用场景

智能客服复杂售后处理

阶段:Agent架构设计

解决的问题:传统客服机器人只在知识库里做一次文本匹配,遇到“订单延迟 + 退款咨询”这类复合问题就答非所问。基于ReAct的客服Agent能先推理出“需要查订单状态”,然后调用订单查询工具拿到真实物流信息,观察到“已延迟3天”后,再推理出“需要触发退款流程”,调用退款工具完成操作。

具体案例:电商平台智能助手接收到用户投诉“买的手机一直没发货,我要退款”。Agent第一轮推理“需要查订单状态”→ 调用查询接口 → 观察结果显示“已揽收,但物流信息36小时未更新”→ 第二轮推理“可申请延迟赔付”→ 调用赔付申请工具 → 观察确认成功 → 输出安抚话术和处理结果。整个流程全程可见,用户能感受到“它在真正处理我的问题”。

数据调研与分析Agent

阶段:工具调用规划

解决的问题:撰写竞品分析报告需要联网检索、数据整理、报告生成多个步骤,人工操作耗时数小时。ReAct让AI自主拆解调研任务,来回切换搜索工具和笔记工具,直到信息齐全再生成报告。

具体案例:一位产品经理让Agent调研“2024年国内AI视频生成工具发展现状”。Agent第一轮搜索“AI视频生成 工具 2024”→ 观察到结果列表 → 推理出“需要逐个访问前三个工作站点查看功能详情”→ 依次调用网页抓取工具 → 观察到各产品差异 → 推理出“还需检索融资情况”→ 再次搜索 → 最后输出一份带信息来源的结构化调研报告。

具身智能机器人操作

阶段:感知-决策-执行闭环

解决的问题:机械臂抓取物体时,不能靠一次性规划确定所有关节角度——因为环境会有误差和扰动。ReAct让机器人“观测-思考-调整”循环执行,每次抓取尝试都根据视觉反馈修正位姿。

具体案例:分拣机器人抓取传送带上的杂件。第一轮视觉系统观察到“目标为圆柱形物体”→ 推理“需要调整夹爪角度”→ 执行调整 → 视觉观察“夹爪偏左2厘米”→ 推理“向左修正”→ 重新执行 → 观察确认“夹持稳固”→ 输出完成。每一步都是真实反馈驱动的自我修正。

Python 演示

python61 行
# -*- coding: utf-8 -*-"""一个模拟 ReAct 循环的迷你 Agent 示例。 不使用真实 LLM API,用规则函数模拟"推理-行动-观察"的循环,演示 Agent 如何通过多步工具调用完成"查天气并给出穿衣建议"的任务。"""import json TOOLS = {    "get_weather": lambda city: {"city": city, "temp": 12, "condition": "小雨"},    "get_advice": lambda temp: "建议穿风衣并带伞" if temp < 15 else "建议穿薄外套",    "finish": lambda answer: {"done": True, "answer": answer}} def llm_think(context):    """模拟大模型的推理:根据上下文决定下一步行动。"""    if "get_weather" not in context:        return "用户想知道上海今天穿什么,先查询天气。"    if "advice" not in context:        return "天气数据拿到了,再查询穿衣建议。"    return "信息齐全,可以输出最终答复。" def llm_act(thought):    """模拟大模型从推理中生成结构化行动指令。"""    if "查询天气" in thought:        return {"tool": "get_weather", "params": {"city": "上海"}}    if "穿衣建议" in thought:        return {"tool": "get_advice", "params": {"temp": None}}    return {"tool": "finish", "params": {"answer": "上海今天有雨,气温12度,建议穿风衣并带伞。"}} def run_react(max_steps=5):    """执行 ReAct 循环:推理 -> 行动 -> 观察,直到 finish 或步数耗尽。"""    context = []    history = []    step_count = 0    while step_count < max_steps:        step_count += 1        thought = llm_think(" ".join(history))        action = llm_act(thought)        tool_name = action["tool"]        params = action["params"]        if tool_name == "get_weather":            result = TOOLS[tool_name](params["city"])            params["temp"] = result["temp"]        elif tool_name == "get_advice":            result = TOOLS[tool_name](params["temp"])        else:            result = TOOLS[tool_name](params["answer"])        context.append({"thought": thought, "action": action, "observation": result})        history.append(thought + " " + json.dumps(action, ensure_ascii=False) + " -> " + json.dumps(result, ensure_ascii=False))        print(f"[第{step_count}轮] 推理: {thought}")        print(f"         行动: {json.dumps(action, ensure_ascii=False)}")        print(f"         观察: {result}")        if result.get("done"):            print(f"任务完成!最终回答: {result['answer']}")            return context    print("达到最大步数,任务未完成。")    return context if __name__ == "__main__":    run_react()
目的:完整展示了ReAct“推理→行动→观察”循环的框架逻辑,即使没有真实大模型也能理解Agent如何一步步调用工具完成任务。
  1. def llm_think(context)模拟模型的“思考”环节,根据当前上下文决定下一步动作。在真实系统中,这里会调用GPT、Claude等大模型。
  2. def llm_act(thought)把思考结果转化成结构化的tool调用指令,模拟模型输出JSON格式行动的过程。
  3. context.append(...)把每一轮的思考、行动和观察都追加进历史记录,构建持续累积的上下文。
  4. history.append(thought + ...)将三轮信息序列化成一行文本,模拟真实Agent中“把历史拼接成新prompt”的操作。
  5. if result.get("done")检查观察结果中的done标记,实现“目标达成即结束”的停止条件。
  6. while step_count < max_steps实现步数上限保护,防止Agent陷入死循环。

常见误区

误区很多人以为ReAct就是在提示词里加上“请先思考再行动”的指令,本质上跟普通提示工程没区别。

正解ReAct的核心在于“行动-观察”的执行闭环。Prompt只是让模型输出Thought和Action文本,真正让Agent运转起来的是外围框架——解析模型输出、调用真实工具、把结果写回上下文,再决定是否继续。就像小雷不是靠嘴上念叨“我要做菜”就能把菜做好,而是要真的动手切菜、真的看锅里的变化。没有工具和反馈环,再好的提示词也只是一个“思想者”,不是“行动者”。

为何常见:因为多数人接触的LLM只有文字输入输出,容易把一切看成“写提示词”;直到动手搭建工具调用框架,才发现ReAct的工程重心在循环控制。

误区初学者以为Observation应该是“成功了”或“失败了”这样简洁的状态码,返回一大坨文本是设计缺陷。

正解现实中的Observation往往是原始的工具返回——一长串搜索结果、一份数据库记录、一段报错日志。它不是给人类看的总结,而是给模型看的“生料”。模型需要自己从生料中提取关键信息,就像小雷要自己从一口锅里看出“肉质已经软烂”而不会有人替他总结。设计Observation的关键是“完整”而非“简洁”,因为信息损失会导致推理偏差。

为何常见:因为写演示Demo时常把Observation简化成一句话,让人误以为那就是标准形态。

误区有人给Agent加了特别长的思考流程,让它每轮输出几百字的“深度分析”,认为推理越充分行动越准确。

正解ReAct的Thought要服务于行动决策。过长的推理有两个代价:一是消耗token、增加延迟和成本;二是容易陷入“光想不做”,就像小雷盯着菜谱看了十分钟却不动刀,食材都凉了。好的Thought应该像便利贴一样精简:当前情况是什么、下一步做什么、为什么。推理是为行动服务的导航,不是行为艺术。

为何常见:受到“CoT思维链效果随推理长度提升”的说法影响,把“多思考”错误迁移到ReAct的循环控制上。

误区为了防止Agent“没做完就被截断”,把max_steps设成50甚至100,觉得给足次数总能完成。

正解步数上限是保护机制而非完成保障。步数越大,Agent在错误路径上浪费的资源越多——每轮都要调大模型、调工具,成本线性增长。更麻烦的是,模型可能会把前十几轮的“废操作”记在上下文里,干扰后续推理。工程惯例是先设小步数(如5-10)并配重复检测,跑通了再按需增大。就像炒菜全程用大火,菜容易糊;恰到好处的停火时机,才是主厨的本事。

为何常见:因为初学者把“循环次数”当作“努力程度”,忽视了token成本与上下文污染这两个工程约束。

面试题

Q1. ReAct模式中的“Re“和”Act”分别代表什么?

单选题 · easy

  • A.推理与行动← 正确答案
  • B.阅读与转录
  • C.识别与触达
  • D.检索与调用

答案:A。ReAct是Reasoning(推理)和Acting(行动)的合成词。类比小雷做菜:推理是指“看菜谱决定下一步”,行动是指“真下手做”。其他选项虽然也是R和A开头的词,但都不是该模式的原始含义。

Q2. ReAct循环的三个核心步骤的正确顺序是?

单选题 · easy

  • A.思考-行动-观察← 正确答案
  • B.观察-思考-行动
  • C.行动-观察-思考
  • D.思考-观察-行动

答案:A。ReAct的经典循环是Thought→Action→Observation:先推理出下一步该做什么,再执行行动,然后获取环境反馈,反馈再作为下一轮推理的输入。这就像小雷先看菜谱(思考)、再切菜(行动)、然后看锅里变化(观察),顺序不可颠倒。

Q3. ReAct模式相比传统单轮问答的核心区别是?

单选题 · easy

  • A.回答速度更快
  • B.支持持续交互← 正确答案
  • C.需要更大模型
  • D.无需任何工具

答案:B。ReAct将一次性问答变成多轮的“推理-行动-观察”循环,Agent可以边执行边获取反馈,持续逼近目标。就像小雷做复杂的东坡肉要分很多步完成,而不是背完菜谱就出锅。传统问答是“闭卷考试”,ReAct是“开卷实践”。

Q4. 在ReAct中,模型的Thought输出通常以什么形式转换成可执行指令?

单选题 · mid

  • A.自然语言描述
  • B.结构化JSON格式← 正确答案
  • C.二进制编码
  • D.数据库SQL语句

答案:B。ReAct的行动指令通常输出为结构化JSON,包含工具名和参数,如{"tool": "search", "query": "xxx"}。原因是JSON能被框架程序稳定解析并映射到对应工具函数。自然语言虽然人看得懂,但程序解析容易出错,就像小雷的厨具必须有固定摆放位置才能顺手拿到。

Q5. Observation在ReAct循环中扮演什么角色?

单选题 · mid

  • A.模型的最终答案
  • B.环境对行动的反馈← 正确答案
  • C.用户的提问内容
  • D.模型的训练数据

答案:B。Observation是Agent执行Action后,环境返回的实际结果——可能是搜索结果、数据库记录或报错信息。它被追加到上下文中供模型下一轮推理参考,就像小雷尝尝汤才知道咸淡。它是模型与现实世界建立联系的唯一桥梁。

Q6. 下列哪些属于ReAct的有效停止条件?

多选题 · mid

  • A.模型输出finish标记← 正确答案
  • B.达到最大步数上限← 正确答案
  • C.检测到重复动作← 正确答案
  • D.上下文长度恰好1024

答案:ABC。目标达成(finish)是正常停止,步数上限和重复检测是防御性停止,三者都是ReAct工程的标配。上下文长度本身不是停止条件——虽然超长会触发截断或报错,但那是工程限制而非Agent的主动停止逻辑。

Q7. 关于ReAct中的上下文累积,下列说法正确的是?

单选题 · mid

  • A.只保留最近一轮的记录
  • B.所有历史轮次全部保留← 正确答案
  • C.每轮结束后清空替换
  • D.仅保留行动丢弃思考

答案:B。ReAct会把每一轮的Thought、Action、Observation全部拼接入上下文,让模型能看到完整的“工作日志”来生成下一步。这就像小雷的烹饪笔记记录每个环节的火候和时间,帮助他做出整体判断。只留最近一轮会导致模型“失忆”。

Q8. 一个典型的ReAct循环中的Action字段{"tool": "finish", "answer": "..."}代表什么?

单选题 · hard

  • A.请求终止工具
  • B.输出最终答案← 正确答案
  • C.记录执行错误
  • D.清除上下文记录

答案:B。finish是特殊的终止动作,answer字段携带最终回答。模型判断任务完成后会输出该指令,框架收到后结束循环并把answer返回给用户。这就像小雷最后装盘上菜——"finish"是上菜的动作,answer则是那盘菜本身。

Q9. 下列哪些情况更容易体现ReAct相较于纯Prompt的优势?

多选题 · hard

  • A.需要调用实时数据源的查询← 正确答案
  • B.需要多步骤推理的复杂任务← 正确答案
  • C.需要外部系统状态反馈的决策← 正确答案
  • D.需要背诵固定知识点的快问快答

答案:ABC。ReAct擅长处理“信息不在模型脑中”或“结果需要外部确认”的任务——实时查询、多步拆解、依赖系统反馈的决策。而纯知识问答中模型靠训练记忆就能直接回答,引入ReAct循环反而增加延迟,就像杀鸡用牛刀。

Q10. 在ReAct的“行动”设计中,工具接口的哪些属性最关键?

单选题 · hard

  • A.参数私有化和复杂嵌套
  • B.稳定可解析的结构化格式← 正确答案
  • C.尽量多的可选参数
  • D.返回二进制原始数据

答案:B。工具接口必须稳定、可解析、文档清晰,模型才能可靠地生成符合格式的调用。接口越简单明确,模型“使用工具”的准确率越高——就像小雷的厨具要按固定位置悬挂,用起来才顺手。参数复杂、返回生僻格式都会增加模型犯错概率,降低循环成功率和效率。