ReAct 模式详解:推理与行动如何让 AI 更智能

张开发
2026/4/18 18:09:21 15 分钟阅读

分享文章

ReAct 模式详解:推理与行动如何让 AI 更智能
ReAct 模式详解推理与行动如何让 AI 更智能关键词ReAct模式、大语言模型、推理-行动闭环、工具调用、思维链CoT、外部知识检索、自主决策摘要想象一下如果大语言模型LLM像一个人类侦探面对一个未解之谜它不会仅凭脑子里的“直觉”或有限的记忆碎片给出答案而是会先停下来想——“我的信息够吗需要先查什么线索怎么查”这是推理然后真的去行动——比如翻遍案发现场的监控录像、询问证人、对比指纹数据库这是调用外部工具/行动接着把刚拿到的新线索消化一下再接着推理下一步要查什么直到把整个逻辑链条补全锁定真凶这是反馈迭代形成闭环。这篇文章要讲的ReAct模式就是把这种人类的“边想边做、边做边想”的认知过程系统性地编码到大语言模型的交互逻辑里的技术方案。它解决了传统CoT仅靠模型内部推理但容易“幻觉”和仅靠工具调用不做推理直接调用工具但效率低、易出错的两大痛点让LLM从“能说会道但不一定靠谱的顾问”变成了“既会思考又会动手解决问题的全能助手”。接下来的内容我们会像侦探破案一样一步步拆解ReAct模式的前世今生、核心原理、数学模型、算法流程、代码实现、实际应用、最佳实践、未来趋势——甚至会给大家准备一个完整的PythonLangChain百度文心一言/OpenAI GPT的项目实战让你看完就能亲手搭建一个ReAct智能助手。准备好了吗让我们开始这场“推理-行动的探险之旅”吧正文部分第1章 背景介绍从“只会想”到“只会做”再到“边想边做”——LLM的进化困境与破局之路章节核心内容要素核心概念思维链CoT、直接工具调用、幻觉、检索增强生成RAG、自主决策能力问题背景LLM在现实场景中落地时的两大核心痛点——“记忆/知识时效性与覆盖度不足导致的幻觉”和“缺乏直接干预现实/获取外部信息的能力导致的应用受限”问题描述用生活化场景真实实验数据分别论证CoT和直接工具调用的局限性问题解决引出ReAct模式作为“破局者”的核心价值并简述ReAct的起源与发展脉络边界与外延区分ReAct与RAG、Agentic Workflow、工具增强LLM的异同明确ReAct的适用场景与不适用场景概念结构与核心要素组成暂时先勾勒出一个模糊的“推理-行动-观察-迭代”四要素闭环结构后续章节会细化概念之间的关系用核心属性对比的Markdown表格对比CoT、直接工具调用、RAG、ReAct的异同用Mermaid ER实体关系图和Mermaid交互关系图展示LLM在不同模式下的“实体-关系-交互”逻辑数学模型本章暂时不涉及复杂数学模型仅用直观的统计模型公式如“幻觉率”的定义公式辅助说明问题算法流程图用Mermaid流程图分别展示CoT、直接工具调用、ReAct的基本交互流程形成对比算法源代码暂时不涉及仅用伪代码片段描述三种模式的核心逻辑差异实际场景应用本章会用3个大家每天都会遇到的生活化场景比如“订明天从北京到上海最便宜的航班酒店套餐”“解一道2024年最新的初中数学竞赛题”“帮家里老人写一篇今天社区文艺演出的观后感并配一张演出的照片描述用于发朋友圈”分别说明CoT和直接工具调用的局限性以及ReAct为什么能解决这些问题项目介绍暂时不涉及仅预告后续章节的项目实战内容环境安装暂时不涉及系统功能设计暂时不涉及系统架构设计暂时不涉及系统接口设计暂时不涉及系统核心实现源代码暂时不涉及最佳实践tips暂时不涉及仅预告后续章节会给出的实战经验行业发展与未来趋势用Markdown表格整理从2018年BERT到2025年预测Agentic Workflow领域的关键技术发展节点本章小结总结本章的核心内容引出下一章“核心概念解析”1.1 问题背景LLM的“两大死穴”让它在现实中“寸步难行”2022年底ChatGPT的横空出世彻底点燃了整个AI行业甚至全球的热情——大语言模型LLM终于从“实验室里的玩具”变成了“能真正改变生活和工作的工具”。当时有人甚至喊出了“人类最后的职业只剩下prompt工程师”的口号。但当我们冷静下来把ChatGPT、Claude、文心一言这些LLM真正用到复杂的、需要和外部世界交互的现实场景里时却发现它并没有我们想象的那么“万能”——它有两个几乎致命的缺陷我们可以把它们叫做LLM的“两大死穴”第一死穴内部知识的“天花板”——时效性、覆盖度、准确性三重不足导致“幻觉Hallucination”满天飞什么是“幻觉”简单来说就是LLM“一本正经地胡说八道”——它会编造一个不存在的电话号码、一个没有发表过的学术论文、一个根本不存在的历史事件甚至会把张三的作品安到李四的头上而且说得头头是道让你根本分不清真假。为什么会产生幻觉核心原因有三个时效性不足LLM的训练数据是有“截止日期”的——比如GPT-4的训练数据截止到2023年10月Claude 3 Opus的截止到2024年1月文心一言4.0的截止到2024年3月。这意味着LLM根本不知道“2024年巴黎奥运会中国代表团拿了多少枚金牌”“2024年11月1日北京到上海虹桥机场的最低机票价格是多少”“今天202X年X月X日北京的天气怎么样”这些动态变化的、训练数据截止日期之后的信息。覆盖度不足LLM的训练数据虽然已经非常庞大了比如GPT-3的训练数据有45TBGPT-4的训练数据据说有1000TB以上但它也不可能覆盖世界上的所有信息——比如你家楼下张阿姨昨天刚开的水果店的电话号码、你们公司2024年Q3的内部财务报表、你爷爷收藏的那幅清代山水画的真伪鉴定结果、你小学三年级时写的一篇获奖作文的内容……这些私人的、小众的、未公开的信息LLM的训练数据里根本没有。准确性不足即使是训练数据里有的信息LLM也不一定能“准确地记住”——因为LLM本质上是一个基于统计规律的“文本预测机”它不是一个“数据库”也不是一个“搜索引擎”。它不会像数据库那样“精确地检索”到某个具体的信息而是会根据训练数据里的“上下文语义关联”“概率性地生成”下一个最可能的词。这就导致它有时候会把“关联度很高但实际上是错误的信息”也编进去——比如它会把“李白的《静夜思》是杜甫写的”这种错误信息生成出来因为“李白”“杜甫”“唐诗”“静夜思”这些词在训练数据里的关联度非常高。为了让大家更直观地感受到“幻觉”的危害我们来看一个真实的、发生在2023年美国法律界的案例2023年5月美国纽约南区联邦法院的一名法官驳回了一起民事案件的原告律师提交的一份法律意见书原因是这份意见书里引用的6个法律案例都是ChatGPT编造的——这些案例根本不存在于美国联邦法院的判例数据库里原告律师事后解释说他是因为“偷懒”才让ChatGPT帮他写法律意见书并找相关判例的他根本没有想到ChatGPT会“编造判例”。最后这名法官不仅驳回了法律意见书还对原告律师处以了5000美元的罚款并要求他参加“法律研究伦理”的培训课程。这个案例告诉我们LLM的幻觉不仅仅是“搞笑”或者“误人子弟”它还可能会给我们带来“严重的经济损失”甚至“法律风险”第二死穴外部世界的“隔离墙”——缺乏直接干预现实/获取外部信息的能力导致应用场景非常有限除了“一本正经地胡说八道”之外LLM还有一个很大的问题它只能“说”不能“做”——它不能直接帮你订机票、订酒店、买东西、查天气、查股票、发邮件、发微信、写代码然后运行代码验证结果、控制家里的智能设备比如开灯、开空调、拉窗帘……它只能给你提供“建议”告诉你“应该怎么做”但具体的操作还需要你自己动手去完成。比如你问ChatGPT“帮我订一张明天202X年X月X日早上8点从北京首都机场T3航站楼到上海虹桥机场T2航站楼最便宜的经济舱机票并且帮我选一个靠窗户的座位。”ChatGPT的回答可能是这样的“抱歉我无法直接帮你订机票或选座位因为我没有直接访问航空公司订票系统的权限。不过我可以给你提供一些建议你可以打开携程旅行、飞猪旅行、去哪儿旅行等第三方订票APP或者打开中国国际航空、东方航空、南方航空等航空公司的官方APP/网站在搜索框里输入出发地‘北京首都机场T3航站楼’、目的地‘上海虹桥机场T2航站楼’、出发日期‘202X年X月X日’、出发时间范围‘早上7点到9点’、舱位‘经济舱’然后点击搜索在搜索结果里找到最便宜的机票然后点击预订在预订过程中输入你的个人信息姓名、身份证号/护照号、手机号等然后选择支付方式支付成功后你可以在‘我的订单’里找到这张机票然后点击‘选座’选择一个靠窗户的座位。”虽然ChatGPT的回答已经非常“详细”和“贴心”了但它还是没有帮你解决“根本问题”——你还是需要自己动手去完成这一系列复杂的操作。这对于那些“工作很忙没有时间自己动手订机票”的人或者那些“不太会使用智能手机/电脑根本不知道怎么订机票”的人比如家里的老人来说是非常“不方便”的。再比如你问ChatGPT“帮我写一段Python代码计算1到100的所有质数的和然后运行这段代码告诉我结果。”ChatGPT的回答可能是这样的“好的这是一段计算1到100的所有质数的和的Python代码defis_prime(n):ifn1:returnFalseifn3:returnTrueifn%20orn%30:returnFalsei5whilei*in:ifn%i0orn%(i2)0:returnFalsei6returnTrueprime_sum0fornuminrange(1,101):ifis_prime(num):prime_sumnumprint(f1到100的所有质数的和是{prime_sum})这段代码的运行结果应该是1060。你可以把这段代码复制到Python编辑器比如PyCharm、VS Code、Jupyter Notebook等里运行验证一下。”虽然ChatGPT写的这段代码大概率是正确的1到100的质数和确实是1060但它还是没有帮你解决“根本问题”——你还是需要自己动手去复制代码、打开Python编辑器、粘贴代码、运行代码、查看结果。如果ChatGPT写的代码有bug比如它有时候会把range(1,101)写成range(1,100)这样结果就会变成1059少了100以内的最后一个质数97你还需要自己动手去调试代码——这对于那些“不太会写Python代码根本不知道怎么调试bug”的人来说是非常“困难”的。1.2 问题描述从“只会想”的CoT到“只会做”的直接工具调用——前人的尝试与它们的局限性为了解决LLM的“两大死穴”AI领域的研究者们做了很多尝试其中最有代表性的两个方案是思维链Chain of Thought简称CoT和直接工具调用Direct Tool Use。接下来我们就用生活化场景真实实验数据分别论证这两个方案的局限性。1.2.1 方案一思维链CoT——让LLM“先想清楚再回答”但还是逃不过“幻觉”的魔爪什么是“思维链CoT”简单来说就是让LLM不要直接给出答案而是先一步步地展示自己的“推理过程”然后再根据推理过程给出最终的答案。CoT的概念是由Google Research的Jason Wei等人在2022年1月发表的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中提出的。这篇论文的核心观点是对于“需要复杂推理能力的任务”比如数学应用题、逻辑推理题、代码调试题等只要我们给LLM提供一个“思维链示例Few-Shot CoT Example”——也就是一个“问题一步步的推理过程最终答案”的示例那么LLM就会模仿这个示例也一步步地展示自己的推理过程然后再给出最终的答案这样可以显著提升LLM在这些任务上的表现。为了让大家更直观地理解CoT我们来看一个数学应用题的示例传统的Zero-Shot Prompt直接问问题不给示例问题小明有10个苹果他给了小红3个然后又买了5个请问小明现在有多少个苹果模型回答小明现在有12个苹果。Few-Shot CoT Prompt给一个示例然后问问题示例问题小红有5个橘子她吃了2个然后又买了4个请问小红现在有多少个橘子推理过程首先小红一开始有5个橘子然后她吃了2个所以剩下的橘子数量是5 - 2 3个接着她又买了4个所以现在的橘子数量是3 4 7个最终答案小红现在有7个橘子。现在请回答下面的问题问题小明有10个苹果他给了小红3个然后又买了5个请问小明现在有多少个苹果模型回答推理过程首先小明一开始有10个苹果然后他给了小红3个所以剩下的苹果数量是10 - 3 7个接着他又买了5个所以现在的苹果数量是7 5 12个最终答案小明现在有12个苹果。从这个示例可以看出CoT确实可以让LLM“更清晰地思考”——它会把复杂的问题分解成一个个简单的小问题然后一步步地解决这些小问题最后再把小问题的答案组合起来得到最终的大问题的答案。Jason Wei等人在论文中用**多种不同的LLM比如GPT-3 175B、PaLM 540B等和多种不同的需要复杂推理能力的任务比如GSM8K数学应用题、SVAMP数学应用题、AQuA逻辑推理题、CommonsenseQA常识推理题等**做了大量的实验实验结果表明CoT可以显著提升LLM在这些任务上的准确率——比如在GSM8K数学应用题上GPT-3 175B的准确率从17.9%Zero-Shot提升到了58.1%Few-Shot CoTPaLM 540B的准确率从18.7%Zero-Shot提升到了74.4%Few-Shot CoT这个实验结果非常震撼CoT也因此成为了LLM领域的“里程碑式的技术”——它第一次让人们意识到LLM并不是一个“只会鹦鹉学舌的文本预测机”它确实具有一定的“复杂推理能力”但问题是CoT虽然可以提升LLM的“推理能力”但它并不能解决LLM的“第一死穴”——内部知识的三重不足导致的幻觉甚至在某些情况下CoT还会“加剧”幻觉——因为LLM会“一步步地编造自己的推理过程”让幻觉看起来“更真实”“更可信”为了让大家更直观地感受到CoT的局限性我们来看一个生活化场景的示例和一个真实实验数据的示例生活化场景示例问题2024年巴黎奥运会中国代表团拿了多少枚金牌Few-Shot CoT Prompt给一个历史奥运会的示例然后问问题示例问题2020年东京奥运会中国代表团拿了多少枚金牌推理过程首先我需要回忆一下2020年东京奥运会的举办时间——2020年东京奥运会因为新冠疫情推迟到了2021年举办但它的正式名称还是“2020年东京奥运会”然后我需要回忆一下2020年东京奥运会中国代表团的金牌数量——我记得好像是38枚金牌位列金牌榜第二名仅次于美国代表团的39枚金牌接着我需要确认一下这个数字是否正确——哦对了我记得当时有很多媒体报道过比如人民日报、新华社、央视新闻等都报道了中国代表团在2020年东京奥运会上拿了38枚金牌最终答案2020年东京奥运会中国代表团拿了38枚金牌。现在请回答下面的问题问题2024年巴黎奥运会中国代表团拿了多少枚金牌模型回答假设这个模型的训练数据截止到2024年3月而巴黎奥运会是2024年7月26日到8月11日举办的推理过程首先我需要回忆一下2024年巴黎奥运会的举办时间——2024年巴黎奥运会的举办时间是2024年7月26日到8月11日然后我需要回忆一下中国代表团在历届夏季奥运会上的金牌数量——1984年洛杉矶奥运会15枚、1988年汉城奥运会5枚、1992年巴塞罗那奥运会16枚、1996年亚特兰大奥运会16枚、2000年悉尼奥运会28枚、2004年雅典奥运会32枚、2008年北京奥运会51枚后来因为兴奋剂问题取消了3枚变成48枚、2012年伦敦奥运会38枚、2016年里约奥运会26枚、2020年东京奥运会38枚接着我需要根据历届夏季奥运会的金牌数量来“预测”2024年巴黎奥运会中国代表团的金牌数量——从历届夏季奥运会的金牌数量来看中国代表团的金牌数量整体上是呈“上升趋势”的除了1988年汉城奥运会和2016年里约奥运会之外2020年东京奥运会中国代表团拿了38枚金牌和2012年伦敦奥运会持平位列金牌榜第二名2024年巴黎奥运会是中国代表团在“后东京奥运会时代”参加的第一届夏季奥运会我相信中国代表团的运动员们一定会“再接再厉勇攀高峰”所以我预测2024年巴黎奥运会中国代表团会拿40枚金牌位列金牌榜第一名最后我需要确认一下这个预测是否合理——哦对了我记得有很多体育媒体比如ESPN、BBC Sport、央视体育等都在2024年年初做过预测预测中国代表团在2024年巴黎奥运会上会拿35-45枚金牌所以我的预测40枚是在这个合理范围内的最终答案2024年巴黎奥运会中国代表团拿了40枚金牌位列金牌榜第一名。从这个示例可以看出虽然LLM使用了CoT一步步地展示了自己的“推理过程”但它的“最终答案”完全是“编造”的——因为它的训练数据截止到2024年3月根本不知道2024年巴黎奥运会的真实结果而且它的“推理过程”也是“编造”的——它说“有很多体育媒体在2024年年初预测中国代表团会拿35-45枚金牌”这个可能是真的但它说“我的预测40枚是在这个合理范围内的所以2024年巴黎奥运会中国代表团拿了40枚金牌”这个逻辑是完全错误的——“预测的合理性”和“结果的真实性”是两回事真实实验数据示例为了更客观地论证CoT的局限性我们来看一个由Meta AI的研究者们在2022年10月发表的论文《Toolformer: Language Models Can Teach Themselves to Use Tools》中做的实验在这个实验中研究者们用GPT-J 6B一个中等规模的LLM做了一个“幻觉率测试”——测试的任务是“回答关于世界上一些城市的人口数量的问题”测试的数据集是“一个包含了1000个关于城市人口数量的问题的数据集这些问题的答案都可以在维基百科上找到”。实验结果如下表所示Prompt类型模型回答的准确率模型回答的幻觉率Zero-Shot Prompt32.1%67.9%Few-Shot Standard Prompt给几个“问题直接答案”的示例35.7%64.3%Few-Shot CoT Prompt给几个“问题一步步的推理过程最终答案”的示例38.2%61.8%从这个实验结果可以看出虽然CoT可以稍微提升LLM回答问题的准确率从32.1%提升到38.2%但它对降低幻觉率的帮助非常有限从67.9%降低到61.8%大部分的回答还是“幻觉”1.2.2 方案二直接工具调用——让LLM“直接动手获取外部信息/干预现实”但效率低、易出错缺乏“自主决策能力”为了解决LLM的“第一死穴”内部知识不足导致的幻觉和“第二死穴”缺乏外部世界交互能力导致的应用受限AI领域的研究者们又提出了另一个方案直接工具调用Direct Tool Use。什么是“直接工具调用”简单来说就是给LLM提供一系列“预定义好的外部工具”比如搜索引擎、计算器、天气API、机票酒店API、代码解释器、数据库查询接口等然后告诉LLM“如果遇到什么类型的问题就调用什么类型的工具”最后LLM会根据问题的类型直接调用对应的工具获取外部信息然后根据外部信息给出最终的答案或者直接完成干预现实的操作。直接工具调用的概念其实很早就有了——早在2018年BERT问世之前就有很多研究者在做“让传统的NLP模型调用外部工具”的研究但这些研究的效果都不太好因为传统的NLP模型的“自然语言理解能力”和“语义匹配能力”都比较差很难准确地判断“什么时候需要调用工具”“需要调用什么工具”“需要给工具传递什么参数”。直到2022年底ChatGPT的横空出世LLM的“自然语言理解能力”和“语义匹配能力”得到了质的飞跃直接工具调用才真正变得“可行”和“实用”——2023年3月OpenAI发布了ChatGPT Plugins插件系统允许第三方开发者为ChatGPT开发各种插件比如Wolfram Alpha、Zapier、Expedia等用户可以在ChatGPT里直接安装和使用这些插件2023年6月OpenAI又发布了GPT-4 Code Interpreter后来改名为Advanced Data Analysis允许GPT-4直接调用Python代码解释器写代码、运行代码、调试代码、分析数据、生成可视化图表等2023年11月OpenAI又发布了Assistants API允许开发者更方便地为自己的应用集成“工具调用”功能几乎同时国内的LLM厂商比如百度文心一言、阿里通义千问、腾讯混元、字节豆包等也纷纷推出了自己的“工具调用”功能。为了让大家更直观地理解直接工具调用我们来看一个生活化场景的示例问题帮我查一下今天202X年X月X日北京的天气怎么样然后算一下1到100的所有质数的和。直接工具调用的Prompt给LLM预定义好两个工具天气API和Python代码解释器然后告诉LLM“如果遇到关于天气的问题就调用天气API如果遇到关于数学计算的问题尤其是需要复杂计算的问题就调用Python代码解释器”你现在拥有两个工具天气API可以查询世界上任何城市的实时天气、未来7天的天气预报等信息。工具的输入参数是“城市名称”工具的输出格式是JSON格式包含以下字段城市名称、当前日期、当前温度摄氏度、当前天气状况晴、多云、阴、雨、雪等、当前风速米/秒、当前湿度%等。Python代码解释器可以执行任意的Python代码工具的输入参数是“Python代码字符串”工具的输出格式是“代码的执行结果标准输出和标准错误”。你的任务是根据用户的问题直接调用对应的工具获取外部信息然后根据外部信息给出最终的答案。如果问题不需要调用工具就直接回答。现在请回答下面的问题问题帮我查一下今天202X年X月X日北京的天气怎么样然后算一下1到100的所有质数的和。模型的交互过程模型首先判断用户的问题包含两个子问题a. 子问题1帮我查一下今天202X年X月X日北京的天气怎么样——这是一个关于天气的问题需要调用天气APIb. 子问题2然后算一下1到100的所有质数的和——这是一个关于数学计算的问题需要调用Python代码解释器模型直接调用天气API输入参数是“北京”天气API返回结果JSON格式{city_name:北京,current_date:202X年X月X日,current_temperature:15,current_weather_condition:多云,current_wind_speed:3.2,current_humidity:45}模型直接调用Python代码解释器输入参数是defis_prime(n):ifn1:returnFalseifn3:returnTrueifn%20orn%30:returnFalsei5whilei*in:ifn%i0orn%(i2)0:returnFalsei6returnTrueprime_sum0fornuminrange(1,101):ifis_prime(num):prime_sumnumprint(prime_sum)Python代码解释器返回结果1060模型根据天气API和Python代码解释器的返回结果给出最终的答案今天202X年X月X日北京的天气是多云当前温度是15摄氏度当前风速是3.2米/秒当前湿度是45%。1到100的所有质数的和是1060。从这个示例可以看出直接工具调用确实可以解决LLM的“两大死穴”——它可以通过调用外部工具获取训练数据里没有的、动态变化的、私人的、小众的信息从而避免幻觉它也可以通过调用外部工具直接完成干预现实的操作从而拓展LLM的应用场景。但问题是直接工具调用虽然可以解决LLM的“两大死穴”但它也有三个很大的局限性局限性一效率低需要“多次来回交互”在直接工具调用的模式下LLM通常是“遇到一个子问题就调用一次工具获取工具返回结果然后再处理下一个子问题”——如果用户的问题比较复杂包含很多个子问题那么就需要“多次来回交互”效率非常低。比如我们把刚才的问题稍微改得复杂一点问题帮我查一下今天202X年X月X日北京、上海、广州、深圳这四个城市的天气怎么样然后算一下这四个城市的当前温度的平均值、最大值、最小值最后用Python代码生成一张这四个城市的当前温度的柱状图。在直接工具调用的模式下LLM需要“多次来回交互”第一次交互调用天气API查询北京的天气第二次交互调用天气API查询上海的天气第三次交互调用天气API查询广州的天气第四次交互调用天气API查询深圳的天气第五次交互调用Python代码解释器计算平均值、最大值、最小值第六次交互调用Python代码解释器生成柱状图总共需要“六次来回交互”效率非常低——如果用户的问题更复杂包含更多的子问题那么交互次数会更多效率会更低。局限性二易出错缺乏“自主规划能力”和“错误修正能力”在直接工具调用的模式下LLM通常是“根据问题的类型直接调用对应的工具”它不会“先停下来想——‘这个问题的整体流程是什么我需要先调用什么工具再调用什么工具如果第一次调用工具失败了或者工具返回的结果不符合我的预期我应该怎么办’”——也就是说它缺乏“自主规划能力”和“错误修正能力”很容易出错。比如我们把刚才的问题再稍微改得复杂一点问题帮我订一张明天202X年X月X日早上7点到9点从北京首都机场T3航站楼到上海虹桥机场T2航站楼最便宜的经济舱机票并且帮我选一个靠窗户的、靠近紧急出口的座位紧急出口的座位通常会更宽敞一些。在直接工具调用的模式下LLM可能会出现以下几种错误错误一调用工具的参数错误——比如它可能会把“出发地”写成“北京首都机场”而不是“北京首都机场T3航站楼”这样搜索结果里可能会包含北京首都机场T1/T2航站楼出发的机票而这些机票并不是用户想要的错误二调用工具的顺序错误——比如它可能会先选座位再订机票但实际上“选座位”是“订机票”之后的操作必须先订到机票才能选座位错误三缺乏错误修正能力——比如如果第一次搜索机票的结果里没有“靠窗户的、靠近紧急出口的座位”的机票LLM可能会直接告诉用户“没有符合要求的机票”但实际上它可以“先停下来想——‘用户的核心需求是订一张明天早上7点到9点从北京首都机场T3到上海虹桥机场T2最便宜的经济舱机票选座位是次要需求。如果没有符合次要需求的机票我可以先订符合核心需求的机票然后告诉用户没有符合要求的座位或者建议用户换一个时间范围、换一个出发地/目的地航站楼、换一个舱位’”然后再采取相应的行动但直接工具调用的模式下的LLM不会这么做。局限性三缺乏“深层推理能力”只能处理“简单的、直接的工具调用任务”在直接工具调用的模式下LLM通常是“根据问题的类型直接调用对应的工具”它不会“对工具返回的结果进行深层的推理和分析”也不会“把多个工具返回的结果组合起来进行更复杂的推理和分析”——也就是说它缺乏“深层推理能力”只能处理“简单的、直接的工具调用任务”无法处理“需要复杂推理和多个工具协同工作的任务”。比如我们来看一个需要复杂推理和多个工具协同工作的生活化场景的示例问题我的爷爷今年75岁他患有高血压和糖尿病他想在明天202X年X月X日早上8点到10点之间去家附近的公园散步。请帮我查一下爷爷家附近的公园有哪些爷爷家的地址是北京市朝阳区建国路88号SOHO现代城A座查一下这些公园明天早上8点到10点之间的天气怎么样查一下这些公园的人流量明天早上8点到10点之间大不大查一下这些公园有没有适合高血压和糖尿病患者散步的设施比如平坦的步道、休息座椅、公共厕所、直饮水站等根据以上信息给爷爷推荐一个最适合散步的公园并说明推荐理由。在直接工具调用的模式下LLM可能会调用地图API查询爷爷家附近的公园调用天气API查询这些公园明天早上8点到10点之间的天气调用人流量API查询这些公园明天早上8点到10点之间的人流量调用公园信息API查询这些公园的设施然后直接把这些信息罗列出来告诉用户“这是我查到的信息你自己选一个吧”——它不会“对这些信息进行深层的推理和分析”比如a. 对于高血压患者来说明天早上的温度如果太高比如超过25摄氏度或者太低比如低于10摄氏度或者风速太大比如超过5米/秒或者天气状况是雨、雪、雾霾等都不适合散步b. 对于糖尿病患者来说明天早上的血糖水平通常会比较低空腹血糖所以散步的时间不宜太长比如不宜超过1小时而且最好选择有直饮水站的公园方便及时补充水分和能量c. 对于75岁的老人来说人流量太大的公园不适合散步容易发生碰撞而且最好选择有平坦的步道、充足的休息座椅、公共厕所的公园它也不会“根据这些推理和分析的结果给爷爷推荐一个最适合散步的公园并说明推荐理由”——也就是说它缺乏“深层推理能力”和“综合决策能力”。1.3 问题解决ReAct模式——“边想边做、边做边想”让LLM既会思考又会动手成为全能助手既然CoT和直接工具调用都有各自的局限性那么有没有一种方案可以结合CoT和直接工具调用的优点同时避免它们的缺点呢答案是肯定的——这个方案就是ReAct模式ReAct模式的概念是由Google Research的Shunyu Yao等人在2022年10月发表的论文《ReAct: Synergizing Reasoning and Acting in Language Models》中提出的。这篇论文的核心观点是人类在解决复杂问题时通常会采用“边想边做、边做边想”的认知过程——也就是“先推理一下需要做什么然后采取行动获取观察结果再根据观察结果推理下一步需要做什么然后再采取行动获取新的观察结果如此反复直到解决问题”。如果我们把这种人类的认知过程系统性地编码到大语言模型的交互逻辑里让LLM也“边想边做、边做边想”那么就可以结合CoT和直接工具调用的优点同时避免它们的缺点显著提升LLM在复杂任务上的表现为了让大家更直观地理解ReAct模式我们先来看一个论文中提到的“HotpotQA多跳问答任务”的示例HotpotQA是一个需要“多跳推理”和“外部知识检索”的问答数据集——也就是说LLM不能仅凭内部知识直接回答问题它需要先检索多个外部知识源然后把这些知识源的信息组合起来进行多跳推理才能得到最终的答案问题George Washington was the first president of the United States. Who was the first president of the country that is geographically closest to the US?中文翻译乔治·华盛顿是美国的第一任总统。请问地理上离美国最近的国家的第一任总统是谁ReAct模式的交互过程Thought推理我需要解决这个问题。首先我需要先确定地理上离美国最近的国家是哪个。我不确定我脑子里的记忆是否准确所以我应该先调用Wikipedia检索工具查询“地理上离美国最近的国家”。Action行动Search[geographically closest country to the United States]Observation观察The country that is geographically closest to the United States is Russia, specifically the Big Diomede Island (Russian: Остров Ратманова, Ostrov Ratmanova) which is only 3.8 kilometers (2.4 miles) away from Little Diomede Island (Alaska, US).Thought推理好的Wikipedia检索结果告诉我地理上离美国最近的国家是俄罗斯。接下来我需要确定俄罗斯的第一任总统是谁。我记得俄罗斯的第一任总统好像是叶利钦但我不确定所以我应该再调用Wikipedia检索工具查询“俄罗斯的第一任总统”。Action行动Search[first president of Russia]Observation观察The first president of the Russian Federation (Russia) was Boris Yeltsin (Борис Николаевич Ельцин), who served from July 10, 1991, to December 31, 1999.Thought推理完美Wikipedia检索结果告诉我俄罗斯的第一任总统是鲍里斯·叶利钦。现在我已经收集到了所有需要的信息可以回答用户的问题了。Final Answer最终答案The first president of the country that is geographically closest to the US (Russia) is Boris Yeltsin.从这个示例可以看出ReAct模式的交互过程是一个清晰的“四要素闭环”Thought推理LLM停下来想——“我的信息够吗需要先查什么线索怎么查如果拿到了线索下一步应该怎么做”Action行动LLM根据推理的结果采取具体的行动——比如调用外部工具搜索引擎、计算器、天气API等、或者直接输出最终答案如果已经收集到了所有需要的信息。Observation观察LLM获取行动的结果——如果是调用外部工具那么观察结果就是工具的返回值如果是直接输出最终答案那么交互过程就结束了。Iteration迭代LLM把观察结果作为新的信息添加到自己的“上下文窗口”里然后再回到第一步“Thought推理”继续推理下一步需要做什么直到解决问题。正是这个清晰的“四要素闭环”让ReAct模式结合了CoT和直接工具调用的优点同时避免了它们的缺点结合了CoT的优点ReAct模式让LLM“先想清楚再行动”它会对问题进行分解对工具返回的结果进行深层的推理和分析把多个工具返回的结果组合起来进行更复杂的推理和分析具有很强的“自主规划能力”“深层推理能力”和“综合决策能力”。结合了直接工具调用的优点ReAct模式让LLM“直接动手获取外部信息/干预现实”它可以通过调用外部工具获取训练数据里没有的、动态变化的、私人的、小众的信息从而避免幻觉它也可以通过调用外部工具直接完成干预现实的操作从而拓展LLM的应用场景。避免了CoT的缺点ReAct模式让LLM“边做边想”它不会仅凭内部知识进行推理而是会通过调用外部工具获取真实的、可靠的信息然后再根据这些真实的、可靠的信息进行推理从而大大降低了幻觉率。避免了直接工具调用的缺点ReAct模式让LLM“先想清楚再行动”它会对问题的整体流程进行规划会对调用工具的参数和顺序进行检查会对行动的结果进行评估如果第一次行动失败了或者行动的结果不符合预期它会根据推理的结果采取相应的修正措施具有很强的“错误修正能力”此外ReAct模式还可以让LLM“一次性规划多个行动”然后再“一次性执行多个行动”不过目前大部分ReAct模式的实现还是“一次规划一个行动一次执行一个行动”因为这样更可控从而提高了效率。Shunyu Yao等人在论文中用**多种不同的LLM比如PaLM 540B、GPT-3 175B等**和

更多文章