Claude Code 的深度控制能力, 正在对开发者关于 AI Agent 的认知, 产生颠覆性影响。从 CLAUDE.md 的全局配置而言, 再到 Dynamic Workflows 的动态编排, 当下本文会去拆解 7 种上下文注入方法的实战价值。比方说, 为何 Rules 需要路径限定? Skills 为何并非提示词? Hooks 又怎样去实现确定性防护? 这些工程化思维, 恰恰是打造高效 Coding Agent 的核心密码。


今日足球现场直播-高清无插播
如何让各种 Coding Agent 更好的干活?
除了常规的对话之外, Claude Code(也能够是 Codex)实际上还给出了一些不一样的控制方式(或者称作: 上下文注入), 例如: CLAUDE.md、Rules、Skills、Subagents、Hooks、Output Styles、以及 System Prompt Append。
接下去, 我要详细说一说这些稀奇古怪的事物, 采用最不拐弯抹角、最能将你稳稳承接住。
的方法,尝试讲清楚这些玩意儿都是个啥,让你最听人话
的知道:
→ 这些方法各自适合放什么样的指令
为什么, 在名为 CLAUDE.md 的文档里面, 写着「永远不要做 X」这样的内容, 是不靠谱的呢。
→ Skills 和 Subagents 到底怎么玩
→ Hooks 是怎么做到确定性执行的
Claude, 怎么通过“→ Dynamic Workflows”来让它自己去编写编排脚本呢。
除此之外, 近来 Claude 新近增添了一项名为 Dynamic Workflows 的能力, 该能力能够使 Claude 自行编写编排脚本, 进而协调多个 agent 并行开展工作, 在此也会试着阐述清晰。
这篇文章里头的图片, 以及部分的描述, 是源自Claude Code官方文档, 要是有兴趣的话, 同样能够去查看原始文档:
Steering Claude Code https://claude.com/blog/steering-claude-code-skills-hooks-rules-subagents-and-more
剧前提要
首先, 我们定然必得去领会懂得大模型的运行工作原理, 简要概括阐述来讲就是, 将足量充足的上文填塞入其中, 而后模型便能够给出相当不错足够良好的结果。
AI的能力, 其问题, 以及用法, 本质上都是由上下文来决定的。用户发出一条请求, AI会将请求和它所能获取到的所有材料拼凑在一起, 进而组成一段完整的上下文, 然后再继续往下生成结果, 如此循环往复地进行着。
而对于Agent来说, 你要先给出初始的目标, 再给出背景信息, 还要给出限定条件等等情况之后, 它便自行去构建那上下文。
将重点进行划分, Agent与ChatBot之间存在区别, 区别体现在一件事情上, 这件事情就是【究竟是谁来构建上下文】。
ChatBot 靠人喂,你给它什么材料它就用什么材料
代理会自行去搜索网页, 会去读取文档, 会去调用工具, 将有用的内容写入上下文, 发觉不够时还会自动回过头来继续寻找。
对于 Agent 来讲, 其仅能瞧见自身上下文范围之内的内容, 那么借助一些工程方面的手段, 去限定 Agent 在哪些步骤之时, 能够看到哪些事物, 就显得格外重要, 因此我们便拥有了像 claude.md、skill 等诸如此类的上下文注入方式。
此处, 我制作出一个表, 用以方便诸位, 能够更优地去实行比较, 不同情况下的上下文注入方式。
如果追一下这几个东西的设计方法的话,会发现更多有趣的点:
下面,我们来具体的讲解每一种上下文注入
CLAUDE.md
算是那个被称作项目的「说明书」, Claude Code在启动的时候会自动进行读入。
【全程都把你稳稳接住】
这个东西极其相似于GPT当中含有的Instruction/自定义指令, 又或者是API Call里的System Prompt, 在项目开始启动之际就会进行读取。
在 Claude 里,这个叫做 CLAUDE.md
在 Codex 里,这个叫 agents.md
这些文件放置于根目录, Claude Code启动后会自动读取, 你能够在其中约定构建命令、写上目录结构、编码规范呀以及团队约定等等。
然后这里得说一下,CLAUDE.md 分两种加载模式:
始终加载处于根目录的CLAUDE.md, 再加上你本地带有个人偏好的CLAUDE.md。启动之时便进行加载, 经过压缩后重新去读取, 在整个过程当中全都按照需求加载子目录下的CLAUDE.md(就好比app/api/CLAUDE.md), 仅仅是在Claude读取该目录下的文件之际才会加载。压缩之后会丢失, 一直等到再次碰到那个目录才会重新加载。
只在Claude碰到那个目录时, 子目录CLAUDE.md才会加载。
关于此事, 官方给出的建议是, 在每个团队的目录之中放置各自的CLAUDE.md, 开发者借助claudeMdExcludes进行配置, 以此跳过那些与自身团队不相关的文件, 并做到团队之间彼此不相互占用上下文语境。
如同那会持续膨胀的instruction一般, CLAUDE.md也有可能跟所有无owner的配置文件那样持续膨胀, 毕竟人向来热爱不断的积攒规则、添规则, 紧接着。这个CLAUDE.md也会持续膨胀, 致使指令遵循率也降低。
CLAUDE.md 的正确用法
告知 Claude, 项目的样子是怎样的, 构建命令是什么。将流程以及约束放置到 Rules、Skills 这些根据需求加载的机制当中。
在针对组织级状况下的安全策略以及合规要求时, 借助MDM , 也就是移动设备管理工具, 或者是配置管理工具, 能够把一个统一进行集中管理的CLAUDE.md, 部署于开发者的机器之上, 而这一份文件是不可以被个人配置给排除掉的。
Rules
这针对特定文件, 或者是特定目录所设定的约束, 能够达成「只有碰到这类文件的时候, 才会生效」这样的情况。
Rules是位于.claude/rules/目录下的markdown文件, 你能够将它理解为更为细致的CLAUDE.md, CLAUDE.md是在全局范围内生效的, Rules则能够仅在遇到特定路径的文件之际才进行加载。
不添加路径限定的 Rule, 与写于 CLAUDE.md 里的情形并无差异, 启动之时便会加载, 在整个过程中占用 token。加入路径限定之后, 便会呈现出不同的状况。
路径包括, “src/api/**”, “**/*.handler.ts” , 对于所有 API handler, 都必须运用 Zod 来进行输入校验。
只有在 Claude 读取处于 src/api/ 之下的文件之际, 这条 Rule 才会被加载。于做文档之时, 这条规则根本不存在于上下文当中, 不会浪费 token。
至于什么时候该用 Rule?
当存在这样一条约束情况, 即它是跨目录的, 比如说所有的migration文件仅仅能够进行追加操作, 所有的测试文件都必须使用某个特定的mock库, 然而却又不要求在全局范围内生效的时候, path范围限定的规则便是最为合适的了。
Skills
这个算得上是众人最为熟知的「技能包」, 唯有在被调用之际, 才会加载完备的内容 , 平常仅仅占据几十个token。
Skills所处的位置是在.claude/skills/这个目录之下, 每一个skill它都是一个文件夹, 文件夹里面存在着一个SKILL.md, 该SKILL.md用于定义名字、描述以及完整指令。
然后,这里我必须要说一点开云app官方最新下载地址开云真人app官网登录app,也是常见的误区:
Skill并非提示词, 它通常也不作为数据源呢, 一般来说也不会出现“小红书搜索Skill”这种情况的。
Skill的本质, 是要将那一堆文件, 按照约定好的结构去进行打包, 打包成.zip格式, 接着再把后缀给改成了.skll , 所以, 当你去调用别人的Skill的时候, 其本质就是把别人打包好的文件夹喂给大模型: 要是文件夹里面有提示词的话, 当然能够把Skill当作提示词来使用, 但是绝对不可以说Skill就是提示词。
讲回来, 在 Agent 启动之际, 并非将 Skill 的全部内容予以加载, 仅仅是把它的名字以及描述加载进来(那不过是几十个 token 的事情), 而完整内容要等到 skill 被调用之时才进入上下文。
Skill调用方式有两种, 一种是通过人工斜杠命令, 像/code-review这样的, 另一种是靠着Claude自动匹配任务。
凭藉系统提示促使 Skills 得以触发, 唯有在实际运用之时方可纳入到上下文里边?
CLAUDE.md所放置的, 是像构建命令、目录结构这类Claude随时都要知晓的事实, Skill与之的关键区别便在于是「流程对事实」, Skill放置的则是诸如部署清单、发布流程、review checklist这类得依照步骤实施执行的流程, 流程并非需全程占据token, 仅在用到之际加载就行了。
倘若对话内容的长度超出常规, 当对话内容遭遇被压缩的状况时, 各种各样不同的内容将会被运用以不同的方式来进行压缩。
根目录下的CLAUDE.md不会遗失, 确切来讲, 压缩之际缓存会被清除掉, 然而紧接着Claude Code会再度读取此文件, 故而它始终存在于上下文当中。
包含CLAUDE的子目录会不见, 不过等Claude再度触及那个子目录时它又会再度被加载。
被压缩后的 Skills 同样会被再度注入, 然而存在着一个共享的 token 预算上限这事。要是调用了过多的 skill, 那么最早的那些就会被赶走呢。
Anthropic存在具备一份完整的skill构建指南, 去观看这份指南。
https://claude.com/blog/complete-guide-to-building-skills-for-claude
Subagents
把这个弄成较多独立的上下文窗口, 让 Agent 在其中执行任务, 执行完仅交回结论, 如此这般, 相对而言是比较易于领会的。
Subagents属于.claude/agents/目录里边的markdown文件, 它借助YAML frontmatter去定义名字, 并且描述模型选择以及可用工具, 你能够将其视作一个专门针对某类任务处理的独立助手。
跟Skills的关键区别侧重于隔离性。Skill于主线程当中执行, 在此过程里你能够可视每一步的中间具体进程。Subagent在自身单独的上下文窗子内部运行, 同时主会话难以见到它的中间进程情况。
Claude Code的上下文窗口构造形式, Subagent具备自身单独的窗口。
有一个被称作subagent的, 进行了五十轮的搜索行为, 还阅读了二百个文件, 然而在主会话的上下文窗口之中, 仅仅只是多了一段摘要, 这正是使用它的原因所在: SubAgent做的是那些繁杂辛苦的工作, 不会去污染主会话, 而且还能够使效率得到加快。
于实际运用当中, 存在三个典型场景可供去尝试, 其一为深度搜索, 此场景下大量中间结果并无保留之需求, 其二是日志分析, 即需翻找几百行 log 去寻觅问题, 其三为依赖审计, 也就是要逐个检查库版本。
代理的下属这东西确实挺好使, 用来做跑测试等之事非常让人省心, 这几天我正着手处理AGI Bar的饮酒计划, 随后制作了一个小程序, 那完全是由代理的下属组成的集群操持的, 在此我放一张图让大家感受一番(其实中途我中断过一回, 实际上已然运行了40多个小时了)。
然后, Subagent能够进行嵌套, 其最深可嵌套至五层, 在后续讲述Dynamic Workflows的时候会见到, 这种嵌套能力乃是大规模编排的基础。
怎么选?
需要看到每一步的中间结果吗?需要就用 Skill
不需要,让它自己跑完给你一个结论,用 Subagent
Hooks
这东西有着这样的本质, 它是那种触发脚本的情况, 在碰到特定的问题的时候, 就会实现自动执行, 这和模型的判断力没有关联, 是这样的情况。
Claude Code 里最不具 AI 特性的机制就是 Hooks , 你于 settings.json 中注册一个 hook , 这一 hook 是用于指定当某个事件出现之时, 去执行那条命令的, 你知道 IFTTT 么, 就是呈现出 if this , then do that 这种形式的东西。
八种 hook 事件覆盖从启动到完成的全流程
可以先看一下上面这张图,有八种 Hook 事件:
自动追加当前 sprint 信息
那, Hook这种动作自身存在着五种类别, 分别是command, 也就是执行命令, 还有HTTP, 即调接口, mcp_tool, 便是调用MCP工具, prompt, 是让模型去进行判断, 以及agent, 是启动agent来进行判断。前面三种是完全按照确定性去执行的, 而后两种依靠模型的判断力。
若存在某件事, 其决然不会发生, 那就运用 hook 或者 permission 去打造硬护栏。
比如说, 之前我在搞「龙虾大逃杀」这件事的时候, 不是遭遇被踢的情况了嘛…艹…龙虾大逃杀: 那些存活下来的, 会拿到 Mac mini|群里面存在着一只就是专门去踢人的龙虾。
那个时候, 我是出于想要偷懒, 从而省去一些麻烦事儿, 才直接把相关内容写在了系统提示词当中的, 除此之外没有添加任何防护措施, 然而江湖充满险恶, 人心难以揣测……屮屮屮屮屮….遭遇被踢之后, 经过痛定思痛, 才设置了permission硬护栏, 活动这才能够顺利开展进行。
话再说回来, 在做安全防护之际, 任何的提示词层面的防护皆不靠谱, 都极有可能在长会话情况、压力较大之时、或者受到prompt injection干扰这下失效, 而PreToolUse hook拦截具备确定性, 身为大守密者, 始终帮你牢牢把控住像「永远不要执行rm -rf」这般的信息。
更多 hook 配置细节:查看指南
https://claude.com/blog/how-to-configure-hooks
Output Styles
你能够借助这个, 将 Claude Code 的「人设」改成猫娘, 把它投入到system prompt 里, 权重在最高级别, 但是影响面也属于最为广泛的那种。标点符号。
Output Styles此物的位置, 于.claude/output-styles/之下, 可注入至system prompt里, 永远不会被压缩, 并且指令遵循权重最高。
但在另外一方面, 你要明确, 自定义output style会将默认的system prompt replacing掉。
这儿讲一讲system prompt, 它是Claude当中的内置基础提示语, 涵盖了诸多定义, 像怎样限定改动范畴, 安全问题如何处置, 改完代码要先运行测试。
若你不在frontmatter里添加keep - coding - instructions: true, 那就不行, 除非你添加 , 添加过后才行 , 不然不行。
要是针对这个情况你打算进一步去进行研究的话, 那么能够先瞧一瞧三个被内置的style, 其中包括, Proactive(自主决策多), 还有, Explanatory(教学模式), 以及, Learning(协作编码)。
System Prompt Append
通过 CLI 参数, 临时往 system prompt 后面追加内容, 不改变默认指令, 仅对当次调用起作用, 使其生效。
倘若认为Output Styles变动幅度过于大, append-system-prompt乃是一种更为像甜品的类别。它仅仅朝着默认system prompt的后面增添一段内容, 并不替换任何事物。Claude Code最初的软件工程指令全部得以留存。
在命令行界面当中, 你能够如此进行输入, 克劳德, 破折号, 追加系统提示, 引号, 所有回复运用中文, 代码注释同样使用中文。
这回的这条指令, 仅仅是针对当次调用才会产生效力, 它不会去写文件, 而且也不会跨越session , 是适于去添加那种编码规范、输出格式、语气偏好之类的轻量性质的指令的。
压缩行为与Output Styles相同, 它不论何时, 都绝对不会被压缩。
可是, 需要留意一种递减效应, 那就是在增加附加指令的情形下, Claude针对每一条指令的遵循比率会越低, 尤其是当指令之间存在冲突状况时, 遵循比率降低的速度会更快。
常见误区
对于这些注入方法, 实际上也是存在一些常见的配置误区的, 这些误区的内容源自官方之处, 我针对其进行了翻译以及补充处理。
错误:「每次 X,必须做 Y」写在 CLAUDE.md 里
比如说, 你期望在每次对文件进行编辑之后, 能够自动去运行formatter。像这样的行为, 应当运用 PostToolUse hook。对于模型而言, 选择去做一件事情, 跟自动执行一件事情, 这二者简直完全就是两码事。
错误:「绝对不要做 Z」写在 CLAUDE.md 里
PreToolUse hook 被用以制成硬护栏来实施绝对性约束, exit code 2能够直接进行阻止。Managed Settings 被用来当作组织级别的护栏, 由管理员实施部署, 用户无法对其予以覆盖。
错误:30 行的流程写在 CLAUDE.md 里
关于部署流程, 将其放置于skill之中, 而review checklist也放置于skill里。CLAUDE.md, 则专门用来放置事实, 放置流程的是skill。
错误:Rule 没加路径限定
仅限于 src/api/** 的那种约束, 要是没添加 paths: 的话, 呈现出来的样子就如同写于 CLAUDE.md 当中那般, 整个过程加载白白搭进去 token,白费了。
错误:个人偏好写在项目级文件里
将个人偏好, 像是 commit message 格式这样子的, 放置于用户级别的本地文件之中, 而项目级别的文件仅仅放置团队达成的共识。
Dynamic Workflows
不久之前, Anthropic 发布了诸如 dynamic workflows 的动态工作流, 简而言之, 这意味着让 Claude 自主撰写编排脚本, 用以协调多个 subagent 开展并行工作, 旨在解决繁杂任务。
其诞生,是为了解决默认 harness 的三个老问题:
被称为偷懒的代理懒惰行为, 安全审查需要查五十项, Claude查到第三十五项就宣告完成了。
趋向于自我偏好的Self-preferential bias, 致使Claude去检查自身所编写的代码, 而它往往会倾向于认为不存在问题。
指向目标漂移, 就是Goal drift, 在长会话里, 每一次进行压缩, 都是带损的, 边缘处的需求以及约束, 很容易在压缩这个行为当中丢失。
在这个过程中,三个核心函数起到了作用:
把提示信息给到代理, 或者提供可选参数, 使其并列运行, 再将一系列项目放入流水线。
利用独立上下文窗口, 将Dynamic workflow里的每个子任务隔离开, 从结构方面把这三个问题给消解掉触发方式特别直接, 就是跟Claude讲「使用一个workflow」, 或者运用触发词ultracode。
静态工作流 vs 动态工作流
说起Dynamic workflow的编排方式, A社归纳总结出来的有下面这六中: 。
常见的工作流编排模式
首先, 运用一个 classifier 来对任务类型予以判断, 之后, 将其分发给对应的专用 agent 去进行处理, 此过程即为 Classification-and-act。
Fan-out-and-synthesize
把任务进行拆分, 拆成 N 个子任务, 针对每个子任务, 让一个 subagent 去执行, 最后由一个 agent 对结果进行汇总。
Adversarial verification
为每一个执行agent配备一个验证agent, 依照标准对抗性检查来输出标点符号。
Tournament
N 个 agent 用不同方法做同一件事,逐对比较选出最优
Generate-and-filter
先大量生成,再过滤去重,只留验证过的高质量结果
Loop until done
对于不设置固定的轮数, 而是进行循环, 持续生成智能体直至合乎终止所规定的条件, 存在实际的案例。
取之前 Bun 从 Zig 重写至 Rust 时运用 dynamic workflows 这一情况当作例子, 于该过程里, 每一次修复皆运行一个 subagent 在独立的 worktree 里头施行更改操作, 另外还有一个 agent 开展对抗性的 review, 待通过之后再进行合并。
深度验证模式:执行 agent + 验证 agent 对抗
Claude Code里内置的一个名为Deep research的工作流程技能(/deep-research), 它会进行扇出搜索, 会抓取源文档, 会对每条声明进行对抗验证, 最后汇总成带引用的报告。
另外存在一种反向运用情况, 并让workflow去翻动你最近的50个session从中找出你反复修正Claude的模式, 之后聚类成为规则候选, 再对抗验证每一条用以判断能不能真的防止之前出现错误, 要是通过了就写进CLAUDE.md!
反向用法:从历史 session 挖掘规则候选最后
这些借助上下文进行注入的方法, 其根本实质是去延续这样的一种思路。那便是在有需求之时便会出现, 而当不存在需求之际就会消失。
对应到工程上,就是:不同的指令开云正版app下载开云app在线入口,要有不同的生命周期
有的要求自始至终需在现场(CLAUDE.md), 有的仅于特定情形下才会现身(path - scoped Rules), 有的是在被运用之际才进行加载(Skills), 有的是在单独的窗口当中运行(Subagents), 有的全然不会占据上下文(Hooks)。
将任何指令都一股脑地放置于一个CLAUDE.md之中, 这是最为简便的举措, 然而, 这同时又是最为浪费资源的操作, 并且还会对上下文造成污染, 在开展正式项目期间, 这种做法是不被推荐的。
CLAUDE.md 文件放置事实, Skill 放置流程, Hook 放置护栏, Subagent 被分配隔离任务。
接着, 如果整个团队都在使用整套 Agent 系统, 那么便能够试着将这些物品整理成一个 plugin, 以此便于进行共享或者分发。
那这个插件到底该怎么去做, 在代理时代是怎样进行项目管理的, 这就是我们下次再去说的事儿。
标签: ClaudeCode 上下文注入 AIAgent 编程助手 工程化思维
还木有评论哦,快来抢沙发吧~