最近大语言模型突破了文字处理任务的限制,向智能coordinator的角色转化。 一个疑问随之而来,“LLM到底如何决断并采取行动来调用不同的api的?”

LLM有没有主动推理能力目前没有确切答案

但是可以明确的是,随着Chain-of-Thought(CoT)的引入,LLM的推理能力可被解锁, CoT是ReAct的前提

CoT, 简言之就是把人的思维过程嵌入到prompt,指导LLM完成思考做出预测, 但是CoT的问题在于,它是静态

而我们人类,在行动之前,总是要根据环境和条件的变化不断的产生新的,动态的CoT来指导不同的行动。

同样的,LLM在充当智能coordinator的过程中,也需要根据不同的情况,调用不同的api

静态CoT在multi-hop的问题中尤其挣扎。

例图中问题,[device] ... [program] ? 是一个多跳问题,我们需要通过外部知识首先定位到program,然后才能回答哪个device可以control这个program

这种情况下,LLM产生的静态CoT出现了知识和逻辑的错误(apple tv不是progrm),导致最终预测失败

为了解决此问题

ReAcT的作者首先设计了简单的wikipedia api(search, lookup, finish)来通过的外部知识协助LLM

其次,作者在调用 api之前和之后,显性的放入Thought和observation,用来指导和调整api的调用策略

这本质上还是CoT, 不过因为oberve了外部环境,CoT随之变化,打破了静态性

图像

总结作者使用的prompt

Thought, Act, Obs

简单的Re(reasoning)Act prompting, 并通过few-shot的方式,让LLM学会调用 api,并以[Finish]作为任务完成的标志

如果拓展开来,把多跳问题换成其他,把wikipedia的api换成任意别的api,ReAct这种 工作流 其实可以移植到任何场景。

例如接下来的例子:

利用langchain来调用spotify的api来根据用户的自然语言指令,创建歌单

图像当我们仔细看它的log输出,会发现熟悉的:

Thought, Act, Obs

langchain一定是借鉴了ReAct的方法

我们去它的github看一下源代码,果然如此,用了同样的ReAct的few-shot方式做了封装

图像