Anthropic联合创始人Chris Olah指出,像Claude这样的生成式AI系统更多是“生长”出来的,而非完全“构建”而成。研究人员设定了引导生长的条件,但具体的结构和能力往往难以预测。
这给基于Claude构建应用带来了挑战:代理框架中编码了Claude无法独立完成的假设,但随着Claude能力提升,这些假设会逐渐过时。即使是本文分享的经验,也需要经常回顾和更新。
本文介绍了三种构建应用的模式,帮助团队跟上Claude不断进化的智能,同时平衡响应速度和成本:利用Claude已掌握的知识,思考“我可以停止做什么”,以及谨慎设定代理框架的边界。
1. 利用Claude已知的工具
建议优先使用Claude熟悉的工具来构建应用。
2024年底,Claude 3.5 Sonnet仅凭一个bash工具和一个文本编辑工具,在SWE-bench Verified测试中达到49%,刷新了当时的技术水平。Claude Code也基于这些工具构建。虽然bash工具并非专为构建代理设计,但Claude不仅会使用它,还能随着时间不断提升使用效率。

我们观察到Claude能将这些通用工具组合成解决不同问题的模式。例如,Agent Skills、程序化工具调用和记忆工具,都是基于bash和文本编辑工具构建的。

2. 反思“我可以停止做什么?”
代理框架中往往包含了Claude无法独立完成的假设。随着Claude能力提升,这些假设需要重新验证。
让Claude自主协调行动
常见假设是每个工具的结果都必须通过Claude的上下文窗口反馈,以指导下一步操作。但将工具结果转为tokens处理既慢又费钱,且有时并不必要,尤其当结果只需传递给下一个工具或Claude只关注部分输出时。

比如读取一张大表格却只需分析一列,整个表格都进入上下文,Claude为无关行付出代价。虽然可以通过硬编码过滤器解决部分问题,但代理框架本身做出的编排决策,Claude其实更适合来做。
给Claude配备代码执行工具(如bash工具或特定语言的REPL)能解决这个问题:Claude可以编写代码表达工具调用及其间逻辑。代理框架不必处理所有工具调用结果,Claude决定哪些结果传递、过滤或传给下一个调用,只有代码执行的输出进入上下文窗口。

这样,编排决策从代理框架转移到模型。代码作为通用编排手段,也让Claude成为强大的通用代理。Claude在非编程评测中表现优异,例如在BrowseComp基准测试中,Opus 4.6通过自主过滤工具输出,准确率从45.3%提升到61.6%。
让Claude管理自己的上下文
任务特定的上下文引导Claude使用通用工具。常见假设是系统提示应手工编写任务指令,但预加载大量指令不利于多任务扩展,且浪费Claude的注意力预算。
赋予Claude访问技能的能力(每个技能的YAML前言作为简短描述预加载到上下文)解决了这个问题。Claude可根据需要调用读取文件工具,逐步获取完整技能内容。

技能让Claude自由组装上下文,反向的上下文编辑功能则可选择性移除过时或无关内容,如旧工具结果或思考块。
通过子代理,Claude能更好地判断何时分叉出新的上下文窗口,专注处理特定任务。Opus 4.6在BrowseComp测试中,子代理功能使结果提升2.8%。
让Claude持久化自己的上下文

长时间运行的代理可能超出单个上下文窗口限制。常见假设是记忆系统依赖模型外的检索基础设施。我们重点让Claude自己选择持久化内容。
例如,压缩功能让Claude总结过去上下文,保持长任务的连续性。Claude在多次版本迭代中,记忆选择能力不断提升。在BrowseComp任务中,Sonnet 4.5准确率稳定在43%,而Opus 4.5和4.6分别达到68%和84%。
记忆文件夹是另一种方法,允许Claude将上下文写入文件,后续按需读取。我们观察到Claude在代理搜索任务中使用此功能,Sonnet 4.5在BrowseComp-Plus中使用记忆文件夹后,准确率从60.4%提升至67.2%。

长时间游戏(如宝可梦)是Claude改进记忆文件夹能力的典型案例。Sonnet 3.5将记忆当作对话记录,写下NPC说的话而非关键信息,14,000步后生成31个文件,仍停留在第二个城镇:
caterpie_weedle_info:
- Caterpie和Weedle都是毛毛虫宝可梦。
- Caterpie不带毒。
- Weedle带毒。
- 这些信息对未来战斗至关重要。
- 如果宝可梦中毒,应尽快去宝可梦中心治疗。
后续模型写下了战术笔记。Opus 4.6同样步数时,生成10个文件,分目录管理,包含三枚徽章和总结失败经验的学习文件:
/gameplay/learnings.md:
- Bellsprout睡眠+缠绕组合:睡眠粉落地前用咬击快速击倒,别让它布置。
- 第一代背包限制:最多20件物品,地牢前丢弃不需要的TM。
- 旋转瓷砖迷宫:不同入口y坐标通向不同目的地,尝试所有入口并串联多处。
- B1F y=16墙壁在x=9-28处确认坚固(步数14557)。
3. 谨慎设定边界
代理框架为Claude提供结构,保障用户体验、成本和安全。
设计上下文以最大化缓存命中率
Messages API是无状态的,Claude无法看到之前对话历史。代理框架需在每轮调用时,将新上下文与所有历史操作、工具描述和指令一并打包。
提示可以基于断点缓存。即API将上下文写入缓存,并检查是否与已有缓存匹配。
由于缓存token成本仅为基础输入token的10%,代理框架应遵循以下原则以最大化缓存命中率:
使用声明式工具管理用户体验、可观测性和安全边界
Claude不一定知道应用的安全边界或用户界面。Claude发出工具调用,由代理框架处理。bash工具给Claude广泛的程序操作能力,但代理框架只能获得命令字符串,缺乏针对具体动作的钩子。将动作提升为专用工具,代理框架可获得结构化参数,便于拦截、控制、渲染或审计。
需要安全边界的动作适合专用工具。可逆性是重要标准,难以逆转的动作(如外部API调用)可通过用户确认进行控制。写入工具如edit可包含陈旧检查,避免覆盖已变更文件。

工具也适合需要向用户展示动作的场景,比如以模态窗口清晰提问、提供多选项或阻塞代理循环等待用户反馈。
此外,工具有助于可观测性。结构化参数方便代理框架记录、追踪和重放操作。
动作是否提升为工具应持续评估。例如,Claude Code的自动模式(发布时仍处于研究阶段)为bash工具提供安全边界:由第二个Claude审查命令字符串判断安全性。这种模式可减少专用工具需求,适合用户信任整体方向的任务。高风险动作仍需专用工具保障。
展望未来
Claude智能的前沿不断变化。对Claude能力的假设需随着能力提升不断重新验证。
这一模式反复出现。在我们为长任务构建的代理中,Sonnet 4.5因感知上下文限制而过早结束任务。我们添加了上下文重置以缓解“上下文焦虑”。Opus 4.5后,这种行为消失,之前的重置机制成了代理框架的负担。
剔除这些负担至关重要,因为它们可能成为Claude性能瓶颈。随着时间推移,应用中的结构和边界应基于“我可以停止做什么?”的问题不断修剪。
欲使用本文介绍的所有工具和模式,请访问我们的claude-api技能库。
致谢
本文由Claude平台团队技术成员Lance Martin撰写。特别感谢Thariq Shihipar、Barry Zhang、Mike Lambert、David Hershey和Daliang Li在相关话题上的宝贵讨论。感谢Lydia Hallie、Lexi Ross、Katelyn Lesse、Andy Schumeister、Rebecca Hiscott、Jake Eaton、Pedram Navid和Molly Vorwerck的编辑审阅和反馈。


