LLM 工具使用 – 一份全面的技术报告
作者:高级研究员 – 2025 年 8 月
目录
- LLM 工具使用 – 一份全面的技术报告
1️⃣ 执行摘要
大型语言模型(LLM)已经超越了单纯的文本生成,成为外部工具的协调器——搜索引擎、代码解释器、数据库连接器、自定义 API,甚至是物理设备控制器。这种转变解锁了现实世界的实用性(例如,最新的天气预报、交易性金融),同时也带来了新的工程挑战:模式定义、可靠的调用、延迟、成本、安全和评估。
本报告综合了最新的公开指南(OpenAI 函数调用、Azure OpenAI、LangChain、ChatGPT 插件管道)、交互设计研究、安全分类法、成本感知训练策略、基准套件和生产案例研究。最终,它形成了一份具体的最佳实践手册,开发者可以采用它来构建健壮、可维护和可扩展的 LLM 增强服务。
2️⃣ LLM 驱动的工具使用基础
2.1 OpenAI 函数调用(现为“工具”)
| 元素 | 描述 | 关键提示 |
|---|---|---|
| 工具定义 | tools 数组下的 JSON-Schema 类似对象:type、name、description、parameters(具有 properties、required、可选 additionalProperties:false 的对象)。 |
使用 strict:true 强制执行精确的模式符合性;保持模式浅层以尽量减少令牌使用。 |
| 调用流程 | 1️⃣ 发送带有工具的请求。2️⃣ 模型可能响应 tool_call(名称 + 参数)。3️⃣ 应用程序执行函数,捕获输出并返回 tool_call_output。4️⃣ 模型接收观察结果并可以继续推理。5️⃣ 发出最终响应。 |
遵循 5 步循环;将 tool_call_output 视为对话中的新观察结果。 |
| 配置 | tool_choice(auto、required、特定名称或 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。
* 工具包 – 相关工具的组(例如,SearchToolkit、SQLDatabaseToolkit)简化了入职;它们向 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 沙箱与隔离策略
- 容器级隔离 – 在轻量级容器(Docker、gVisor、Firecracker)中运行每个工具调用。强制执行:
- 只读文件系统挂载。
- 网络出口过滤(仅允许白名单目的地)。
- 对 CPU 和内存的 Cgroup 限制。
- 语言级沙箱 – 使用受限的 REPL(例如,Pyodide、Subprocess 沙箱)执行代码;仅将安全模块列入白名单。
- API 网关强制执行 – 每个外部调用都要通过一个网关进行验证:
- 身份验证和范围权限。
- 速率限制。
- 用于异常检测的可审计日志。
- 每会话内存隔离 – 每次用户会话后清除缓存;使用短期密钥加密任何临时存储。
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)
结果: 模型学会了避免不必要的工具调用,将延迟和计算减少了多达 ≈50 %,同时保持了答案的准确性。
5.2 运行时优化(工程策略)
| 杠杆 | 描述 | 预期收益 |
|---|---|---|
| 并行 / 推测执行 | 在令牌生成的同时启动审核、检索或计算;如果后来的推理决定它们是不必要的,则丢弃。 | 20-30 % 的挂钟时间更低。 |
| 请求整合 | 将工具选择、参数准备和调用整合到一个单一提示中,以避免多次往返。 | 更少的网络 RTT → 15-25 % 的延迟削减。 |
| 模型分层 | 将轻量级工具任务(例如,算术运算)路由到较小的模型(GPT-3.5、Claude Sonnet),而将复杂的推理任务委派给较大的模型。 | 每个令牌的成本急剧下降(高达 60 %)。 |
| 语义缓存和批处理 | 缓存完全相同或高度相似的工具响应(相似度 > 0.95)。将低优先级调用批处理到共享端点。 | 重复查询基本上变成免费的;批处理延迟被摊销。 |
实施提示: 在系统提示中提供一个 成本预算 字段({budget: 0.05 USD})并让模型自我调节;与 α 惩罚结合使用,形成双重保障。
6️⃣ 评估指标与基准
6.1 核心指标
- 工具正确性 – 模型本应调用的工具与实际调用的工具之间的精确匹配。✅ 二元或分数。
- 工具选择准确性 – 节点-F1(所选工具节点的精确率/召回率)和边-F1(排序/依赖关系链接)。
- 调用准确性 – 模型是否正确决定是否需要一个工具?
- 参数名称 F1 – 参数字段名称的精确率/召回率。
- 参数值距离 – 数值的莱文斯坦距离或绝对误差。
- 工具成功率 – 没有运行时错误便执行的工具调用的分数(对现实世界的可靠性很重要)。
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 安全守门(深度防御)
- 参数消毒(正则表达式白名单、长度上限)。
- 在隔离容器中运行工具 并使用网络出口过滤器。
- 对有副作用的操作请求用户确认(例如,发送电子邮件、进行支付)。
- 审计和警报 以应对异常模式(例如,
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 金融机器人(实时股票洞察)
- 工具:
yfinanceAPI 包装器、calc用于投资组合指标、search_web用于新闻头条。 - 模式: 并行工具调用 – 在单个模型轮次中获取 5 个股票代码的价格和新闻;模型合并观察结果并生成简明的推荐。
- 延迟: 平均 1.8 秒(并行 + 缓存)。
8.3 旅行助手
- 工具:
openweather、flight_search、hotel_lookup。 - 交互: 具有 行程时间线 节点图的画布用户界面;每个节点代表一个工具调用(航班 → 天气 → 打包清单)。
- 用户研究: 72 % 的参与者更喜欢节点图而不是线性聊天流来构建行程。
8.4 法律条款分析仪
- 工具:
pdf_extract、search_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 中的实现: 带有
toolkit的ZeroShotAgent– 一行代码agent = ZeroShotAgent.from_llm_and_tools(llm, tools)。 - 好处: 跨域的统一 API,可解释的推理轨迹,中间步骤的日志记录简单。
9️⃣ 未来方向与开放研究问题
- 自适应工具成本调度 – 根据实时预算动态调整 α(例如,用户指定的延迟 SLA)。
- 分层工具发现 – 允许模型即时创建新的工具包装器(例如,根据描述生成 OpenAPI 规范)。
- 跨模态工具集成 – 将视觉、听觉和触觉传感器与语言推理结合在一个统一的工具调用框架中。
- 标准化基准扩展 – 添加更多领域(机器人、物联网)并测量 安全意识 指标(阻止的禁止调用百分比)。
- 自我审计 LLM – 在发出提议的工具调用前预测其 成本 和 风险 的模型,从而启用两阶段验证循环。
- 工具决策的可解释性 – 将工具选择的理由呈现为面向用户的叙述(例如,“我使用了
search_web,因为问题询问了最新政策,而我无法从记忆中获取”)。
🔟 参考文献与延伸阅读
- OpenAI 函数调用 – 核心指南 (2023‑2024)。
- Azure OpenAI – 函数调用集成 (2024)。
- LangChain 文档 – 工具与工具包 (v0.2+)。
- ChatGPT 插件 – 开发指南 (OpenAI, 2024)。
- 基于 LLM 的工具交互设计 – 调查 (2024)。
- LLM 驱动的工具使用 – 安全威胁 – 白皮书 (2024)。
- SandboxEval 与 AgentScan – 安全测试框架 (2024)。
- 高效工具调用的对齐 – ACL 2024 论文。
- UltraTool 基准套件 – ACL 2024 发现。
- ReAct: 协同推理与行动 – arXiv 2023。
- ZERO\_SHOT\_REACT – LangChain 实现 (2024)。
- AID-agent PDF 提取案例研究 – 2025 年工业人工智能会议论文集。
- 运行时约束 DSL – \tool 系统 – 研讨会论文 (2024)。
- llm‑exe 解析器模块 – GitHub 仓库 (2024)。
- 最佳实践提示与工具设计 – OpenAI 食谱 (2024)。
报告结束
为内部发行准备。任何重用都需要适当引用上述列出的来源。