25年2月来自斯坦福大学的论文“OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning”。
解决复杂的推理任务可能涉及视觉理解、域知识检索、数值计算和多步骤推理。现有方法使用外部工具增强大语言模型 (LLM),但仅限于专业领域、有限的工具类型或需要额外的训练数据。本文的 OctoTools,是一个无需训练、用户友好且易于扩展的开源智体框架,旨在解决跨不同域的复杂推理。OctoTools 引入标准化工具卡来封装工具功能、用于高级和低级规划的规划器以及执行器来执行工具使用。在 16 个不同的任务(包括 MathVista、MMLU-Pro、MedQA 和 GAIA-Text)中验证 OctoTools 的通用性,与 GPT-4o 相比,平均准确率提高 9.3%。此外,在相同的工具组合下,OctoTools 的表现比 AutoGen、GPT-Functions 和 LangChain 高出 10.6%。
大语言模型 (LLM) (Brown,2020;Chowdhery,2022;OpenAI,2023b) 在总结、翻译 (Thoppilan,2022)、代码生成 (Nakano,2021) 和数学问题解决 (Shuster,2022) 等任务上取得快速进展。然而,涉及多个步骤、逻辑分解或专业领域知识的复杂推理任务仍然具有挑战性。例如,解决视觉谜题可能需要细粒度的图像理解和基于文本的推理,而数学或化学问题可能需要彻底的计算或领域专业知识。现有的提示方法通常无法将这些不同的过程协调成连贯的推理链 (Yao,2022)。
解决这些挑战的一个有希望的方向,是用外部工具增强 LLM。通过将专门的子任务(例如,Web 查询、基于 Python 的计算和专门的科学工具)卸载到专用模块,LLM 可以专注于更高级别的规划和综合。一些框架已经探索了此类工具的使用,从依赖大量监督数据和微调的框架(Schick,2023; Liu,2023),到没有细化的静态解决方案(Lu,2023),以及仅限于一个专门的工具领域框架(Nakano,2021;Tao,2023;Hu,2024)。虽然这些方法在特定任务上表现良好,但它们仍然面临阻碍广泛使用的挑战。许多方法需要使用精选数据进行大量训练,这限制了它们对新领域的适应性。其他则是为特定领域设计的(Bran,2023;Kang & Kim,2024;Li,2024a;Schmidgall,2024)或无法轻松支持多步骤问题解决(Lu,2023),从而限制了它们的通用性。
OctoTools,是一个无需训练(即不需要更新模型权重)、用户友好且可扩展的智体框架,用于解决不同域的复杂推理任务,如图所示:
给定一个用户查询 q 和一个预训练语言模型 LLM_θ (·),一种简单的方法会直接生成一个输出 y ∼ LLM_θ(q),提供单步响应。相比之下,OctoTools 框架引入一个结构化的多步骤过程,利用外部工具有效地处理查询。
具体来说,OctoTools 包含一组工具 D = {d_i} 和相关元数据 M = {m_i},n 是可用工具的数量。给定一个查询,规划器(基于语言模型)首先从高级角度生成一个暂定规划,指示如何使用这些工具来处理查询,这形成初始上下文 s_0。根据这个规划,规划器确定工具使用的初始动作 a_1,指定要使用哪个工具 d_1、相关上下文和子目标。然后,执行器(也由语言模型提供支持)将规划器的基于文本动作 a_1 转换为机器可执行命令 o_t,运行该命令可获得中间结果 r_1。这些结果与原始动作一起将上下文更新为 s_1 := (a_1, o_1, r_1)。此过程构成框架中的一个步骤。
此过程重复进行,规划器根据不断发展的上下文迭代地改进其动作,直到找到完整的解决方案或达到推理限制(例如时间或步骤)。经过 T 步骤后,框架会生成完整的轨迹(s_0、s_1、…、s_T),该轨迹以结构化方式存储在上下文中。然后,规划器使用此轨迹生成原始查询的最终解决方案。
OctoTools 通过分解子目标和系统化使用工具,为解决复杂任务提供一个强大而有效的框架。标准化工具卡封装功能,规划器协调高级和低级任务规划,执行器为每个子目标实例化工具调用。
工具卡
为了实现工具、规划器和执行器之间的无缝交互,工具箱是 OctoTools 的基本构建块。与以前的工作(Lu,2023;Hu,2024)相比,OctoTools 利用工具卡以模块化方式封装工具,这些工作依赖于仔细的调整和调整来支持新工具。
每张工具卡代表一个工具 d 及其基本元数据 m(如图所示)。此元数据包括工具的名称、输入和输出类型以及命令演示。它还可能包含其他使用约束(例如,用户定义的“限制”和“最佳实践”),这些约束为开发人员提供指导规划器和执行器的见解。例如,Image_Captioner_Tool 包括“它可能会在复杂场景中出错”和“考虑使用其他工具进行验证”,而 Object_Detector_Tool 则指出检测目标的局限性。
为了确保一致的交互,每个工具卡都实现两个标准函数。函数 execute() 封装了工具的主要功能,例如生成代码片段或执行目标检测。执行的结果以结构化格式存储,以支持不同的输出类型,例如生成的代码、检测的目标、存储的文件。函数 get metadata() 允许规划器和执行器动态评估工具的功能并了解使用限制。
每个工具卡的设计相对于框架都是模块化的,使用户能够集成各种工具而无需修改底层框架或智体逻辑。可以轻松添加、替换或更新新工具卡。因此,即使任务的复杂性或范围增加,OctoTools 仍然保持强大和可扩展。
规划器模块
规划器初始化。规划器检查工具箱并加载每个工具卡。正式地,它构建一个包含 n 个可用工具的集合 {d_i},每个工具都有描述其输入-输出模式和使用约束的元数据 m。不必启用完整工具集,而是可以根据专家见解选择子集 D* = {d_i},或使用一小组示例进行优化。
查询分析和动作预测。给定查询 q,规划器根据其初始化制定工具使用的高级暂定规划。高级规划总结查询目标,分析所需技能,确定相关工具,并包括其他考虑因素以强调验证的必要性。高级任务规划提供最终目标的全局视角,确保每个后续子目标与原始查询保持一致。
随后,在步骤 t,动作预测器生成一个动作 a_t,该动作将规划器建议的子目标(例如,“检测图像中的棒球”)、所选工具 d(例如,物体检测器)和相关上下文相结合。这个低级规划会实时细化和执行每个子目标,并在每个步骤中适应新信息或反馈。
上下文验证和解决方案总结。执行每个命令后,上下文验证器会检查是否可以在当前上下文中解决问题。它验证完整性(例如,是否满足所有子目标)并识别任何歧义。如果问题仍然不完整,规划器将继续下一个迭代周期,预测下一个动作 a_t+1。
一旦验证器得出结论认为查询已被解决,单独的解决方案总结器就会根据轨迹 (s_0, s_1, . . . , s_T) 编译最终答案。此阶段集成中间工具输出,跟踪推理步骤,并提供简洁、用户友好的摘要作为最终解决方案。
执行器模块
命令预测。先前的工作(Lu,2023;Hu,2024)通常期望一个语言模型既用于规划每个步骤(即使用哪种工具),也用于生成相应的可执行命令。这种双重责任可能会使模型超载并导致错误,尤其是在处理复杂或特定于环境的代码时(Bran,2023;Li,2024b;Ji,2024)。为了缓解这些问题,OctoTools 引入一个命令生成器,它可以解释规划器的基于文本动作并生成可执行代码。
给定规划器预测的动作 a_t,命令生成器(由语言模型提供支持)以可执行 Python 脚本的形式创建一个低级命令 o_t,该脚本使用必要的输入调用工具 d_t 并执行任何所需的数据准备。此步骤将 a_t 中指定的抽象动作与具体的工具调用联系起来。通过将决策与代码生成分开,系统的每个组件都可以专注于其专门的角色。
命令执行。生成可执行命令后,必须在可能涉及依赖项、外部库或资源访问(例如文件系统)的环境中运行它。将执行与规划直接结合起来会带来安全性和可维护性挑战,特别是如果规划器无法管理代码执行细节。
在 OctoTools 中,命令执行器在 Python 环境中运行生成的命令 o_t,获得结果 r_t。这可能包括工具输出、日志或错误消息。然后,执行器将此步骤的当前上下文 s_t := (a_t, o_t, r_t) 添加到智体的当前轨迹 (s_0, s_1, . . . , s_t−1)。轨迹保留所采取动作、生成代码和获得结果的清晰历史记录。
特定任务的工具集优化
OctoTools 工具箱包含一套涵盖不同模式和技能的多样化工具。通过利用结构化工具卡和强大的规划功能,当所有可用工具在不同任务中启用时,OctoTools 表现出很强的泛化。但是,当某项任务只有一小组验证示例时,配置特定任务的工具子集可以进一步提高效率和效果。
为此,其提出一种自动算法来优化每个任务的工具集配置。给定工具箱中 n 个可用工具,可能的子集总数为 O(2^n),这非常大。为了使其易于处理,采用贪婪搜索策略,将复杂度降低到 O(n)。该方法分为三个阶段。
第 1 阶段:基线设置。首先通过启用工具箱中的基本工具集(表示为 D_base)来建立基线性能。这个基础集代表一个最小的起始工具集,可以由用户预先定义。
第 2 阶段:单个工具评估。接下来,和基础工具集在一起,启用和测量每个候选工具 d_i。对于每个 d_i,形成一个增强子集 D_i = D_base ∪ {d_i},并计算验证示例集的准确度差
∆_d_i = Acc (D_i)− Acc( D_base) (1)
如果 ∆_d_i > 0,认为工具 d_i 对目标任务有益。
第 3 阶段:优化工具集选择。最后,汇总所有产生积极改进的工具,并将它们与默认工具集组合起来,形成优化工具集:
D^∗ =D_base ∪ {d_i |∆_d_i > 0} (2)
此集合包含所有单独能展示比基线性能提升的工具,确保下游任务的定制但高效的配置。虽然这种选择不能保证全局最优,但与简单使用所有工具相比,整体改进效果更好。
如下是任务-特定的工具集优化算法总结:
为了证明 OctoTools 框架的泛化能力,对涵盖两种模态、五个领域和四种推理类型的 16 个不同基准进行全面评估,如表所示。这些基准涵盖广泛的复杂推理任务,包括视觉理解、数值计算、知识检索和多步骤推理。
对于一般的视觉推理,包括 AlgoPuzzleVQA(Ghosal,2024)、Hallusion-VD(Guan,2024)、PuzzleVQA(Chia,2024)和 VQA 2.0(Goyal,2017)。对于数学推理,使用 Game of 24 (Lile, 2024)、Omni-MATH (Gao et al., 2024)、CLEVR-Math (Lindstro ̈m & Abraham, 2022) 和 Math-Vista (Lu et al., 2024b)。对于科学推理,采用 GPQA (Rein et al., 2023)、MMLU-Pro (Wang et al., 2024b) 和 SciFIBench (Roberts et al., 2024)。为了评估专门的医学领域模型,在 MedQA(Jin,2021)、PathCLS(Sun,2025)、PathVQA(He,2020)和 SLAKE(Liu,2021)上进行测试。此外,还结合 GAIA-Text,这是 GAIA(Mialon,2023)基准的文本子集,旨在评估具有工具调用功能的智体框架。
对于每个基准,抽样 100 个示例来构建工具集优化和消融研究的验证集,并留出 200 个示例的保留测试集用于最终评估。对于总样本少于 300 个的基准,测试集由所有未用于验证的剩余样本组成。为了减轻随机性,报告所有实验(包括消融研究)在三次试验中的平均准确率和标准差。
在工具箱中为实验创建各种各样的工具。基本工具集包括通用解决方案生成器,这是一个建立在基本 LLM 之上的工具,它将执行器生成的专门提示作为输入,例如“详细描述图像”或“为数学问题生成分步解决方案”。此工具允许进行一般的分步推理,而无需外部工具,但缺乏域特异性。该工具箱还包括图像感知工具(如 Image_Captioner)、网络搜索 API(如 Google_Search)、代码生成器 Python_Code_Generator,以及专用工具(如用于病理图像分类的 Path_Generalist_Classifier)。其中,相关 Patch_Zoomer 是一个独特的工具,它接受文本查询并返回放大的四分之一 patches,为细粒度的视觉推理场景提供局部细节。