Lessons from Building Claude Code - Seeing like an Agent
AI 核心摘要
构建 Agent 最困难的部分之一是设计其行动空间。文章分享了构建 Claude Code 过程中的经验:改进提问能力(AskUserQuestion 工具)、随能力更新工具(从 Todo 到 Task)、设计搜索界面(从 RAG 到 Grep)、渐进式披露(Claude Code Guide Agent)等。核心思想是学会像 Agent 一样思考,让 AI 主动构建上下文,而非被动接收。
核心观点
构建 Agent 最困难的部分之一是设计其行动空间(action space)。工具设计需要匹配模型的能力——就像给人类解决数学题时,纸笔、计算器、电脑各有适用场景。关键是学会"像 Agent 一样思考"。
一、改进提问能力 - AskUserQuestion 工具
目标
提高 Claude 的提问能力(elicitation),降低用户回答问题的摩擦,增加沟通带宽。
三次尝试
尝试 #1 - 编辑 ExitPlanTool
- 在 ExitPlanTool 中添加问题数组参数
- 问题:同时要求计划和问题会让 Claude 困惑
- 如果用户答案与计划冲突怎么办?需要调用两次工具吗?
尝试 #2 - 改变输出格式
- 修改 Claude 的输出指令,使用特殊的 markdown 格式
- 例如:带括号选项的项目符号列表
- 问题:Claude 不能保证格式一致,会添加额外句子、省略选项或使用不同格式
尝试 #3 - AskUserQuestion 工具 ✅
- 创建独立工具,Claude 可随时调用(特别是在计划模式)
- 触发时显示模态框,阻塞 Agent 循环直到用户回答
- 允许结构化输出,确保提供多个选项
- 可在 Agent SDK 中调用或在 skills 中引用
- 最重要:Claude 喜欢调用这个工具,输出效果很好
即使设计最好的工具,如果 Claude 不理解如何调用也没用。
二、随能力更新工具 - 从 Todo 到 Task
Todo 时代(早期)
- 模型需要 Todo 列表保持专注
- 提供 TodoWrite 工具来写入/更新 Todos
- 每 5 轮插入系统提醒,提醒 Claude 目标
- 问题:模型经常忘记要做什么
Task 时代(Opus 4.5)
- 新模型不仅不需要提醒,反而被 Todo 列表限制
- 系统提醒让 Claude 认为必须严格遵守列表,而不是修改它
- Opus 4.5 更擅长使用子代理,但如何在共享 Todo 列表上协作?
- 解决方案:用 Task 工具替代 TodoWrite
- Todo 是关于保持模型专注
- Task 是关于帮助 Agent 相互沟通
- Task 可以包含依赖关系、跨子代理共享更新、可修改和删除
教训
随着模型能力提升,曾经需要的工具可能现在反而成为限制。要不断重新审视之前的假设。支持少量能力相近的模型也很重要。
三、设计搜索界面
从 RAG 到 Grep
早期:RAG 向量数据库
- 强大且快速,但需要索引和设置
- 在不同环境中可能不稳定
- 更重要:Claude 是被给予上下文,而不是自己找到上下文
现在:Grep 工具
- 如果 Claude 能在网上搜索,为什么不能搜索代码库?
- 给 Claude Grep 工具,让它自己搜索文件和构建上下文
- 模式:随着 Claude 变聪明,如果给予正确工具,它越来越擅长自己构建上下文
渐进式披露(Progressive Disclosure)
通过 Agent Skills 正式化了渐进式披露概念,允许 Agent 通过探索逐步发现相关上下文。
- Claude 可以读取 skill 文件
- 这些文件可以引用其他文件
- Claude 可以递归读取
- Skills 的常见用途:添加更多搜索能力(如 API 使用说明、数据库查询)
演进: 一年内,Claude 从几乎无法构建自己的上下文,到能够跨多层文件进行嵌套搜索,找到所需的确切上下文。
渐进式披露现在是常用技术,用于在不添加工具的情况下增加新功能。
四、渐进式披露案例 - Claude Code Guide Agent
问题
Claude Code 目前有约 20 个工具,添加新工具的门槛很高(给模型多一个选项去思考)。
Claude 不够了解如何使用 Claude Code 本身:
- 如何添加 MCP?
- slash 命令是什么?
解决方案演进
方案 1:放入系统提示词
- 问题:用户很少问这些问题,会增加上下文腐烂,干扰 Claude Code 的主要工作(写代码)
方案 2:提供文档链接
- Claude 可以加载文档搜索信息
- 问题:Claude 会加载大量结果到上下文中,实际上只需要答案
方案 3:Claude Code Guide 子代理 ✅
- 当询问 Claude Code 自身时,提示 Claude 调用此子代理
- 子代理有详细的文档搜索指令和返回内容规范
- 虽然不完美(Claude 在设置问题上仍会困惑),但比以前好多了
- 在不添加工具的情况下扩展了 Claude 的行动空间
五、总结:艺术而非科学
设计模型工具更像艺术而非科学,高度依赖于:
- 使用的模型
- Agent 的目标
- 运行环境
建议:
- 经常实验
- 阅读输出
- 尝试新事物
- 像 Agent 一样思考(See like an agent)
个人思考
这篇文章展示了 Anthropic 团队在构建 Claude Code 过程中的实践智慧:
- 工具设计要匹配模型能力:不是越多越好,而是要"合身"
- 随模型演进调整工具:昨天的拐杖可能是今天的枷锁
- 让 AI 主动构建上下文:从被动接收到主动探索
- 渐进式披露:不要一次性塞给 AI 所有信息
- 实践导向:没有银弹,需要不断观察、实验、调整
这对我们设计 AI 工作流和工具有很强的指导意义。