引言
近年来,大型语言模型(LLMs)在人工智能领域取得了令人瞩目的进展,其强大的语言理解和生成能力使其在多个领域得到了广泛应用。然而,LLMs 在处理需要调用外部工具的复杂任务时,仍然面临诸多挑战。例如,当用户询问“明天我目的地的天气如何?”时,LLMs 需要能够调用天气 API 来获取准确的信息。
为了解决这一问题,研究人员提出了多种工具学习方法,旨在让 LLMs 能够更有效地利用外部工具。然而,现有的方法往往存在以下局限性:
- 基于微调的方法:需要对模型进行微调,使其只能使用训练数据中见过的工具。这种方法虽然能够提高工具调用的准确性,但会限制模型对未见工具的泛化能力。
- 基于上下文学习(ICL)的方法:无需对模型进行微调,可以通过在提示中添加工具演示来调用工具。然而,当面对大量工具时,这种方法的推理效率会显著降低。
CoTools:一种更高效的工具学习框架
为了克服上述挑战,苏州大学的研究团队开发了一种名为 CoTools 的新型工具学习框架。该框架的主要目标是在不牺牲模型泛化能力的前提下,实现对大量未见工具的高效调用。
CoTools 的工作原理
CoTools 的核心思想是利用冻结语言模型的强大语义表示能力,在推理过程中动态判断是否需要调用工具,并选择最合适的工具。其主要流程如下:
- 工具判断:
- 输入:用户的问题和模型生成的当前答案片段。
- 过程:CoTools 会分析当前答案片段的语义信息,判断是否需要调用工具来补充信息。例如,当用户询问天气时,模型会识别出需要调用天气 API。
- 输出:一个判断结果,决定是否触发工具调用。
- 工具检索:
- 输入:用户的问题和判断结果。
- 过程:如果需要调用工具,CoTools 会根据问题描述从工具池中检索最合适的工具。工具池可以包含大量未见过的工具,CoTools 通过分析工具的描述信息来评估其与问题的相关性。
- 输出:选定的工具。
- 工具调用:
- 输入:选定的工具和用户的问题。
- 过程:CoTools 使用上下文学习提示生成工具的参数,执行工具并获取结果。
- 输出:工具的返回结果被添加到答案中。
图 1:CoTools 方法的流程图。
CoTools 的优势
- 高效利用未见工具:CoTools 不依赖于对工具的预先训练,而是通过分析工具描述来动态选择工具。这使得它能够灵活调用大量未见过的工具。
- 保持模型原有能力:由于语言模型是冻结的,CoTools 不会影响模型的泛化能力和推理能力。
- 增强模型可解释性:通过分析模型输出的关键维度,CoTools 可以帮助研究人员更好地理解工具选择的过程。
实验结果
为了验证 CoTools 的有效性,研究团队进行了多项实验,包括:
- 数值推理任务:使用 GSM8K-XL 和 FuncQA 数据集,CoTools 在单跳和多跳问题上均表现出色。
- 知识问答任务:使用 KAMEL 和 SimpleToolQuestions (STQuestions) 数据集,CoTools 在大量工具场景下表现良好,并且在未见工具上展现出良好的泛化能力。
以下是 CoTools 与其他方法在 KAMEL 和 STQuestions 数据集上的对比结果:
方法 | KAMEL SUP | KAMEL SYN | STQuestions Seen | STQuestions Unseen |
---|---|---|---|---|
ToolkenGPT LLaMA | 93.4 | 20.6 | 23.8 | 0.0 |
CoTools (Ours) LLaMA | 93.8 | 43.6 | 35.1 | 10.4 |
结论
CoTools 提供了一种更高效、更灵活的工具学习框架,能够在不牺牲模型泛化能力的前提下,实现对大量未见工具的高效调用。该方法为大型语言模型在更复杂的现实场景中的应用开辟了新的可能性。
未来展望
尽管 CoTools 取得了令人鼓舞的成果,但研究人员也指出,当前对 LLM 工具学习的研究仍处于早期阶段。未来,CoTools 团队计划:
- 探索如何处理包含多个返回值的工具。
- 在更大规模、更复杂的真实世界工具集上测试 CoTools 的性能。
Prompt 示例
CoTools 的核心思想是利用冻结语言模型的强大语义理解能力,在推理过程中动态判断是否需要调用工具,并选择最合适的工具执行任务。以下将详细介绍 CoTools 的工作流程,并提供详细的 Prompt 示例,帮助读者更好地理解每个步骤的输入和输出。
#### 1. 初始输入与预处理
- **输入**:
- **用户问题**:例如,“明天我目的地的天气如何?”
- **上下文信息**(如果有):例如,之前对话的上下文或用户的位置信息。
- **处理**:
- **问题解析**:将用户问题进行预处理,包括分词、去除停用词等。
- **上下文整合**:将上下文信息与用户问题整合,形成完整的输入序列。
- **输出**:
- **预处理后的输入序列**:例如,“[CLS] 明天 我 目的地 的 天气 如何? [SEP] 北京”
#### 2. 工具判断
- **输入**:
- **预处理后的输入序列**。
- **处理**:
- **语义分析**:CoTools 使用冻结语言模型生成输入序列的隐藏状态,并利用工具判断器(Tool Judge)分析这些隐藏状态,以确定是否需要调用工具。
- **工具判断器**:
- **计算公式**(简化版):
```
Score_I = 工具判断器(隐藏状态)
```
- **决策逻辑**:
- 如果 $Score_I$ 超过预设阈值(通常为 0.5),则触发工具调用。
- 否则,继续生成答案文本。
- **输出**:
- **判断结果**:
- **调用工具**:例如,“需要调用天气 API”。
- **无需调用工具**:继续生成答案。
#### 3. 工具检索
- **输入**:
- **判断结果**:例如,“需要调用天气 API”。
- **用户问题**:例如,“明天我目的地的天气如何?”
- **处理**:
- **工具池检索**:CoTools 使用工具检索器(Tool Retriever)从工具池中检索最合适的工具。
- **工具检索器**:
- **查询向量计算**:将用户问题转换为向量表示。
- **工具向量计算**:将工具池中的每个工具描述转换为向量表示。
- **相似度计算**:计算查询向量与每个工具向量的相似度得分,得分最高的工具即为最合适的工具。
- **工具池示例**:
```
1. 天气 API:提供指定地点的天气信息。
2. 地图 API:提供指定地点的地图信息。
3. 翻译工具:提供文本翻译服务。
```
- **输出**:
- **选定的工具**:例如,“天气 API”。
#### 4. 工具调用
- **输入**:
- **选定的工具**:例如,“天气 API”。
- **用户问题**:例如,“明天我目的地的天气如何?”
- **处理**:
- **参数生成**:使用上下文学习提示(ICL Prompt)生成工具调用所需的参数。
- **示例提示**:
```
[用户问题]
[当前答案片段(如果有)]
请调用以下工具并生成调用参数:
工具名称:天气 API
工具描述:提供指定地点的天气信息。
```
- **工具执行**:将生成的参数传递给工具,执行工具并获取返回结果。
- **输出**:
- **工具返回结果**:例如,“北京的天气情况:晴天,气温 25°C”。
#### 5. 答案生成
- **输入**:
- **工具返回结果**:例如,“北京的天气情况:晴天,气温 25°C”。
- **用户问题**:例如,“明天我目的地的天气如何?”
- **处理**:
- **答案整合**:将工具返回结果整合到答案中,生成最终回答。
- **输出**:
- **最终回答**:
```
明天北京的天气情况是晴天,气温 25°C。
```
### 详细的 Prompt 示例
以下是一个更详细的 Prompt 示例,展示了 CoTools 在每个流程节点的具体操作:
用户问题:明天我目的地的天气如何?
初始输入序列:
[CLS] 明天 我 目的地 的 天气 如何? [SEP] 北京
工具判断:
输入:预处理后的输入序列
处理:
语义分析:生成隐藏状态并计算 Score_I
决策:Score_I > 0.5,触发工具调用
输出:需要调用天气 API
工具检索:
输入:用户问题和判断结果
处理:
查询向量计算:生成用户问题的向量表示
工具向量计算:生成工具池中每个工具的向量表示
相似度计算:计算相似度得分
输出:选定天气 API
工具调用:
输入:选定的工具和用户问题
处理:
参数生成:
[用户问题]
[当前答案片段(如果有)]
请调用以下工具并生成调用参数:
工具名称:天气 API
工具描述:提供指定地点的天气信息。
工具执行:调用天气 API 并获取返回结果
输出:北京的天气情况:晴天,气温 25°C
答案生成:
输入:工具返回结果和用户问题
处理:整合结果生成最终回答
输出:明天北京的天气情况是晴天,气温 25°C。
### 总结
CoTools 通过精细化的流程设计和强大的语义理解能力,实现了在复杂任务中对外部工具的高效调用。该框架不仅能够处理常见工具,还能灵活应对未见过的工具,为大型语言模型在现实场景中的应用提供了新的可能性。
通过这样的提示,CoTools 可以根据用户的问题和当前答案片段,动态判断是否需要调用工具,并选择最合适的工具来获取所需的信息。
原文:https://arxiv.org/pdf/2503.16779