像智能体一样观察:Anthropic 团队谈 Claude Code 工具设计的演进与艺术
更新时间:2026-03-01 03:39 浏览量:1
导读:本文由 Claude Code 团队成员 Thariq 分享一篇长文,探讨 AI 智能体设计技巧,强调其更像艺术,需要平衡提示缓存、工具调用与上下文管理。
文章核心包括渐进式披露机制,从 JSON 配置到完整 Markdown 逐步加载上下文,避免 token 浪费,并建议使用文件系统作为 agent 的“自然界面”。
Thariq @trq212 , Claude Code 核心成员,专注 AI agent 与开发者工具设计。曾参与 YC W20 创业项目,并于 MIT Media Lab 深耕研究。目前致力于让 Claude 成为更强大、可控的编码伙伴,分享实用工程洞见,追求“loving grace”的智能未来。
构建智能体框架(Agent Harness)最困难的部分之一,就是构筑其
动作空间(Action Space)
。
Claude 通过“工具调用(Tool Calling)”来采取行动,但在 Claude API 中,构建工具的方式多种多样,包括 Bash 脚本、预设技能(Skills)以及最近推出的代码执行功能(关于 API 上的程序化工具调用,可以参阅 @RLanceMartin 的新文章)
参阅:https://x.com/RLanceMartin/status/2027450018513490419
面对这么多选项,你该如何设计智能体的工具?是只需要“代码执行”或“Bash”这一个万能工具就够了,还是针对每种可能遇到的场景设计 50 个专门的工具?
为了让自己进入模型的思维状态,我喜欢想象自己正在解一道复杂的数学题。你会想要什么样的工具来解决它?这取决于
你自己的能力
。
纸笔是底线,但你会受限于手动计算;计算器更好,但你需要知道如何操作那些高级功能;最快、最强大的选择是电脑,但你必须懂得如何编写和执行代码。
这是一个设计智能体的有用框架:
你希望赋予它的工具,应当是根据其自身能力量身定制的。
但你怎么知道它的能力边界在哪里?你需要仔细观察、阅读它的输出、不断实验。简而言之,你要学会
像智能体一样观察
。
以下是我们在构建 Claude Code 过程中,通过观察 Claude 总结出的一些经验。
在构建AskUserQuestion工具时,我们的目标是提升 Claude 的提问能力(通常称为“引导/需求采集”,Elicitation)。
虽然 Claude 可以直接用纯文本提问,但我们发现回复这些问题往往会消耗不必要的时间。我们如何才能降低这种摩擦,增加用户与 Claude 之间的沟通带宽?
尝试 :修改 ExitPlanTool我们最初尝试在ExitPlanTool(退出计划工具)中增加一个参数,使其在输出计划的同时附带一系列问题。这是最容易实现的方案,但它让 Claude 感到困惑,因为它需要同时制定计划并针对该计划提出问题。如果用户的回答与计划冲突怎么办?Claude 是否需要调用两次该工具?我们需要另寻他法。
(你可以在我们关于提示词缓存的文章中了解更多关于 ExitPlanTool 的设计初衷)
尝试 :更改输出格式
接着,我们尝试修改 Claude 的输出指令,让它使用一种略微修改过的 Markdown 格式来提问。例如,要求它输出一个带括号选项的列表。然后我们可以解析这种格式,并为用户渲染 UI。
虽然这是改动最小的方案,Claude 似乎也能胜任,但
稳定性无法保证
。Claude 经常会附带额外的句子、漏掉选项,或者干脆使用了完全不同的格式。
尝试 :AskUserQuestion 工具
最终,我们决定创建一个 Claude 可以在任何时候调用的专用工具,并特别提示它在“计划模式(Plan Mode)”下使用。当该工具被触发时,我们会弹出一个模态框显示问题,并
阻塞智能体的循环
,直到用户给出回答。
这个工具允许我们要求 Claude 提供结构化输出,确保它能给用户提供多个选项。它还允许用户灵活组合功能,例如在 Agent SDK 中调用它,或在自定义技能中引用它。
最重要的是,
Claude 似乎很喜欢调用这个工具
,其输出效果也非常好。即使设计得再精妙的工具,如果 Claude 不理解如何调用它,也是徒劳。
这是 Claude Code 中“引导提问”的最终形态吗?我们不确定。正如接下来的例子所示,对一个模型有效的方案,对另一个模型未必是最佳的。
当 Claude Code 最初发布时,我们意识到模型需要一个“待办事项清单(Todo list)”来保持专注。Todo 可以在开始时写入,并在工作进行中逐步勾选。为此,我们给 Claude 配备了TodoWrite工具,该工具可以编写或更新 Todo 并将其展示给用户。
但即便如此,我们仍经常发现 Claude 会忘记自己要做什么。为了适应这一点,我们曾每隔 5 轮对话就插入一次系统提醒,告知 Claude 它的当前目标。
然而,随着模型的进步(如 Opus 4.5),它们不仅不再需要 Todo 提醒,甚至会觉得这是一种限制。不断发送的 Todo 提醒让 Claude 认为它必须死板地遵守清单,而不是根据实际情况修改它。我们还发现,新模型在调用“子智能体(Subagents)”方面表现更出色,但多个子智能体如何在一个共享的 Todo 清单上协作?
看到这些变化后,我们用
Task 工具
取代了TodoWrite(在此阅读更多关于 Task 的信息)。Todo 的核心是“保持专注”,而 Task 的核心则是“辅助智能体间的协作”。Task 可以包含依赖关系、在子智能体间共享进度,且模型可以自由修改或删除它们。
当模型能力提升时,曾经需要的工具反而可能成为束缚。
不断审视先前的假设至关重要。这也是为什么在开发时,最好专注于支持一组能力曲线相似的模型。
Claude Code 刚面世时,我们使用 RAG(检索增强生成)向量数据库来寻找上下文。虽然 RAG 强大且快速,但它需要索引和配置,且在不同环境下可能显得脆弱。更重要的是,上下文是“喂”给 Claude 的,而不是它自己“找”到的。
如果 Claude 能搜索网页,为什么不能搜索你的本地代码库?通过赋予 Claude 一个Grep工具,我们让它能够自行搜索文件并构建上下文。
我们观察到一个规律:
随着 Claude 变得越来越聪明,只要给它合适的工具,它就越来越擅长自主构建上下文。
当我们引入“智能体技能(Agent Skills)”时,我们将
“渐进式披露(Progressive Disclosure)”
的理念正式化了——这允许智能体通过探索逐步发现相关的上下文。
Claude 可以阅读“技能文件”,这些文件可以递归地引用模型可以读取的其他文件。事实上,技能的一个常见用法是为 Claude 增加更多搜索能力,比如教它如何使用某个 API 或查询某个数据库。
在一年时间里,Claude 从不太会构建上下文,演进到了能够跨多层文件进行嵌套搜索,从而精准找到所需的上下文。
渐进式披露
现在已成为我们增加新功能而不增加新工具的常用技巧。
目前 Claude Code 拥有约 20 个工具,我们一直在反思是否真的需要这么多。添加新工具的门槛很高,因为这会增加模型的思考负担。
例如,我们注意到 Claude 不太了解如何使用 Claude Code 本身。如果你问它如何添加 MCP 或某个斜杠命令的作用,它无法回答。
我们可以把这些信息全塞进系统提示词(System Prompt)里,但考虑到用户很少问这些,这会造成“上下文腐化(Context Rot)”,干扰 Claude Code 的核心任务:写代码。
相反,我们尝试了渐进式披露。我们给了 Claude 一个指向其文档的链接,它可以在需要时加载并搜索。这可行,但我们发现 Claude 为了找一个简单的答案,会把大量搜索结果加载到上下文中,其实你只需要那个答案本身。
于是我们构建了
Claude Code Guide 子智能体
。当用户询问有关 Claude Code 自身的问题时,Claude 会被提示调用这个子智能体。这个子智能体拥有关于如何精准搜索文档并返回答案的详尽指令。
虽然这并不完美(Claude 在处理安装配置类问题时偶尔仍会困惑),但比以前好得多!
我们成功地在不增加工具的前提下,扩展了 Claude 的动作空间。
如果你期待一套关于如何构建工具的死板规则,那么这篇文章恐怕无法提供。为模型设计工具既是科学,更是艺术。它高度依赖于你使用的模型、智能体的目标以及它运行的环境。
多实验,多阅读输出,多尝试新事物。
像智能体一样去观察。
https://x.com/trq212/status/2027463795355095314
有一位网友马上根据这篇文章设计了一个 skill,将文章粘贴到 Claude code 自动生成以下 skill。
太棒了!我已经根据文章创建了agent-design技能。以下是我的操作内容:
已创建的技能结构
~/.claude/skills/agent-design/└── SKILL.md
技能包含的内容
该技能涵盖了文章中的核心经验:
核心哲学
:根据模型能力定制工具
经验 1
:提升引导提问能力(AskUserQuestion 工具的演进)
经验 2
:适应不断进化的能力(Tasks 与 Todos 的对比)
经验 3
:让智能体自行构建上下文(渐进式披露)
经验 4
:优先使用渐进式披露而非新工具(子智能体应用)
设计指南
:何时添加工具、何时不添加,以及值得考虑的模式
框架
:工具设计的循序渐进方法
反模式
:应当避免的常见错误
如何使用
在开发智能体系统时调用该技能:
