工具设计的艺术
用 Agent 优化 Agent 的工具
工具写得好不好,Agent 最有发言权。业界验证了一套「用 Agent 写工具 → 跑评测 → 自动优化」的工作流,让工具设计从手工打磨变成系统化迭代。
核心思路
传统方式:人类写工具 → 人类测试 → 人类改进。周期长、反馈慢、依赖开发者的直觉。
新方式:让 Claude Code 写工具 → 用评测自动度量 → 让 Claude Code 读评测结果并自动优化。Agent 成了自己工具的产品经理。
新方式:让 Claude Code 写工具 → 用评测自动度量 → 让 Claude Code 读评测结果并自动优化。Agent 成了自己工具的产品经理。
三步工作流:Prototype → Evaluate → Optimize
Prototype
Evaluate
Optimize
评测结果不满意?重复循环,直到达标
01
Prototype
用 Claude Code 快速生成工具原型。描述你想要的工具功能,让它生成 MCP 工具的代码框架。
输入:「帮我写一个 Jira 工具,能创建 issue、列出 issue、更新 issue 状态」
输出:Claude Code 生成完整的 MCP 工具代码,包括工具定义、参数校验、API 调用逻辑
输出:Claude Code 生成完整的 MCP 工具代码,包括工具定义、参数校验、API 调用逻辑
02
Evaluate
建立评测体系,系统化度量工具表现。要用数据证明好不好用,光看起来能用不算数。
评测维度:
- Agent 是否选对了工具?
- 参数填写是否正确?
- 返回结果是否被正确理解?
- 端到端任务完成率如何?
- Agent 是否选对了工具?
- 参数填写是否正确?
- 返回结果是否被正确理解?
- 端到端任务完成率如何?
03
Optimize
让 Claude Code 读评测结果,自动分析失败原因,并改进工具描述和实现。
Claude Code 分析:「Agent 在 23% 的 case 中混淆了 search 和 list,因为描述太相似」
自动修复:重写工具描述,增加区分说明和使用示例
自动修复:重写工具描述,增加区分说明和使用示例
五个工具设计原则
1
选对工具:少即是多
不要实现太多工具。如果人类开发者分不清该用
search 还是 find 还是 lookup,Agent 也分不清。原则:如果两个工具的使用场景有 50% 以上重叠,合并它们。宁可一个工具多几个参数,也不要两个容易混淆的工具。
2
命名空间:分组管理
相关工具用前缀分组,让 Agent 一眼就能看出工具之间的关系。
好的命名:
差的命名:
jira_create_issue / jira_list_issues / jira_update_status差的命名:
create_issue / list_tasks / update3
返回有意义的上下文
工具返回不要只说 "success",要返回 Agent 下一步需要的信息。
差:
好:
{"status": "success"}好:
{"status": "success", "issue_id": "PROJ-123", "url": "https://...", "assignee": "Alice"}4
Token 效率:精简返回
大量结果要做精简。返回 1000 条记录意味着消耗大量 Token,而 Agent 只需要前 10 条。
策略:总结(只返回统计信息)、截断(默认返回前 N 条)、分页(支持翻页参数)、过滤(支持条件筛选)
5
Prompt 工程化工具描述
工具描述不只是说明书,它是 Prompt 的一部分。要告诉 Agent 什么时候用这个工具,更重要的是什么时候不用。
好的描述模板:「[工具名] 用于 [具体用途]。当你需要 [场景A] 或 [场景B] 时使用此工具。不要在 [场景C] 时使用,那种情况请用 [另一个工具] 代替。示例:[具体输入输出]」
命名空间实战:让 Agent 看到工具地图
工具命名空间分组
jira_ -- 项目管理
jira_create_issue
jira_list_issues
jira_update_status
jira_add_comment
git_ -- 版本控制
git_diff
git_commit
git_log
git_create_branch
db_ -- 数据库
db_query
db_insert
db_update
db_schema
命名空间的价值:当 Agent 看到
jira_ 前缀的一组工具时,它立刻知道这些工具是相关的、操作的是同一个系统。这大幅降低了选错工具的概率。
Token 效率:返回结果的学问
全量返回
[
{"id": 1, "title": "Fix login bug",
"desc": "Users cannot login...",
"created": "2025-01-15T...",
"updated": "2025-01-16T...",
"assignee": {"name": "Alice", ...},
"labels": [...], "comments": [...]},
{"id": 2, ...},
... // 共 847 条记录
]
~52,000 Tokens -- Agent 根本处理不过来
精简返回
{
"total": 847,
"showing": 10,
"page": 1,
"results": [
{"id": 1, "title": "Fix login",
"status": "open",
"assignee": "Alice"},
{"id": 2, ...},
... // 前 10 条核心字段
],
"hint": "Use page=2 for more"
}
~800 Tokens -- 信息密度高,Agent 轻松消化
真实例子:工具描述的差距
search_issues 工具描述对比
BEFORE -- 敷衍描述
{
"name": "search_issues",
"description": "Search for issues
in the project tracker."
}
Agent 不知道搜索语法、不知道返回格式、不知道和 list_issues 有什么区别
AFTER -- 工程化描述
{
"name": "search_issues",
"description": "Full-text search
across issue titles and
descriptions. Use when the
user mentions specific
keywords. Returns max 20
results sorted by relevance.
For browsing by status/label,
use list_issues instead.
Example:
search_issues({
query: 'login timeout',
status: 'open'
})"
}
语义清晰、有使用边界、有示例、有和相似工具的区分
优化循环的关键洞察:让 Claude Code 跑完评测后,它能精确地说出「43% 的错误是因为 Agent 混淆了 search 和 list」,然后自动修改工具描述来解决这个问题。这比人类凭直觉调试快得多。
工具质量决定 Agent 质量上限。用 Prototype → Evaluate → Optimize 的循环系统化地提升工具质量。记住五原则:选对工具、命名空间、有意义的返回、Token 效率、工程化描述。让 Agent 成为自己工具的产品经理。