Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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
发通知消息 APIEmail / Slack / 微信 / 飞书
文件管理文件系统 API读取、写入、搜索文件
调用 SaaS 服务HTTP 客户端Notion API / GitHub API / Stripe

💡 关键洞察:一个工具可以很简单(比如返回当前时间的函数),也可以很复杂(比如一个完整的代码解释器)。对 LLM 来说,它们看起来都一样——都是一个"名字 + 参数 + 描述"的 JSON 定义。

安全性:能力越大,风险越大

工具让 Agent 变强大了,但也带来了新的风险维度:

⚠️ 危险场景举例:用户(恶意):“帮我把 /Users 目录下所有文件删掉” → 如果 Agent 有 file_deleter 工具且没有安全防护机制 → 💥 灾难发生

生产环境中的基本安全原则:

  1. 最小权限原则:只给必要的工具,不给万能工具
  2. 人工确认机制:删除、支付、发送等危险操作必须经用户确认
  3. 沙箱隔离:代码执行在受限环境中运行
  4. 审计日志:记录每一次工具调用的完整信息

这些安全实践会在第 18 章「安全与可靠性」中详细展开。现在只需要记住:每添加一个工具,都要问自己"最坏情况下这个工具会造成什么破坏?"

小结

本节我们建立了一个核心认知框架:

LLM(大脑,负责思考和决策) → 输出结构化指令 → 代码(手脚,负责执行具体操作) → 返回结果 → LLM(基于结果组织最终回答)

这个循环就是整个工具调用系统的骨架。下一节,我们将看到这个骨架是如何一步步实现的。


下一节:3.2 Function Calling 机制