05 - Tool 工具调用:让 AI “长出双手“
这是"从 LLM 到 Agent Skill"系列的第五篇。前面四篇我们一直在聊模型本身——它怎么运作、怎么读文字、怎么"记住"对话、怎么接收指令。但有一个根本的局限始终没有解决:模型只能输出文本,无法感知和影响外部世界。这一篇,我们来聊聊它是怎么"长出双手"的——Tool(工具调用)。
一、LLM 的天然局限
回顾第一篇的核心认知:大语言模型唯一的能力,就是输出文本。
这意味着什么?
❌ 它不知道今天天气如何(训练数据截止到某个时间点)
❌ 它不知道此时此刻的股价
❌ 它不能帮你发一封邮件
❌ 它不能在你的日历里创建一个日程
❌ 它不能读取你本地的文件
你问它"今天北京天气怎么样",如果只靠模型本身,它要么回答不上来,要么瞎编。
这就是 LLM 的核心局限:封闭的知识边界。
二、Tool(工具):给模型装"假肢"
2.1 工具的本质是什么?
Tool(工具)本质上就是一个函数(Function)。
def get_weather(city: str, date: str) -> str: # 调用天气 API,返回天气信息 return "北京今天晴,22°C"
这个函数接收城市名和日期,返回天气信息。模型不认识天气,但它知道:当用户问天气时,有一个叫get_weather的工具能用。
2.2 工具的描述(Function Definition)
给模型看的不是代码,而是工具的描述:
{ "name": "get_weather", "description": "查询指定城市的天气信息", "parameters": { "city": "城市名称,如'北京'", "date": "日期,如'2025-05-24'" } }这个描述本身会被放入 Context(作为 System Prompt 或工具列表的一部分)。模型读取后就知道:当我遇到天气相关的问题,可以"调用"这个工具。
三、工具调用的完整流程(四个角色)
这是本文最核心的一张流程图:
用户:"今天北京天气怎么样?" │ ▼ ┌──────────────────────────────────────┐ │ 平台(Platform) │ │ │ │ 将「用户问题 + 可用工具列表」打包 │ │ 发给大模型 │ └──────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────┐ │ 大模型(LLM) │ │ │ │ 分析问题 → 决定调用 get_weather │ │ 输出:【调用指令】 │ │ { │ │ "tool": "get_weather", │ │ "params": { │ │ "city": "北京", │ │ "date": "2025-05-24" │ │ } │ │ } │ └──────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────┐ │ 平台(Platform) │ │ │ │ 接收指令 → 实际执行函数 → 获取结果 │ │ "北京今天晴,22°C,北风3级" │ └──────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────┐ │ 大模型(LLM) │ │ │ │ 接收工具返回的数据 → 整合生成回答 │ │ "北京今天天气晴朗,气温22°C, │ │ 吹北风3级,适合出门。" │ └──────────────────────────────────────┘ │ ▼ 用户看到回答四、四个角色的职责
| 角色 | 做什么 |
|---|---|
| 用户(User) | 提出问题或任务 |
| 平台(Platform) | 传话筒 + 协调者 + 执行器。管理 Context,把工具列表告诉模型,真正执行函数,回传结果 |
| 大模型(LLM) | 分析问题,决策调用哪个工具、填什么参数。只输出"调用指令"文本 |
| 工具(Tool) | 被平台调用,执行实际逻辑(调 API、读文件等),返回结果 |
五、最重要的认知:模型不执行工具
大模型只是输出了一段文本——一个包含"工具名"和"参数值"的 JSON 字符串。
它不执行任何东西。
真正去调天气 API 的,是外部的"平台"。模型说"帮我查一下北京天气"→ 平台听到后去查 → 把结果贴回来 → 模型看着结果说"哦,北京晴天"。
就像一个人被锁在房间里,面前只有一个打字机。他打字说"请帮我看看窗外有没有下雨"。外面的人看了纸条,去窗口看了看,塞回来另一张纸条:"没下雨,晴天。"房间里的人于是打字回复:"外面是晴天,可以出门。"
模型就是那个锁在房间里的人。他从来没有真正看见过窗外。
六、工具调用的实际应用场景
6.1 实时信息获取
天气查询
股票价格
新闻搜索
航班状态
6.2 外部系统操作
发送邮件
创建日历事件
操作数据库(增删改查)
调用企业内部 API
6.3 本地环境交互
读写文件
执行 Shell 命令
操作浏览器
控制本地软件
在 Claude Code 这个产品里,工具就是代码编辑、文件读写、命令执行等能力——模型"说"要改哪一行,平台帮它改。
七、工具调用的进阶形式
7.1 多工具并行调用
模型可以一次性输出多个工具调用指令,没有依赖关系的工具可以并行执行:
[ {"tool": "get_weather", "params": {"city": "北京"}}, {"tool": "get_weather", "params": {"city": "上海"}} ]7.2 工具调用链
一个工具的结果可以作为另一个工具的输入:
用户:"帮我查一下北京天气,要是下雨就帮我找最近的雨伞店" → 调 get_weather("北京") → "下雨" → 调 search_nearby("雨伞店", "北京") → "XX路12号" → 回复用户这其实就是 Agent 的雏形了——我们第七篇会详细讲。
八、总结
Tool 是 LLM 从"嘴"到"手"的关键一步:
工具本质上是函数,平台给模型看的只是函数的"描述"(名称、参数、用途)。
模型只输出调用指令(JSON 文本),不真正执行。平台负责执行并回传结果。
工具让模型获得了感知实时信息和影响外部世界的能力,是所有 AI 应用的基础能力。
下一篇,我们来聊工具接入的标准化问题——MCP(模型上下文协议),看看怎么避免为每个平台重复造轮子。
本系列文章:
LLM 大语言模型
Token 与 Tokenizer
Context 与 Context Window
Prompt 提示词
Tool 工具调用← 你在这里
MCP 模型上下文协议(待发布)
Agent 智能体(待发布)
Agent Skill(待发布)
