ReAct(reason act) 推理行为

简介

ReAct(reason act)是一种让语言模型能够通过自然语言推理来解决复杂任务的范式。ReAct适用于语言模型可以执行某些动作的任务。例如,与MRKL系统类似,语言模型可以与外部API交互,获取信息。在[[1.AI知识/常识/LangChain|LangChain]] 的Agent中必不可少。

当被问到一个问题时,语言模型可以选择执行一个动作来获取信息,然后根据获取的信息来回答问题。ReAct系统可以被认为是MRKL系统的扩展,增加了对可执行动作的推理能力。如下图所示,语言模型在回答问题的过程中,会交替地进行思考(Thought)、动作(Act)和观察(Obs),直到得出结论。

参考论文:https://arxiv.org/pdf/2210.03629.pdf

笔记

1/ ReAct: 大语言模型推理,决断和行动的关键 最近大语言模型突破了文字处理任务的限制,向智能coordinator的角色转化。 一个疑问随之而来,“LLM到底如何决断并采取行动来调用不同的api的?” 本条thread读书笔记,通过解读论文ReAct,同时介绍langchain的一个具体例子来试图回答这个问题。

图像

2/ paper: ReAct: Synergizing Reasoning and Acting in Language Models. 关键词 [推理],[行动] LLM有没有主动推理能力?目前没有确切答案。 但是可以明确的是,随着Chain-of-Thought(CoT)的引入,LLM的推理能力可被解锁。 CoT是ReAct的前提,我之前有thread专门介绍CoT,感兴趣的读者可以去阅读

3/ CoT, 简言之就是把人的思维过程嵌入到prompt,指导LLM完成思考做出预测。 CoT的问题在于,它是静态的。 而我们人类,在行动之前,总是要根据环境和条件的变化不断的产生新的,动态的CoT来指导不同的行动。 同样的,LLM在充当智能coordinator的过程中,也需要根据不同的情况,call不同的api。

4/ 静态CoT在multi-hop的问题中尤其挣扎。 例图中问题,[device] ... [program] ? 是一个多跳问题,我们需要通过外部知识首先定位到program,然后才能回答哪个device可以control这个program 这种情况下,LLM产生的静态CoT出现了知识和逻辑的错误(apple tv不是progrm),导致最终预测失败

图像

5/ 为了解决此问题 ReAcT的作者首先设计了简单的wikipedia api(search, lookup, finish)来通过的外部知识协助LLM 其次,作者在call api之前和之后,显性的放入Thought和observation,用来指导和调整api的调用策略 这本质上还是CoT, 不过因为oberve了外部环境,CoT随之变化,打破了静态性

6/ 总结作者使用的prompt Thought, Act, Obs Thought, Act, Obs Thought, Act, Obs 简单的Re(reasoning)Act(Act) prompting, 并通过few-shot的方式,让LLM学会call api,并以[Finish]作为任务完成的标志。

7/ 如果拓展开来,把多跳问题换成其他,把wikipedia的api换成任意别的api,ReAct这种work flow其实可以移植到任何场景。 例如接下来的例子: 利用langchain来调用spotify的api来根据用户的自然语言指令,创建歌单。

A similar "Plan-Execute" agent framework that @yoheinakajima has been using to create Baby-AGI is also useful for interacting with large and complex OpenAPI specs Here an agent plans and executes 5 different API calls to complete a user request Docs: https://python.langchain.com/en/latest/modules/agents/toolkits/examples/openapi.html#st-example-hierarchical-planning-agent…

类似的 "计划-执行"(Plan-Execute)代理框架(@yoheinakajima 已用于创建 Baby-AGI)也适用于与大型复杂 OpenAPI 规范进行交互。 在这里,一个代理计划并执行 5 个不同的 API 调用来完成一个用户请求 文档:https://python.langchain.com/docs/integrations/toolkits/openapi#st-example-hierarchical-planning-agent

图像

8/ 当我们仔细看它的log输出,会发现熟悉的: Thought, Act, Obs Thought, Act, Obs Thought, Act, Obs 如果你看完了我的这条thread,就会知道langchain一定是借鉴了ReAct的方法。 我们去它的github看一下源代码,果然如此,用了同样的ReAct的fewshot方式做了封装。

图像

9/ 题外话,langchain的我看到的非常快速把学术成功封装在自己产品中的项目,它最近刚完成了1000万美元的融资。 不知道看完此条thread的你,有什么感想?你是不是也可以?

10/ 最后写一下这条thread的由来。 感谢 @tinyfool 老师, 在他的space中聊到了langchain和ReAct。一直等他的视频等不到,我自己先做文字版预热了,相信tiny老师的视频会更精彩。

11/ 如果你喜欢我分享的NLP知识,请关注 @realrenmin , 每周会坚持发长thread跟大家做分享。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注