SmaugBrain
← 返回新闻
news 焦点文章

AI Agent 工具调用与函数调用:生产级设计模式

2026年8月14日 smaugbrain 7 分钟阅读 WordPress 文章

AI Agent 工具调用与函数调用:生产级设计模式

简介

AI Agent 的能力上限取决于它能调用的工具。一个只能聊天、却无法与 API、数据库或外部系统交互的 Agent,本质上只是对话工具——而非执行工具。工具调用(又称函数调用)才是让 AI 模型从文本生成器转变为行动型 Agent 的关键。

本指南覆盖生产级工具设计、选型与集成模式。无论你是构建查询订单状态的客户服务的 Agent,还是执行数据库查询的内部运营 Agent,以下原则都将帮助你规避最常见的故障模式。


什么是工具调用与函数调用?

函数调用是 LLM 与外部能力之间的结构化接口。模型不再输出自由文本,而是生成一个描述「调用哪个工具」及「传入什么参数」的 JSON payload。运行时随后执行该工具,并将结果返回给模型。

{
  "tool": "get_weather",
  "arguments": {
    "location": "San Francisco",
    "unit": "celsius"
  }
}

与传统 API 调用的关键区别在于:模型根据自然语言上下文**决定调用哪个工具**以及**传入什么参数**。这很强大,但也引入了确定性代码中不存在的新故障模式。


工具设计原则

原子化工具设计与单体工具设计对比图

原则一:工具应单一且原子化

每个工具只做好一件事。避免像 `execute_task()` 这样接受自由文本指令的单体工具。应将功能拆分为离散且可预测的函数:

  • `search_knowledge_base(query)`
  • `create_ticket(title, description, priority)`
  • `check_order_status(order_id)`
  • `send_notification(recipient, message)`

原子化工具更容易测试、调试和推理。它们也能产生更可靠的函数调用结果,因为模型对何时调用每个工具有更清晰的边界认知。

原则二:定义清晰且受限的 Schema

工具参数应使用严格 Schema,包含类型化字段、必填参数以及尽可能使用枚举值。松散的 Schema 会导致调用歧义和运行时错误。

良好的 Schema 示例:

{
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string",
      "pattern": "^ORD-[0-9]{6}$",
      "description": "订单号格式为 ORD-123456"
    },
    "include_tracking": {
      "type": "boolean",
      "default": false
    }
  },
  "required": ["order_id"]
}

糟糕的 Schema 示例:

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "任意搜索词"
    }
  }
}

受限 Schema 为模型提供了明确的验证规则,降低了生成无效参数的可能性。

原则三:提供丰富的工具描述

模型完全依赖你的工具描述来理解何时及如何使用每个工具。模糊的描述如 `”获取天气信息”` 会导致不一致的使用行为。而详细的描述如 `”检索城市当前天气及 5 天预报。支持城市名或邮编。返回指定单位(摄氏度/华氏度)的温度数据。”` 能产生远比前者可靠的调用结果。

每个工具描述中应包含:

  • 工具的功能
  • 触发条件(何时使用)
  • 接受的参数及其格式
  • 响应结构
  • 任何限制或错误条件

常见故障模式与修复

故障模式一:幻觉参数

模型捏造不符合 Schema 的参数或虚构值。这通常发生在 Schema 松散或描述不清时。

修复方案:在工具执行层添加严格校验。永远不要信任未经校验的模型输出。使用 Pydantic 模型、JSON Schema 校验器或等效工具,在参数到达后端之前拦截非法输入。

故障模式二:缺失必需工具

模型调用了不存在的工具,或因描述不清而遗漏了必需工具。

修复方案:维护工具注册表,在执行前校验工具名称。记录所有工具调用日志以备审计。定期审查日志,识别工具缺失或误用的模式。

故障模式三:工具过载

工具过多会让模型产生决策疲劳。当面临 20+ 工具时,模型难以选出正确的工具,可能调用无关工具或跳过必要工具。

修复方案:在适当场景将相关工具分组为复合工具。使用工具分类或命名空间。优先展示最常用的工具,将专用工具隐藏在条件加载之后。

故障模式四:输出格式非确定性

同一工具的多次调用产生格式不一致的响应,导致模型难以可靠地解析结果。

修复方案:统一工具响应格式。始终返回结构化 JSON,字段名保持一致。以可预测的结构包含成功/失败指示器和错误消息。


工具集成模式

工具链式调用工作流示意图,展示 AI Agent 顺序 API 调用流程

模式一:直接 API 调用

最简单的模式:Agent 通过工具包装器直接调用外部 API。适用于读取密集型操作,如获取数据、查询状态或检索文档。

优点:

  • 低延迟
  • 完全控制认证与错误处理
  • 易于添加缓存层

缺点:

  • 需维护 API 客户端代码
  • 每次集成都增加复杂度

模式二:内部服务抽象

将内部服务(数据库、CRM、ERP 系统)封装在一致的工具接口背后,使 Agent 与后端实现细节解耦。

示例:不让 Agent 直接查询数据库,而是提供 `query_customer_data(customer_id)` 工具,封装数据库逻辑、缓存和权限检查。

优点:

  • 集中化的安全与访问控制
  • 修改后端无需更改 Agent 逻辑
  • 一致的错误处理

模式三:工具链式工作流

复杂任务通常需要按顺序调用多个工具。模型应能自然地将工具链式串联,将一个工具的输出作为另一工具的输入。

示例工作流:

  1. `search_orders(customer_email)` → 返回订单列表
  2. `get_order_details(order_id)` → 返回特定订单信息
  3. `check_inventory(product_id)` → 验证库存
  4. `create_shipment(order_id, product_id)` → 完成发货

确保每个工具的响应结构化且自描述,模型便能解析结果并决定下一步动作。


安全与权限管理

工具赋予 AI Agent 执行动作的能力,这种能力需要谨慎的安全控制。

核心安全实践

  1. 最小权限原则:每个工具应仅具备最低必要权限。客户服务 Agent 不需要管理员级数据库访问权限。
  1. 输入净化:将所有工具参数视为不可信输入。验证、净化并对查询进行参数化处理,防止注入攻击。
  1. 审计日志:记录每次工具调用,包含时间戳、Agent 身份、工具名称、参数(已净化)及结果。这对调试和合规至关重要。
  1. 速率限制:按工具和按 Agent 实施速率限制,防止滥用并保护下游系统。
  1. 敏感数据过滤:确保工具响应不泄露 PII 或密钥。在将结果返回给模型之前,过滤敏感字段。

工具集成测试

在部署到生产环境之前,对工具集成进行严格测试。

工具单元测试

为每个工具编写测试,验证:

  • Schema 校验能捕获非法参数
  • 输出与文档格式一致
  • 错误条件得到妥善处理
  • 边界情况(空结果、超时、速率限制)产生正确响应

集成测试

端到端模拟真实 Agent 工作流:

  • 输入自然语言提示,验证正确的工具选择
  • 检查链式工具调用是否产生连贯结果
  • 在负载下测量延迟和错误率
  • 验证安全控制(未授权工具访问被拦截)

模糊测试

注入畸形或意外工具参数,验证校验层能否拦截。这有助于发现手动测试可能遗漏的 Schema 漏洞和边界情况。


监控与可观测性

生产级工具调用需要可观测性。追踪以下指标:

  • 工具调用成功率:无错误完成的调用占比
  • 参数校验失败率:模型生成非法参数的频率
  • 延迟分布:从工具调用到响应的耗时
  • 工具选择准确率:是否正确工具被用于正确任务
  • 错误模式:需要工具或 Prompt 修复的常见故障模式

使用结构化日志并与现有监控栈(Prometheus、Datadog 等)集成,以异常告警。


最佳实践总结

实践重要性
原子化工具更易于测试、调试和维护
严格 Schema减少幻觉参数
丰富描述提升工具选择准确率
输入校验防止注入和运行时错误
工具注册表支持审计与发现
响应标准化提升模型解析可靠性
最小权限访问降低安全风险
全面测试在上线前发现问题
结构化日志支持调试与优化

常见问题

问:AI Agent 应该有多少个工具?

答:从覆盖最常见任务的 5–10 个核心工具开始。仅在必要时添加专用工具。超过 15–20 个工具往往会降低选择准确率,除非实现了智能路由或工具分组。

问:应让 Agent 直接调用工具,还是通过协调者转发?

答:对于简单 Agent,直接调用即可。对于复杂的多 Agent 系统,协调者或路由器能通过考虑单个 Agent 可能忽略的上下文,做出更好的工具选择决策。

问:如何处理 Agent 工作流中的工具失败?

答:为瞬态错误实现带指数退避的重试逻辑。对于永久性失败,向模型返回清晰错误消息以便其调整策略。务必记录失败日志以供调试。

问:工具可以调用其他工具吗?

答:可以,这称为工具链式调用。它对复杂工作流很强大,但会增加延迟和复杂度。应审慎使用,并确保链中每个工具都有清晰的成功/失败信号。

问:如何在不停止 Agent 的情况下更新工具定义?

答:设计支持动态重载的工具注册表。将工具定义存储在数据库中或配置文件中,可在运行时更新。大多数生产级框架支持工具 Schema 的热重载。

问:函数调用与 Agent 有什么区别?

答:函数调用是一种机制——模型调用外部代码的方式。Agent 是一种系统,它使用函数调用(配合记忆、规划及其他能力)自主达成目标。函数调用是 Agent 使用的工具,而非 Agent 本身。

问:如何防止 Agent 过于频繁地调用工具?

答:在工具层面设置速率限制。实现节流中间件。使用熔断器暂时禁用故障或被过度使用的工具。监控调用频率,并根据实际使用模式调整限制。


结语

工具调用是 AI 对话与 AI 行动之间的桥梁。设计可靠工具集成需要对 Schema 质量、输入校验、安全性和可观测性给予充分关注。从原子化工具、严格 Schema 和丰富描述起步。全面测试,持续监控。记住:你的工具设计得越好,Agent 就越强大、越可靠。

如需关于构建具备强健工具集成的生产级 AI Agent 的实践指导,请访问 [SmaugBrain](https://www.smaugbrain.com/) 查阅资源。

如需关于构建具备强健工具集成的生产级 AI Agent 的实践指导,请访问 SmaugBrain 查阅资源。