Day 3 · 读 Anthropic Tool Use 文档做对比
| 属性 | 值 |
|---|---|
| 日期 | 2026-08-14(周五) → 实际完成 2026-08-17 |
| 周次 | 第1周:双轨认知框架建立 |
| 轨 | 轨1 · Hermes 技术认知 |
| 时间 | 1 小时 |
| 状态 | ✅ 已完成 |
📋 Checklist
- 阅读 Anthropic Tool Use 文档全文
- 理解 Claude 的 Tool Use 协议:tool_use 块 + tool_result 块 + stop_reason
- 对比 Day 1 的 Hermes
<tool_call>格式,列出差异 - 思考:Claude Code 的 Skills 本质上是 Tool Use 的什么形式?
- 完成「Hermes vs Claude Tool Use 对比表」
📖 阅读材料
| 材料 | 链接 |
|---|---|
| Anthropic Tool Use 文档 | https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview |
| 复习:Hermes-3 Model Card | https://huggingface.co/NousResearch/Hermes-3-Llama-3.1-8B |
✍️ 学习笔记 · 四层讲解
第 1 层:什么是 Tool Use?
定义: Tool Use 是让模型调用外部函数的能力。模型自己决定是否要调工具、调哪个、传什么参数。
Claude 的 Tool Use 是 Messages API 层原生支持的协议——不需要手动拼 XML 标签,API 直接返回结构化的 JSON block。
三种工具类型:
| 类型 | 谁写 schema | 谁执行 | 例子 |
|---|---|---|---|
| 自定义工具 | 你 | 你的代码 | get_weather、search_product |
| Anthropic 预置工具 | Anthropic | 你的代码 | Bash、Text Editor、Memory |
| Server 工具 | Anthropic | Anthropic 服务器 | Web Search、Web Fetch、Code Execution |
Server 工具放在 Anthropic 服务器上,你不需要写 handler,直接拿到结果。
Anthropic 预置工具是通用工具(Bash/Text Editor 等),假设你的环境支持,不支持则返回is_error: true。
第 2 层:Tool Use 完整轮转(核心)
第 1 步:系统发请求(携带 tools 清单 + user 消息)
↓
第 2 步:Claude 判断是否需要调工具
├── 需要 → 返回 tool_use block + stop_reason: "tool_use"
└── 不需要 → 返回文本回复 + stop_reason: "end_turn"
↓
第 3 步:系统执行工具,拿到真实数据
↓
第 4 步:系统用 tool_result block 回传结果(role: "user")
↓
第 5 步:Claude 读取结果,再判断
├── 信息够了 → 生成最终文本回复
└── 不够 → 再次返回 tool_use(循环)
关键机制:stop_reason
每次 Claude 响应都携带 stop_reason,告诉系统下一步该做什么:
stop_reason |
含义 | 系统行为 |
|---|---|---|
"end_turn" |
对话完成,不需要调工具 | 展示给用户,本轮结束 |
"tool_use" |
需要调工具,等待系统回传结果 | 执行工具 → 回传 tool_result |
"max_tokens" |
输出被截断 | 截断处理 |
为什么 tool_result 的 role 是 "user"?
Claude Messages API 只有两种角色:user 和 assistant。tool_result 是「外部世界的信息」输入,所以用 user 角色。逻辑上:你执行工具后,把结果「作为用户的消息」发给 Claude。
第 3 层:Claude Tool Use 高级特性
3.1 并行工具调用(Parallel Tool Use)
Claude 可一次返回多个 tool_use,代码可并行执行后一次性回传多个 tool_result。
使用条件: 两个工具没有依赖关系。
3.2 严格模式(Strict Tool Use)
在工具定义中设置 strict: true,确保 Claude 输出参数 100% 符合 schema。
| 是否加 strict | 适用场景 |
|---|---|
| ✅ 加 | 调数据库接口、输出给前端(参数必须精确) |
| ❌ 不加 | 分析类任务、探索性输出(需要灵活性) |
为什么不是每个工具都加? 因为 strict 限制了模型的灵活性——模型可能想返回额外信息辅助判断,但被 strict 拦截了。
3.3 tool_choice 控制策略
每次请求都可以设置,不设置默认是 auto。 控制的是「选工具」这一步,不是「提取参数」——参数提取永远需要模型语义分析。
| 策略 | 写法 | 效果 | 适用场景 |
|---|---|---|---|
| auto(默认) | {"type": "auto"} |
模型自己决定是否调工具 | 自由对话页面 |
| any | {"type": "any"} |
每次必须调至少一个工具 | 数据查询 Agent |
| tool(指定) | {"type": "tool", "name": "xxx"} |
强制调指定工具 | 专项操作页面(如审核页) |
| none | {"type": "none"} |
禁止调工具 | 纯展示/纯对话场景 |
PM 的使用逻辑: 按页面/场景设置规则,不是猜用户输入什么。
3.4 参数缺失行为
| 模型 | 行为 |
|---|---|
| Claude Opus 5 | 大概率主动问用户要缺失参数 |
| Claude Sonnet 5 | 可能问,也可能自己猜 |
| Hermes 8B | 无明确保证,预期更弱 |
产品设计启示: 涉及重要操作时,前端做好参数校验,不要依赖模型主动问。
3.5 定价
| 成本项 | Claude | Hermes |
|---|---|---|
| Tool 定义 | 作为输入 token 计费(schema 越长越贵) | 无 token 计费 |
| 额外 system prompt | 每个模型固定额外 token(Opus 5: 286-406 tokens) | 无 |
| Server 工具 | 额外按次计费 | 无 |
| 模型调用 | 按 token 计费 | 按服务器成本 |
第 4 层:思考题——Claude Code Skills 是什么?
Skills 本质上是「半自动 Tool Use」:
| 标准 Tool Use | Skills | |
|---|---|---|
| 谁触发 | 模型自主判断 | 人手动触发(/skill-name) |
| 参数来源 | 模型从用户输入提取 | 人输入参数 |
Skills = 人决定调哪个工具,模型负责执行。标准 Tool Use = 模型自己决定调哪个。
📊 Hermes vs Claude Tool Use 对比表
| 维度 | Hermes-3 | Claude (Sonnet/Opus) | 结论 |
|---|---|---|---|
| 函数调用格式 | XML 标签 <tool_call> 包裹 JSON |
API 原生 JSON block(type: "tool_use") |
Claude 更标准化,不需要手动拼标签 |
| 角色定义 | ChatML 四角色(system/user/assistant/tool) | Messages API 两角色(user/assistant),tool_result 用 user 角色 | 角色体系不同,但逻辑一一对应 |
| 停止判断 | 无内置机制,需正则解析文本中的 <tool_call> |
stop_reason 字段(API 保证准确) |
Claude 更可靠,不会误判 |
| 多轮对话 | 手动维护 ChatML 格式上下文 | 自动带上历史消息即可 | Claude 开发成本更低 |
| 并行调用 | 不明确支持 | 原生支持一次返回多个 tool_use | Claude 性能更好 |
| 参数严格校验 | 无 | strict: true 保证参数 100% 符合 schema |
Claude 更适合生产环境 |
| 工具选择控制 | 无 | tool_choice(auto/any/tool/none) |
Claude 可控性更强 |
| 中文能力 | 未经专门训练,8B 是短板 | 官方支持中文 | Claude 对多语言站点更友好 |
| 部署方式 | 开源自部署(Ollama/服务器) | 云端 API(Anthropic 服务器) | Hermes 适合数据隐私场景 |
| 成本 | 无 token 费,只有服务器成本 | 按 token 计费,Server 工具额外收费 | Hermes 大规模使用成本更低 |
| 集成难度 | 需自己写解析器、路由、上下文管理 | SDK 开箱即用 + Tool Runner 自动循环 | Claude 集成更快 |
🧭 速查卡(一页纸)
| 我想做的事 | 用哪个参数 | 怎么设 |
|---|---|---|
| 让模型自己判断要不要调工具 | tool_choice |
"auto"(默认) |
| 强制模型必须调工具 | tool_choice |
"any" |
| 指定模型只能用某个工具 | tool_choice |
{"type": "tool", "name": "xxx"} |
| 禁止模型调工具 | tool_choice |
"none" |
| 工具参数必须精确 | strict |
true(在工具定义里) |
| 允许模型灵活输出 | strict |
false(默认) |
| 判断 Claude 是否要调工具 | 看 stop_reason |
"tool_use" = 要调,"end_turn" = 不调 |
| 判断是否并行执行 | 看 content 里几个 tool_use | 多个 = 可并行,无依赖关系时可同时执行 |
💡 关键认知
1. Tool Use 就 3 个部分
① tools 定义:告诉 Claude 有什么能力
② tool_choice:控制这轮要不要调工具
③ tool_use / tool_result:调用的来回
2. tool_choice 按页面/场景设置,不是猜用户输入
自由对话页面 → auto
专项操作页面 → tool: "xxx"
数据查询场景 → any
纯展示场景 → none
3. 每个后台操作不一定需要独立 Tool
细粒度(每个操作一个 Tool)→ 精确但定义多
粗粒度(同类操作合并) → 简洁但参数复杂
选择标准:Agent 需要自主决策的程度
4. Claude 的 Tool Use 是行业标杆,Hermes 是开源替代
Claude:开箱即用,适合快速验证
Hermes:自部署,适合数据隐私 + 成本敏感场景
❓ 疑问
- Hermes 的 FC 准确率实际表现?(Day 7 实测验证)
- Tool Search Tool 在大规模工具管理中的实际效果?(后续学习)
- 如果后台 Agent 化,操作粒度应该多细?(Day 14 场景优先级矩阵时决定)
📤 产出
- 对比表 → 归档到 产出归档/对比笔记.md
- 笔记已写入本文件
🧪 Day 3 自测题
每题先自己回答,再看答案。
第 1 题:判断 stop_reason
Claude 返回了以下响应,系统应该做什么?
{
"stop_reason": "tool_use",
"content": [
{"type": "tool_use", "name": "search_product", "input": {"query": "兔笼"}}
]
}
A. 把「兔笼」展示给用户
B. 执行 search_product 工具,把结果回传给 Claude
C. 忽略这个响应,直接发下一个请求
点击看答案
B。 stop_reason: "tool_use" 表示 Claude 在等系统执行工具。不能展示给用户,必须先执行工具、回传结果。
第 2 题:判断对错
「tool_choice 设为 tool: "updatePostStatus" 后,模型不需要分析用户输入,直接返回固定参数。」
点击看答案
错。 tool_choice 只控制「选哪个工具」,参数提取(postId 是多少、status 是 approved 还是 rejected)仍然需要模型分析用户语义来提取。
第 3 题:场景判断
后台做了一个「帖子审核」页面,运营只能在这里点「通过」或「驳回」。这个页面应该用哪种 tool_choice?
A. auto
B. any
C. tool: "updatePostStatus"
D. none
点击看答案
C。 专项操作页面,用户行为确定(只做审核),用 tool: "updatePostStatus" 指定工具即可——不需要让模型在多个工具之间选择。
第 4 题:对比题
| 环节 | Claude | Hermes |
|---|---|---|
| 判断是否调了工具 | 看 ____ 字段 |
解析文本,找 ____ 标签 |
请在 ____ 处填入正确内容。
点击看答案
| 环节 | Claude | Hermes |
|---|---|---|
| 判断是否调了工具 | 看 stop_reason 字段 |
解析文本,找 <tool_call> 标签 |
Claude 用 API 原生字段,Hermes 需要手动解析文本。
第 5 题:场景应用题
用户在一个自由对话的 AI 购物助手页面中说「帮我推荐一个 A7III 兔笼」。系统定义了 10 个工具(搜商品、查天气、查订单、查物流……)。
问题:
- 这个场景应该用哪种
tool_choice? - Claude 从 10 个工具中选哪个?为什么?
点击看答案
auto。自由对话页面,用户输入不确定,让模型自己判断。search_product。因为工具描述匹配(「搜索商品」),且用户输入包含「兔笼」这个商品关键词。
模型做了两件事:① 10 选 1 决定用哪个工具 ② 提取参数 query="兔笼"。
第 6 题:概念判断题
Claude Code 的 /prd 命令,本质上是 Tool Use 的什么形式?
A. 标准 Tool Use(模型自主判断调用)
B. 半自动 Tool Use(人手动触发,模型执行)
C. 和 Tool Use 无关
点击看答案
B。 /prd 是人手动触发的(你输入 /prd),模型负责执行(加载模板、生成 PRD)。这是「半自动」形态——人决定调哪个工具,模型负责执行。
⏭️ 完成后:更新 当前进度 为 Day 4