引言:LLM 的「无能」与「全能」

大语言模型(LLM)拥有惊人的知识和推理能力,但它们本质上是「缸中之脑」——没有眼睛看世界,没有双手操作现实,没有记忆追溯过往。GPT-4 可以告诉你历史上的今天发生了什么,但它不知道今天你邮箱里有什么新邮件;Claude 可以写出优美的代码,但它不能真正运行这段代码并看到输出。

Tool(工具)系统就是赋予 LLM「双手」的机制。通过工具调用,LLM 从一个被动的问答机器转变为一个能主动探索、操作、验证的 AI Agent。

本文将深入剖析 AI Agent 中 Tool 系统的设计原理、实现机制和最佳实践。

为什么 LLM 需要工具

弥补能力边界

LLM 的核心局限可以归纳为四类,每种都对应一种工具类型:

局限 说明 解决方案
知识截止 训练数据有截止日期 搜索工具、RAG
无实时感知 不知道当前时间和外部状态 时间工具、API 工具
无副作用 不能操作真实世界 执行类工具(发邮件、调接口)
计算不准 复杂数学容易出错 代码执行工具

从「说」到「做」

没有工具的 LLM 只能「说」——生成文本。有了工具的 AI Agent 可以「做」——查询信息、执行操作、验证结果、迭代优化。这就是从 Chatbot 到 Agent 的质变。

工具的定义:三个要素

无论使用哪种框架或模型,一个工具的定义都包含三个核心要素:

1. 名称(Name)

工具的唯一标识符,AI 模型通过它来指定调用哪个工具。命名的黄金法则:清晰、简洁、动词开头

1
2
✅ 好命名:search_web、query_database、send_email
❌ 差命名:s、db、do_stuff

2. 描述(Description)

这是 AI 模型判断「何时使用此工具」的核心依据。描述的质量直接决定了工具选择的准确率。

一个优秀的工具描述应包含:

  • 功能说明:这个工具做什么
  • 适用场景:什么时候应该用它
  • 限制条件:它不能做什么,有什么注意事项
  • 输入输出:参数的大致含义和返回内容
1
2
3
4
5
6
7
✅ 好的描述:
"在当前代码仓库中搜索文本模式匹配的内容。适用于查找函数定义、
变量引用或特定错误信息。返回匹配的文件路径和行号。
注意:此工具仅搜索代码文件,不包括二进制文件。"

❌ 差的描述:
"搜索东西。"

3. 参数模式(Parameters Schema)

以 JSON Schema 格式定义工具接受的所有参数,包括类型、必填性、默认值和约束条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "搜索关键词"
},
"limit": {
"type": "integer",
"description": "返回结果数量上限",
"default": 10,
"minimum": 1,
"maximum": 100
}
},
"required": ["query"]
}

工具调用流程

一个完整的工具调用循环遵循以下步骤:

1
2
3
4
5
6
7
8
┌──────────────────────────────────────┐
│ 1. 用户输入 + 工具定义 → LLM │
│ 2. LLM 输出:文本 or 工具调用请求 │
│ 3. 解析工具调用请求 │
│ 4. 执行工具,获取结果 │
│ 5. 结果返回 LLM,继续推理 │
│ 6. 重复 1-5,直到 LLM 输出最终答案 │
└──────────────────────────────────────┘

关键洞察:这不是一条直线,而是一个循环。AI 可能会多次调用工具、根据中间结果调整策略、甚至在发现错误后自行纠正。

两大主流工具调用规范

OpenAI Function Calling

OpenAI 的 Function Calling 是最早被广泛采用的工具调用规范。其核心是在 API 请求中传递 tools 参数,模型在 chat.completionfinish_reasontool_calls 时返回一个包含函数名称和参数的 JSON 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
}]
)

Anthropic Tool Use

Anthropic 的 Tool Use 在设计理念上与 Function Calling 类似,但在消息结构上有重要差异:工具的调用和结果直接作为对话消息的一部分,格式更加自然。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=[{
"name": "get_weather",
"description": "获取指定城市的实时天气",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}]
)

二者的核心差异:

维度 OpenAI Anthropic
消息角色 assistant + tool assistant (content 为 tool_use block)
结果回传 tool role message user role message (tool_result block)
并行调用 原生支持 原生支持
流式处理 tool_call delta chunks content_block delta events

工具的分类体系

根据功能和实现方式,工具可以分为以下几类:

检索类工具

搜索网页、查询知识库、检索文档。特点是只读、无副作用,调用风险低。

计算类工具

执行数学计算、运行代码、数据处理。特点是结果确定性强,但需要注意资源消耗和超时控制。

API 类工具

调用第三方 API(天气、地图、支付)。特点是依赖外部服务,需要处理网络异常和速率限制。

文件系统工具

读写文件、创建目录、移动文件。特点是可能造成不可逆的副作用,需要权限控制。

浏览器工具

打开网页、点击元素、提取内容。特点是交互复杂、执行时间长,需要完善的错误恢复机制。

代码执行工具

在沙箱中运行代码。特点是灵活性最强但风险最高,必须严格隔离。

工具组合模式

单个工具的能力有限,真正强大的 Agent 需要组合多个工具:

链式调用(Chain)

工具 A 的输出作为工具 B 的输入。

1
搜索「2026年 AI 趋势」→ 打开搜索结果第一条 → 提取文章内容 → 生成摘要

扇出调用(Fan-out)

同时调用多个独立工具,合并结果。

1
同时查询:北京天气 + 上海天气 + 深圳天气 → 对比分析

条件分支(Conditional)

根据中间结果决定下一步调用哪个工具。

1
查询用户权限 → 如果是管理员:查全量数据 → 如果是普通用户:查脱敏数据

常见陷阱与应对

1. 无限循环

AI 可能陷入「调用工具 → 不满意结果 → 再调用 → 再不满意」的循环。

应对:设置最大调用轮次(如 25 轮),超过后强制总结。

2. 幻觉参数

AI 可能虚构工具参数,比如编造一个不存在的文件路径。

应对:在工具处理函数中做严格校验,发现无效参数立即返回明确错误。

3. 权限升级

AI 可能利用工具的合法功能达成不良目的,如用文件读取工具遍历系统目录。

应对:实施最小权限原则,每个工具只授予完成任务所需的最小权限。

4. 上下文溢出

工具返回的大量结果可能导致上下文窗口超限。

应对:设置返回结果大小上限,要求模型在工具描述中声明限制。

工具系统的评估方法

评估一个 AI Agent 的工具系统,核心指标包括:

  • 工具选择准确率:Agent 是否在正确的场景选择了正确的工具。
  • 参数正确率:生成的工具调用参数是否准确。
  • 任务完成率:端到端任务是否成功完成。
  • 调用效率:完成任务所需的工具调用次数。

评估框架建议:构建包含 100+ 场景的测试集,每个场景标注期望的工具选择和参数,自动化回归测试。

总结

工具系统是 AI Agent 的基石——它将 LLM 从「会说的鹦鹉」升级为「能干的助手」。设计良好的工具系统需要关注三个层次:单个工具的定义质量(名实相符、描述精准、参数合理)、工具的组合模式(链式、扇出、分支)、系统的工程化保障(安全、性能、可观测性)。

在下一篇文章中,我们将深入到 Tool Calling 的底层机制,剖析从 API 响应解析到并行调用的完整技术细节。