从Claude Code源码泄露,读懂12个可复用的Agentic Harness设计模式(生产级落地指南)

张开发
2026/4/13 1:25:52 15 分钟阅读

分享文章

从Claude Code源码泄露,读懂12个可复用的Agentic Harness设计模式(生产级落地指南)
前段时间Claude Code源码意外泄露在技术圈掀起了一场学习热潮。不同于普通开发者只关注代码本身的实现细节真正有价值的是藏在代码背后的设计思路那些支撑Claude Code成为生产级AI编码助手的核心架构逻辑并不是某个产品的专属功能而是可以复用到所有Agent开发中的通用模式。我们都知道AI模型会迭代更新工具会不断升级但好的设计模式会一直沉淀下来成为支撑Agent长期稳定运行的基石。就像Kubernetes Patterns和Prompt Patterns的作者Bilgin lbryam从泄露的源码中提炼出12个可直接复用的Agentic Harness设计模式按功能分成了四大类记忆与上下文、工作流与编排、工具与权限、自动化。这12个模式每一个都对应着Agent开发中最常见的痛点比如上下文不够用、记忆混乱、权限失控、流程混乱等。今天我们就用最通俗的语言把这些生产级的设计模式拆解开从原理、落地方式、适用场景到权衡点一步步讲清楚让无论是刚入门Agent开发的新手还是有经验的开发者都能直接借鉴、落地使用。毕竟这次Claude Code的泄露给了我们一个难得的窗口让我们能窥见顶级AI编码助手的内部架构。这些从真实场景中打磨出来的模式不是空谈的理论而是能解决实际问题的架构智慧值得每一个做Agent应用的人认真研究。一、记忆与上下文让Agent“记对事、记牢事”不浪费每一个TokenAgent的核心能力之一就是“记忆”记住规则、记住上下文、记住用户偏好。但很多开发者在做Agent时都会陷入一个误区要么让Agent“什么都记”导致上下文臃肿、Token浪费甚至触发窗口限制要么让Agent“什么都不记”每次会话都从零开始重复踩坑、效率低下。Claude Code提炼的5个记忆与上下文模式本质上是一条逐步演进的路径从固定规则文件到按范围限制规则再到分层记忆、后台清理最后到上下文压缩一步步解决“记不住、记太乱、记太多”的问题。1. 持久化指令文件模式让Agent每次会话都“带着规则开工”做过Agent开发的人都有过这样的体验每次开启新的会话都要重复告诉Agent同样的约定比如代码构建命令、测试方式、架构规则、命名约定甚至还要反复纠正Agent之前犯过的错误。就像一个新员工每次上班都要重新问一遍工作要求效率极低还容易出错。持久化指令文件模式就是为了解决这个问题而生的做法其实非常简单在项目根目录下放一个固定的配置文件比如instruction.json或.claude-instructions里面详细写清楚项目的所有通用规则包括但不限于代码构建命令如npm run build前端项目、mvn clean packageJava项目测试方式单元测试命令pytest、集成测试流程、测试覆盖率要求架构规则比如微服务项目的分层规范Controller→Service→Dao、禁止使用的依赖命名约定变量名采用小驼峰、类名采用大驼峰、接口名以I开头边界限制比如禁止修改核心配置文件、禁止执行高危Shell命令。这个配置文件跟着代码仓库一起管理每次Agent开启会话时会自动加载这个文件不需要用户再重复输入规则。这样一来无论多少次会话Agent都能保持一致的行为避免重复踩坑也减少了用户的沟通成本。适用场景非常明确需要在多个会话里反复处理同一个代码库的场景比如长期维护一个项目、持续迭代某个产品的代码。但这个模式也有明显的权衡点需要承担一定的维护成本。这个指令文件必须跟着项目一起更新如果项目架构调整、命名规范变化而指令文件没有及时更新反而会误导Agent让Agent按照旧规则做事效果还不如没有这个文件。所以一定要建立“项目更新同步更新指令文件”的机制避免规则过时。2. 作用域上下文组装模式解决“规则太杂、不适用”的痛点持久化指令文件在小项目里很好用但项目一旦变大问题就来了。比如一个Monorepo项目里面包含前端、后端、移动端多个模块每个模块的规则都不一样前端需要遵循React代码规范后端需要遵循Java代码规范移动端需要遵循Flutter规范。如果把所有规则都写在一个指令文件里要么文件越写越长最后没人愿意看、没人维护要么写得太笼统对具体模块没有实际指导意义。作用域上下文组装模式就是把指令拆分成不同的作用域让Agent根据当前所在的位置动态加载对应的规则。简单来说就是“哪里需要就加载哪里的规则”既保证全局一致又允许局部差异。具体的做法是将指令文件按作用域分层常见的分层方式有5级组织级整个公司或团队的通用规则比如代码提交规范、安全底线用户级用户个人的偏好比如喜欢的代码风格、常用的工具项目根目录级整个项目的通用规则比如项目的构建流程、依赖管理规范父目录级某个模块的通用规则比如后端模块的整体架构规范子目录级具体文件或子模块的规则比如某个接口的开发规范、某个组件的编码要求。Agent在工作时会先判断自己当前操作的文件所在的目录然后自动加载该目录及以上所有作用域的规则忽略无关的规则。比如Agent在修改前端目录下的文件时只会加载组织级、用户级、项目根目录级、前端父目录级和当前子目录的规则不会加载后端的规则避免规则干扰。另外通过“导入”的方式还可以把大的指令集拆开管理避免重复。比如组织级的代码提交规范可以被所有项目导入不需要每个项目都重复写一遍减少维护成本。适用场景Monorepo项目、多语言项目或者不同目录有不同规范的代码库。比如一个大型互联网公司的项目包含多个业务模块每个模块的技术栈和规范都不同用这个模式就能很好地管理规则。权衡点也很明显可读性会变差。规则分散在多个文件、多个目录下很难一眼看清Agent实际加载了哪些规则不同作用域之间也可能出现规则冲突。比如父目录的规则和子目录的规则不一致Agent需要有明确的优先级判断逻辑通常是子目录规则优于父目录规则否则会出现行为混乱。3. 分层记忆模式让Agent“记重点、不浪费Token”很多开发者做Agent时会把所有记忆都塞进上下文里——用户的提问、Agent的回复、代码片段、规则文件不管重要与否全部堆在一起。这样做的后果很明显Token消耗飞快很快就会撞上上下文窗口的上限而且重要信息会被大量无关信息淹没Agent反而记不住关键内容。分层记忆模式的核心思路就是“把记忆分等级按需加载”就像我们人类的记忆大脑里会记住最关键的信息比如自己的名字、家庭住址不太重要的信息比如昨天吃了什么会暂时存在短期记忆里需要时再回忆更详细的信息比如小时候的事情会存在长期记忆里不常用就不会轻易调取。具体的做法是把Agent的记忆分成三层索引层最精简的核心信息始终放在上下文里控制在几百行以内。比如项目的核心规则、当前任务的目标、用户的核心偏好这些信息是Agent每次工作都需要用到的必须随时可用活跃层和当前任务相关的内容按需加载到上下文。比如当前正在修改的代码文件、相关的依赖信息、近期的对话记录这些信息只在当前任务中有用任务结束后可以卸载持久层完整的历史记录和详细信息存在磁盘或数据库里不放入上下文。比如所有的对话记录、完整的规则文件、历史代码修改记录这些信息平时用不到只有需要回溯历史、查询细节时Agent才会去磁盘调取。举个例子如果Agent正在修改一个Java接口索引层会包含“Java接口命名规范、当前任务目标修改接口参数”活跃层会包含“该接口的现有代码、相关的依赖类、用户最近的修改要求”持久层会包含“该接口过去半年的修改记录、整个项目的完整规则文件、之前所有的对话记录”。这样一来上下文里只保留最关键、最常用的信息既节省Token又能避免信息混乱。适用场景需要跨多次会话保留偏好、决策或状态的Agent。比如长期维护一个项目的编码助手需要记住用户的编码偏好、项目的历史修改记录同时又不能让上下文过于臃肿。权衡点实现会更复杂。需要开发者想清楚哪些信息该放在索引层、哪些该放在活跃层、哪些该放在持久层还要设计好信息的“上升”和“下沉”机制比如某个活跃层的信息被频繁使用就可以上升到索引层某个索引层的信息长期不用就可以下沉到持久层。同时还要保证索引层的信息和持久层的实际数据是同步的避免出现“索引和实际内容不一致”的问题。4. 记忆整合模式给Agent做“记忆垃圾回收”保持记忆干净可用即使做了分层记忆Agent的记忆用久了还是会“变乱”。比如重复的信息越来越多比如用户多次提到同一个规则Agent都记了下来旧信息和新信息打架比如项目规则更新后旧规则还留在记忆里索引层的信息慢慢膨胀最后还是会占用大量Token。记忆整合模式就相当于给Agent做一次“垃圾回收”通过后台整理机制在Agent空闲时定期清理记忆让记忆保持干净、可用。Claude Code源码中提到的autoDream功能本质上就是在实现这个模式——自动合并重复的记忆、处理新旧信息的冲突、控制索引层的规模让Agent的记忆始终处于“有用、简洁”的状态。具体的整理逻辑主要有三点去重识别并删除重复的信息比如重复的规则、重复的对话片段避免占用多余的Token删旧删除过期、无用的信息比如已经过时的项目规则、长期不用的历史记录优先保留最新、最有用的信息重组优化记忆的结构比如把分散的规则整合到一起把碎片化的对话总结成连贯的摘要让Agent更容易调取和使用。举个例子用户在多次对话中反复提到“代码命名要采用小驼峰”Agent的记忆里会出现多次这句话记忆整合机制会自动合并这些重复内容只保留一句如果项目更新了命名规范从“小驼峰”改成“下划线”记忆整合机制会删除旧的“小驼峰”规则保留新的“下划线”规则避免新旧规则冲突。适用场景Agent会长期运行、持续积累记忆而且不方便靠人工去维护的场景。比如一个面向企业的AI编码助手需要服务多个用户、处理多个项目长期积累的记忆会非常多靠人工清理不现实就需要自动整合机制。权衡点整理本身也要消耗Token而且整理结果不一定完全准确。如果清理太激进可能会把有用的信息一起删掉比如把用户偶尔提到的、但很重要的偏好删掉如果清理太保守又起不到“垃圾回收”的效果记忆还是会变乱。所以需要根据实际场景调整整理的频率和强度找到一个平衡点。5. 渐进式上下文压缩模式对话再长也不会触发窗口上限无论怎么优化记忆只要对话轮次多了比如超过2030轮上下文还是会慢慢膨胀最终撞上窗口上限。要么早期的对话内容被挤掉Agent忘记之前的约定要么任务直接无法继续只能重新开启会话之前的工作全部白费这两种情况都非常影响体验。渐进式上下文压缩模式就是通过“分层压缩”的方式解决上下文膨胀的问题核心思路是越久远的信息保留得越粗略越新的信息保留得越详细。就像我们人类回忆事情最近发生的事情能记得很多细节很久之前的事情只能记得一个大概的轮廓。具体的做法的是将对话内容按时间顺序分成多个层级每个层级采用不同的压缩强度最新层05轮对话不压缩完整保留所有细节包括用户的提问、Agent的回复、代码片段、修改建议因为这些信息是当前任务最需要的近期层615轮对话轻量压缩保留核心内容删除无关的语气词、重复的表述比如把“你好我想修改这个代码具体要求是……”压缩成“用户要求修改某代码具体要求为……”远期层16轮以上对话深度压缩只保留最核心的摘要比如把10轮关于“项目规则调整”的对话压缩成“用户在第818轮对话中调整了项目的命名规范和构建流程”。Claude Code源码中就采用了类似的多层压缩思路甚至把压缩层级分得更细根据对话轮次的多少动态调整压缩强度既保证了当前任务能用到的信息足够详细又避免了上下文过于臃肿突破窗口限制。适用场景对话轮次比较多的任务比如复杂的代码重构、多阶段的项目开发需要Agent持续跟进对话轮次可能达到几十甚至上百轮。权衡点压缩一定是有损的。信息在一轮轮总结和压缩中必然会丢失一些细节比如用户之前提到的某个细微的偏好、某个代码的细节要求可能会在压缩过程中被忽略。如果后面的任务又需要这些细节Agent可能会“编造”信息而不是承认自己不知道这会影响任务的准确性。所以在压缩时需要优先保留关键信息同时给Agent设置“无法回忆时主动询问用户”的逻辑避免编造信息。二、工作流与编排让Agent“有条理地做事”不混乱、不返工很多Agent的默认做法是把“查资料、做规划、改代码、测效果”这些步骤混在一起一上来就动手改代码看似高效实则很容易出问题比如理解不完整改错文件漏掉依赖或者忽略现有的实现方式最后导致返工反而浪费更多时间。Claude Code提炼的3个工作流与编排模式核心就是一个词分离。把读取和写入拆开把“查资料”和“改代码”的上下文拆开把顺序执行和并行执行也拆开。这样做的好处是即使任务变得越来越复杂Agent的工作流程也不会混乱能始终保持高效、准确。6. 探索-规划-行动循环模式先搞清楚再动手不盲目做过开发的人都知道拿到一个需求最忌讳的就是一上来就写代码。如果连需求都没理解清楚、连现有代码的结构都没摸清很容易写出不符合要求、甚至无法运行的代码最后只能返工。Agent也是一样一上来就让它改代码很容易出现各种问题。探索-规划-行动循环模式就是把Agent的工作流程拆成三步而且权限逐步放开让Agent“先搞清楚、再做决定、最后动手”避免盲目操作。这三步具体是探索阶段只读不写摸清情况。Agent只能读取代码、查询相关信息不能修改任何文件、不能执行任何写操作。这个阶段的核心目标是理解当前的代码结构、依赖关系、现有问题以及用户的具体需求。比如用户让Agent修改一个接口探索阶段Agent会先读取该接口的代码、相关的依赖类、测试用例搞清楚接口的功能、参数、返回值以及当前存在的问题规划阶段沟通对齐明确方案。Agent根据探索阶段获取的信息制定详细的修改方案包括修改哪些文件、修改哪些代码、如何测试然后把方案反馈给用户和用户对齐思路。如果用户有不同的意见Agent再调整方案直到双方达成一致行动阶段执行操作完成任务。方案对齐后Agent再获得写权限按照规划的方案修改代码、执行测试完成用户的需求。如果执行过程中遇到问题比如修改后代码报错Agent会回到探索阶段重新查看相关信息调整方案后再继续行动。这个模式的本质就是“先调研、再规划、后执行”和我们人类做开发的流程完全一致。比如我们拿到一个需求会先看现有代码、查相关文档然后制定开发方案最后再写代码、做测试这样能最大程度避免返工。适用场景不熟悉的代码库或者涉及多个文件的复杂修改。比如Agent第一次接触某个项目或者用户要求修改一个涉及多个模块、多个文件的功能用这个模式能让Agent更准确地理解需求、完成任务。权衡点会慢一点。相比一上来就动手改代码多了探索和规划这两步对于一些简单的小任务比如修改一个变量名、调整一行代码会显得有点“流程过重”浪费时间。所以在实际落地时可以根据任务的复杂度动态调整流程——简单任务可以跳过探索和规划直接行动复杂任务则严格执行三步流程。7. 上下文隔离子智能体模式避免“信息污染”让Agent专注做事很多Agent在处理长会话、多阶段任务时会出现“上下文污染”的问题——会话一长所有东西都会堆在同一个上下文里调研内容、规划讨论、代码修改、日志输出全混在一起。等真正开始改代码时很多无关信息已经在干扰Agent的判断导致Agent出错。比如Agent先做调研上下文里充满了各种调研资料、文档链接然后做规划又把规划方案、讨论记录加到上下文里最后改代码时上下文里已经堆满了无关的调研和规划信息Agent很容易被这些信息干扰写错代码、漏改内容。上下文隔离子智能体模式就是把任务拆给不同的子Agent每个子Agent都有自己独立的上下文和权限只处理自己负责的阶段避免“信息污染”。简单来说就是“专人专岗”每个子Agent只做自己擅长的事情不接触无关的信息。具体的做法是拆分出三个核心子Agent各自负责不同的阶段探索子Agent只负责调研没有写权限只能读取代码、查询信息、分析结构。它的上下文里只包含调研相关的内容比如代码片段、文档信息、问题分析不涉及规划和执行的内容规划子Agent只负责制定方案没有写权限只能根据探索子Agent提供的调研结果制定修改方案、和用户对齐思路。它的上下文里只包含调研结果、用户需求、规划方案不涉及调研细节和执行操作执行子Agent只负责执行拥有完整的写权限和工具权限只能根据规划子Agent提供的方案修改代码、执行测试。它的上下文里只包含规划方案、需要修改的代码、测试结果不涉及调研和规划的无关信息。三个子Agent之间通过主Agent进行协调主Agent负责接收用户需求把需求分配给探索子Agent然后把探索结果传递给规划子Agent再把规划方案传递给执行子Agent最后把执行结果反馈给用户。每个子Agent只接触自己需要的信息不会被无关信息干扰能更专注、更准确地完成自己的任务。适用场景长会话、多阶段流程或者不同阶段对上下文要求差异很大的任务。比如一个复杂的代码重构任务需要先调研现有代码的问题、再规划重构方案、最后执行重构和测试每个阶段的上下文需求都不同用这个模式能有效避免信息污染。权衡点需要额外协调。主Agent要负责各个子Agent之间的信息传递决定每一步传递什么信息、传递多少信息。如果传递的信息太少子Agent可能会因为缺少细节而无法完成任务如果传递的信息太多又会回到“上下文污染”的问题失去隔离的意义。所以需要设计好信息传递的规则确保每个子Agent只拿到自己需要的核心信息。8. 分支-合并并行模式让Agent“多线并行”提高效率有些任务其实可以拆成多个互不依赖的子任务但很多Agent的默认做法是“顺序执行”一次只能处理一个子任务最后导致整体效率很低。比如用户要求修改10个互不相关的代码文件Agent只能一个一个修改浪费大量时间再比如一个项目需要同时优化前端和后端的代码Agent只能先优化前端再优化后端无法并行处理。分支-合并并行模式就是把任务拆成多个分支让多个子Agent并行处理最后再把结果合并回来提高整体效率。这个模式的思路和我们平时用Git做分支开发很像——每个人在自己的分支上开发互不干扰开发完成后再合并到主分支。具体的做法是拆分任务主Agent把一个复杂任务拆成多个互不依赖的子任务。比如把“修改10个互不相关的代码文件”拆成10个子任务每个子任务对应修改一个文件并行执行为主每个子任务分配一个子Agent每个子Agent在独立的代码副本里工作比如用git worktree创建独立的工作目录互不干扰。多个子Agent同时执行自己的子任务实现并行处理合并结果所有子Agent完成自己的子任务后主Agent把各个子任务的结果合并回来比如把10个修改后的文件合并到主代码库然后执行整体测试确保合并后的代码没有冲突、能正常运行。举个例子用户要求优化一个项目的性能需要修改前端的加载速度、后端的接口响应速度、数据库的查询效率这三个子任务互不依赖。主Agent可以拆分出三个子Agent分别负责前端优化、后端优化、数据库优化三个子Agent并行工作原本需要3小时完成的任务可能1小时就能完成效率提升非常明显。适用场景可以拆成多个互不依赖子任务的场景。比如批量修改多个互不相关的文件、同时优化项目的多个模块、并行执行多个测试用例等。权衡点合并会更复杂。如果不同分支的子任务修改了同一个代码文件的同一部分就会出现合并冲突而且这种冲突可能比顺序处理更难解决。比如两个子Agent同时修改同一个接口的代码一个修改了参数一个修改了返回值合并时就会出现冲突需要主Agent或用户手动解决。所以在拆分任务时要尽量避免子任务修改同一部分内容同时做好冲突处理机制。三、工具与权限让Agent“能做事、不闯祸”控制风险如果说记忆与上下文模式解决的是“Agent知道什么”的问题工作流模式解决的是“Agent怎么做事”的问题那么工具与权限模式解决的就是“Agent能做什么”的问题。从Claude Code的源码来看它在工具设计和权限控制上已经细到了非常具体的粒度远比现在大多数Agent框架要严格。毕竟Agent一旦拥有了工具权限比如执行Shell命令、修改文件、访问外部系统就可能出现风险比如误删文件、执行高危命令、泄露敏感信息。所以工具与权限的设计核心是“既要让Agent能完成任务又要控制风险避免闯祸”。9. 渐进式工具扩展模式按需开放工具不浪费、不混乱很多开发者在做Agent时会一开始就把所有工具都开放给Agent比如文件操作工具、Shell命令工具、搜索工具、数据库操作工具不管Agent用不用得到全部开放。这样做的后果是工具太多Agent的选择成本变高很容易选错工具而且很多工具Agent很少用到开放后反而增加了风险和维护成本。渐进式工具扩展模式就是“按需开放工具”先给Agent最基础、最常用的工具够用就行其他工具根据任务需求再逐步开放。这样既能减少Agent的选择成本又能降低风险避免不必要的工具带来的麻烦。具体的做法是把工具分成两类基础工具默认开放满足大多数简单任务的需求。比如文件读取工具读取代码文件、配置文件、文件写入工具修改代码、保存文件、基础搜索工具查询项目内的文档、代码这些工具风险低、使用频率高默认开放给Agent扩展工具按需开放只有在需要时才开放。比如Shell命令工具执行构建、测试、部署命令、数据库操作工具查询、修改数据库、外部API调用工具访问第三方服务这些工具风险较高、使用频率较低只有当任务需要时才开放给Agent任务完成后立即收回权限。举个例子Agent默认只有文件读取和写入工具当用户要求“构建项目并测试”时主Agent会临时开放Shell命令工具允许Agent执行npm run build和npm run test命令构建和测试完成后立即收回Shell命令工具的权限避免Agent误执行其他高危命令。适用场景工具很多但大多数任务其实只用到一小部分的场景。比如一个AI编码助手平时主要做代码修改、代码优化很少用到数据库操作和外部API调用就可以采用这种模式按需开放工具。权衡点需要额外判断什么时候该开新工具。如果开放工具的时机太晚Agent可能已经走了弯路浪费了一些对话轮次。比如Agent需要执行构建命令但Shell工具没有及时开放Agent可能会尝试用其他方式构建结果失败浪费时间。所以需要设计好工具开放的判断逻辑比如当Agent明确提出需要某个工具时或者当任务中包含需要某个工具的操作时自动开放对应的工具。10. 命令风险分类模式自动判断风险不麻烦、不闯祸如果让Agent随便执行Shell命令、修改系统配置风险会非常高比如Agent误执行rm -rf /命令会删除整个系统的文件如果让Agent每执行一个命令都需要用户确认用户很快就会点到麻木失去耐心而且效率很低。命令风险分类模式就是在Agent执行命令前做一层“风险判断”根据命令的风险等级采取不同的处理方式低风险的命令自动放行中风险的命令提示用户确认高风险的命令直接拦截既控制风险又不影响效率。具体的实现步骤是命令解析Agent在执行命令前先对命令进行解析识别命令的操作类型、参数、影响范围。比如解析Shell命令ls -l会识别出这是“查看目录文件”的操作参数是-l影响范围是当前目录没有破坏性解析rm -rf /home/user会识别出这是“删除目录”的操作参数是-rf影响范围是/home/user目录有破坏性风险分级根据解析结果将命令分成三个风险等级低风险无破坏性、影响范围小的命令比如ls、cat、pwd这些命令只会读取信息不会修改、删除内容自动放行中风险有一定破坏性、影响范围中等的命令比如rm filename删除单个文件、mv filename newname移动文件这些命令会修改或删除内容但影响范围有限提示用户确认后再执行高风险破坏性强、影响范围大的命令比如rm -rf /删除根目录、sudo reboot重启系统、rm -rf *删除当前目录所有文件这些命令会造成严重损失直接拦截不允许执行同时提示用户风险。执行处理根据风险等级执行对应的操作低风险自动执行中风险确认后执行高风险拦截。Claude Code源码中就包含了这样的风险分类逻辑甚至对不同类型的命令制定了详细的风险判断规则比如对文件操作命令根据操作的文件路径、操作类型进一步细化风险等级确保风险控制的准确性。适用场景Agent能执行Shell命令或者会操作外部系统的场景。比如AI编码助手需要执行构建、测试命令AI运维助手需要操作服务器都需要用到这个模式来控制风险。权衡点规则不可能覆盖所有情况。世界上的命令有无数种而且不同的场景下同一个命令的风险等级也可能不同比如rm -rf test如果test目录是空的就是低风险如果test目录里有重要的项目文件就是中风险。所以风险判断规则需要不断调整、优化而且有时候会出现误判要么放过风险操作要么拦住本来安全的命令需要结合实际场景不断打磨。11. 单用途工具设计模式工具专用好理解、好控制很多Agent框架会让Agent直接使用通用Shell命令比如cat、sed、grep来完成文件操作、搜索等任务。这种方式虽然灵活但问题也很多命令不直观比如sed -i s/old/new/g filename很多用户和Agent都不容易理解不好审查很难判断Agent执行这个命令的真实目的更难做权限控制比如允许Agent执行grep命令就无法阻止它用grep命令搜索敏感信息。单用途工具设计模式就是把常见的操作拆成专门的工具每个工具只做一件事有明确的输入、输出和边界。这样不仅 Agent 和用户更容易理解也更容易做权限控制避免风险。具体的做法是将通用操作拆分成多个单用途工具比如读文件工具专门用于读取文件内容输入是文件路径输出是文件内容只能读取不能修改、删除写文件工具专门用于修改文件内容输入是文件路径、修改内容输出是修改后的文件内容只能修改指定文件不能删除文件搜索工具专门用于搜索项目内的代码、文档输入是搜索关键词、搜索范围输出是搜索结果只能搜索不能修改内容路径匹配工具专门用于匹配文件路径输入是路径规则输出是符合规则的文件列表只能查询不能操作文件。这些单用途工具每个都有明确的功能边界比如读文件工具只能读不能写写文件工具只能修改指定文件不能删除。这样一来权限控制就变得非常简单比如只允许Agent读取文件不允许修改就只开放读文件工具关闭其他工具即可。同时单用途工具的输入和输出都很规范Agent更容易使用不容易出错。比如读文件工具只需要输入文件路径就能返回文件内容不需要Agent记住复杂的cat命令参数写文件工具只需要输入文件路径和修改内容就能完成修改不需要Agent记住sed、echo等命令的用法。适用场景需要频繁做文件操作或搜索的Agent。比如AI编码助手、AI文档助手每天都需要大量读取、修改文件搜索相关信息用单用途工具能提高效率、降低风险。权衡点灵活性会受限。单用途工具只能完成固定的操作不可能覆盖所有情况。比如某个特殊的文件修改操作单用途工具无法完成就需要保留通用Shell命令作为兜底在特殊情况下开放给Agent使用。所以在设计单用途工具时要覆盖大多数常见操作同时保留通用工具作为兜底平衡灵活性和安全性。四、自动化让Agent“不偷懒、不遗漏”系统兜底更可靠最后这一类模式可以单独拿出来说因为它贯穿了前面的记忆、工作流、工具三个部分。不管是记忆的整合、工作流的执行还是工具的调用本质上都有一个共同的问题有些步骤是每次都必须执行的但不能指望模型每次都记得。比如改完代码后必须执行格式化执行命令前必须做风险校验切换目录时必须重新加载配置。这些步骤如果只是写在提示词里基本不可靠模型会忘、会跳过甚至在复杂上下文里“理解偏了”导致步骤遗漏出现问题。确定性生命周期钩子模式就是用系统层面的逻辑代替模型的记忆把这些“必须执行、不能遗漏”的步骤挂到Agent生命周期的关键节点上自动执行完全不依赖提示词。简单来说凡是“不能出错、不能漏”的事情都不该交给模型记而应该交给系统兜底。12. 确定性生命周期钩子模式系统兜底不依赖模型记忆Agent的生命周期包含多个关键节点比如会话开始、工具调用前、工具调用后、工作目录变化、会话结束等。确定性生命周期钩子模式就是在这些关键节点上挂对应的自动化动作只要触发了节点动作就会自动执行不需要模型干预。具体的实现方式是定义多个生命周期钩子每个钩子对应一个关键节点以及一个需要自动执行的动作。常见的钩子和对应的动作有会话开始钩子会话开启时自动加载持久化指令文件、初始化分层记忆确保Agent一开始就有规则可依、有记忆可用工具调用前钩子Agent调用工具前自动执行风险校验比如检查命令的风险等级、参数校验比如检查文件路径是否存在避免Agent调用错误的工具、执行错误的命令工具调用后钩子Agent调用工具后自动执行结果校验比如检查代码修改是否正确、命令执行是否成功、日志记录记录工具调用的时间、参数、结果方便后续回溯和问题排查工作目录变化钩子Agent切换工作目录时自动重新加载该目录对应的作用域规则确保Agent使用的规则和当前目录匹配代码修改后钩子Agent修改代码后自动执行代码格式化比如用Prettier格式化前端代码、用ESLint检查代码规范、单元测试确保修改后的代码符合规范、能正常运行会话结束钩子会话结束时自动执行记忆整合去重、删旧、重组、保存记忆到持久层为下一次会话做准备。举个例子Agent修改完一个前端代码文件后触发“代码修改后钩子”系统会自动执行prettier --write filename命令格式化代码然后执行eslint filename命令检查代码规范如果有错误自动提示Agent修改。这个过程不需要Agent记住“改完代码要格式化”系统会自动完成避免遗漏。Claude Code源码中就大量使用了这种生命周期钩子比如代码修改后自动格式化、会话结束后自动整合记忆、工具调用前自动校验风险这些自动化动作保证了Agent的行为一致性和可靠性也是它能成为生产级产品的重要原因。适用场景存在必须严格执行、不能遗漏的步骤的场景。比如代码开发必须遵循规范、命令执行必须经过风险校验、记忆必须定期整合这些步骤都可以通过生命周期钩子自动执行。权衡点出了问题不太好排查。这些自动化动作是在对话之外运行的Agent和用户都看不到执行过程如果出现问题比如代码格式化失败、记忆整合出错很难快速定位问题所在。所以需要做好日志记录把每个钩子的执行过程、结果都记录下来方便后续排查问题。五、结语这些模式是Agent长期稳定运行的基石看完这12个设计模式你会发现它们不是空谈的理论而是从Claude Code这个生产级AI编码助手的源码中提炼出来的架构智慧。这些模式解决的都是Agent开发中最常见、最核心的痛点,记忆混乱、流程混乱、权限失控、步骤遗漏。我们常说Agent的核心是“智能”但智能不仅仅是模型的能力更是架构的设计。模型会迭代更新今天用GPT-4明天可能用更强大的模型工具会不断升级今天用Shell命令明天可能用更高效的工具但这些设计模式不会很快过时。因为它们解决的是“Agent如何稳定、高效地完成任务”的本质问题是Agent架构的基石。这次Claude Code的泄露给了我们一个难得的窗口让我们能窥见顶级AI编码助手的内部架构。这样的窗口可能不会一直存在但这些从真实场景中打磨出来的经验会一直沉淀下来成为每一个Agent开发者的宝贵财富。如果你正在做Agent应用不管是AI编码助手、AI运维助手还是其他类型的Agent都值得认真研究这些模式。它们不是“锦上添花”的优化而是决定你的系统能不能长期稳定运行、能不能真正落地使用的基础。当然这些模式也不是一成不变的你可以根据自己的实际场景灵活调整、组合使用。比如小项目可以用“持久化指令文件模式”“单用途工具设计模式”简单高效大项目可以用“作用域上下文组装模式”“上下文隔离子智能体模式”“确定性生命周期钩子模式”保证稳定和安全。

更多文章