Benchmarking Agent Tool Use

Agent 工具使用基准测试

12 分钟阅读

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

关系数据任务成功使用工具的示例

我们设计这些任务是为了测试我们认为对于常见 agent 工作流程来说是先决条件的能力,例如规划/任务分解、函数调用以及在需要时覆盖预训练偏差的能力。如果 LLM 无法解决这些类型的任务(没有显式的微调),那么它很可能难以在其他需要“推理”的工作流程中可靠地执行和泛化。以下是一些关键要点,供那些渴望了解我们发现的人参考

所有任务的总体性能(加权平均值)。 误差条使用标准误差计算。
💡
主要发现
- 所有 模型都可能在较长的轨迹中失败,即使对于简单的任务也是如此。
- GPT-4 在关系数据任务中获得了最高分,该任务最接近常见的用法。
- GPT-4 在 Multiverse Math 任务上的表现似乎比 GPT-3.5 更差;这可能是其预训练的偏差阻碍了其性能,是 逆向扩展 的一个例子。
- 对于 4 个任务中的 3 个,Claude-2.1 的性能在 GPT-4 的误差范围内,但在关系数据任务上似乎落后于 GPT-4。
- 尽管输出了格式良好的工具调用,但 AnyScale 微调的 Mistral 7b 变体在可靠地组合超过 2 个调用时遇到了困难。未来的开源函数调用工作应侧重于函数组合以及单次调用的正确性。
- 除了模型质量外,服务可靠性也很重要。我们遇到了来自最受欢迎的模型提供商的频繁随机 5xx 错误。
🦜
所以呢?
- 如果您的任务或知识与其预训练内容差异很大,那么超人的模型知识也无济于事。在部署之前,验证您选择的 LLM 在您需要它擅长的行为模式上的表现。
- 规划对于 LLM 来说仍然很困难 - 即使对于简单的任务,失败的可能性也会随着所需步骤的数量增加而增加。
- 函数调用使 100% 的模式正确性变得容易,但这对于任务正确性来说是不够的。如果您正在为 agent 使用微调模型,那么必须在多步轨迹上进行训练。

在本文的其余部分,我们将详细介绍每个任务,并交流一些初步的基准测试结果。

实验概述

在此版本中,我们将分享结果和代码,以重现 7 个模型在 4 个工具使用任务中的这些实验

我们计算了这些任务的四个指标

  1. 正确性(与真实情况相比)- 这使用 LLM 作为判断者。由于所有这些问题的答案都是简洁且相当二元的,我们发现判断结果与我们自己的决定相符。
  2. 正确的最终状态(环境)- 对于打字机任务,每次工具调用都会更新世界状态。我们直接检查每个测试行结束时环境的等效性。
  3. 中间步骤正确性 - 每个数据点都有一个获得正确答案的最佳函数调用序列。我们直接根据真实情况检查函数调用的顺序。
  4. 采取的步骤与预期步骤的比率 - 可能是 agent 最终返回了正确的答案,尽管选择了次优的工具集。此指标将反映差异,而不会像完全匹配中间步骤那样严格。正确性。

我们比较了闭源模型和开源模型。展开下面的部分以了解更多详细信息。

测试模型

开源

  • Mistral-7b-instruct-v0.1:Mistral 的 7B 参数模型 由 Anyscale 改编用于函数调用。
  • Mixtral-8x7b-instruct:Mistral 的 7B 参数专家混合模型,由 Fireworks.ai 使用指令调优进行改编。

OpenAI - (工具调用 Agent)

  • GPT-3.5-0613
  • GPT-3.5-1106-preview
  • GPT-4-0613
  • GPT-4-1106-preview

Anthropic

⌨ 打字机(单工具)

打字机任务很简单:agent 必须“键入”给定的单词,然后停止。单词的难度范围从简单(acat )到稍难(communicationkeyboard)。在 单工具设置 中,模型被赋予一个单独的 type_letter 工具,该工具接受字符作为输入。要通过,agent 所要做的就是按正确的顺序为每个字母调用该工具。例如,对于 cat,agent 将执行

单工具打字机任务成功使用工具的示例

您可以查看 此链接的完整数据集,以了解其外观,并 查看文档 以获取有关如何自己运行此任务的更多信息。

对于任何有自尊心的 agent 来说,成功完成如此简单的任务都是基本要求,您会期望像 gpt-4 这样具有工具调用功能的大型模型能够轻松通过,但我们发现情况并非总是如此!例如,以 此示例 为例,agent 只是拒绝尝试键入单词“keyboard”,或者 此示例 为例,它无法识别提供的单词 (“head”)。

GPT-4 无法理解提供的单词。

以下是此任务中测试 agent 的结果

大多数闭源模型的性能都在彼此的误差范围内。函数调优的 mistral-7b 模型未能有效地按顺序调用超过 1 个工具。

上面的图表显示了每个 agent 在给定数据集上的平均正确率。误差条是标准误差

\( \text{标准误差} = \hat{p}\pm\sqrt{\frac{p \times (1 - p)}{n}}\)

我们对微调的 mistral-7b-instruct-v0.1 模型的糟糕表现感到惊讶。为什么它在这个任务中表现不佳?让我们回顾一下它的其中一次运行,看看可以在哪里改进。对于数据点 “aaa”(请参阅链接的运行),模型首先调用 “a”,然后以文本形式回复 “a”,其中字母 “b” 的函数调用格式错误。然后 agent 返回。

第二次调用失败的响应。

上面的图像取自第二次 LLM 调用,此前它已成功键入字母 “a”。从结构上看,第二次响应接近正确,但工具参数错误。

⌨️ 打字机(26 个工具)

您可能希望您的 agent 能够在您的应用程序中使用多个工具,但它能否有效地使用所有工具?多少才算太多?

26 工具打字机任务测试的内容与单工具用例相同:agent 是否能够使用提供的工具键入提供的单词(然后停止)?这里的区别在于 agent 必须在 26 个工具之间进行选择,每个工具对应英文字母表中的一个字母。所有工具都不接受任何参数。我们上面的 cat 示例将通过执行以下操作来传递

26 工具打字机任务成功使用工具的示例

此任务的数据集使用与单工具打字机数据集相同的测试输入单词。您可以查看 此链接的数据集 并查看 任务文档 以了解更多详细信息,包括如何在此基准测试中运行您自己的 agent。

再一次,您会认为对于像 gpt-4 这样强大的模型来说,这项任务是微不足道的,但您会再次被证明是错误的。以 此运行 为例。当要求键入 “aaaa” 时,它首先键入四个 a,但随后未能停止,又键入 4 个 “a” 才决定完成。

GPT-4 未能返回并继续调用额外的函数。

以下是此任务中测试 agent 的结果

由于频繁的内部错误,此任务尤其难以进行基准测试,因为它似乎触发了许多模型中的病态行为,导致基于 OpenAI 模型的 agent 性能大幅下降。

🕸️ 关系数据

一个有用的 AI 助手应该能够推理对象及其关系。回答一个真实世界的问题通常需要从不同的来源综合响应,但 LLM 在这种“思考”方式上的可靠性如何?

在关系数据任务中,agent 必须根据 3 个关系表中的数据回答问题。为了使用这些工具,给出了以下说明

请使用提供的工具回答用户的问题。不要猜测答案。请记住,用户、食物和位置等实体都有名称和 ID,这两者并不相同。

agent 可以使用其拥有的 17 个工具查询这些表以获得正确答案。这三个表分别包含有关用户、位置和食物的信息。在今天发布的所有合成数据集中,此数据集最类似于真实 Web 应用程序中的工具使用。

使用表中的数据,可以回答诸如:“你能告诉我关于 Alice 的什么?” 或 “Alice 现在可能需要雨伞吗?” (示例如下)。

下图说明了后一个问题

关系数据任务成功使用工具的示例

对于此示例,agent 从其拥有的 17 个工具中选择了以下 3 个工具

  • find_users_by_name(name)→ 按名称搜索用户。
  • get_user_location(user_id) → 查找给定用户最喜欢的颜色。
  • get_weather_at_location(location_id) → 获取给定位置的天气。

通过查看每个表的前 2 条记录,我们可以看到这些函数调用将返回的结果

用户

id 名称 电子邮件 位置 最喜欢的颜色 最喜欢的食物
1 Alice alice@gmail.com 1 红色 [1, 2, 3]
21 Bob 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 ["Gluten", "Dairy"]
2 巧克力 50 ["Milk", "Soy"]

agent 首先检索 Alice 的用户 ID,然后使用该用户 ID 获取当前位置,最后使用位置 ID 获取当前天气。由于 Alice 位置的当前天气是多云,因此她不太可能需要雨伞。如果 agent 跳过任何这些步骤,它将缺少准确提供最终答案所需的必要信息。

评估数据集包含 20 个难度各异的问题,让我们测试 agent 在推理每个函数如何依赖于其他函数方面的能力。您可以在 此链接 探索数据集。下图分享了此任务中测试 agent 的结果

关系数据任务结果的排名更接近您对这些模型在其他基准测试中的表现的预期。此任务与常见的应用程序要求最相似。我们测试的 OSS 模型仍有改进空间。

尽管在所需的推理能力方面比前两个任务稍难,但 GPT-4 在此任务中表现相当出色,除了 1 个问题 外,所有问题都回答正确。让我们来看看这个失败案例。对于此数据点,agent 的提示是 “Frank 是 Even 的朋友,对乳制品过敏。他能吃沙拉吗?”

Agent 忽略了工具响应,认为它与提供的用户不匹配。

在这种情况下,GPT-4get_users_by_name("Frank") 进行了正确的首次调用。该工具返回了有关 “Frank the Cat” 的信息。然后模型决定这与请求的 “frank” 不匹配,因此它再次查询 “Even”。没有直接匹配,因此 agent 放弃,回复说找不到名为 “Even” 的用户。虽然它可以理解为它对 “Frank the cat” 不太有信心,但 agent 既没有将其视为可能的匹配项,也没有在最终回复用户的消息中提及它,这意味着用户将无法有效地提供反馈来帮助 agent 自我纠正。

🌌 Multiverse Math

LLM 被宣传为 “推理机器”,但它们在实践中“推理”得有多好?

multiverse math 任务 中,agent 必须回答简单的数学问题,例如 2 加 3。不同之处在于,在这个 “数学宇宙” 中,数学运算与您预期的不同。想做 2 + 2 吗?答案是 5.2 。用 5.2 减去 2 吗?答案是 0.2

下面提供了提供给 LLM 的完整任务说明(在可用的系统提示中提供)

您被要求在另一个数学宇宙中解决数学问题。运算已被更改,以产生与预期不同的结果。不要猜测答案或依赖您对数学的内在知识。使用提供的工具回答问题。虽然结合律和交换律适用,但分配律不适用。使用尽可能少的工具回答问题。仅包含数字响应,不包含任何说明。

重要的是,虽然这些常见运算(加、减、乘、除、cos 等)都略有改变,但大多数数学性质仍然成立。运算仍然是可交换和结合的,尽管它们不是分配的。

让我们来看一个 示例,以说明我们的意思:“大肠杆菌每 20 分钟分裂一次。如果我们从 5 个细胞开始,2 小时(120 分钟)后会有多少个细胞?”

Multiverse Math 任务成功使用工具的示例

要使用提供的工具解决此问题,agent 需要识别

  • 在分配的时间内将发生多少次分裂 d? (d = 120/20)
  • 然后,对于每个细胞 c ,将产生多少个细胞? (c = 2**d)
  • 然后最终细胞 f 的数量是多少 (f = 5*c)

GPT-4 可能在训练期间见过这些步骤中的每一个,但由于它知道这些运算已被修改,因此它必须避免跳过步骤,而应专注于组合工具。以下是此任务中测试 agent 的结果

GPT-4 在此任务中的表现并不可靠地优于 gpt-3.5 或 claude-2.1(甚至开源 mistral-7b 模型)。如果任务超出分布范围,规模并不总是转化为质量提升。

multiverse math 数据集在隔离状态下测试了 LLM 的两个重要特征,而不会让其事实知识干扰

  • 它的组合“推理”能力如何?
  • 它遵循可能与其预训练知识相矛盾的指令的能力如何?

当您 记住答案时,很容易在测试中取得好成绩。当答案与您习惯的模式相矛盾时,难度就更大了。让我们看看 GPT-4 失败的众多示例之一:“131,778 除以 2 是多少?

GPT-4 使用记忆的答案 (65,589) 而不是工具输出 (32,944.5)

虽然 GPT-4 agent 正确地调用了 divide() 工具,但它忽略了来自工具的输出,而是使用了它认为应该是答案的内容。尽管给 agent 的指令声明它应该只依赖工具输出来获得答案,但这种情况仍然发生了。

mistral-7b-instruct-v0.1 ,由 Anyscale 为函数调用微调的 OSS 模型,在此任务中表现出人意料地好。此数据集平均而言,需要多次工具调用的问题更少(与我们的其他任务相比)。该模型在简单的打字机任务中失败,但在这里表现相当不错,这突显了仅针对 1 跳函数调用进行微调可能会导致意想不到的性能下降。

其他观察结果

对于这些结果,我们交流了模型质量, 但构建 AI 应用程序还需要服务可靠性和稳定性。尽管这些实验的数据集大小相对较小,并且尽管我们在评估套件中添加了客户端速率限制,但我们仍然遇到了来自流行模型提供商的随机但频繁的 5xx 内部服务器错误。

我们最初计划对 Google 的 gemini-pro 模型进行基准测试,但由于评估期间内部服务器错误的发生率上升,我们决定将其排除在我们的结果之外。API 还拒绝了打字机和 Multiverse Math 数据集的多个数据点,原因是它们 “不安全”(例如 “2 的 3 次方的结果是多少”

安全过滤器可能很有用,但如果误报率太高,则可能会影响您的服务质量。

最后,我们已经展示了对更好的开源工具使用替代方案的明确需求。开源社区正在迅速开发更好的函数调用模型,我们预计很快会有更具竞争力的选项广泛可用。要在此基准测试中测试您的函数调用模型,请按照 此处的说明 进行操作,或者如果您希望我们运行特定模型,请在 GitHub 存储库中打开一个 issue。 我们很乐意看到这些结果发生变化!

结论

感谢阅读!我们很乐意听取您对希望在此环境中测试的其他模型和架构的反馈,以及哪些其他测试可以帮助您在尝试在您的应用程序中使用 agent 时让您的生活更轻松。您可以在链接的帖子中查看我们之前关于 文档问答提取半结构化表格问答多模态推理能力 的发现。您还可以通过运行 langchain-benchmarks 软件包中的 notebook 来了解如何自己重现这些结果。再次感谢!