5. # 驾驭 Claude 的智能:构建应用的三个关键模式Anthropic 联合创始人 Chris Olah 说过,像 Claude 这样的生成式 AI 系统,与其说是“造”出来的,不如说是“长”出来的。研究人员设定好生长条件、引导方向,但最终会涌现出什么样的结构和能力,谁也没法完全预料。这就给基于 Claude 的开发带来了一个挑战:Agent 框架里写死了很多“Claude 做不到某件事”的假设,但随着 Claude 越来越强,这些假设会逐渐过时。哪怕是本文分享的经验,也值得隔一段时间就重新审视一遍。这篇文章分享了三个模式,帮助开发团队在兼顾延迟和成本的同时,让应用跟上 Claude 不断进化的智能水平:用它已经会的东西、问问自己哪些事可以不做了、以及谨慎地用框架设定边界。## 一、用 Claude 已经熟悉的工具我们建议用 Claude 理解得很透的工具来构建应用。2024 年底,Claude 3.5 Sonnet 在 SWE-bench Verified 上拿到了 49% 的得分,当时是业界最高水平,而它用到的工具只有两个:一个 bash 工具和一个文本编辑器(用来查看、创建和编辑文件)。Claude Code 的底层也是这两个工具。bash 本来不是为构建 Agent 设计的,但 Claude 非常熟悉它,而且随着模型迭代,用得越来越好。我们观察到,Claude 会把这些通用工具组合出各种模式来解决不同的问题。比如 Agent Skills、程序化工具调用、记忆工具,底层都是 bash 和文本编辑器的组合。## 二、问自己“哪些事可以不做了?”Agent 框架里写满了“Claude 自己搞不定”的假设。随着 Claude 能力增强,这些假设应该被重新检验。### 让 Claude 自己编排行动一个常见的假设是:每次工具调用的结果都得回传到 Claude 的上下文窗口里,好让它决定下一步做什么。但把工具结果转成 token 来处理,既慢又贵,而且很多时候根本没必要,因为那个结果可能只是要传给下一个工具,或者 Claude 只关心其中一小部分。举个例子:读一张大表格,只为了分析其中一列。整张表都塞进上下文,Claude 要为每一行不需要的数据付出 token 成本。你可以在工具设计层面加硬编码过滤器来解决,但这没有触及问题的本质:框架在替 Claude 做一个“编排决策”,而 Claude 自己其实更适合做这个决策。给 Claude 一个代码执行工具(比如 bash 或者某种语言的 REPL)就能解决这个问题。Claude 可以写代码来表达工具调用和调用之间的逻辑。框架不再替它决定“每个工具结果都要处理成 token”,Claude 自己决定哪些结果要传递、哪些要过滤、哪些直接管道给下一个调用,根本不用经过上下文窗口。只有代码执行的最终输出才会进入上下文。编排决策从框架转移到了模型手中。因为代码是一种通用的行动编排方式,所以一个编程能力强的模型,同时也是一个强大的通用 Agent。Claude 在非编程类评测上也展现了很强的表现:在 BrowseComp(一个测试 Agent 网页浏览能力的基准)上,让 Opus 4.6 自己过滤工具输出后,准确率从 45.3% 提升到了 61.6%。### 让 Claude 自己管理上下文任务相关的上下文引导着 Claude 如何使用 bash 和文本编辑器这类通用工具。一个常见假设是:系统提示词应该手工编写,塞满各种任务指令。问题在于,预加载一堆指令在多任务场景下根本不可扩展:每多一个 token 都在消耗 Claude 的注意力预算,而且把很少用到的指令预先塞进去纯属浪费。Skills 机制解决了这个问题:每个 skill 的 YAML 头部是一段简短描述,预加载到上下文窗口里,相当于一个目录概览。只有当任务确实需要时,Claude 才会调用读文件工具来加载完整的 skill 内容,实现“渐进式披露”。Skills 给了 Claude 自主组装上下文的自由,而上下文编辑(context editing)则是反过来的操作,可以有选择地移除已经过时或无关的内容,比如旧的工具返回结果或思考过程。通过子 Agent(subagents),Claude 越来越擅长判断什么时候该分叉出一个全新的上下文窗口,把某个具体任务隔离处理。Opus 4.6 使用子 Agent 后,在 BrowseComp 上比最佳单 Agent 方案提升了 2.8%。### 让 Claude 自己持久化上下文长时间运行的 Agent 可能会超出单个上下文窗口的容量。一个常见假设是:记忆系统应该依赖模型外围的检索基础设施。而我们的大量工作聚焦在一件事上:给 Claude 简单的方式,让它自己选择要保留什么内容。比如“压缩”(compaction)功能,让 Claude 总结过去的上下文,从而在长周期任务中保持连贯性。经过几个版本的迭代,Claude 在“选择记住什么”这件事上越来越强。在 BrowseComp 上,Sonnet 4.5 不管给多少压缩预算,准确率都停在 43% 不动。但 Opus 4.5 在同样的设置下提升到了 68%,Opus 4.6 更是达到了 84%。记忆文件夹是另一种方案,让 Claude 把上下文写入文件,之后按需读取。我们看到 Claude 在搜索类 Agent 任务中会主动使用这个功能。在 BrowseComp-Plus 上,给 Sonnet 4.5 一个记忆文件夹后,准确率从 60.4% 提升到了 67.2%。用长周期游戏(比如宝可梦)来测试,能很直观地看到 Claude 使用记忆文件夹的能力进化。Sonnet 3.5 把记忆当流水账来记,NPC 说了什么就记什么。跑了 14000 步之后,它攒了 31 个文件,其中还有两个内容几乎重复的关于毛毛虫宝可梦的笔记,而它还卡在第二个城镇:```plaintextcaterpie_weedle_info:- 绿毛虫和独角虫都是毛毛虫宝可梦。- 绿毛虫没有毒。- 独角虫有毒。- 这个信息对未来的战斗很重要。- 如果我们的宝可梦中毒了,应该尽快去宝可梦中心治疗。```后来的模型学会了写战术笔记。Opus 4.6 在同样的步数下,只有 10 个文件,还按目录分好了类,已经拿到三个道馆徽章,并且有一个从自己的失败中提炼出来的经验总结文件:```plaintext/gameplay/learnings.md:- 喇叭芽的催眠+紧束组合技:用咬咬赶紧秒掉, 别让它放出催眠粉!- 初代背包上限:最多 20 个道具。进迷宫前把没用的技能机器扔掉。- 旋转地砖迷宫:不同的入口 y 坐标会通向不同的终点。 把所有入口都试一遍,然后串联穿过多个区域。- B1F y=16 的墙在 x=9-28 范围内确认全部是实心的(第 14557 步)```## 三、谨慎设定边界Agent 框架为 Claude 提供结构化的约束,用于保障用户体验、控制成本或确保安全。### 设计上下文结构以最大化缓存命中率Messages API 是无状态的。Claude 看不到之前轮次的对话历史。这意味着每一轮交互,框架都需要把新的上下文连同所有历史操作、工具描述和指令一起打包发给 Claude。提示词可以根据设定的断点进行缓存。也就是说,Claude API 会把断点之前的上下文写入缓存,并检查是否与之前的缓存条目匹配。由于缓存 token 的成本只有普通输入 token 的 10%,以下几个原则可以帮助最大化缓存命中率:| 原则 | 说明 || --- | --- || 静态内容在前,动态内容在后 | 把稳定不变的内容(系统提示词、工具定义)放在前面 || 用消息来更新 | 在消息中追加 `<system-reminder>`,而不要直接改系统提示词 || 不要切换模型 | 避免在一个会话中途换模型。缓存是按模型区分的,一换就失效。如果需要更便宜的模型,用子 Agent || 谨慎管理工具 | 工具定义在缓存前缀里。增删任何一个都会让缓存失效。如果需要动态发现工具,用 tool search,它是追加式的,不会破坏缓存 || 更新断点 | 对于多轮应用(比如 Agent),把断点移到最新的消息上,保持缓存及时更新。可以用自动缓存功能来实现 |### 用声明式工具来划定用户体验、可观测性和安全边界Claude 不一定了解应用的安全边界或用户界面。Claude 发出工具调用,由框架来执行。bash 工具给了 Claude 很大的操作自由度,但对框架来说,它拿到的只是一个命令字符串,每个操作长得都一样。把特定操作提升为专用工具,框架就能获得一个带类型参数的钩子,可以拦截、审批、渲染或审计。需要安全边界的操作天然适合做成专用工具。可逆性通常是个好的判断标准:难以撤销的操作(比如外部 API 调用)可以加上用户确认环节。像 `edit` 这样的写入工具可以加入过期检查,防止 Claude 覆盖掉上次读取之后已经被修改的文件。工具在需要向用户展示信息时也很有用。比如可以渲染成一个弹窗,清晰地向用户展示问题、提供多个选项,或者阻塞 Agent 循环直到用户给出反馈。最后,工具对可观测性也很有价值。当操作是一个带类型的工具调用时,框架就能拿到结构化的参数,方便记录日志、追踪和回放。是否要把某个操作提升为专用工具,应该持续评估。比如 Claude Code 的自动模式(发文时还在研究阶段)给 bash 工具加了一层安全边界:让另一个 Claude 读取命令字符串,判断是否安全。这种模式可以减少对专用工具的需求,但只适用于用户信任整体方向的场景。对于某些高风险操作,专用工具仍然有其不可替代的价值。## 展望Claude 的智能前沿一直在变化。关于“Claude 做不到什么”的假设,每当能力发生阶跃式提升时,都需要重新检验。我们反复看到这个规律。在我们为长周期任务构建的一个 Agent 中,Sonnet 4.5 会在感知到上下文快要用完时提前收工。我们加了上下文重置机制来应对这种“上下文焦虑”。到了 Opus 4.5,这个行为消失了。我们为了补偿而写的重置逻辑,变成了框架里的累赘。清除这些累赘很重要,因为它们会成为 Claude 发挥能力的瓶颈。随着时间推移,应用中的结构和边界应该不断精简,核心问题始终是那一个:哪些事可以不做了?要使用本文讨论的所有工具和模式,可以查看我们的 [claude-api skill](网页链接)。---*作者:Lance Martin, Anthropic Claude 平台团队技术人员。感谢 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 的编辑审阅和反馈。*