Clipping 微信公众号

Anthropic 给 Claude Code 设计工具的最佳实践 2

by 方圆yo 原文 ↗
Created: 2026-04-24

公众号名称:方圆AI分享

作者名称:方圆yo

发布时间:2026-04-23 20:26

Anthropic 官方博客发了一篇文章 Seeing like an agent: how we design tools in Claude Code(像 Agent 一样思考,如何设计 Claude Code 的工具)[1],作者 Thariq Shihipar 是 Anthropic 的技术人员,专门负责 Claude Code 的开发。

文章详细讲述了他们在构建 Claude Code 过程中,如何设计和迭代 AI Agent 工具的实践经验,包括走过的弯路和最终的解法,对于任何在做 Agent 开发的人来说都有很强的参考价值。

​

工具设计的核心思维:学会像 Agent 一样思考

构建一个 Agent harness,最难的部分之一就是设计它的工具。Claude 完全通过 tool calling 来执行操作,但工具可以有很多种构建方式,比如 bash、skills、代码执行等等。

那到底应该怎么设计工具?是给 Agent 一个通用的工具(比如 bash),还是给它五十个专用工具,每个对应一个场景?

文章里用了一个很形象的类比:想象你面前有一道很难的数学题,你希望用什么工具来解决?这取决于你自身的能力。

纸和笔是最基本的,但你只能做手算。计算器更好,但你得知道怎么用那些高级功能。最快最强的选择是电脑,但前提是你会写代码来执行计算。

这个类比揭示了工具设计的一个核心原则:你需要给 Agent 配备与它能力匹配的工具。

但你怎么知道它的能力边界在哪里?答案是持续观察、阅读它的输出、反复实验。用 Anthropic 的话说,就是学会「像 Agent 一样看世界」。

如果你正在构建自己的 Agent,你会面对和 Anthropic 同样的问题:什么时候该加一个工具?什么时候该移除一个工具?怎么判断两者的边界?

​

AskUserQuestion 工具的三次迭代

为了提升 Claude 向用户提问的能力(也就是所谓的 elicitation),Anthropic 团队经历了三次尝试,过程很有意思。

第一次尝试是在已有的 ExitPlanTool 上做修改,给它加一个参数,让它在输出计划的同时带上一组问题。

这是最省事的做法,但结果发现 Claude 被搞混了。因为你同时要求它做两件事:输出计划,以及对计划提出问题。

如果用户的回答和计划本身有冲突怎么办?Claude 是不是需要调用两次 ExitPlanTool?这条路很快就被否定了。

第二次尝试是修改输出格式。他们让 Claude 按照一种特殊的 Markdown 格式来输出问题,比如用带括号的备选项列出问题,然后在前端解析并渲染成 UI。

Claude 大多数时候能按照这个格式输出,但做不到稳定。它会在后面追加多余的句子,丢掉选项,或者干脆放弃整个格式。这条路也走不通。

第三次尝试终于成功了,他们创建了一个独立的 AskUserQuestion 工具。

Claude 可以在任何时候调用这个工具,但在 plan mode 下会被特别引导去调用它。当工具被触发时,前端会弹出一个模态框展示问题,并阻塞 Agent 的循环直到用户回答。

这个方案之所以成功,有几个关键点。首先,它让 Claude 产出结构化输出 变得可靠了。其次,它确保 Claude 会给用户提供多个选项。

再者,用户可以在不同场景下灵活组合使用这个工具,比如在 Agent SDK 中调用,或者在 skills 里引用。

但最重要的一点是,Claude 看起来很愿意调用这个工具,而且输出效果很好。毕竟,哪怕设计再精良的工具,如果模型不理解怎么调用它,一切也是白搭。

文章也坦诚地说,这不一定是 elicitation 的最终形态。随着 Claude 能力的增强,服务于它的工具也必须跟着演进。

​

从 TodoWrite 到 Task:工具必须跟着模型能力迭代

这一段讲的是另一个很有代表性的工具演进故事。

Claude Code 刚上线时,团队意识到模型需要一个待办事项列表来保持工作节奏。待办可以在任务开始时写好,然后边做边勾选。

为此他们设计了 TodoWrite 工具,让 Claude 可以创建和更新待办,同时展示给用户看。

但即便有了待办列表,Claude 还是经常忘记自己该做什么。为了适应这个问题,他们每隔 5 轮对话就插入一个系统提醒,提醒 Claude 当前的目标是什么。

随着模型越来越强,待办列表反而变成了一种限制。系统提醒让 Claude 觉得它必须严格遵循现有列表,而不是在发现新情况时灵活调整方向。

到了 Opus 4.5 这一代模型,子 Agent 的使用能力有了大幅提升,但多个子 Agent 之间怎么共享和协调一个待办列表?这又成了新的问题。

于是他们用 Task 工具 替换了 TodoWrite。

两者的区别在于,待办列表的核心是让模型不跑偏,而 Task 的核心是让多个 Agent 之间能够通信和协作。Task 可以包含依赖关系,可以在子 Agent 之间共享更新,模型还可以修改和删除任务。

这个案例揭示了一个重要的规律:随着模型能力的提升,曾经必要的工具可能会变成瓶颈。

持续重新审视之前的假设非常重要。这也是为什么 Anthropic 建议只支持少数几个能力水平相近的模型,这样工具设计的复杂度才可控。

​

搜索接口的演进:从 RAG 到让 Agent 自己找上下文

Anthropic 认为,他们构建的最重要的工具是那些让 Claude 能自己寻找上下文的工具。

Claude Code 刚在内部发布时,用的是 RAG 方案。一个向量数据库会预先索引整个代码库,在每次回复之前把相关代码片段检索出来交给 Claude。

RAG 确实强大且快速,但它需要索引和配置,而且在不同环境下容易出问题。最关键的是,这种方式下 Claude 是被动地接收上下文,而不是主动地寻找上下文。

后来他们换了一种思路:既然 Claude 可以在网上搜索,为什么不能让它搜索代码库呢?于是他们给 Claude 一个 Grep 工具,让它自己搜索文件、构建上下文。

随着 Claude 越来越聪明,只要给它合适的工具,它构建上下文的能力也越来越强。

当 Anthropic 推出 Agent Skills 之后,他们把这种理念正式化了,叫做 progressive disclosure(渐进式发现)。Agent 可以通过探索来逐步发现相关的上下文。

具体来说,Claude 可以读取 skill 文件,而这些 skill 文件又可以引用其他文件,模型可以递归地去读取。

实际上,skill 的一个常见用法就是给 Claude 增加更多的搜索能力,比如告诉它怎么使用某个 API 或查询某个数据库。

经过一年的演进,Claude 从基本不会自己构建上下文,发展到可以进行多层嵌套搜索,在好几层文件之间穿梭来找到它需要的精确上下文。

​

Progressive Disclosure:不加工具也能扩展能力

Claude Code 目前有大约 20 个工具,团队经常审视是否真的每个都需要。添加新工具的门槛很高,因为每多一个工具就意味着模型多一个需要考虑的选项。

一个具体的例子是,Claude 对 Claude Code 自身的使用方法了解不够。如果你问它怎么添加 MCP,或者某个 slash command 是干什么的,它答不上来。

一种方案是把所有这些信息都塞进 system prompt 里。但考虑到用户很少问这类问题,这样做会增加上下文噪音,干扰 Claude Code 的核心工作:写代码。

他们尝试了 progressive disclosure 的方案:给 Claude 一个文档链接,让它在需要时自己去加载和搜索。

这个方法有效,但有个问题。Claude 会把大段大段的文档拉进上下文里,只为了回答一个用户本来一句话就能得到答案的问题。

最终的解决方案是构建了一个叫 Claude Code Guide 的子 Agent。

当用户问关于 Claude Code 本身的问题时,主 Agent 会调用这个子 Agent。子 Agent 在自己独立的上下文中执行文档搜索,按照详细的指令去检索和提取信息,最后只把答案返回给主 Agent。这样主 Agent 的上下文就保持了干净。

虽然这个方案还不完美(Claude 在被问到如何配置自身时偶尔还是会困惑),但他们成功地扩展了 Claude 的行动空间,而没有增加新的工具。这就是 progressive disclosure 的价值所在。

​

工具设计是一门手艺

文章最后总结说,为模型设计工具,与其说是科学,不如说更接近手艺。它高度依赖于你使用的模型、Agent 的目标,以及它运行的环境。

Anthropic 给出的建议很简洁:频繁实验,认真阅读输出,勇于尝试新东西。最重要的是,试着用 Agent 的眼光来看问题。

从这篇文章里可以看到几个值得反复琢磨的点。

第一,工具设计要匹配模型能力。给太强的工具模型不会用,给太弱的工具模型会受限。

第二,工具需要持续迭代。模型能力在进步,以前好用的工具可能变成包袱。TodoWrite 到 Task 的演变就是典型例子。

第三,不是所有问题都需要新工具来解决。Progressive disclosure 提供了一种不增加工具数量就能扩展能力的思路。

第四,结构化比自由文本更可靠。AskUserQuestion 的三次迭代证明了这一点。让模型输出特定格式的文本很脆弱,不如给它一个结构化的工具调用接口。

第五,让 Agent 主动寻找上下文,比被动喂给它上下文要好得多。从 RAG 到 Grep 再到 skill 的渐进式发现,这条路径的演进方向非常清晰。

这些经验不仅适用于 Claude Code,对于任何正在构建 AI Agent 的团队来说,都是非常实在的参考。

(完)

我是方圆,持续分享AI干货,下期再见~

往期推********荐

我给 Claude Code 源码加了宠物成长系统,人人都能拥有金色传说

企业项目AI编程经验分享

五位大佬聊了两小时,终于把 Harness Engineering 讲明白了

我开源了生成文字卡片的 Skill,一键生成公众号封面

添加微信,加入AI交流群,获取AI干货分享👇

如果这篇文章对你有帮助,欢迎顺手点个赞、点个在看,再转发给更多需要的人

也欢迎给公众号加个星标⭐,这样以后更新就能第一时间看到

你的每一次支持,都是我持续输出的动力,谢谢你~

引用链接

[1] Seeing like an agent: how we design tools in Claude Code(像 Agent 一样思考,如何设计 Claude Code 的工具): https://claude.com/blog/seeing-like-an-agent


cover_image

原创 方圆yo 方圆AI分享

输入关键词开始搜索