夜雨聆风学习资料网

ARTICLE · 1224884

工具都齐了,AI为什么还是办不好事?

工具都齐了,AI为什么还是办不好事?

AI江湖那些事儿

第三回:工具都齐了,AI为什么还是办不好事?

ReAct的诞生:让大模型在行动中修正判断

技术史·从工具调用到任务执行|第三篇

一、张主任抢走B205之后,AI该怎么办?

上一回,我们讲到一件不大不小的麻烦。

一位员工让AI帮忙预约会议室:下午三点到四点,八个人参加,需要投影仪。

AI已经通过MCP连接了会议室管理系统。它会查询会议室,也知道怎样调用预约接口。

查出来的B205,时间合适、人数合适、设备也符合要求。

眼看事情就要办成,张主任突然抢先一步,把B205订走了。

系统返回一条消息:

SLOT_TAKEN:会议室已被占用。

这时候,AI应该怎么办?

如果它回答:“预约失败,请自行重新选择。”

那它确实调用了工具,却没有真正替人把事情办完。

如果它一声不吭地把会议改到明天,又显然越过了用户的授权。

比较合适的做法,是保留原来的会议时间、人数和设备要求,重新寻找其他符合条件的会议室。如果确实没有,再向用户询问是否允许调整条件。

这些判断,对于一个有经验的行政人员来说,几乎是下意识完成的。

但对于大模型,这里面有一个非常重要的技术变化。

它不只是回答用户的问题,还要根据刚刚执行的动作和得到的新信息,判断下一步该做什么。

这一回,我们要认识的技术叫ReAct。

它的名字来自两个英语单词:

Reasoning,推理。

Acting,行动。

两者放在一起,便是ReAct。

这个名字看起来很简单,却回应了大语言模型研究中的一个实际难题:模型可以分析问题,也可以产生行动指令,怎样才能让分析指导行动,又让行动获得的真实信息反过来修正分析?

二、2022年,研究人员发现:会想与会做,原来是两件事

2022年,大语言模型已经展示出相当不错的语言理解和问题求解能力。

其中一项受到关注的研究方向,是Chain-of-Thought,简称CoT,通常称为思维链。

过去,用户向模型提出一个问题,模型可能直接给出答案。

CoT则通过示例或提示,引导模型生成一系列中间分析步骤,再得出结论。

例如:

“甲比乙年长三岁,乙今年十二岁,甲多大?”

模型可以先写出:

乙今年十二岁。

甲比乙大三岁。

因此甲十五岁。

对于某些算术、逻辑和多步骤问题,这种方法可以改善模型表现。

但它存在一个明显的局限。

模型可以一直分析,却未必知道外面究竟发生了什么。

假设有人问:“某位科学家获得奖项时,他所在研究机构的负责人是谁?”

模型可能先根据已有知识猜测获奖年份,再猜测当时的负责人,最后写出一段看似严密的分析。

问题是,中间某一步如果猜错,后面的推理可能建立在错误事实上。

即使分析过程看起来很完整,也不等于答案有可靠依据。

这是一类“只推理”的问题。

另一边,也有研究让语言模型根据文字环境直接选择行动。

例如,在一个模拟房间里,模型接到“把苹果放到冰箱里”的任务。

它需要依次选择打开门、寻找苹果、拿起苹果、打开冰箱等动作。

这种方法让模型能够与环境交互,但如果只是不断根据当前文字选择下一个动作,它可能缺少对整体目标和已完成步骤的有效管理。

于是出现两种不同的不足。

只推理:容易脱离外部事实,在错误信息上继续分析。

只行动:能够操作环境,却可能迷失在一连串动作中。

2022年10月6日,Shunyu Yao等研究人员公开论文《ReAct: Synergizing Reasoning and Acting in Language Models》。

论文后来被ICLR 2023接收。

研究人员来自普林斯顿大学与Google Research。他们提出的问题,并不是怎样训练一个全新的超级模型,而是能否让现有语言模型以新的方式组织任务求解过程。

他们想到,把推理和行动交织起来。

需要判断时,生成分析。

需要事实时,执行查询。

获得新事实以后,再决定下一步。

研究论文的引言甚至使用了一个厨房里的例子:做菜的人会一边准备食材,一边想下一步;发现没有盐,便考虑替代调料;不知道怎么做面团,就去查食谱。

人类的行动与判断,本来就经常这样交替发生。

研究者想知道,语言模型能否利用类似的组织方式解决任务。

这便是ReAct的出发点。

三、ReAct究竟是什么?先看它最核心的三个词

要理解ReAct,不需要先了解复杂的算法。

只需要记住三个词。

Thought:任务分析。

Action:行动指令。

Observation:环境观察。

它们分别做不同的事情。

Thought是模型生成的一段语言分析。例如:“现在还没有确认会议室预约成功,需要检查执行结果。”

Action是模型提出的具体行动,例如调用预约接口、查询数据库或者搜索网页。

Observation则来自外部环境。例如,工具返回“会议室已被占用”。

这里有个细节特别重要。

Thought和Action可以由模型生成,但Observation必须由真实的工具或任务环境返回,才具有外部观察的意义。

模型自己编造一句“会议室预约成功”,那仍然只是模型生成的文字。

只有业务系统返回了有效的预约结果,才能成为真正的执行依据。

我们可以用一段简化的任务记录,观察ReAct如何运行。

首先,用户提出要求:

帮我预约下午三点到四点的会议室,八个人,需要投影仪。

系统已经查询到B205符合条件。

模型开始处理下一步:

Thought 1:

B205当前符合要求,可以尝试提交预约。任务尚未完成,需要等待预约结果。

Action 1:

book_room("B205")

外部程序接到这个指令,调用会议室管理系统。

系统返回:

Observation 1:

SLOT_TAKEN:B205已被其他人预约。

如果这只是一次性的工具调用,AI可能到这里就结束了。

但是,在ReAct式过程中,Observation会被加入下一轮模型能够读取的上下文。

于是模型有机会继续处理:

Thought 2:

B205无法预约。用户没有要求必须使用B205,原来的时间、人数和投影设备要求也没有改变。需要寻找其他符合条件的会议室。

Action 2:

find_rooms(time="15:00-16:00", capacity=8, projector=true)

工具返回:

Observation 2:

B206:10人,有投影仪,空闲。

C301:12人,无投影仪,空闲。

D108:6人,有投影仪,空闲。

模型获得了新的信息。

它可以判断B206符合原始要求,而另外两间存在明确缺陷。

接下来:

Thought 3:

B206符合全部条件,可以尝试预约。提交成功后仍需核验预约状态。

Action 3:

book_room("B206")

Observation 3:

CONFIRMED:B206预约成功,预约编号BK-1029。

在这个假设案例中,业务系统确认了一条有效预约记录,系统可以据此结束任务。

请留意整个过程。

同一个模型,前后提出了三次不同的行动。

第二次行动并不是在最初回答时就确定好的,而是受到第一次预约失败这一新观察的影响。

这便是ReAct最直观的特点:

行动不是推理的终点。行动得到的结果,会成为下一次判断的依据。

需要说明的是,这段B205过程是为了理解原理构造的教学案例,并非论文中的实验。论文所说的Thought也是模型生成的可见语言轨迹,不能直接等同于模型全部真实的内部计算过程。

四、秘密在哪里?模型到底是怎样做到的?

读到这里,可能会产生一个疑问。

既然ReAct能够不断调整行动,研究人员是不是重新训练了一种专门负责做事的模型?

事情比想象中有趣。

在论文的主要大模型实验里,研究人员使用的是当时已有的PaLM-540B,并没有为了实现ReAct而修改这个大模型的参数。

他们主要使用一种叫Few-shot Prompting的方法,也就是在提示上下文中放入少量示范。

示范不只是普通问答,而是展示了完整的任务处理轨迹:

什么时候分析。

什么时候选择动作。

执行动作后,会得到什么观察。

观察返回后,下一步怎样继续。

大语言模型本来就是根据已有上下文生成后续内容。

如果上下文中给出的例子,是一个交替出现Thought、Action、Observation的任务过程,模型就可能沿着这种结构继续生成。

不过,这里还有一部分工作,不能由模型独自完成。

假设模型输出:

Action: book_room("B205")

这仍然是一段文本。

它本身不会改变会议室数据库。

必须有一个外部执行程序,识别模型提出的行动,检查是否允许调用这个工具,并按照接口要求实际发出请求。

随后,外部程序把业务系统返回的结果,整理成一条Observation,再提供给模型。

整个过程可以理解为:

模型生成下一步行动 → 执行程序调用工具 → 工具返回观察结果 → 观察进入新上下文 → 模型继续生成。

如果用极简的伪代码表达:

while not finished:    output = model.generate(context)    if output.is_action:        result = execute_tool(output.action)        context.append(result)    elif output.is_finish:        finished = verify_result(output)

这不是ReAct论文中的原始代码,而是帮助理解其运行方式的简化表示。真实系统还必须处理工具权限、参数校验、循环次数、超时与任务终止等问题。

现在就可以解释一个经常被混淆的概念。

ReAct不是模型,不是工具协议,也不是一套完整的Agent平台。

它是一种组织语言模型任务分析与外部行动的方法。

模型负责根据上下文提出分析和行动。

外部程序负责真实执行。

环境反馈再进入下一轮上下文。

另外,ReAct也不要求模型每次行动之前,都必须写出一大段Thought。

原论文指出,对于行动步骤较多的交互任务,语言分析可以只在重要位置出现,而不是机械地每一步都重复一次。

研究人员后来还探索过利用成功的ReAct任务轨迹,微调较小模型。

因此,ReAct既可以通过提示示范引导,也可以与模型训练结合。

它的核心并非某一种提示格式,而是让语言分析与环境行动在任务求解过程中相互配合。

五、真正的实验:加入推理之后,机器确实更会做事了吗?

一个技术思想听起来合理,并不等于它真的有效。

ReAct论文很值得读的地方,在于研究者设计了不同任务来进行比较。

其中两个实验尤其适合理解。

第一个叫ALFWorld。

它是一个文字交互的家庭环境。

系统可能要求智能体找到某件物品,把它清洗、加热或者放到指定位置。

模型必须不断接收环境描述,选择下一步动作。

有时候,目标物品不在预期的位置。

有时候,需要先完成另一个操作,后面的动作才可能成功。

第二个叫WebShop。

它是一个模拟网上购物的环境。

智能体需要根据用户提出的商品要求,在网页中搜索、查看详情、筛选条件,并完成符合任务要求的购物流程。

这类任务不只需要回答问题,还需要与环境进行多轮交互。

研究人员将只生成行动的Act-only方法,与ReAct进行比较。

在论文报告的PaLM-540B少样本提示实验中,结果如下:

实验任务
只行动 Act-only
ReAct
ALFWorld
45%
约71%
WebShop
30.1%
40%

ALFWorld提高了约26个百分点,WebShop提高了约9.9个百分点。

要注意,这些数字对应的是2022年前后的特定模型、实验环境和提示设置,并不能理解为ReAct在所有企业项目中都会带来同样的提升。

但实验至少支持了一个重要判断。

在需要多次行动、环境观察和目标跟踪的任务中,加入适当的语言分析,能够改善行动效果。

为什么?

因为模型不仅要回答“眼前有什么动作可以执行”,还可以根据任务目标判断:

刚刚完成了什么?

现在距离目标还差什么?

是不是走错了方向?

是否需要从环境中获取新的信息?

这使语言模型的分析能力,参与了连续行动的过程。

而论文还有一个反过来的发现。

在HotpotQA问答实验里,单独使用ReAct的准确匹配率为27.4%,反而略低于只使用思维链CoT的29.4%。

将ReAct与CoT方法结合后,其中一种组合方式达到35.1%。

研究人员还发现,ReAct可能因为生成重复的分析和行动而陷入循环。有些失败来自搜索结果不理想,有些则来自模型未能正确选择下一步。

这个反例十分重要。

它说明ReAct有价值,但并不是每多调用一次工具、每多增加一次Thought,效果就必然更好。

在某些以推理为主的问题中,过于频繁的行动反而可能打断分析。

在另一些需要外部事实的问题中,缺乏行动又容易使模型依靠不可靠的记忆继续回答。

合理安排什么时候分析、什么时候行动,本身就是技术设计的一部分。

这也解释了为什么现代Agent系统有不同的实现方式,而不是所有任务都机械套用同一个ReAct循环。

六、既然ReAct这么有用,为什么企业还需要Workflow?

这里必须回到B205。

我们仔细想想。

会议室被张主任抢走以后,重新查询其他符合条件的房间,真的需要ReAct吗?

不需要。

普通软件完全可以写出这样的规则:

如果预约失败的原因是会议室被占用,就重新查询。

如果查询到其他满足全部条件的房间,就按既定规则选择。

如果没有,则请用户确认是否修改条件。

这是一套明确、可预测的流程。

不论有没有大模型,它都可以运行。

因此,真正有意义的问题不是:

“ReAct能不能处理B205?”

而是:

“什么情况下,提前写好的流程已经不足以决定下一步?”

例如,用户提出更复杂的要求:

这次会议主要是协调项目延期,张主任必须参加,另外几个部门负责人尽量到场。如果大家实在凑不齐,就先安排能拍板的人。会议形式可以灵活一点,但不要影响最终决策。

现在,系统不仅需要查会议室,还需要处理许多不那么明确的条件。

“能拍板的人”是谁?

如果有人只能线上参会,是否仍满足会议目标?

如果某位负责人无法参加,是否应该优先调整时间?

这些判断可以部分依赖企业已有的规则和优化算法,但也可能需要结合邮件、人员职责、组织关系和用户最新要求,动态提出方案。

这时,语言模型参与下一步行动选择,才可能体现更明显的价值。

例如,模型先查询人员日程,发现关键负责人冲突,再进一步查阅会议背景,提出两个备选方案,最后向用户询问需要授权的变更。

在这样的任务中,每一次新信息都可能改变后续行动。

而这些变化不一定都适合提前写成大量固定分支。

不过,ReAct也不会让所有复杂判断自动正确。

模型可能误判谁拥有决策权,可能忽略组织规定,也可能自行提出不合适的安排。

所以,真实系统往往需要把两种能力结合起来。

让模型处理开放式判断。

让规则和业务系统处理明确的硬性约束。

让外部执行程序控制哪些动作能够真正发生。

Workflow可以组织这样的过程,Agent也可以在其中承担动态决策。

两者没有必要互相排斥。

七、ReAct让模型有了行动反馈,但没有替它解决现实世界的所有麻烦

ReAct带来的重要变化,是让模型有机会在执行过程中获得新信息,并据此调整行动。

可是,能够根据观察继续行动,与能够可靠地完成业务,仍有距离。

先看一个简单的例子。

预约B205返回:

SLOT_TAKEN

这表示此次预约因为资源冲突而失败。

模型可以据此重新寻找会议室。

但如果工具返回:

TIMEOUT

事情就不同了。

超时可能意味着业务系统没有收到请求,也可能意味着请求已经成功,只是响应未能及时返回。

如果模型看到TIMEOUT就反复调用预约接口,可能造成重复操作。

解决这种问题,通常需要查询原请求状态、使用服务端支持的幂等机制,或者在结果不明时转交人工处理。

仅仅增加ReAct循环,不能消除这类风险。

再看权限。

模型可能根据会议安排推断:“取消另一间会议室的预约,可以释放资源。”

这并不意味着它拥有取消别人预约的权力。

工具权限和动作边界,应当由执行程序及业务系统控制。

最后,还有一个经常被忽略的问题:

模型认为任务完成了,业务系统是否也认为完成了?

如果模型生成:

“会议室已经帮您预约成功。”

但预约接口实际上只是返回“申请已提交”,那任务并没有达到用户最初希望的结果。

必须继续查看业务系统的真实状态,确认预约是否生效。

这些问题不属于ReAct单独能够解决的范围。

这恰好揭示了现代AI任务执行的一个重要边界。

ReAct可以帮助模型根据反馈调整行动。

但真实系统仍需要可靠的接口、权限机制、异常处理与结果验证。

让模型知道下一步可以做什么,与保证这一步执行正确,是两个不同的技术责任。

八、从2022年的ReAct,再看今天的Agent

现在我们已经可以理解,为什么ReAct会在大模型技术发展过程中受到关注。

此前,大模型主要通过生成文字来展示能力。

用户提出问题,模型生成答案。

即使加入思维链,它仍可能只是在原有上下文中展开分析。

工具让模型可以接触外部信息与系统。

而ReAct进一步展示了,模型可以在任务分析与外部行动之间交替运行,利用工具返回的新信息修正后续行为。

这使得大模型有机会从一次性的问答,参与连续的任务求解。

但ReAct并不是Agent的全部,更不能将今天各种Agent框架简单理解为ReAct改了一个名字。

有的系统先制定整体计划,再分步执行。

有的让模型只负责少数不确定的决策。

有的通过固定Workflow管理整个过程。

还有的系统把不同的模型、搜索算法、工具与业务规则组合起来。

它们都可能借鉴ReAct的思想,却不一定完全按照原论文的方式实现。

2024年,Anthropic在《Building effective agents》中也强调,对于路径明确的任务,应优先考虑简单、可组合的实现方式;需要灵活决策时,再考虑更复杂的Agent系统。

这与ReAct的实验结果并不矛盾。

ReAct告诉我们,语言模型的分析与外部行动能够互相促进。

工程实践则提醒我们,这种能力有成本、有误差,也有适用范围。

对于企业来说,不能只问“这个场景能不能做Agent”。

还要问:

任务中究竟有哪些判断无法提前写死?

这些判断是否需要外部事实支持?

模型参与以后,能否比确定性方法取得更好的效果?

哪些执行结果需要业务系统最终确认?

如果这些问题没有回答清楚,即使给AI连接再多工具,增加再多行动循环,也不代表它就更会办事。

九、机器开始边做边判断,但它真的懂业务吗?

回到故事最初。

张主任抢走了B205。

如果AI只是一次性调用工具,它可能只会告诉我们预约失败。

如果采用ReAct式的方法,它可以利用新的观察,重新判断行动,继续寻找符合目标的会议室。

但我们已经知道,重新预约这件简单的事,并不需要大模型才能处理。

ReAct真正值得关注的,是它提供了一种让语言模型在外部环境中逐步求解任务的方法。

模型不必在最初一次回答中确定全部行动。

它可以利用执行过程中的新信息,对后续行动作出调整。

2022年的研究通过模拟交互任务、网页购物和知识问答等实验,说明了这种方法的潜力,也暴露了重复行动、推理错误和环境信息不充分等问题。

这项研究最值得记住的,不是Thought、Action、Observation三个单词本身。

而是它们之间的联系。

模型分析下一步,行动改变或查询外部环境,环境反馈再影响模型的下一次分析。

这正是ReAct所研究的推理与行动协同。

不过,这离真正的专业工作还有一步距离。

假如用户让AI审核一份招标文件。

它能够读取文件。

能够查询制度。

能够调用工具。

遇到问题,也能够继续查找资料。

可经验丰富的审核人员,往往知道哪些条款最容易出风险,哪些条件需要跨文件核对,哪些错误会导致投标被否决。

这些判断并不会因为AI具备ReAct式行动循环,就自动出现在它的工作过程中。

会根据反馈决定下一步,不等于知道专业人员应该怎样做。

如果把专家的工作方法、检查步骤、参考资料和质量要求封装起来,能不能让AI更加稳定地完成专业任务?

这又涉及另一项技术。

下一回,我们继续研究。

把经验写成Skill,AI就真的学会了吗?

相关学习资料