本文介绍了 ReAct 、Plan-and-Execute 两种大模型推理模式,以及 FastGPT 对 ReAct 的三种实现方式。
01ReAct 和 Plan
ReAct(Reasoning and Acting),让大模型通过「观察-思考-行动」三个步骤,循环往复,能够自主决定使用一些工具去解决问题。从代码层面来讲,本质是递归(or 循环),而递归结束的条件往往是超过次数限制、问题已经得到解决等条件。
Plan-and-Execute,相较于 ReAct,会先让大模型制定计划、步骤(子任务),然后按照计划依次执行。中间可能会调整计划,如有必要。
从一些测评集来看,ReAct响应速度更快,消耗 token 量少,但处理复杂任务的表现不及Plan-and-Execute。这似乎也是意料之中。
笔者认为,在智能客服、需要即时响应等情况下,ReAct是最优解。且大部分实际生产环境中,计划可以由基于 Cot(Chain-of-Thought) 设计模式的 Prompt 来完成。
FastGPT中「工具调用」可以看做是 ReAct 的思路。
02 FastGPT 代码
代码所在目录:
1. 入口与主流程
工具调用的主入口是 dispatchRunTools(见 runTool/index.ts),它负责根据当前节点、上下文、历史消息等,决定是否需要调用工具,并组织好调用工具所需的参数和上下文。
2. 工具调用的三种模式
根据所用大模型的能力,分为三种调用方式:
ToolChoice(如 OpenAI 的 tool_calls):runToolWithToolChoice
FunctionCall(如 OpenAI 的 function_call):runToolWithFunctionCall
PromptCall(通过 prompt 让大模型决定是否调用工具):runToolWithPromptCall
dispatchRunTools 会根据模型的能力选择合适的调用方式。
科普一下 tool_calls 和 function_call 的区别:
function_call(旧版本)
每次只能调用一个函数
已被标记为 deprecated(废弃)
tool_calls(新版本)
最新的模型,目前主要使用 tool_calls,提供给大模型 tool schema,没有显式的使用Prompt干预整个过程。也可以看一下古老的PromptCall是如何处理的。附源码中的Prompt。