这是"从 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 从"嘴"到"手"的关键一步:

  1. 工具本质上是函数,平台给模型看的只是函数的"描述"(名称、参数、用途)。

  2. 模型只输出调用指令(JSON 文本),不真正执行。平台负责执行并回传结果。

  3. 工具让模型获得了感知实时信息和影响外部世界的能力,是所有 AI 应用的基础能力。

下一篇,我们来聊工具接入的标准化问题——MCP(模型上下文协议),看看怎么避免为每个平台重复造轮子。


本系列文章:

  1. LLM 大语言模型

  2. Token 与 Tokenizer

  3. Context 与 Context Window

  4. Prompt 提示词

  5. Tool 工具调用 ← 你在这里

  6. MCP 模型上下文协议(待发布)

  7. Agent 智能体(待发布)

  8. Agent Skill(待发布)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐