概要
开源大型语言模型 (LLMs) 现已达到一种性能程度,使它们适宜作为推动智能体工作流的推理引擎: Mixtral 甚至在咱们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能能够轻易的失去进一步加强。
引言
针对 因果语言建模 训练的大型语言模型 (LLMs) 能够解决宽泛的工作,但它们常常在逻辑、计算和搜寻等根本工作上遇到困难。最蹩脚的状况是,它们在某个畛域,比方数学,体现不佳,却依然试图本人解决所有计算。
为了克服这一弱点,除其余办法外,能够将 LLM 整合到一个零碎中,在该零碎中,它能够调用工具: 这样的零碎称为 LLM 智能体。
在这篇文章中,咱们将解释 ReAct 智能体的外部工作原理,而后展现如何应用最近在 LangChain 中集成的 ChatHuggingFace
类来构建它们。最初,咱们将几个开源 LLM 与 GPT-3.5 和 GPT-4 进行基准测试。
什么是智能体?
LLM 智能体的定义十分宽泛: 它们指的是所有将 LLMs 作为外围引擎,并可能依据察看对其环境施加影响的零碎。这些零碎可能通过屡次迭代“感知 ⇒ 思考 ⇒ 口头”的循环来实现既定工作,并经常融入布局或常识管理系统以晋升其体现效力。你能够在 Xi et al., 2023 的钻研中找到对智能体畛域综述的精彩评述。
明天,咱们将重点放在 ReAct 智能体 上。ReAct 采纳一种基于“ 推理 (Reasoning)”与“ 口头 (Acting)”联合的形式来构建智能体。在提醒词中,咱们论述了模型可能利用哪些工具,并疏导它“逐渐”思考 (亦称为 思维链 行为),以布局并施行其后续动作,达成最终的指标。
ReAct 智能体外部工作原理示例
上述图解虽显得有些形象,但其外围原理其实相当间接。
参见 此笔记本: 咱们借助 Transformers 库展现了一个最根底的工具调用实例。
实质上,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'}
。
于是,咱们将这整个信息块追加至提醒词中。
更新后的提醒词当初变为 (更为详尽的版本):
这是一个问题:“1:23:45 蕴含多少秒?”你能够应用以下工具:
- convert_time: 将小时、分钟、秒格局的工夫转换为秒。首先,进行“思考: {your_thoughts}”,之后你能够:
- 应用正确的 JSON 格局调用工具,- 或以“最终答案:”为前缀输入你的答案。思考: 我须要把工夫字符串转换成秒数。口头:
{
"action": "convert_time",
"action_input": {"time": "1:23:45"}
}
观测后果: {'seconds': '5025'}
➡️ 咱们用这个新的提醒再次调用 LLM,鉴于它能够拜访工具调用后果中的 观测后果
,LLM 当初最有可能输入:
思考: 我当初有了答复问题所需的信息。最终答案: 1:23:45 中有 5025 秒。
工作就这样实现了!
智能体零碎的挑战
一般来说,运行 LLM 引擎的智能体零碎的难点包含:
- 从提供的工具中抉择一个可能帮忙实现目标的工具: 例如,当询问
“大于 30,000 的最小质数是什么?”
时,智能体可能会调用“K2 的高度是多少?”
的Search
工具,但这并无帮忙。 -
以严格的参数格局调用工具: 例如,在尝试计算一辆汽车 10 分钟内行驶 3 公里的速度时,你必须调用
Calculator
工具,通过distance
除以time
来计算: 即使你的 Calculator 工具承受 JSON 格局的调用{“tool”:“Calculator”,“args”:“3km/10min”}
,也存在许多陷阱,例如:- 工具名称拼写错误:
“calculator”
或“Compute”
是有效的 - 提供的是参数名称而非其值:
“args”:“distance/time”
- 格局非标准化:
“args":"3km in 10minutes”
- 工具名称拼写错误:
- 高效地排汇和利用过来察看到的信息,无论是初始上下文还是应用工具后返回的察看后果。
那么,残缺的智能体设置会是怎么的呢?
应用 LangChain 运行智能体
咱们刚刚在 🦜🔗LangChain 中集成了一个 ChatHuggingFace
封装器,使你可能基于开源模型创立智能体。
创立 ChatModel 并为其装备工具的代码非常简单,你能够在 Langchain 文档 中查看所有相干代码。
from langchain_community.llms import HuggingFaceHub
from langchain_community.chat_models.huggingface import ChatHuggingFace
llm = HuggingFaceHub(
repo_id="HuggingFaceH4/zephyr-7b-beta",
task="text-generation",
)
chat_model = ChatHuggingFace(llm=llm)
你能够通过为其提供 ReAct 格调的提醒词和工具,将 chat_model
转化为一个智能体:
from langchain import hub
from langchain.agents import AgentExecutor, load_tools
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import (ReActJsonSingleInputOutputParser,)
from langchain.tools.render import render_text_description
from langchain_community.utilities import SerpAPIWrapper
# 设置工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 设置 ReAct 格调的提醒词
prompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(tools=render_text_description(tools),
tool_names=",".join([t.name for t in tools]),
)
# 定义智能体
chat_model_with_stop = chat_model.bind(stop=["\nObservation"])
agent = (
{"input": lambda x: x["input"],
"agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
}
| prompt
| chat_model_with_stop
| ReActJsonSingleInputOutputParser())
# 实例化 AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke(
{"input": "Who is the current holder of the speed skating world record on 500 meters? What is her current age raised to the 0.43 power?"}
)
智能体将解决如下输出:
思考: 为了答复这个问题,我须要找出以后速滑世界纪录保持者的年龄。我将应用搜寻工具来获取这些信息。口头:
{
"action": "search",
"action_input": "速滑 500 米世界纪录保持者的年龄"
}
察看: ...
智能体对决: 开源 LLM 作为通用推理智能体的体现如何?
你能够在 这里 找到这个基准测试的代码。
评估
咱们旨在评估开源大型语言模型 (LLMs) 作为通用推理智能体的体现。因而,咱们抉择了须要使用逻辑和应用根本工具 (如计算器和互联网搜寻拜访) 的问题。
最终数据集 是从其余三个数据集中选取样本的组合:
- 为了测试互联网搜寻能力,咱们选取了 HotpotQA 中的问题: 尽管这是一个检索型数据集,但它也可用于须要互联网拜访的通用问题解答。有些问题本来须要联合来自不同起源的信息: 在咱们的设置中,这意味着须要进行多步互联网搜寻以整合后果。
- 对于计算器的利用,咱们退出了来自 GSM8K 的问题: 这个数据集测试小学数学能力,并且齐全能够通过正确利用 4 个运算符 (加、减、乘、除) 来解决。
- 咱们还从 GAIA 中筛选了问题,这是一个对通用 AI 助理来说极具挑战性的基准测试。原始数据集中的问题可能须要许多其余不同的工具,如代码解释器或 PDF 阅读器: 咱们精选了那些仅需搜寻和计算器的问题。
评估采纳了 GPT-4 作为评判员,基于 Prometheus 提醒格局 的提醒进行,后果以 5 点李克特量表 (5-point Likert Scale) 示意: 具体的提醒内容可在 此处 查看。
模型
咱们评估了一些弱小的开源模型:
- Llama2-70b-chat
- Mixtral-8x7B-Instruct-v0.1
- OpenHermes-2.5-Mistral-7B
- Zephyr-7b-beta
- SOLAR-10.7B-Instruct-v1.0
这些模型通过 LangChain 的 ReAct 实现 进行了评估
这意味着咱们疏导它们依照以下格局输入函数调用:
{
"action": $TOOL_NAME,
"action_input": $INPUT
}
作为比拟,咱们还利用 LangChain 的 专为 OpenAI 设计的智能体 对 GPT-3.5 和 GPT-4 在雷同的例子上进行了评估。
因为这波及到它们本人的函数调用模板,并在此基础上进行了微调,这意味着 OpenAI 模型该当展现出最佳性能。
后果
鉴于开源模型并没有针对特定的输入格局进行特地的函数调用微调,相较于 OpenAI 智能体,它们处于略微不利的地位。
只管存在这样的不利条件,某些模型的体现仍然十分优良!💪
这是 Mixtral-8x7B 答复“贵阳和塔城哪个城市人口更多?”问题的示例:
思考: 为了答复这个问题,我须要找到贵阳和塔城以后的人口数。我将利用搜寻工具来查问这些信息。操作:
{
"action": "search",
"action_input": "贵阳以后人口"
}
4.697 百万 (2016 年)
思考: 我已取得贵阳的人口数,为 4.697 百万 (截至 2016 年)。当初,我将再次应用搜寻工具来确定塔城的人口数。操作:
{
"action": "search",
"action_input": "塔城以后人口"
}
人口: 新疆: 塔城的数据在 2021 年报告为 1,110,000 人。这比 2020 年的 1,138,638 人有所降落。人口: 新疆: 塔城的数据每年更新,从 2005 年 12 月到 2021 年,均匀人口为 1,023,000 人,共 17 次察看。我已确定塔城的人口约为 1.11 百万 (截至 2021 年)。比照两地人口,贵阳的人口超过塔城。思考: 我当初分明最终答案了
最终答案: 贵阳的人口更多,约为 4.697 百万 (截至 2016 年),而塔城的人口约为 1.11 百万 (截至 2021 年)。
这是各模型在咱们的评估数据集上的基准测试后果 (原始平均分按 1-5 的评分量表,已转换为 0-100% 的量表以便浏览):
正如所见,一些开源模型在推动智能体工作流程方面体现欠佳: 尽管对于小型的 Zephyr-7b 而言这是预期之中的,但令人诧异的是 Llama2-70b 的体现相当差。
👉 然而,Mixtral-8x7B 的体现十分杰出: 它甚至超过了 GPT-3.5!🏆
这是即开即用的性能: 与 GPT-3.5 不同的是,据咱们所知,Mixtral 没有针对智能体工作流程进行过微调 ,这在肯定水平上影响了其性能。例如,在 GAIA 上,因为 Mixtral 尝试应用格局不正确的参数调用工具,导致 10% 的问题失败。 如果对性能调用和工作布局技能进行适当的微调,Mixtral 的得分可能会更高。
➡️ 咱们强烈建议开源开发者开始针对智能体对 Mixtral 进行微调,以超过下一个挑战者: GPT-4!🚀
结语:
- 尽管 GAIA 基准测试仅在一小部分问题和多数工具上进行了尝试,但它仿佛是智能体工作流程整体模型性能的一个十分弱小的指标,因为它通常波及多个推理步骤和严格的逻辑。
- 智能体工作流程使 LLMs 可能晋升性能: 例如,在 GSM8K 上,GPT-4 的技术报告 显示,应用 5 次 CoT 提醒的状况下得分为 92%: 通过提供一个计算器,咱们可能在零次提醒的状况下达到 95%。对于 Mixtral-8x7B,LLM 排行榜 报告了应用 5 次提醒的状况下为 57.6%,而咱们在零次提醒的状况下达到了 73%。(记住,咱们仅测试了 GSM8K 的 20 个问题)
英文原文: https://hf.co/blog/open-source-llms-as-agents
作者: Aymeric Roucher, Joffrey THOMAS, Andrew Reed
译者: Evinci