跳至正文
创始价格 — 早期客户锁定立即开始 →

AI智能体工具使用:函数调用、模式定义与安全执行

AI智能体工具使用是LLM请求执行外部函数的机制 — 网络搜索、数据库查询、API调用、文件操作 — 通过输出结构化工具调用JSON,运行时拦截并对JSON Schema进行验证,在返回工具结果前执行。LLM从不执行任何操作;它只是发出请求。运行时在任何执行之前强制执行模式验证、ACL检查和步骤预算。tau-bench(2025年)显示,参数构造错误是工具使用的最大失败模式。

AI智能体工具使用是大型语言模型请求执行外部函数的机制 — 网络搜索、数据库查询、API调用、文件操作或自定义业务逻辑 — 通过在其输出中发出结构化工具调用,运行时拦截该调用,对JSON Schema定义进行验证,执行并在下一个上下文轮次中作为工具结果返回。

工具调用的工作原理:请求-执行-返回循环

工具调用生命周期

每个工具调用都遵循相同的五步循环,无论使用哪个框架或提供商:

  1. 上下文设置 — 智能体接收任务和可用工具列表,每个工具由名称、自然语言描述和参数的JSON Schema定义来描述。
  2. LLM决策 — 模型在其输出中发出工具调用块:一个函数名称和与声明模式匹配的JSON参数对象。
  3. 运行时拦截 — 框架在任何执行发生前拦截工具调用。参数针对模式进行验证。检查智能体的ACL:此智能体是否被允许调用此工具?
  4. 执行 — 如果验证和权限检查通过,运行时执行该函数并收集其输出。
  5. 上下文注入 — 工具结果作为工具结果轮次注入回对话上下文。LLM从这个丰富的上下文继续推理。

关键架构事实:LLM从不执行任何操作。它只是请求。每个不安全的操作 — 写入文件、调用API、发送电子邮件 — 都由运行时控制。这种请求和执行之间的分离是安全智能体工具使用的基础。

提供商格式差异:OpenAI vs Anthropic vs Google

三大主要LLM提供商都原生支持工具使用,但JSON格式不同:

OpenAI(openai/openai-python,30,941颗星,Apache-2.0):工具定义以JSON Schema对象数组的形式放入tools参数。模型在助手消息的tool_calls字段中返回工具调用。客户端以role: "tool"的消息发送回工具结果。Responses API(2025年3月)添加了服务器端执行的内置工具(web_searchfile_searchcomputer_use)。

Anthropic(anthropic-sdk-python,3,595颗星,MIT):工具定义放入顶级tools参数。模型在助手轮次中返回tool_use内容块。客户端必须解析这些块并在下一个人类轮次中返回tool_result内容块。

Google Gemini:工具定义在tools参数内使用functionDeclarations。模型返回functionCall部分;客户端发送functionResponse部分。Gemini支持带有ANY模式和AUTO模式的tool_config

这些格式在语义上等价,但在语法上足够不同,以至于硬编码一个提供商的约定在模型切换时会失败。

谁真正执行工具(以及为何对安全至关重要)

LLM无法执行工具。它只能请求。当运行时在每次工具执行前强制执行ACL门时,没有任何LLM输出能够绕过权限检查。模型可以用任何参数请求delete_all_records();如果智能体的权限矩阵不包含该工具,运行时将在任何执行前拒绝该请求。

定义LLM能正确使用的工具模式

tau-bench(ServiceNow Research,2025年)测量GPT-4o在零售工具使用任务上的44% pass@1。最大的失败类别不是工具选择 — 模型选择了正确的工具 — 而是参数构造。模式质量是主要的可靠性杠杆。

工具定义的JSON Schema结构

最小有效的工具模式需要四个字段:

{
  "name": "search_web",
  "description": "搜索公共网络获取当前信息。当任务需要训练截止日期后的事实、实时数据或训练数据中没有的来源时使用。",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索查询。使用具体、有针对性的术语,而非完整句子。"
      },
      "max_results": {
        "type": "integer",
        "description": "要返回的最大结果数。默认为5,最多20。",
        "default": 5
      }
    },
    "required": ["query"]
  }
}

required数组很重要:不在required中的参数是可选的。经常被省略的必需参数表明模式描述有问题。

编写减少参数错误的描述

改善参数构造精度的工具描述三条规则:

  1. 使用动词-名词对命名search_webcreate_ticketread_file。避免类似工具之间的歧义。
  2. 在描述中消除歧义:如果两个工具看起来相似,明确说明何时使用每个工具。
  3. 用示例描述参数"搜索查询。示例:'LangGraph v0.2 并行工具调用'" 在参数准确性上优于 "查询字符串"

常见模式错误及修复方法

错误效果修复
对分类值使用无约束的"type": "string"模型发明无效值使用"enum": ["option_a", "option_b"]
参数上缺少description模型猜测参数语义编写带示例的明确描述
所有参数都在required可选字段未知时模型拒绝调用只列出真正必需的参数
模糊的工具名称(processhandle模型无法区分相似工具使用动词-名词:submit_formparse_date
没有required数组JSON Schema无效始终包含required,即使为空([]

严格模式:强制精确的模式遵守

OpenAI的结构化输出严格模式(工具定义上的"strict": true)保证模型的输出JSON与声明的模式完全匹配,消除整个参数构造错误类别。

并行和顺序工具调用

何时使用并行工具调用

OpenAI的Responses API(2025年3月)将并行工具调用设为默认。在单个LLM轮次中,模型可以同时请求多个工具执行。对于独立工具,并行调度将往返次数从N个顺序轮次减少到一个并发批次。

示例:研究智能体需要当前股价、最新新闻和公司的SEC文件。三者都是独立的。顺序:3个LLM轮次 x 10秒 = 30秒。并行:1个LLM轮次 + max(工具延迟)约10秒。

前提条件:工具必须真正独立。如果工具B需要工具A的输出作为参数,它们必须是顺序的。

依赖操作的顺序工具调用

工具链接 — 使用一个工具的输出作为下一个工具的输入 — 需要顺序执行。模式:search_web(查询)fetch_page(搜索结果中的URL)extract_data(页面内容)summarize(提取的数据)

有状态资源的并发风险

对有状态资源的并行工具调用需要排序保证。规则:当工具是只读的或写入独立资源时,并行调度是安全的。

工具输出解析和错误恢复

工具调用会失败。外部API返回503。数据库查询超时。设计良好的工具使用实现可以在不需要人工干预的情况下处理可恢复错误的失败。

验证工具输出

返回HTTP 200的工具与返回正确、有用结果的工具不同。在将输出注入智能体上下文之前,根据预期模式验证输出。

重试策略:何时以及如何重新调用

针对不同失败模式的三种重试模式:

  • 瞬态失败重试(网络超时、速率限制):在短暂回退后用相同参数重新调用相同工具。
  • 参数澄清重试:向LLM返回解释为何参数被拒绝的结构化错误。
  • 回退工具:如果工具A在N次重试后失败,路由到具有等效功能的工具B。

向编排器报告工具失败

不可恢复的错误必须向编排器报告。对于多智能体管道,编排器需要包含失败工具名称、错误类别和任务是否可重试的结构化失败信号。对于AI智能体编排模式,这是触发重新路由或取消语义的升级路径。

工具权限范围和安全性

最小权限工具分配

每个智能体应该只持有其特定任务所需的工具。成功提示注入的智能体的爆炸半径受其许可工具集的限制。OWASP LLM Top 10 v1.1(2025年)将提示注入(LLM01)列为LLM应用程序的最大风险。

执行前的输入验证

在两个层面验证工具调用参数:模式验证和语义验证。fetch_page工具应拒绝带有file://localhost URL的参数以防止SSRF。

有关工具级攻击向量的完整分类,请参阅AI智能体安全威胁模型

不可逆操作:人在回路门控

具有不可逆副作用的工具调用 — 发送电子邮件、删除记录、转账、发布内容 — 在执行前需要明确的人工确认门或幂等性检查。

OpenLegion的观点:工具注册表和ACL门

每个主要LLM提供商都有不同的工具调用API。正确的抽象:定义一次工具,让框架在调用时将其转换为正确的提供商约定。

OpenLegion的工具注册表实现了这种抽象。定义一次search_web。网格根据配置的模型将定义转换为OpenAI tools、Anthropic tools或Gemini functionDeclarations。ACL门不是可选的。每个工具调用 — 内置的、MCP的或自定义的 — 在执行前都要经过每智能体权限矩阵。

维度OpenLegionLangChain / LangGraphOpenAI Agents SDKCrewAIAnthropic直接
工具定义格式单一模式,提供商转换需要特定于提供商的包装器仅OpenAI格式CrewAI工具装饰器仅Anthropic tool_use格式
提供商抽象是 — GPT-4o、Claude、Gemini统一部分 — 通过LangChain集成否 — 仅OpenAI模型部分否 — 仅Anthropic
ACL执行每智能体权限矩阵,结构性未内置未内置未内置未内置
并行工具调用支持支持(依赖提供商)是 — Responses API默认值支持是 — Claude支持
内置工具浏览器、文件、HTTP、Shell、图像生成通过LangChain社区工具web_search、file_search、computer_use未内置未内置
MCP集成原生 — 相同的ACL/预算管道通过LangChain MCP适配器实验性非原生非原生

有关MCP规范、服务器架构和每服务器权限要求,请参阅模型上下文协议指南

内置工具 vs MCP工具 vs 自定义工具

内置运行时工具

内置工具由运行时预先强化:浏览器自动化、文件操作、HTTP请求、Shell命令、图像生成。首先使用内置工具。

MCP工具服务器

MCP工具由通过stdio或HTTP上的JSON-RPC公开工具的模型上下文协议服务器提供。MCP工具需要显式沙箱化和每服务器权限范围设置。

自定义工具注册

自定义工具是您在智能体工具注册表中编写和注册的Python(或TypeScript)函数。提供完全的灵活性;权衡是您拥有验证、错误处理、幂等性和安全控制。

常见问题

什么是AI智能体工具使用?

AI智能体工具使用是大型语言模型请求执行外部函数的机制 — 网络搜索、API调用、数据库查询、文件操作 — 通过输出运行时拦截、验证并执行的结构化工具调用JSON。LLM从不直接执行任何操作;它只描述想要调用什么以及使用什么参数。

函数调用在AI智能体中如何工作?

函数调用在请求-执行-返回循环中工作:智能体接收任务和可用工具列表;LLM发出命名函数并提供参数的工具调用;运行时验证这些参数,执行函数,并将结果作为工具结果注入上下文。

对AI智能体来说什么是好的工具模式?

好的工具模式使用动词-名词名称(search_webcreate_ticket),明确说明何时使用及每个参数含义的描述,尽可能使用枚举的强类型参数,以及列出必需参数的required数组。tau-bench(2025年)显示不正确的参数构造是最常见的失败模式。

什么是并行工具调用,何时应该使用?

并行工具调用让智能体在单个LLM轮次中请求多个工具执行,由运行时并发调度。当工具独立时使用并行调用 — 它们的输出不相互依赖,且不写入共享有状态资源。

如何防止AI智能体中的工具调用循环?

工具调用循环发生在智能体持续调用工具而不收敛到最终答案时。唯一可靠的预防措施是在基础设施层面强制执行步骤预算:由编排器强制执行的每次智能体运行的工具调用硬性最大值。

AI智能体工具使用的安全风险是什么?

主要风险是工具结果注入:当智能体调用返回可重定向智能体行为的攻击者控制内容的工具时。OWASP LLM Top 10 v1.1(2025年)将提示注入列为LLM应用程序的首要风险。缓解措施包括输出净化、最小权限工具分配以及针对不可逆操作的人在回路门控。

内置工具、MCP工具和自定义工具之间有什么区别?

内置工具由智能体运行时提供,已应用ACL执行。MCP工具由通过JSON-RPC公开外部功能的模型上下文协议服务器提供;需要沙箱化和每服务器权限范围设置。自定义工具是您编写和注册的函数,提供完全的灵活性,但需要负责验证和安全性。

不同的LLM提供商如何实现工具使用?

OpenAI通过tools参数、助手响应中的tool_callsrole: "tool"结果消息实现工具使用。Anthropic使用带有在下一个人类轮次中的tool_result块的tool_use内容块。Google Gemini使用带有响应中的functionCall部分和后续轮次中的functionResponse部分的functionDeclarations。三种格式在语义上等价,但在语法上不同。

定义一次工具,在任何地方安全执行

tau-bench(2025年)将GPT-4o定位在工具使用任务的44% pass@1,将参数构造作为主要失败类别。带有动词-名词名称、类型化枚举和参数示例的精确模式弥合了这一差距的大部分。

有关覆盖步骤预算和循环预防的智能体工作流模式,以及衡量工具使用可靠性的AI智能体评估基准,这些指南扩展了本页涵盖的基础。

在OpenLegion上构建具有每智能体ACL执行的工具使用智能体 →