Hugging Face Transformers 代码代理 GAIA 基准测试结果

Hugging Face 开发了一个使用 transformers.agents 库(现已演进为 smolagents 库)的代码代理,在 GAIA 基准测试中取得了最高排名,GAIA 是 AI 代理最具挑战性的基准之一。该系统表明,让代理通过 Python 代码而非 JSON 数据块来表达动作,可显著提升效率,降低 token 成本,并增强代理处理复杂多步骤轨迹的能力。

GAIA 基准测试挑战

GAIA 旨在测试代理在需要高级规划和严格执行的任务上的表现。典型的 GAIA 问题可能需要多模态能力(读取图像)、从网络收集分散的信息,并遵守严格的输出约束。这些任务常常需要链式步骤,后续信息依赖于先前的发现,凸显了大型语言模型在规划和执行方面的常见困难。

基于代码的动作优势

与使用类似字典的 JSON 输出不同,Hugging Face 代理采用“代码代理”方式,将动作以 Python 代码的形式构造并执行。这种方法提供了若干技术优势:

  • 简洁与高效: 代码是表达复杂序列的更优化方式。例如,平行的动作流可以在单一步骤的代码中处理,而不是多个 JSON 数据块。研究表明,代码动作相比 JSON 可减少约 30% 的步骤,降低生成的 token 数量并降低运营成本。
  • 直观的变量管理: 代码允许代理将工具输出存储为具名变量(例如 rock_image = image_generation_tool("A picture of a rock")),相比 JSON 中需要的复杂命名技巧,LLM 在后续步骤中引用这些输出更为容易。
  • 模型流畅度: 由于 LLM 在大量代码上进行训练,它们在编写代码方面通常比编写 JSON 更为流畅。

安全代码执行实现

为降低执行 LLM 生成代码的风险,Hugging Face 从头实现了一个使用 ast(抽象语法树)模块的安全 Python 解释器。该解释器采用“白名单”方式,而非“黑名单”(禁止特定操作)方式:

  • 基于 AST 的执行: 解释器逐个执行树节点,并在遇到未明确授权的操作时停止。
  • 授权导入: 仅执行在 authorized_imports 列表中明确列出的导入;标准函数如 printrange 被包含,而诸如 open 等危险函数默认被禁止。
  • 安全防护: 系统限制操作次数以防止无限循环,并限制打印输出的行数,以防 LLM 的上下文窗口被垃圾数据淹没。

多代理编排与规划

系统采用多代理架构来管理上下文并降低噪声,尤其在网页浏览时:

编排结构

  • 管理代理: 一个 ReactCodeAgent,负责高层任务求解,并可访问 file_inspectorvisualizersearch_agent
  • 搜索代理: 一个基于 JSON 的代理,作为工具供管理代理使用。它处理顺序网页浏览任务(使用 informational_web_searchpage_downfind_in_page 等工具),仅将相关信息返回给管理代理,以避免上下文混乱。

规划工作流

代理采用“提前规划”工作流,每 N 步生成已知与所需事实的摘要以及逐步计划。

  • 调优: 管理代理每 2 步(N=2)更新一次计划,而搜索代理每 5 步(N=5)更新一次。
  • 上下文优化: Hugging Face 发现从提示中省略先前的计划版本可提升得分,因为这防止 LLM 对过时计划产生偏见,并鼓励重新评估方法。

性能结果

在未进行微调的情况下使用 GPT-4o,代理在 GAIA 基准测试中取得了以下结果:

  • 验证集: 44.2%,整体排名第 1。
  • 测试集: 33.3%,整体排名第 2,优于 Microsoft Autogen 的提交。
  • 第 3 级问题: 代理在最难的“硬核”第 3 级问题上获得了最高平均分。

未来改进

Hugging Face 确定了若干进一步优化的方向:

  • LLM 引擎: 探索微调的开源模型以降低解析错误。
  • 编排: 朝着更无缝的多代理编排方向发展。
  • 网页工具: 集成 selenium 包以处理 JavaScript 和 cookie 横幅。
  • 规划: 测试当前文献中的替代规划策略。

Sources