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,适合出门!
关键特征:
- 声明式:AI不直接执行,而是生成调用请求
- 结构化:使用JSON等格式传递参数
- 可组合:多个工具可以链式调用
- 并行化:现代模型支持同时调用多个工具
⚖️ 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"]
}
}
]
}
💡 最佳实践
- 工具描述要清晰:AI靠描述判断何时使用工具
- 参数命名要直观:city比c更易理解
- 返回结果要结构化:方便AI解析和展示
- 错误处理要完善:工具失败时给AI友好的错误信息
- 权限控制要到位:敏感操作需要确认机制