3.1 为什么 Agent 需要工具?
🎯 本节目标:用 5 分钟建立对"工具价值"的直觉理解,不需要写任何代码。
一个类比:博学的学者 vs. 行动的探险家
把 LLM 想象成一个在巨型图书馆里读完了所有书的学者。它知识渊博,但有三个致命限制:
| 限制 | 类比 | 后果 |
|---|---|---|
| 知识有截止日期 | 书是 2024 年印的 | 问它今天的股价、天气、新闻 → 答案可能已经过时 |
| 无法离开图书馆 | 它不能走出去 | 不能上网搜索、不能查数据库、不能操作文件 |
| 只会用嘴说 | 只能口头回答 | 不能发邮件、不能下单、不能执行任何实际操作 |
工具(Tool)就是给这位学者配上的手机和手脚。
- 手机 → 能打电话查询实时信息(搜索引擎 API)
- 手脚 → 能出门办事(文件操作、数据库查询、发送邮件)
学者本身不需要变聪明——它只需要学会一件事:"什么时候该拿出手机,该打给谁"。
这就是 Function Calling 的全部哲学。
LLM 的三个"先天残疾"
1. 知识截止(Knowledge Cutoff)
LLM 的所有知识都来自训练数据。训练结束后世界继续运转:
你:今天苹果股价是多少?
LLM:根据我的训练数据(截止到 2024 年 X 月),苹果股价大约在 170-190 美元……
但今天可能是 230 美元,也可能是 150 美元。
解决方案:接入实时数据源(股票 API、天气 API、搜索引擎)。
2. 无法行动(Cannot Act)
LLM 只能输出文字。它不能直接完成这些动作:
- 发送邮件:模型可以写邮件内容,但不能自己把邮件发出去。
- 创建文件:模型可以生成文件内容,但需要文件系统工具真正落盘。
- 执行 SQL 查询:模型可以决定查什么表、用什么条件,但查询动作必须由数据库工具执行。
- 调用第三方 API:模型可以组织参数,但不能凭空访问外部服务。
它真正擅长的是:告诉系统“应该调用哪个 API、传什么参数”。这正是 Function Calling 做的事。模型输出的是指令,不是直接行动。
3. 计算/推理不精确
LLM 是语言模型,不是计算器。问它 12345 × 67890,它可能碰巧答对;但换成更长、更不常见的数字时,就很容易自信地给出错误结果。
例如:
| 问题 | 模型可能的表现 | 为什么危险 |
|---|---|---|
12345 × 67890 | 可能答对,也可能只是“看起来会算” | 用户容易误以为模型具备稳定计算能力 |
847392 × 928471 | 可能给出近似但错误的数字 | 财务、科学计算中小误差也不可接受 |
大数乘法只是冰山一角。涉及精度要求的任何场景(财务计算、科学计算、数据分析)都需要真正的计算器。
工具能做什么?一张全景图
工具的本质是 "将外部能力转化为 LLM 可以调用的函数"。常见的能力映射:
| Agent 想做的事 | 对应的工具类型 | 真实例子 |
|---|---|---|
| 查实时信息 | 搜索引擎 | Tavily / DuckDuckGo / Google Search |
| 做精确计算 | 代码执行器 | Python eval / Wolfram Alpha |
| 操作数据库 | 数据库驱动 | SQL 查询工具 |
| 访问网页 | 浏览器自动化 | Playwright / Selenium |
| 发通知 | 消息 API | Email / Slack / 微信 / 飞书 |
| 文件管理 | 文件系统 API | 读取、写入、搜索文件 |
| 调用 SaaS 服务 | HTTP 客户端 | Notion API / GitHub API / Stripe |
💡 关键洞察:一个工具可以很简单(比如返回当前时间的函数),也可以很复杂(比如一个完整的代码解释器)。对 LLM 来说,它们看起来都一样——都是一个"名字 + 参数 + 描述"的 JSON 定义。
安全性:能力越大,风险越大
工具让 Agent 变强大了,但也带来了新的风险维度:
⚠️ 危险场景举例:用户(恶意):“帮我把 /Users 目录下所有文件删掉” → 如果 Agent 有 file_deleter 工具且没有安全防护机制 → 💥 灾难发生
生产环境中的基本安全原则:
- 最小权限原则:只给必要的工具,不给万能工具
- 人工确认机制:删除、支付、发送等危险操作必须经用户确认
- 沙箱隔离:代码执行在受限环境中运行
- 审计日志:记录每一次工具调用的完整信息
这些安全实践会在第 18 章「安全与可靠性」中详细展开。现在只需要记住:每添加一个工具,都要问自己"最坏情况下这个工具会造成什么破坏?"
小结
本节我们建立了一个核心认知框架:
LLM(大脑,负责思考和决策) → 输出结构化指令 → 代码(手脚,负责执行具体操作) → 返回结果 → LLM(基于结果组织最终回答)
这个循环就是整个工具调用系统的骨架。下一节,我们将看到这个骨架是如何一步步实现的。