《深入理解 AI Agent》之学习笔记-DAY 8(工具分类 + 工具设计通用原则 + MCP 协议)
Day 8:工具分类 + 工具设计通用原则 + MCP 协议
目标
弄懂三件事:Agent 的工具有哪五类、设计一个好工具要遵循什么原则、MCP 协议为什么是工具生态的"插座标准"。
核心知识点
一、五类工具全景
Day 1 你学过 Agent = LLM + 上下文 + 工具,工具是 Agent 的"手脚"。今天从两个维度看这五类工具:
| 工具类型 | 调用方向 | 作用对象 | 例子 |
|---|---|---|---|
| 感知工具 | Agent 主动调用 | 获取信息 | web_search, read_file, grep_file |
| 执行工具 | Agent 主动调用 | 改变世界 | shell_exec, write_file, send_email |
| 协作工具 | Agent 主动调用 | 驱动其他 Agent/人类 | spawn_subagent, request_human_approval |
| 用户沟通工具 | Agent 主动调用 | 向用户传递信息 | reply_to_user, send_card_to_user |
| 事件触发工具 | Agent 注册、外部触发 | 驱动 Agent 开始执行 | set_timer, connect_channel |
关键区分:前四类都是 Agent 主动调用,只有第五类是外部触发——Agent 先注册"我关心什么事件",之后外部事件来时被唤醒。这是 Agent 从"被动响应"到"主动服务"的关键。
感知 vs 执行的本质区别:
- 感知工具是只读的 → 可以安全缓存、可以并行执行
- 执行工具改变世界 → 错误代价可能极高,安全约束是核心
二、工具设计的通用原则
1. 能力表达形式:专用工具 vs Skill + 通用执行器
这是最根本的设计选择:
| 专用代码工具 | Skill + 通用执行器 | |
|---|---|---|
| 形式 | 结构化函数调用 | 自然语言文档 + bash/代码解释器 |
| 优点 | 确定性高、可测试 | 少量工具覆盖大量场景,不破坏 KV Cache |
| 缺点 | 每个占数百 token,数量膨胀 | 依赖模型能力 |
三维决策框架:
| 维度 | 选专用工具 | 选 Skill + 通用执行器 |
|---|---|---|
| 参数复杂度 | 嵌套对象、多字段联合校验 | 参数简单 |
| 变更频率 | 稳定的底层操作 | 频繁变化的能力 |
| 模型能力 | 较弱模型需要结构化引导 | SOTA 模型可以用 Skill |
2. 工具粒度:整合与分离
核心标准:功能相似性 + 使用场景重叠度
- 该整合:
extract_pdf_text+extract_docx_content+extract_pptx_content→ 统一成read_document(file_type=...) - 该分离:图片 OCR 和视频关键帧提取虽然都是"内容提取",但参数形态差异大
经验法则:工具超过 100 个时,即使是最先进的模型也容易选错。
3. 通用性设计
通用工具优于专用工具,除非存在明确的安全、权限或性能理由。
code_interpreter比十几个专用计算器更省 token、更灵活- 给 Agent 一个"元能力"——一个 Python 解释器代替数十个工具
- 例外:涉及生产数据库写操作等高风险场景,专用工具能提供更精细的权限控制
4. 工具描述的艺术(最实用的部分)
工具描述的核心是让 LLM 知道**“什么时候用”**,而不只是"能做什么"。
四条要点:
| 要点 | 好的做法 | 坏的做法 |
|---|---|---|
| 说清什么时候用 | “当需要获取实时信息或查找未知事实时使用” | “搜索相关内容” |
| 说清做不到什么 | “只能基于文件名匹配,不能搜索文件内容” | (什么都不说) |
| 参数给具体例子 | phone: +8613888888888(中国) |
phone: E.164 格式 |
| 附带 1-5 个真实调用示例 | 准确率从 72% → 90% | 只有 JSON Schema |
调试黄金法则:当 Agent 频繁选错工具时,优先检查工具描述而不是怀疑模型能力。
5. 参数传递的保真性(隐蔽但致命)
两种反模式:
静默输入转换(Cursor 的弯引号 bug):
- 模型读到文件里有中文弯引号
"" - 模型把弯引号原样传入替换工具
- 工具的参数传递层静默把弯引号转成直引号
" - 与文件实际内容不匹配 → “未找到匹配”
- 模型反复尝试、反复失败,无法自行诊断
静默参数注入(某 IDE 的 git commit bug):
- 工具在执行所有
git commit时自动追加一个标记参数 - 旧版 Git 不支持该参数 → 报错
- 模型怎么改提交信息都没用
核心原则:模型感知到的世界与工具操作的世界之间,不能存在系统性偏差。
6. 工具设计的三代演进
| 代 | 特征 | 代表 |
|---|---|---|
| 第一代 | 直接 API 封装,粒度过细 | 每个 API 端点一个工具 |
| 第二代 | ACI 原则(工具对应 Agent 目标) | 粒度权衡、通用性、描述规范 |
| 第三代 | 优化调用/发现/串联 | 示例驱动调用、动态发现、代码编排 |
代码编排执行:让 LLM 一次性生成一段脚本串联多个工具调用,中间变量留在执行环境中,只有最终结果返回上下文——token 消耗可降低约两个数量级。(第 5 章会详细展开)
三、MCP 协议:工具生态的"插座标准"
问题:每个框架定义工具的方式都不同
OpenAI 的 function calling、Anthropic 的 tool use、LangChain 的 Tool 抽象——工具开发者要为不同框架重复适配。就像每个国家的电源插座标准不同,旅行者要带一堆转换插头。
MCP 的解法
Model Context Protocol(MCP) = Anthropic 2024 年底发布的开放标准,相当于给 AI 工具生态制定一个通用的"插座标准"。
客户端-服务器架构:
- MCP 服务器:暴露一组工具
- MCP 客户端(Agent 框架/IDE):通过标准协议与服务器通信
三个关键设计:
| 设计 | 说明 |
|---|---|
| 标准化工具描述 | JSON Schema 定义参数类型、约束、描述 |
| 传输层灵活 | 本地用 stdio,远程用 Streamable HTTP |
| 资源与工具分离 | 工具=可执行操作,资源=只读数据,还有提示模板 |
生态价值:一次开发,处处可用。一个 MCP 服务器可以同时被 Cursor、Claude Desktop 等使用。
MCP 面临的三个递进挑战
挑战 1:同步调用的限制
MCP 本质是请求-响应式。虽然有通知、进度、采样、征询等扩展,但都作用于保持连接的单个会话之内。跨会话、多事件源、离线唤醒需要协议之上另行构建事件驱动架构。
挑战 2:上下文开销
仅仅 5 个 MCP 服务器就可能引入约 55,000 token 的工具定义开销,在 200K 窗口里用掉近三成。
Cursor 的解法:工具描述同步到文件夹,Agent 默认只看工具名索引,需要时再查 → MCP 工具相关 token 消耗减少 46.9%。
Pi Coding Agent 更激进:核心不内置 MCP,优先用 CLI 工具 + Skills 按需加载。即使需要 MCP,也通过代理工具(~200 token)实现"搜索→查看→调用"的渐进式发现。
关键洞察:是否采用 MCP 做互操作 与 是否在会话开始时暴露所有工具定义 是两个独立决策。后端可以保留 MCP 兼容性,前端仍应以 CLI + Skills 实现渐进式披露。
挑战 3:工具能力沉淀为知识 → 第 8 章讨论
MCP 的安全风险(四类)
| 风险 | 说明 | 类比 |
|---|---|---|
| 工具描述投毒 | description 里夹带恶意指令 | 提示注入的变种 |
| 恶意/被劫持服务器 | 供应链攻击 | NPM 包被劫持 |
| 同名工具遮蔽 | 恶意服务器"遮蔽"正规工具 | DNS 劫持 |
| 凭证管理风险 | Agent 持有的 OAuth token 被滥用 | 钥匙被偷 |
缓解思路(供应链安全):
- 接入前审查工具描述(当作不可信输入)
- 锁定服务器版本,拒绝静默更新
- 最小权限凭证,设置有效期
今天的阅读任务
打开本地文件:
-
第 4 章前半部分:
ai-agent-book/book/chapter4.md- 从开头读到"MCP 与工具选择的挑战"一节结束
- 重点是:五类工具分类、通用设计原则六条、MCP 协议和三个挑战
-
实验说明(选读):
ai-agent-book/chapter4/perception-tools/README.md— 感知工具 MCPai-agent-book/chapter4/execution-tools/README.md— 执行工具 MCP
阅读策略:
- 五类工具分类表:精读,记住调用方向和作用对象
- 能力表达形式的三维决策:精读
- 粒度/通用性/描述/保真性四条原则:精读,特别是描述艺术和保真性
- 工具设计三代演进:浏览,理解方向即可
- MCP 协议:精读,理解"插座标准"的价值和三个挑战
- MCP 安全风险:浏览,记住四类风险
自测题
- 五类工具分别是什么?各自的调用方向和作用对象是什么?哪一类和其他四类不同?
- 专用工具和 Skill + 通用执行器的三维决策框架是什么?
- 工具粒度整合与分离的核心标准是什么?举一个该整合和一个该分离的例子。
- 工具描述的四条要点是什么?为什么"说清做不到什么"比"说清能做什么"更重要?
- 参数传递保真性的两种反模式是什么?为什么"模型感知的世界与工具操作的世界不能有系统性偏差"?
- 工具设计的三代演进分别是什么?第三代优化的三个方向是什么?
- MCP 协议解决什么问题?三个关键设计决策是什么?
- MCP 面临的三个递进挑战分别是什么?Cursor 是怎么解决上下文开销的?
- “是否采用 MCP” 和 “是否在会话开始时暴露所有工具定义” 是什么关系?
- MCP 的四类安全风险是什么?缓解思路有哪些?
更多推荐
所有评论(0)