📚 Harness 学习计划 / 第1周 / Day03_对比ToolUse机制

Day 3 · 读 Anthropic Tool Use 文档做对比

属性
日期 2026-08-14(周五) → 实际完成 2026-08-17
周次 第1周:双轨认知框架建立
轨1 · Hermes 技术认知
时间 1 小时
状态 ✅ 已完成

📋 Checklist


📖 阅读材料

材料 链接
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_weathersearch_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 只有两种角色:userassistanttool_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:自部署,适合数据隐私 + 成本敏感场景

❓ 疑问

  1. Hermes 的 FC 准确率实际表现?(Day 7 实测验证)
  2. Tool Search Tool 在大规模工具管理中的实际效果?(后续学习)
  3. 如果后台 Agent 化,操作粒度应该多细?(Day 14 场景优先级矩阵时决定)

📤 产出


🧪 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 个工具(搜商品、查天气、查订单、查物流……)。

问题:

  1. 这个场景应该用哪种 tool_choice
  2. Claude 从 10 个工具中选哪个?为什么?
点击看答案
  1. auto。自由对话页面,用户输入不确定,让模型自己判断。
  2. 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