跳转至

LLM 工具使用 – 一份全面的技术报告

作者:高级研究员 – 2025 年 8 月


目录


1️⃣ 执行摘要

大型语言模型(LLM)已经超越了单纯的文本生成,成为外部工具的协调器——搜索引擎、代码解释器、数据库连接器、自定义 API,甚至是物理设备控制器。这种转变解锁了现实世界的实用性(例如,最新的天气预报、交易性金融),同时也带来了新的工程挑战:模式定义、可靠的调用、延迟、成本、安全和评估

本报告综合了最新的公开指南(OpenAI 函数调用、Azure OpenAI、LangChain、ChatGPT 插件管道)、交互设计研究、安全分类法、成本感知训练策略、基准套件和生产案例研究。最终,它形成了一份具体的最佳实践手册,开发者可以采用它来构建健壮、可维护和可扩展的 LLM 增强服务。


2️⃣ LLM 驱动的工具使用基础

2.1 OpenAI 函数调用(现为“工具”)

元素 描述 关键提示
工具定义 tools 数组下的 JSON-Schema 类似对象:typenamedescriptionparameters(具有 propertiesrequired、可选 additionalProperties:false 的对象)。 使用 strict:true 强制执行精确的模式符合性;保持模式浅层以尽量减少令牌使用。
调用流程 1️⃣ 发送带有工具的请求。2️⃣ 模型可能响应 tool_call(名称 + 参数)。3️⃣ 应用程序执行函数,捕获输出并返回 tool_call_output。4️⃣ 模型接收观察结果并可以继续推理。5️⃣ 发出最终响应。 遵循 5 步循环;将 tool_call_output 视为对话中的新观察结果。
配置 tool_choiceautorequired、特定名称或 none)。parallel_tool_calls(默认 true)——允许在单次交互中进行多次工具调用。 为确定性工作流设置 tool_choice=required;在顺序重要时禁用并行调用。
流式传输 stream:true 发送增量 JSON 片段和一个不同的 function_call_output 事件。 对 UI 侧低延迟用户体验很有用;缓冲直到接收到完整的 JSON。
最佳实践要点 – 清晰、简洁的工具名称和描述。– 每次请求的工具数量 ≤ 20(令牌预算)。– 标记枚举(enum)和必填字段。– 保持参数类型明确(避免使用 any)。– 将静态上下文放在模式之外。 请参阅第 7 节获取检查清单。

安全提示: 即使在严格模式下,模型也可以被诱导进行“提示注入”攻击,试图欺骗它构造恶意参数。验证应在模型发出调用之后、执行任何副作用之前进行。


2.2 LangChain 的工具接口

LangChain 将原始 API 合约抽象为一个 Tool 类:

class Tool:
    name: str
    description: str
    func: Callable[[str], str]
* 绑定.bind_tools([...]) 将工具列表附加到语言模型或代理。模型决定何时调用它们,类似于 OpenAI 的 tool_choice=auto。 * 工具包 – 相关工具的组(例如,SearchToolkitSQLDatabaseToolkit)简化了入职;它们向 LLM 暴露一个统一的模式。 * 生态系统类别(根据 LangChain 文档): - 搜索 – Bing、Google、DuckDuckGo、Serper、Tavily。 - 代码解释器 – Azure Container Apps、Bearly、Riza。 - 生产力 – GitHub、Gmail、Jira、Slack、Twilio。 - 网页浏览 – Playwright、Hyperbrowser、纯 requests。 - 数据库 – SQLDatabase、Cassandra、Spark SQL。 - 金融 – GOAT、Stripe 包装器。 * 自定义工具 – 实现 Tool 接口,提供 JSON 模式或使用 LangChain 的 StructuredTool 进行自动验证。

因此,LangChain 将 LLM 模型与传输层解耦,让开发者关注函数语义,而库本身处理提示、重试逻辑和并行化。


2.3 ChatGPT / GPT‑4 插件(自定义工具插件)

一个四步流程将任意 HTTP API 转变为一级 LLM 工具: 1. 暴露所需的功能为一个公共 HTTPS 端点(REST/GraphQL)。 2. 编写 OpenAPI(Swagger)规范,该规范完整描述了路由、参数、认证和响应模式。 3. 创建 ai-plugin.json 清单文件:名称、描述、openapi_url、认证方法、图标、使用说明。 4. 在 OpenAI 开发者门户注册该插件(需要 ChatGPT-Plus 或等待名单)。验证后,模型可以自动调用 API。

实施提示:一个具有单一路由的最小 Flask 应用、受环境保护的 API 密钥以及部署在公共 HTTPS 主机(如 Vercel、Railway、Repl.it)上足以用于原型设计。

无代码替代方案(Plus AI、BotPenguin、自定义 GPT 构建器)可以自动生成 OpenAPI 规范和清单文件,但核心要求(可访问的 API、符合规范、清单文件)保持不变。


3️⃣ 工具赋能智能体的交互设计

3.1 用户界面分类法与发散 - 聚合工作流

最近的 HCI 研究提出了一种用户界面模式的分类法,支持典型的 LLM 工具使用 发散→聚合 工作流:

模式 描述 示例实现
空间导航(平移/缩放画布) 用户探索一个二维平面,其中每个节点 = 一个 LLM 生成的操作或工具调用。 Luminate、Spellburst 画布图
缩放和过滤列表 具有动态过滤器的列表/网格视图;支持快速剔除无关建议。 Genquery、自适应建议面板
基于节点的链接/刷选 拖拽操作之间的连接,可视化依赖关系(例如,“获取天气 → 总结”)。 语言代理 IDE 中的节点图编辑器
按需显示详细信息工具提示 悬停卡片显示完整的 JSON 参数、执行日志,并允许内联编辑。 Promptify 中的工具提示驱动编辑
参数滑块 实时操作数值或分类参数(温度、top-p、特定于工具的阈值)。 LangChain Playground 中的滑块控件

这些模式体现了 Shneiderman 的座右铭 概述 → 缩放和过滤 → 按需显示详细信息,鼓励用户生成多种替代方案(发散),然后集中精力于一个精炼的子集(聚合)。

3.2 基于画布的探索模型(扩展版 OntoChat)

一个具体交互模型基于 OntoChat 系统构建: 1. 种子:用户提供一个领域描述(例如,“供应商元数据提取”)。 2. 生成:LLM 生成一组候选操作,并绘制在二维画布上。 3. 探索:用户进行平移/缩放以获得概述;点击一个区域会触发增强——LLM 创建更多专注于该语义区域的操作。 4. 筛选:语义或关键字搜索突出显示相关项目。 5. 检查:选择一个项目会打开一个工具提示,显示完整的 JSON 参数和工具输出预览。 6. 编辑与迭代:编辑会被发送回 LLM,LLM 会完善计划,可能还会添加新的工具调用。

画布加上内联控件的工作流程让用户保持在单一界面中,从而实现无需上下文切换的快速迭代,并且同样适用于探索性研究和生产决策制定。


4️⃣ 安全与安全注意事项

4.1 威胁格局

威胁 影响 典型触发因素
提示注入 恶意工具调用、数据外泄、任意代码执行。 攻击者构造用户文本,影响模型生成有害的 arguments 负载。
无限制的文件系统/网络访问 读取/写入敏感数据、SSRF、DoS、外泄。 工具实现不经意间暴露了操作系统级别 API。
跨租户泄露 一个用户的数据出现在另一个用户的会话中。 共享推理服务,没有按会话隔离。
移动/嵌入式代理劫持 设备被攻破、隐私泄露。 自动化 GUI 操作或运行后台服务的代理。

4.2 沙箱与隔离策略

  1. 容器级隔离 – 在轻量级容器(Docker、gVisor、Firecracker)中运行每个工具调用。强制执行:
  2. 只读文件系统挂载。
  3. 网络出口过滤(仅允许白名单目的地)。
  4. 对 CPU 和内存的 Cgroup 限制。
  5. 语言级沙箱 – 使用受限的 REPL(例如,Pyodide、Subprocess 沙箱)执行代码;仅将安全模块列入白名单。
  6. API 网关强制执行 – 每个外部调用都要通过一个网关进行验证:
  7. 身份验证和范围权限。
  8. 速率限制。
  9. 用于异常检测的可审计日志。
  10. 每会话内存隔离 – 每次用户会话后清除缓存;使用短期密钥加密任何临时存储。

4.3 验证与策略执行框架

机制 示例
执行前 模式验证(strict:true,JSON-Schema)+ 安全参数过滤器(正则表达式,白名单)。 拒绝包含 rm -rf 的参数,拒绝不在允许列表中的 URL。
运行时 DSL 自定义策略语言(\\tool 系统)通过 ANTLR4 解析;触发器、谓词、操作(允许、询问用户、中止)。 “如果 tool=web_search 且 query 包含 password,则中止。”
执行后 观察结果净化 – 删除 PII、限制长度、在反馈给 LLM 前删除秘密。
持续测试 SandboxEval(恶意代码套件)& AgentScan(移动载体)– 运行夜间 CI 管道以检测回归。

硬沙箱严格的模式执行自动化的安全测试 的结合为生产 LLM 工具管道构成了纵深防御姿态。


5️⃣ 成本感知与延迟优化工程

5.1 模型级别的工具成本惩罚

最近的研究(例如,高效工具调用的对齐)在训练损失中引入了一个显式 工具成本惩罚 α

Loss_total = Loss_task + α * Cost(tool_calls)
典型值: - α≈0.2 用于廉价计算器(本地执行)。 - α≈0.4 用于网络搜索。 - α≈0.6 用于重量级外部推理(例如,调用单独的 LLM)。

结果: 模型学会了避免不必要的工具调用,将延迟和计算减少了多达 ≈50 %,同时保持了答案的准确性。

5.2 运行时优化(工程策略)

杠杆 描述 预期收益
并行 / 推测执行 在令牌生成的同时启动审核、检索或计算;如果后来的推理决定它们是不必要的,则丢弃。 20-30 % 的挂钟时间更低。
请求整合 将工具选择、参数准备和调用整合到一个单一提示中,以避免多次往返。 更少的网络 RTT → 15-25 % 的延迟削减。
模型分层 将轻量级工具任务(例如,算术运算)路由到较小的模型(GPT-3.5、Claude Sonnet),而将复杂的推理任务委派给较大的模型。 每个令牌的成本急剧下降(高达 60 %)。
语义缓存和批处理 缓存完全相同或高度相似的工具响应(相似度 > 0.95)。将低优先级调用批处理到共享端点。 重复查询基本上变成免费的;批处理延迟被摊销。

实施提示: 在系统提示中提供一个 成本预算 字段({budget: 0.05 USD})并让模型自我调节;与 α 惩罚结合使用,形成双重保障。


6️⃣ 评估指标与基准

6.1 核心指标

  1. 工具正确性 – 模型本应调用的工具与实际调用的工具之间的精确匹配。✅ 二元或分数。
  2. 工具选择准确性 – 节点-F1(所选工具节点的精确率/召回率)和边-F1(排序/依赖关系链接)。
  3. 调用准确性 – 模型是否正确决定是否需要一个工具?
  4. 参数名称 F1 – 参数字段名称的精确率/召回率。
  5. 参数值距离 – 数值的莱文斯坦距离或绝对误差。
  6. 工具成功率 – 没有运行时错误便执行的工具调用的分数(对现实世界的可靠性很重要)。

6.2 基准套件

基准 大小 领域 显著特点
UltraTool (ACL 2024) 5.8 k 样本,22 个领域,2 032 个不同的工具 全面的计划步骤评估(准确性、完整性、可执行性、句法健全性、结构合理性、效率)。 通过 LLM-as-Judge 进行多维度评分;报告嵌套调用(约 40 % 的案例)。
TaskBench ~2 k 查询 专注于工具调用的选择和排序。 提供 Node-F1/Edge-F1,调用准确性。
T-eval 1.5 k 样本 强调参数填充质量。 参数名称 F1 + 莱文斯坦距离。

开源模型通常落后于专有 LLM(GPT-4 ≈ 76 % UltraTool 分数)——凸显了工具意识和模式遵循方面的开放研究空白


7️⃣ 生产部署的最佳实践指南

以下是整合了上述见解的逐步操作手册

7.1 提示工程与系统提示工具披露

系统提示:
你是一个配备了以下工具的助手。只有当用户请求无法从对话历史中得到解答时才使用工具。

工具:
- `search_web(query: string, top_k: integer = 3) -> list[dict]` – 获取最新的网络结果。
- `calc(expression: string) -> number` – 安全的算术计算器。
- `pdf_extract(file_id: string, fields: list[string]) -> dict` – 从向量存储中提取结构化数据的 PDF。

当你决定调用一个工具时,请**准确**输出下面示例中的 JSON 片段。

示例:
{ "tool": "search_web", "arguments": { "query": "最新的标普 500 指数价格" } }
理由: 在系统提示中嵌入每个工具的简短、人类可读的描述,可以告知模型的语义理解,减少漏掉的调用。

7.2 模式设计与严格模式

  • 使用 JSON-Schema Draft-07 兼容的定义。
  • 标记 additionalProperties: false 以防止多余的字段。
  • 优选枚举用于分类输入和数值范围用于限制。
  • 在 API 请求上启用 strict:true 以强制执行精确的模式符合性。

7.3 可观测性、日志记录与版本控制

工件 日志内容 保留
请求有效载荷 用户提示、系统提示、温度、模型版本、工具列表。 30 天(符合 GDPR 的匿名化)。
模型输出 原始 JSON(包括 tool_calls)、令牌使用量、延迟。 90 天。
工具执行 输入参数、stdout/stderr、退出状态、执行时间、资源使用。 90 天。
结果 最终助手回复、成功/失败标志、用户反馈(评分)。 180 天。

将日志存储在不可变的追加仅存储中(例如,CloudWatch Logs、ELK),并使用提示 - 工具包的 git SHA 标记每个版本。

7.4 运行时 DSL 与解析器集成

  • 解析器层 – 模型输出后立即运行 模式驱动的解析器(例如,llm-exe 解析器)。它提取 JSON,根据模式进行验证,并返回类型化对象或抛出异常。
  • DSL 强制执行 – 定义一个轻量级规则语言(\\tool),可以表达诸如以下策略:
    当 tool=search_web 且 arguments.query 包含 "password" 时 => 中止
    当 tool=calc 且 arguments.expression 长度 > 200 时 => 拒绝
    
    规则引擎会在实际函数被调用之前进行评估。

7.5 安全守门(深度防御)

  1. 参数消毒(正则表达式白名单、长度上限)。
  2. 在隔离容器中运行工具 并使用网络出口过滤器。
  3. 对有副作用的操作请求用户确认(例如,发送电子邮件、进行支付)。
  4. 审计和警报 以应对异常模式(例如,search_web 调用的突然激增)。

8️⃣ 案例研究与真实部署

8.1 工业 PDF 提取智能体(AID-agent,2025)

  • 目标: 从 44 个异构的技术报告 PDF 中提取供应商元数据和化学成分字段。
  • 工具栈:
  • Azure Document Intelligence OCR。
  • 表格重建工具(自定义 Python 库)。
  • 用于提取嵌入图像表格的视觉模块。
  • 基于规则的验证器(模式强制 JSON)。
  • 工作流:
  • LLM 接收到高层请求(例如,"提取所有铜含量百分比")。
  • 规划 一个序列:ocr → 定位表格 → 提取行 → 验证 → 聚合
  • 每一步调用适当的工具;LLM 观察输出并决定下一步行动(ReAct 模式)。
  • 结果: 端到端 F1 = 0.926(对比 0.842 基线仅 OCR)。消融实验显示视觉模块增加了 +0.04,验证器增加了 +0.06。
  • 经验教训: 健壮的预处理(纠偏、旋转)是必不可少的;严格的模式显著降低了下游解析错误。

8.2 金融机器人(实时股票洞察)

  • 工具: yfinance API 包装器、calc 用于投资组合指标、search_web 用于新闻头条。
  • 模式: 并行工具调用 – 在单个模型轮次中获取 5 个股票代码的价格和新闻;模型合并观察结果并生成简明的推荐。
  • 延迟: 平均 1.8 秒(并行 + 缓存)。

8.3 旅行助手

  • 工具: openweatherflight_searchhotel_lookup
  • 交互: 具有 行程时间线 节点图的画布用户界面;每个节点代表一个工具调用(航班 → 天气 → 打包清单)。
  • 用户研究: 72 % 的参与者更喜欢节点图而不是线性聊天流来构建行程。
  • 工具: pdf_extractsearch_web(用于判例)、gpt‑4o 用于推理。
  • 安全: 在文档存储上强制执行每会话隔离;所有提取的文本都经过清理,以避免泄露客户 PII。
  • 准确性: 条款提取精度 0.94,召回率 0.91。

8.5 市场研究合成器

  • 工具: 多源网页刮削器(Playwright)、calc 用于趋势线拟合、search_web 用于竞争对手数据。
  • 编排: ReAct 循环与推测执行——刮削器在 LLM 仍在推理报告大纲时启动,从而总周转时间 < 4 秒,生成 3 页简报。

8.6 ReAct / ZERO_SHOT_REACT 作为一个通用模式

  • 核心思想: LLM 产生一个思维链声明,决定是否调用工具,接收观察结果,然后重复。
  • 在 LangChain 中的实现: 带有 toolkitZeroShotAgent – 一行代码 agent = ZeroShotAgent.from_llm_and_tools(llm, tools)
  • 好处: 跨域的统一 API,可解释的推理轨迹,中间步骤的日志记录简单。

9️⃣ 未来方向与开放研究问题

  1. 自适应工具成本调度 – 根据实时预算动态调整 α(例如,用户指定的延迟 SLA)。
  2. 分层工具发现 – 允许模型即时创建新的工具包装器(例如,根据描述生成 OpenAPI 规范)。
  3. 跨模态工具集成 – 将视觉、听觉和触觉传感器与语言推理结合在一个统一的工具调用框架中。
  4. 标准化基准扩展 – 添加更多领域(机器人、物联网)并测量 安全意识 指标(阻止的禁止调用百分比)。
  5. 自我审计 LLM – 在发出提议的工具调用前预测其 成本风险 的模型,从而启用两阶段验证循环。
  6. 工具决策的可解释性 – 将工具选择的理由呈现为面向用户的叙述(例如,“我使用了 search_web,因为问题询问了最新政策,而我无法从记忆中获取”)。

🔟 参考文献与延伸阅读

  1. OpenAI 函数调用 – 核心指南 (2023‑2024)。
  2. Azure OpenAI – 函数调用集成 (2024)。
  3. LangChain 文档 – 工具与工具包 (v0.2+)。
  4. ChatGPT 插件 – 开发指南 (OpenAI, 2024)。
  5. 基于 LLM 的工具交互设计 – 调查 (2024)。
  6. LLM 驱动的工具使用 – 安全威胁 – 白皮书 (2024)。
  7. SandboxEval 与 AgentScan – 安全测试框架 (2024)。
  8. 高效工具调用的对齐 – ACL 2024 论文。
  9. UltraTool 基准套件 – ACL 2024 发现。
  10. ReAct: 协同推理与行动 – arXiv 2023。
  11. ZERO\_SHOT\_REACT – LangChain 实现 (2024)。
  12. AID-agent PDF 提取案例研究 – 2025 年工业人工智能会议论文集。
  13. 运行时约束 DSL – \tool 系统 – 研讨会论文 (2024)。
  14. llm‑exe 解析器模块 – GitHub 仓库 (2024)。
  15. 最佳实践提示与工具设计 – OpenAI 食谱 (2024)。

报告结束

为内部发行准备。任何重用都需要适当引用上述列出的来源。