这道题其实问的是,当LLM需要完成一个自己内部知识不够、还得靠外部工具才能搞定的复杂任务时,怎么把推理和行动串起来。[[ReAct]]的核心就一句话:让模型一边想一边做,每一步的思考结果都作为下一步行动的输入。具体循环就是 Thought → Action → Observation → Thought,说白了就是模型先分析当前状态、决定下一步干什么,然后去调用工具,比如搜索、计算、查数据库,拿到结果后再基于这个新信息继续想下一步。
那它比纯提示好在哪里?其实不是谁替代谁的关系,而是适用场景不同。纯提示,包括 [[Chain-of-Thought]] 那种,适合模型内部知识足够、推理步骤不依赖外部信息的任务,比如写一首诗、做个简单的逻辑推理。但一旦任务需要实时信息,或者需要精确计算,比如查今天的股价、算一个复杂的数学表达式,纯提示就容易瞎编,因为模型参数里没有这些数据。ReAct等于给模型开了个口子,让它能去拿真实数据来验证和支撑推理。
我给你举一个具体的业务例子。客服退款场景里,用户问“我买了个东西,用优惠券后实付80,但退货只退了60,少了20块”。如果纯提示,模型可能直接猜个理由,或者算错。但用ReAct,模型会先想“我要查订单实付金额”,于是调订单系统API拿到实付80;然后想“再查优惠券规则”,调营销系统API发现是“满100减20,但退款时优惠券不退”;最后想“计算应退金额”,得出实付80减未使用的优惠券部分,逻辑上应该退80。这样每步都有工具返回的Observation支撑,不会一步错步步错。
不过落地的时候有个前提:工具本身的质量和响应速度要够。如果搜索API返回一堆噪声,或者计算接口延迟高,那ReAct的推理链会越走越偏。还有一个常见失败场景是推理链太长,模型在中间步骤忘了初衷,比如查了五六个API后,绕到无关问题上去了。所以上线时我会特别关注 最大步数限制 和 每步的置信度阈值,一旦某步Observation和预期偏差太大,就提前终止或回退。
另外,ReAct这种线性链在遇到分支决策时其实有点笨,比如同时有多个搜索方向可选。我更倾向把它和 [[Tree-of-Thoughts]] 结合起来,让模型在每一步探索多个可能的行动路径,然后选置信度最高的继续。这样能减少走错路的风险,但也更贵。
所以整体上,我会把ReAct看成是 给LLM配了一个工具箱和一张草稿纸,让它在需要多步推理和外部信息时,能像人一样边想边查。但真正落地,很少只用ReAct,往往是和[[RAG]]、[[Function Calling]]混着用,根据任务复杂度动态切换。