最近大语言模型突破了文字处理任务的限制,向智能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方式做了封装