这道题其实是在问:当模型遇到一个单靠内部知识搞不定的任务时,怎么让它像人一样,边思考边查资料,而不是硬猜答案。[[ReAct]]的核心理念很简单,就是把Reasoning和Acting交替进行,形成一个思考、行动、观察的闭环。模型先想‘我需要知道什么’,然后调用一个工具,比如查API或者数据库,拿到结果后结合观察再想下一步,直到最终给出答案。
那它和单纯的提示工程,比如[[CoT]],有什么本质区别呢?我觉得边界很清楚:CoT适合那种推理链条封闭、所有信息都在模型参数里的任务,比如数学题。但一旦任务需要实时信息,比如天气、库存、用户上下文,或者要操作外部系统,CoT就抓瞎了,因为它只能‘在脑子里想’,得不到外部反馈。ReAct的优势就在于它能主动获取信息,而且能根据反馈自我纠错。举个例子,如果模型搜索没结果,它不会硬走原来的推理路径,而是换个关键词再搜。
具体到业务场景,最典型的就是客服退款。假设用户说‘我买的东西降价了,要退差价’,系统需要先理解退款规则,然后查订单状态、调价格接口,发现商品已经发货了,那就要走退货退款流程。纯提示工程做不到这种动态适应,因为它没法实时查规则和接口数据。而ReAct可以让模型先思考‘我需要查订单号和当前价格’,然后调用查单API,拿到结果后再思考‘已经发货了,应该走退货流程’,再调用退货接口。每一步都是基于上一步的观察来决策。
但落地ReAct是有前提和风险的。首先,工具本身的质量要够好,API返回的数据要准确、及时,不然模型越推越错。其次,模型的推理能力要跟得上,如果模型连‘搜索无结果该换关键词’这种常识都推理不出来,那ReAct就变成了死循环。最常见的失败场景是模型不按格式输出,比如该调工具时它直接编了个答案,或者工具调用格式错了,系统解析不了。所以上线时我会特别关注模型的输出格式约束,用[[系统提示]]和few-shot样例来引导,同时做好超时和重试机制。
另外,这里有个有意思的点:ReAct的思考轨迹本质上是一种Chain-of-Thought的变体,但它的推理路径不是线性的,而是树状的,因为工具返回的结果可能让模型分支到不同的方向。所以我在想,如果要进一步提升鲁棒性,能不能结合[[Tree-of-Thoughts]]的思路,让模型同时探索多条行动路径,然后选最优的那条?不过这样成本会高很多,需要权衡。
所以,我不会把ReAct看成提示工程的替代品,而是把它看作系统设计中的一个决策点。更倾向的做法是:简单任务用CoT直接推,复杂、需要外部交互的任务用ReAct,甚至可以把两者混合,比如先用CoT做初步推理,再用ReAct去验证和补充信息。最终怎么选,取决于任务对实时性和准确性的要求,以及工具链的成熟度。