站点图标 高效码农

Claude核心工程师忏悔录:AI智能体工具设计的4个血泪教训!

像智能体一样思考:构建Claude Code过程中的工具设计启示

在人工智能快速演进的今天,如何为AI智能体(Agent)设计合适的“行动空间”——即它能够使用的工具集合——已经成为开发者面临的核心挑战之一。Anthropic公司的Thariq在构建广受关注的Claude Code过程中,积累了丰富而深刻的经验。这篇文章将带你深入理解,如何通过观察、实验和迭代,学会“像智能体一样思考”,从而设计出更高效、更自然的AI交互工具。

核心挑战:如何为智能体构建工具?

当我们在Claude API中构建智能体时,面临着多种工具构建方式的选择。可以通过代码执行、bash命令、技能(skills)调用等基础模块来构建工具。面对这些选项,一个关键问题浮现出来:到底该如何设计智能体的工具集?

是只需要一个全能工具,比如代码执行或bash命令?还是准备50个专用工具,覆盖智能体可能遇到的每一个使用场景?

要理解这个问题,我们需要换位思考。想象一下,如果有人给你一个困难的数学问题,你希望拥有什么样的工具来解决它?这完全取决于你自身的技能水平:

  • 纸笔是最基本的选择,但你会受到手工计算能力的限制
  • 计算器更好一些,但你需要知道如何操作它的高级功能
  • 计算机是最强大、最快速的选择,但你得知道如何用它编写和执行代码

这个类比为我们设计智能体工具提供了有益的思考框架。关键在于:给予智能体的工具必须与其自身能力相匹配。 但问题来了——我们如何知道智能体具备什么能力?答案只有通过仔细观察、阅读它的输出、不断实验。我们需要学会“像智能体一样思考”。

经验教训一:优化提问能力——AskUserQuestion工具的演进

在构建Claude Code的过程中,团队最初的一个目标是提升Claude提问的能力,这通常被称为“引导”(elicitation)。虽然Claude可以直接用文本提问,但团队发现用户回答这些问题时,感觉花费了不必要的时间。如何降低这种交互摩擦,提高用户与Claude之间的沟通效率?

尝试1:修改ExitPlanTool

最初的尝试是在ExitPlanTool中添加一个参数,让它可以附带一个问题数组。这是最容易实现的方案,但很快遇到了问题:Claude需要同时提交一个计划和一串关于这个计划的问题。如果用户的回答与计划内容冲突怎么办?Claude是否需要两次调用ExitPlanTool?这个方案导致了混淆,团队需要另辟蹊径。

尝试2:改变输出格式

接下来,团队尝试修改Claude的输出指令,让它使用一种特定的标记格式来提问。例如,要求它输出带方括号选项的要点列表,然后通过解析这个格式来向用户展示问题。

虽然这是最通用的改变,Claude似乎也能较好地按格式输出,但问题在于输出格式无法保证一致性。Claude经常会添加额外的句子、遗漏选项,或者使用完全不同的格式。

尝试3:创建专门的AskUserQuestion工具

最终,团队创建了一个专门的工具——AskUserQuestion。Claude可以在任何时候调用这个工具,特别是在计划模式下。当工具被触发时,系统会显示一个模态窗口展示问题,并暂停智能体的循环,直到用户回答。

这个方案带来了多重好处:

  1. 结构化输出:可以通过提示词要求Claude生成结构化的输出内容
  2. 多选项保证:确保Claude给用户提供多个选择
  3. 功能组合性:用户可以在Agent SDK中调用这个功能,或在技能(skills)中引用它

最关键的是,Claude似乎很喜欢调用这个工具,而且输出效果很好。这揭示了一个重要原则:即使工具设计得再好,如果Claude不理解如何调用它,也是徒劳。

这是Claude Code中引导功能的最终形态吗?团队表示并不确定。正如后续案例将展示的,对某个模型有效的方案,对另一个模型未必是最佳选择。

AskUserQuestion工具的使用界面

经验教训二:适应能力进化——从待办事项到任务管理

在Claude Code首次发布时,团队意识到模型需要一个待办清单(Todo list)来保持工作方向。待办事项可以在开始时写入,随着工作进展逐项勾销。为此,团队给Claude配备了TodoWrite工具,用于编写或更新待办事项并向用户展示。

然而,即使有了这个工具,Claude仍然经常忘记自己要做什么。为了解决这个问题,团队每5轮交互就插入一次系统提醒,提醒Claude它的目标是什么。

但随着模型能力的提升,情况发生了变化。新一代模型不仅不再需要待办清单的提醒,反而觉得这种机制限制了它们的发挥。定时接收待办清单提醒让Claude认为自己必须严格遵循清单,而不是灵活调整。同时,团队发现Opus 4.5在使用子智能体方面的能力显著增强,但问题是——子智能体之间如何在共享的待办清单上协调工作?

基于这些观察,团队用Task Tool替代了TodoWrite。如果说待办清单是为了让模型保持方向,那么任务(Tasks)则更侧重于帮助智能体之间相互沟通。任务可以包含依赖关系,在子智能体之间共享更新,模型还可以自主修改和删除它们。

这个演进过程揭示了一个重要洞见:随着模型能力的提升,原本必要的工具可能反而成为束缚。 开发者需要不断重新审视关于工具需求的既有假设。这也是为什么建议专注于支持一小批能力特征相似的模型。

任务工具的演进过程

经验教训三:搜索接口设计——让智能体自主构建上下文

对Claude来说,特别重要的一组工具是搜索工具,它可以用来自主构建自己的上下文环境。

Claude Code刚推出时,团队使用RAG向量数据库来为Claude查找上下文。虽然RAG功能强大、速度快,但它需要索引和设置,而且在不同环境中可能不稳定。更重要的是,Claude是被动获得上下文,而不是主动寻找上下文

但如果Claude可以在网络上搜索,为什么不能让它在代码库中搜索呢?通过给Claude配备Grep工具,团队让它能够自行搜索文件、构建上下文。

这揭示了一个规律:随着Claude变得更智能,如果给予合适的工具,它在构建自身上下文方面的能力会越来越强。

当团队引入Agent Skills时,他们将“渐进式披露”(progressive disclosure)的概念正式化了。这个概念允许智能体通过探索,逐步发现相关的上下文信息。Claude可以读取技能文件,这些文件可以引用其他文件,模型可以递归地阅读这些文件。实际上,技能的一个常见用途就是为Claude添加更多搜索能力,比如指导它如何使用API或查询数据库。

在一年时间里,Claude从几乎不能自主构建上下文,发展到能够跨多层文件进行嵌套搜索,精确找到所需的上下文信息。渐进式披露现在已成为团队添加新功能的常用技术,而且无需增加新工具。

经验教训四:渐进式披露——Claude Code指南智能体

目前,Claude Code拥有约20个工具,团队在不断反思是否真的需要这么多工具。添加新工具的标准很高,因为这意味着模型需要多考虑一个选项。

举个例子,团队发现Claude对如何使用Claude Code本身了解不够。如果你问它如何添加MCP(Model Context Protocol)或者某个斜杠命令的作用,它无法回答。

一种方案是把所有这些信息放在系统提示词中。但考虑到用户很少询问这些问题,这样做会增加上下文负担,干扰Claude Code的主要任务:编写代码。

于是,团队尝试了渐进式披露的另一种形式。他们给Claude提供了一个文档链接,Claude可以加载这个链接来搜索更多信息。这个方案可行,但团队发现Claude会把大量结果加载到上下文中,试图找到正确答案,而用户其实只需要一个简洁的答案。

基于这个观察,团队构建了Claude Code Guide子智能体。当用户询问关于Claude Code自身的问题时,系统会提示Claude调用这个子智能体。子智能体拥有详细的指令,知道如何有效搜索文档以及应该返回什么内容。

虽然这个方案还不完美——当用户询问如何设置Claude Code时,Claude仍可能混淆——但相比之前已经好多了!团队成功地为Claude扩展了行动空间,而且没有增加新工具

艺术而非科学:工具设计的核心原则

如果你期待一套严格的规则来指导工具构建,很遗憾,这篇文章无法提供这样的指南。为模型设计工具既是科学,也是艺术。它很大程度上取决于你使用的具体模型、智能体的目标以及它运行的环境。

以下是从Claude Code实践中提炼的关键原则:

1. 工具要与模型能力匹配

工具的设计必须考虑模型的实际能力。就像给不同技能水平的人提供不同工具一样,给Claude的工具也要适配它的“技能水平”。随着模型能力的提升,曾经必要的工具可能变得多余甚至成为束缚。

2. 优先考虑专用工具而非全能工具

虽然全能工具(如代码执行)看起来很诱人,但专用工具往往能让Claude更好地理解何时以及如何使用它们。AskUserQuestion工具的成功正说明了这一点。

3. 渐进式披露优于一次性提供

与其把所有信息都塞进系统提示词,不如让Claude能够通过探索逐步获取所需信息。这既节省了上下文空间,又让Claude能够更灵活地获取深度信息。

4. 让智能体主动构建上下文

给予搜索工具,让Claude能够自主寻找和构建自己的上下文环境,而不是被动接受预设的上下文。这充分利用了模型日益增强的探索能力。

5. 观察输出,持续迭代

Claude的输出是最好的反馈。通过仔细阅读模型如何调用工具、在什么情况下调用、调用效果如何,可以不断优化工具设计。Claude Code中工具的演进过程充分说明了迭代的价值。

6. 保持工具集精简

添加新工具的门槛应该很高。每个新工具都是模型需要多考虑的一个选项,可能增加决策负担。Claude Code保持约20个工具,并持续反思是否真的需要这么多。

常见问题解答

问:什么是智能体的“行动空间”?
行动空间是指智能体可以使用的所有工具和功能的集合,包括它能调用的API、能执行的命令、能访问的资源等。

问:为什么不能只给Claude一个全能工具?
全能工具虽然灵活,但往往需要Claude自己弄清楚如何以及何时使用它,这增加了决策负担。专用工具能让Claude更清晰地理解用途和调用时机。

问:渐进式披露具体指什么?
渐进式披露是一种设计理念,让智能体可以通过探索逐步获取信息,而不是一次性获得所有上下文。例如,Claude可以先读取一个文件,该文件再引导它读取其他相关文件。

问:如何判断是否需要为Claude添加新工具?
关键在于观察Claude在现有工具集下是否遇到无法解决的问题,或者现有方案是否效率低下。新工具的门槛应该很高,因为每个工具都会增加Claude的选择负担。

问:模型能力提升后,工具需要如何调整?
随着模型能力提升,原本必要的工具可能变得多余甚至限制模型发挥。Claude Code从TodoWrite到Task Tool的演进就是典型案例。定期重新审视工具集的必要性很重要。

结语:学会像智能体一样思考

构建Claude Code的经验告诉我们,为AI智能体设计工具是一个持续观察、实验和调整的过程。没有一劳永逸的解决方案,只有不断适应模型能力提升、用户需求变化和环境演进的方法论。

“像智能体一样思考” 意味着我们要跳出人类视角,尝试理解模型如何看待和选择工具。它喜欢调用什么工具?在什么情境下调用?什么因素可能导致它误用工具?这些问题的答案只能通过仔细阅读输出、设计实验来获得。

对于正在构建AI智能体的开发者,Claude Code的经验提供了宝贵的参考:工具设计不是一成不变的,而是需要随着模型能力的提升而演进;渐进式披露可以帮助扩展智能体的能力而不增加工具数量;观察和实验是优化工具设计的不二法门。

最终,设计智能体工具既是科学也是艺术。它需要严谨的实验设计、系统性的观察分析,也需要对模型行为的直觉理解和创造性思维。学会像智能体一样思考,我们才能设计出真正符合智能体需求的工具,释放AI的无限潜能。

退出移动版