基于 LangChain 构建开源大语言模型智能体
概要
开源大型语言模型 (LLMs) 现已达到一种性能水平,使它们适合作为推动智能体工作流的推理引擎。例如 Mixtral 等模型在基准测试中甚至超过了 GPT-3.5,并且通过微调,其性能可以轻易得到进一步增强。
引言
针对因果语言建模训练的大型语言模型 (LLMs) 可以处理广泛的任务,但它们经常在逻辑、计算和搜索等基本任务上遇到困难。最糟糕的情况是,它们在某个领域(比如数学)表现不佳,却仍然试图自己处理所有计算。
为了克服这一弱点,除其他方法外,可以将 LLM 整合到一个系统中,在该系统中它可以调用工具:这样的系统称为 LLM 智能体。
在这篇文章中,我们将解释 ReAct 智能体的内部工作原理,然后展示如何使用最近在 LangChain 中集成的 ChatHuggingFace 类来构建它们。最后,我们将几个开源 LLM 与 GPT-3.5 和 GPT-4 进行基准测试对比。
什么是智能体?
LLM 智能体的定义非常宽泛:它们指的是所有将 LLMs 作为核心引擎,并能够根据观察对其环境施加影响的系统。这些系统能够通过多次迭代'感知 ⇒ 思考 ⇒ 行动'的循环来实现既定任务,并常常融入规划或知识管理系统以提升其表现效能。
今天,我们将重点放在 ReAct 智能体 上。ReAct 采用一种基于'推理 (Reasoning)'与'行动 (Acting)'结合的方式来构建智能体。在提示词中,我们阐述了模型能够利用哪些工具,并引导它'逐步'思考(亦称为思维链行为),以规划并实施其后续动作,达成最终的目标。
ReAct 智能体内部工作原理示例
上述图解虽显得有些抽象,但其核心原理其实相当直接。
本质上,LLM 通过一个循环被调用,循环中的提示包含如下内容:
这里是一个问题:'{question}'
你可以使用这些工具:{tools_descriptions}。
首先,你需要进行'思考:{your_thoughts}',接下来你可以:
- 以正确的 JSON 格式发起工具调用,
- 或者,以'最终答案:'为前缀来输出你的答案。
接下来,你需要解析 LLM 的输出:
- 如果输出中包含
'最终答案:'字符串,循环便结束,并输出该答案; - 若不包含,则表示 LLM 进行了工具调用:你需解析此输出以获得工具的名称及其参数,随后根据这些参数执行相应工具的调用。此工具调用的结果将被追加至提示信息中,然后你将带有这些新增信息的提示再次传递给 LLM,直至它获得足够的信息来给出问题的最终答案。
例如,LLM 的输出在回答问题 1:23:45 中有多少秒? 时可能看起来像这样:
{
"action": "convert_time",
"action_input": {
"time": "1:23:45"
}
}
鉴于此输出未包含 '最终答案:' 字符串,它代表进行了工具调用。因此我们解析该输出,获取工具调用的参数:以参数 {"time": "1:23:45"} 调用 convert_time 工具,执行该工具调用后返回 {'seconds': '5025'}。
于是,我们将这整个信息块追加至提示词中。更新后的提示词现在变为(更为详尽的版本):


