Tool Calling 工具调用

让AI从"聊天"进化到"做事"的核心机制

"那天晚上,我问GPT今天的天气。它说:'抱歉,我没有实时数据。'我叹了口气。后来有人教会了它Tool Calling,它可以查天气、搜资料、写代码。我终于明白,AI不是不会,只是缺了把手。"

🔧 一句话理解

Tool Calling = AI伸向外部的手。没有它,AI只是一个困在训练数据里的聊天机器人;有了它,AI可以搜索网页、调用API、操作文件、执行代码——真正帮你干活

💡 周星驰式吐槽理解

Tool Calling就像给AI配了个秘书团。你说"帮我订个披萨",AI自己不送外卖,但它会拿起电话(调用工具)打给披萨店。你说"查一下明天航班",AI会上网搜索。你说"帮我写代码",AI会打开编辑器。AI还是那个AI,但它学会了用工具——这就是人类和动物的区别,也是聪明AI和普通AI的区别。

🧠 工作原理

Tool Calling的核心流程是一个对话循环

用户: 明天北京天气怎么样?
      ↓
AI: 我需要调用天气查询工具
   → 生成工具调用请求:
     {
       "tool": "get_weather",
       "arguments": {
         "city": "北京",
         "date": "明天"
       }
     }
      ↓
系统: 执行工具,获取结果 "晴,25°C"
      ↓
AI: 明天北京天气晴朗,气温25°C,适合出门!

关键特征:

⚖️ Tool Calling vs Function Calling

特性 Function Calling Tool Calling
范围 狭义:调用预定义函数 广义:使用任何外部能力
复杂度 单函数调用 支持多工具、链式调用
标准 OpenAI首创 行业通用术语
使用场景 结构化输出、简单任务 复杂Agent、多步骤任务

💡 简单理解:Function Calling是Tool Calling的子集。所有Function Calling都是Tool Calling,但Tool Calling还包括浏览器、搜索引擎等更广义的工具。

⚡ OpenClaw实战:Tool Calling配置

OpenClaw中的Tool Calling通过Skills系统实现。当Agent配置了Skills后,会自动在对话中触发工具调用:

# openclaw.json 配置示例
{
  "agents": {
    "defaults": {
      "skills": ["web_search", "browser"]
    }
  }
}

# 对话中自动触发
用户: 搜索一下最新的AI新闻
AI: → 调用 web_search 工具
    → 返回搜索结果
    → 整理并回复用户

OpenClaw支持并行Tool Calling

用户: 同时查北京和上海明天的天气
AI: → 并行调用 get_weather(city="北京")  
    → 并行调用 get_weather(city="上海")
    → 等待两个结果都返回
    → 综合回复

🛠️ 代码示例:定义工具

在OpenClaw中定义工具的三种方式:

方式1:Python装饰器

from openclaw import tool

@tool
def calculate(expression: str) -> str:
    """
    计算数学表达式
    
    Args:
        expression: 数学表达式,如 "2 + 2"
    """
    try:
        result = eval(expression)  # 简化示例,生产环境需安全检查
        return f"结果是: {result}"
    except:
        return "计算出错,请检查表达式"

方式2:YAML声明

# skill.yaml
name: calculator
description: 数学计算器
tools:
  - name: calculate
    description: 计算数学表达式
    parameters:
      expression:
        type: string
        description: 数学表达式

方式3:MCP协议

{
  "name": "weather",
  "tools": [
    {
      "name": "get_weather",
      "description": "获取指定城市天气",
      "inputSchema": {
        "type": "object",
        "properties": {
          "city": {"type": "string"},
          "date": {"type": "string"}
        },
        "required": ["city"]
      }
    }
  ]
}

💡 最佳实践

📚 相关教程