13|Tool Calling:让模型“执行”而不只是“回答”
本篇目标:这是 AI 从“聊天机器人”进化为“贾维斯”的关键一步。学会如何让 AI 操控你的电脑、读写文件、甚至帮你在网上买票。
一、AI 的手脚:从“嘴炮”到“行动派”
在前面的章节里,我们认识的 AI 都是“嘴炮王者”:
- 问:“今天北京天气怎么样?”
- AI:“对不起,我不知道。我的训练数据只到 2024 年。”
因为它没有手脚,没法去互联网上查。
但是,现在的 AI(如 GPT-4o, Claude 3.5, DeepSeek-V3)都有了一个超能力:Tool Calling(工具调用),也叫 Function Calling。
核心原理
- 你(开发者) 告诉 AI:“我手里有一个工具叫
get_weather(city),能查天气。” - 用户 问 AI:“今天北京天气咋样?”
- AI 思考:“用户想查天气 -> 我需要用
get_weather工具 -> 参数是Beijing。” - AI 输出一个特殊的 JSON:
{"tool": "get_weather", "args": {"city": "Beijing"}}。 - 你(程序) 拿到这个 JSON,真的去运行这个函数,拿到结果“25度,晴”。
- 你 把结果喂回给 AI。
- AI 最终回复用户:“今天北京天气不错,25度,是个大晴天。”
注意:AI 不会自己去运行代码(为了安全),它只是告诉你要运行什么。真正的执行权在你手里。
二、如何定义一个工具?(给 AI 发说明书)
要让 AI 用工具,你得先给它写一份“说明书”。这份说明书通常是用 JSON Schema 写的。
示例:定义一个“计算器”工具
{
"name": "calculator",
"description": "用于执行数学计算。当用户询问数学问题时使用。",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "要计算的数学表达式,例如 '2 + 2' 或 '100 * 0.5'"
}
},
"required": ["expression"]
}
}
关键点:
- name:工具的名字(AI 靠这个引用)。
- description:最重要! 告诉 AI 什么时候该用这个工具。如果你写得不清不楚,AI 就不会用。
- parameters:告诉 AI 需要提取什么参数。
三、实战流程:一次完整的“工具调用”循环
让我们看看在代码里是怎么跑通的(以 OpenAI 格式为例):
第一步:用户提问
User: “帮我算算 12345 乘以 9876 是多少?”
第二步:AI 决定调用工具
AI 收到问题和工具定义后,不直接回答,而是返回:
Assistant (Tool Call):
name: calculatorarguments: {"expression": "12345 * 9876"}
第三步:程序执行工具
你的代码捕获到这个 Tool Call,在本地运行:
result = 12345 * 9876 # 结果是 121919220
第四步:把结果喂回给 AI
你构造一条新消息发给 AI:
Tool Message:
tool_call_id: call_abc123content: "121919220"
第五步:AI 生成最终回答
AI 看到结果后,终于可以回复用户了:
Assistant: “12345 乘以 9876 的结果是 121,919,220。”
四、进阶:多步调用与 Agent
如果任务很复杂,AI 可能会连续调用多次工具。
场景:用户问“把这个文件夹里最大的图片发给我。”
AI 的思考链(Chain of Thought):
- 调用工具 A:
list_files(dir=".")-> 拿到文件列表。 - 调用工具 B:
get_file_size(file="a.jpg")… 循环查大小。 - 比较大小:发现
c.png最大。 - 调用工具 C:
email_file(file="c.png")。 - 回复用户:“发送成功。”
这就是 Agent(智能体) 的雏形——自主规划、连续执行。
五、本篇产出:工具定义模板
以后你想给 AI 加新能力(比如查库存、发邮件),套用这个模板:
tool_definition = {
"type": "function",
"function": {
"name": "[工具英文名,如 stock_checker]",
"description": "[详细描述:这个工具是干嘛的?什么情况下应该用它?]",
"parameters": {
"type": "object",
"properties": {
"[参数1]": {
"type": "string/integer/boolean",
"description": "[参数说明:例如 '股票代码,如 AAPL']"
},
"[参数2]": {
"type": "string",
"description": "[可选参数说明]",
"enum": ["option1", "option2"] # 如果只能选固定的值
}
},
"required": ["[参数1]"] # 必填参数列表
}
}
}
练习题:为什么 AI 不调用我的工具?
场景:你定义了一个工具 search_database,描述是 Search DB。用户问“查一下张三的订单”,AI 却直接回“我查不到”。
原因分析:
- 描述太烂:
Search DB太简略,AI 不知道这个工具能查“订单”。 - 修改建议:把描述改成 “用于查询用户的历史订单信息。当用户询问买过什么、订单状态时使用此工具。”
记住:AI 是很聪明的,但也是很直男的。你必须把工具的用途说得明明白白。
下一步:我们已经让 AI 学会了用计算器和查天气。但在真实世界里,我们处理最多的其实是文档和图片。下一章(卷 1 最终章)我们将学习多模态(Multimodal)——让 AI 长出眼睛,看懂你的 PDF 和截图。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)