代理可能是最“杀手级” LLM 应用程序,但构建和评估代理很难。函数调用是有效使用工具的关键技能,但用于衡量函数调用性能的良好基准并不多。今天,我们很高兴发布四个新的测试环境,用于基准测试 LLM 有效使用工具完成任务的能力。我们希望这将使每个人都能更容易地测试不同的 LLM 和提示策略,以展示什么能够实现最佳的代理行为。

我们设计了这些任务来测试我们认为是常见代理工作流程先决条件的能力,例如计划/任务分解、函数调用,以及在需要时覆盖预先训练的偏差的能力。如果一个 LLM **无法**解决这些类型的问题(没有明确的微调),它很可能难以可靠地执行和推广其他需要“推理”的工作流程。以下是一些渴望看到我们发现的关键结论

- 所有模型都可能在更长的轨迹上失败,即使是简单的任务也是如此。
- GPT-4 在关系数据任务中获得了最高分,该任务最接近于常见用法。
- GPT-4 在多重宇宙数学任务中似乎比 GPT-3.5更差;它可能预先训练的偏差阻碍了它在逆向缩放示例中的性能。
- Claude-2.1 在 4 个任务中的 3 个任务中性能与 GPT-4 的误差范围一致,但似乎在关系数据任务中落后于 GPT-4。
- 尽管输出了格式良好的工具调用,但 AnyScale 的 Mistral 7b 微调变体难以可靠地组成超过 2 个调用。未来的开源函数调用工作应该侧重于函数组合,而不仅仅是单个调用的正确性。
- 除模型质量外,服务可靠性也很重要。我们遇到了来自最受欢迎的模型提供商的频繁随机 5xx 错误。
- 如果您的任务或知识与模型的预先训练有很大不同,超人的模型知识也无济于事。在部署之前,根据您需要模型擅长的行为模式验证您选择的 LLM。
- 规划对于 LLM 来说仍然很困难 - 即使对于简单的任务,失败的可能性也会随着所需步骤数量的增加而增加。
- 函数调用使获得 100% 的模式正确性变得容易,但这对于任务正确性来说还不够。如果您要为代理使用微调模型,则必须在多步轨迹上进行训练。
在本文的其余部分,我们将逐步介绍每个任务并传达一些初始基准测试结果。
实验概述
在此版本中,我们将分享结果和代码以重现 7 个模型在 4 个工具使用任务中的这些实验
- 打字机(单个工具): 顺序调用单个工具来打出一个单词。
- 打字机(26 个工具): 顺序调用不同的工具来打出一个单词。
- 关系数据: 根据三个表中的信息回答问题。
- 多重宇宙数学: 使用工具回答数学问题,其中底层数学规则略有变化。
我们在这些任务中计算四个指标
- 正确性(与真实情况相比) - 这使用 LLM 作为评判。由于所有这些问题的答案都简明扼要,而且相当二元,我们发现判断与我们自己的决定相符。
- 正确最终状态(环境) - 对于打字机任务,每次工具调用都会更新世界状态。我们直接检查每行测试结束时环境的等效性。
- 中间步骤正确性 - 每个数据点都有一组最佳的函数调用序列来获得正确答案。我们直接检查函数调用的顺序是否与真实情况一致。
- 执行的步骤与预期步骤的比率 - 即使代理最终返回了正确答案,也可能选择了一组次优的工具。此指标将反映差异,但不像精确匹配的中间步骤正确性那么严格。
我们比较了闭源模型和开源模型。展开下面的部分以了解更多详细信息。
测试的模型
开源
- Mistral-7b-instruct-v0.1: Mistral 的 70 亿参数模型 由 Anyscale 改编用于函数调用。
- Mixtral-8x7b-instruct: Mistral 的 70 亿参数专家混合模型,由 Fireworks.ai 使用指令微调改编。
OpenAI -(工具调用代理)
- GPT-3.5-0613
- GPT-3.5-1106-preview
- GPT-4-0613
- GPT-4-1106-preview
Anthropic
- 使用 XML 提示及其 工具用户 库的 Claude 2.1。
⌨ 打字机(单个工具)
打字机任务很简单:代理必须“输入”给定的单词,然后停止。单词从简单(a
或 cat
)到稍微难一点(communication
和 keyboard
)不等。在单工具设置中,模型会得到一个type_letter
工具,该工具接受一个字符作为输入。要通过,代理只需按正确的顺序为每个字母调用该工具即可。例如,对于 cat
,代理将执行

您可以查看此链接处的完整数据集,以了解它是什么样子,以及查看文档,以了解有关如何自己运行此任务的更多信息。
完成如此简单的任务对于任何有自尊的代理来说都是基本要求,并且您可能会认为像 gpt-4
这样的具有工具调用功能的大型模型会轻松通过,但我们发现情况并非总是如此!例如,此示例中,代理拒绝尝试输入单词“keyboard”,或者此示例中,它无法识别提供的单词(“head”)。

以下是针对此任务测试的代理的结果
mistral-7b
模型无法有效地顺序调用超过 1 个工具。上图显示了每个代理在给定数据集上的平均正确性。误差线是标准误差
\( \text{Standard Error} = \hat{p}\pm\sqrt{\frac{p \times (1 - p)}{n}}\)
我们对经过微调的 mistral-7b-instruct-v0.1
模型的糟糕表现感到惊讶。为什么它在这个任务中苦苦挣扎?让我们回顾一下它的其中一个运行,看看它在哪里可以改进。对于数据点“aaa”(参见链接运行),模型首先调用“a”,然后在文本中以“a”响应,并为字母“b”提供格式错误的函数调用。然后代理返回。

上图取自第二次 LLM 调用,它已经成功输入了字母“a”。从结构上来说,第二次响应接近正确,但工具参数是错误的。
⌨️ 打字机(26 个工具)
您可能希望您的代理能够在您的应用程序中使用多个工具,但它是否能够有效地使用所有工具?多少才算太多?
26 工具打字机任务测试与单工具用例相同的内容:代理是否能够使用提供的工具(然后停止)输入提供的单词?这里不同的是,代理必须在 26 个工具(每个英文字母 1 个)中选择。没有一个工具接受任何参数。我们上面的 cat
示例将通过执行以下操作来通过

此任务的数据集使用与单工具打字机数据集相同的测试输入单词。您可以查看此链接处的完整数据集,并查看任务文档,以了解更多详细信息,包括如何在该基准上运行您自己的代理。
再一次,您可能会认为此任务对于像 gpt-4
这样的强大模型来说轻而易举,但您再次会被证明是错误的。以此运行为例。当被要求输入“aaaa”时,它首先输入了四个“a”,但随后无法停止,又输入了 4 个“a”,然后才决定完成。

以下是针对此任务测试的代理的结果
🕸️ 关系数据
一个有用的 AI 助手应该能够推理对象及其关系。回答现实世界的问题通常需要从不同的来源合成响应,但 LLM 在这种“思考”方面有多可靠?
在关系数据任务中,代理必须根据包含在 3 个关系表中的数据回答问题。为了使用这些工具,它得到了以下说明
代理可以使用其可用的 17 个工具查询这些表以获得正确答案。这三个表分别包含有关用户、地点和食物的信息。在今天发布的所有合成数据集中,此数据集最类似于现实生活中 Web 应用程序中的工具使用情况。
使用表中的数据,可以回答以下问题:“你能告诉我关于 Alice 的一些信息吗?”或“Alice 现在可能需要一把雨伞吗?”(下面显示了样本数据)。
以下是后一个问题的说明

对于此示例,代理从其可用的 17 个工具中选择了以下 3 个工具
find_users_by_name(name)
→ 按名称搜索用户。get_user_location(user_id)
→ 查询给定用户的喜爱的颜色。get_weather_at_location(location_id)
→ 获取给定位置的天气。
通过查看每个表格的前两条记录,我们可以看到这些函数调用将返回的结果
用户
id | 姓名 | 电子邮件 | 位置 | 喜欢的颜色 | 喜欢的食物 |
---|---|---|---|---|---|
1 | 爱丽丝 | alice@gmail.com | 1 | 红色 | [1, 2, 3] |
21 | 鲍勃 | bob@hotmail.com | 2 | 橙色 | [4, 5, 6] |
位置
id | 城市 | 当前时间 | 当前天气 |
---|---|---|---|
1 | 纽约 | 2023-11-14 上午 10:30 | 多云,温度:68°F |
2 | 洛杉矶 | 2023-11-14 上午 7:45 | 晴朗,温度:75°F |
食物
id | 姓名 | 卡路里 | 过敏成分 |
---|---|---|---|
1 | 披萨 | 285 | ["麸质", "乳制品"] |
2 | 巧克力 | 50 | ["牛奶", "大豆"] |
代理程序首先检索爱丽丝的用户 ID,然后使用该用户 ID 获取当前位置,最后使用位置 ID 获取当前天气。由于爱丽丝所在位置的当前天气是多云,因此她不太可能需要雨伞。如果代理程序跳过任何这些步骤,它将缺乏准确提供最终答案所需的必要信息。
评估数据集包含 20 个难度不同的问题,让我们可以测试代理程序在理解每个函数如何依赖于其他函数方面的推理能力。

尽管在所需的推理能力方面比前两个任务稍微困难一些,但 GPT-4 在此任务中表现相当出色,除了 1 个问题正确外,其他问题都答对了。让我们来看看这个错误。对于这个数据点,代理程序的提示是“弗兰克是伊文的朋

在这种情况下,GPT-4
正确地首先调用了 get_users_by_name("弗兰克")
。该工具返回了关于“弗兰克猫”的信息。然后,模型决定这与所请求的“弗兰克”不匹配,因此它再次查询“伊文”。没有直接匹配,因此代理程序放弃了,回答说它找不到名为“伊文”的用户。虽然它可能更容易理解它对“弗兰克猫”的信心较低,但代理程序既没有将其视为可能的匹配,也没有在它对用户的最终响应中提及它,这意味着用户将无法有效地提供反馈来帮助代理程序自我纠正。
🌌 多元宇宙数学
LLM 被宣传为“推理机器”,但它们在实践中能“推理”得有多好呢?
在多元宇宙数学任务中,代理程序必须回答简单的数学问题,例如2 加 3 等于多少。
提供给 LLM 的完整任务说明(在系统提示中提供的地方)如下
重要的是,虽然这些常见的运算(加、减、乘、除、余弦等)都略有改变,但大多数数学性质仍然成立。运算仍然是可交换的和可结合的,尽管它们不是可分配的。
让我们通过一个例子来说明我们的意思:“大肠杆菌每 20 分钟分裂一次。如果我们从 5 个细胞开始,在 2 小时(120 分钟)后将有多少个细胞?”

为了使用提供的工具解决这个问题,代理程序需要识别
- 在分配的时间内将发生多少次分裂
d
?(d = 120/20
) - 然后,对于每个细胞
c
,将产生多少个细胞?(c = 2**d
) - 最后将产生多少个细胞
f
?(f = 5*c
)
GPT-4
可能在训练期间看到了这些步骤中的每一个,但由于它知道这些运算已被修改,它必须避免跳过步骤,而是专注于组合工具。以下是我们测试的代理程序在此任务中的结果

mistral-7b
模型)。规模并不总是转化为质量改进,如果任务不在分布范围内。多元宇宙数学数据集测试了 LLM 的两个重要特征,它们是独立的,不会让其事实知识产生干扰
- 它能“推理”组合得有多好?
- 它在遵循可能与预先训练的知识相矛盾的说明方面做得有多好?
如果你已经记住了答案,那么很容易通过考试。当答案与你习惯的模式相矛盾时,就更难了。让我们看看GPT-4
失败的众多示例之一:“131,778 除以 2 等于多少?”

虽然GPT-4
代理程序正确地调用了divide()
工具,但它忽略了来自工具的输出,而是使用了它认为答案应该是的。即使代理程序的说明指出它应该只依靠工具的输出作为其答案,也会发生这种情况。
mistral-7b-instruct-v0.1
,Anyscale 为函数调用微调的 OSS 模型,在此任务中表现出色。这个数据集平均而言,需要多次工具调用的问题更少(与我们的其他任务相比)。该模型在简单的打字机任务中失败,但在此任务中表现良好,这突出了仅对单跳函数调用进行微调可能会导致意想不到的性能下降。
其他观察结果
对于这些结果,我们传达了模型质量,但构建 AI 应用程序还需要服务可靠性和稳定性。尽管这些实验的数据集规模相对较小,并且我们在评估套件中添加了客户端速率限制,但我们仍然遇到了来自流行模型提供商的随机且频繁的 5xx 内部服务器错误。
我们最初计划对谷歌的gemini-pro
模型进行基准测试,但由于其在评估期间的内部服务器错误率上升,我们决定将其排除在结果之外。该 API 还拒绝了打字机和多元宇宙数学数据集中的多个数据点,因为它认为这些数据点“不安全”(例如“2 的 3 次方等于多少”)

安全过滤器可能会有所帮助,但如果误报率过高,它可能会影响您的服务质量。
最后,我们已经表明,对于工具使用,需要更好的开源替代方案。开源社区正在快速开发更好的函数调用模型,我们预计很快将有更多具有竞争力的选项广泛可用。要测试您的函数调用模型在这些基准测试中的表现,请按照这里的说明进行操作,或者如果您希望我们运行特定模型,请在 GitHub 库中打开一个问题。我们希望这些结果能够发生改变!
结论
感谢您的阅读!我们很乐意听到您对您希望看到在这些环境中测试的其他模型和架构,以及哪些其他测试将有助于在尝试将代理程序用于您的应用程序时让您的生活更轻松的反馈。您可以在链接的文章中查看我们之前关于文档问答、提取、半结构化表格上的问答以及多模态推理能力的发现。您还可以通过运行langchain-benchmarks
包中的笔记本,亲眼见证这些结果的复现方式。再次感谢!
