工具调用(Tool Calling)

工具调用是 LLM Agent 与外部世界交互的核心机制。由于大语言模型本身只能处理文本,工具调用框架允许模型识别何时需要调用外部功能,并正确执行这些调用。

函数调用机制的工作原理

JSON Schema 定义

现代 LLM 支持通过 JSON Schema 定义工具接口,模型可以理解工具的参数结构和类型约束。

{
  "name": "search_web",
  "description": "搜索互联网获取最新信息",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {"type": "string", "description": "搜索关键词"},
      "max_results": {"type": "integer", "description": "最大结果数量", "default": 5}
    },
    "required": ["query"]
  }
}

调用流程

  1. 工具注册:开发者向 Agent 注册可用的工具

  2. 意图识别:LLM 分析用户请求,判断是否需要调用工具

  3. 参数生成:LLM 生成符合工具 Schema 的参数

  4. 工具执行:Agent 执行工具调用并获取结果

  5. 结果整合:LLM 将工具结果整合到最终响应中

如何设计和注册自定义工具

工具设计原则

  • 单一职责:每个工具只做一件事

  • 明确接口:参数和返回值要清晰定义

  • 错误处理:提供有意义的错误信息

  • 安全性:验证输入参数,防止恶意调用

工具注册示例(Python + LangChain)

from langchain.tools import Tool

def calculator(expression: str) -> str:
    """安全的数学计算工具"""
    try:
        # 验证表达式安全性
        allowed_chars = set('0123456789+-*/(). ')
        if not all(c in allowed_chars for c in expression):
            return "错误:表达式包含不支持的字符"
        result = eval(expression)
        return str(result)
    except Exception as e:
        return f"计算错误: {str(e)}"

calculator_tool = Tool(
    name="calculator",
    func=calculator,
    description="执行数学计算,支持加减乘除和括号"
)

工具参数验证和错误处理

参数验证策略

验证类型

描述

示例

类型验证

确保参数类型正确

字符串、数字、布尔值

范围验证

检查数值范围

年龄 0-150,页码 ≥1

格式验证

验证数据格式

邮箱、电话、日期格式

业务规则

应用特定规则

用户权限、配额限制

错误处理最佳实践

  1. 友好的错误消息:避免技术细节,提供用户可理解的信息

  2. 重试机制:对于临时性错误(如网络超时),提供重试选项

  3. 降级处理:当工具不可用时,提供替代方案

  4. 日志记录:记录错误详情用于调试和监控

常见工具类型

信息获取类

  • Web 搜索:获取最新信息

  • 数据库查询:访问结构化数据

  • API 调用:集成第三方服务

数据处理类

  • 文件操作:读写、转换文件

  • 数据计算:数学运算、统计分析

  • 格式转换:JSON、XML、CSV 等格式互转

系统操作类

  • 命令执行:执行系统命令(需谨慎)

  • 文件系统:目录遍历、文件管理

  • 网络操作:HTTP 请求、WebSocket 通信

工具调用的安全考虑

权限控制

  • 最小权限原则:工具只拥有完成任务所需的最小权限

  • 用户授权:敏感操作需要用户明确授权

  • 审计日志:记录所有工具调用用于安全审计

输入验证

  • 白名单验证:只允许已知安全的输入模式

  • 长度限制:防止缓冲区溢出攻击

  • 特殊字符过滤:防止注入攻击

输出过滤

  • 敏感信息过滤:移除 API 密钥、密码等敏感数据

  • 内容审查:过滤不当内容

  • 格式标准化:确保输出格式一致

调试和测试工具

测试策略

  • 单元测试:测试单个工具的功能

  • 集成测试:测试工具与 LLM 的交互

  • 端到端测试:模拟真实用户场景

调试技巧

  • 详细日志:记录工具调用的完整过程

  • 模拟工具:在开发环境中使用模拟工具

  • 性能监控:跟踪工具调用的响应时间和成功率

工具调用是构建强大 Agent 的基础,掌握这些概念和最佳实践将帮助你创建安全、可靠、高效的 LLM 应用。