如何把一个“会写代码的聊天机器人”,训练成一个“听话、可控、可复用的工程队”?
关键升级路径就四步:
第一步:别乱喂信息,规则写短、写狠
第二步:别让 AI 一股脑干活,让它先想
第三步:别让上下文爆炸,用分身(subagents)隔离
第四步:别相信规则,用 hooks 把规则变成铁律
最后你会发现一个反直觉结论:真正拉开差距的,不是提示词,而是那些没人看的配置文件。
你的“驯兽手册”CLAUDE.md:别写成800行的裹脚布,4行就能让它服服帖帖
我见过一个“大神”,他写的CLAUDE.md文件足足有800行!里面详细到了每个文件夹是干啥的、每个API的每个参数该怎么用、每个边界情况该怎么处理。
我承认,这位老兄确实用心了,但说实话,这就像你给一个刚出生的婴儿喂了一整本《大英百科全书》,他不仅消化不了,还会被噎得翻白眼。
Claude的注意力是有限的,就像你上课听讲,前面十分钟能听进去,后面就开始神游天外了。
我的原则是,一个CLAUDE.md文件,最好短小精悍,控制在200行以内。官方文档说文件会全部加载,但经验告诉我,文件越短,它执行得越好。文件一长,不仅浪费宝贵的“上下文”空间,Claude还会“选择性失聪”,你说你的,它干它的。那多出来的内容放哪儿?放.claude/rules/里,或者直接用“@”引用文件。记住,CLAUDE.md越长,Claude越不鸟你。200行是我给自己定的天花板,不是官方硬性规定。
那CLAUDE.md里到底该写啥?写那些Claude光看代码看不出来的“为什么”。比如架构决策、历史遗留的教训、老板定的奇怪业务限制、代码风格偏好。千万别写啥API文档、哪个文件是干啥的,这些它自己看代码就能明白。我的全局CLAUDE.md文件,就只有短短4行,但就是这4行,救了我无数次,让我少说了几百句“不不不,我不是这个意思”:
- commit messages use conventional commits
- explain your plan before making changes, wait for my confirmation
- prefer simple solutions, no over-engineering
- don't refactor files I didn't mention
翻译过来就是:提交信息要规范;动手前先给个计划,等我点头;能用简单方法就别整那些花里胡哨的;我没让你动的文件,你就当它们不存在。
到了具体项目里,我会放项目专属的“小贴士”:
# Ship Faster |
更高级的玩法是,把规则拆分到.claude/rules/文件夹里,每个文件开头用YAML格式写上它管哪部分代码。比如下面这个规则,只有当Claude动到src/api/目录下的文件时才会生效,既精准,又省了其他地方的空间:
--- |
这就像你给家里的不同区域贴标签:厨房不能打篮球,卧室不能吃火锅。规则越清晰,AI越不会乱来。Claude Code加载指令的层级有点绕,但大致优先级是:企业管理指令 > 项目指令(./CLAUDE.md或.claude/CLAUDE.md)> 用户全局指令(~/.claude/CLAUDE.md)> 文件夹规则(.claude/rules/和~/.claude/rules/)。我的做法很简单:全局文件管个人习惯,项目文件管项目事实,规则文件夹按目录分权限。三层各司其职,清清爽爽,绝不混在一起。
让AI自己“左右互搏”:6个虚拟人格帮我找bug,15分钟顶我两周
想象一下,如果你有一个庞大的代码库,每次修改都要跑一遍测试、分析日志、搜索整个项目,你的“上下文”窗口是不是很快就爆了?把这些庞杂的操作都塞进主会话里,Claude的智商就会直线下降,开始胡言乱语。这时候,“子智能体”就派上用场了。它的核心价值在于“隔离”。每个子智能体都有自己的独立上下文窗口,它在那里面怎么折腾都行,最后只把一个精简的总结返回给你。Claude Code支持自定义子智能体,你可以给它设定工具权限和角色描述。当任务描述匹配时,Claude会自动把这个活儿派给对应的子智能体,让它去自己的小房间里干活。
我常用的有三个模板:探索者(只读,快速搜代码)、规划者(只读,做研究分析)、执行者(全能,干复杂活)。自定义子智能体放在.claude/agents/文件夹里,比如下面这个代码审查员:
--- |
注意!子智能体会默认继承父会话的工具权限。如果你想让它真的“只读”,光在描述里写“只读”是没用的,必须在tools里明确只给它读的权限,否则它拿到大砍刀就乱砍了。
但我用子智能体最“骚”的操作,不是让它写代码,而是让它模拟用户。我建了一个AI配置系统,自己用了两周,感觉稳得一批。但我不确定别人用起来会咋样。于是我设置了6个AI人格,每个都扮演一个不同类型的“找茬专家”,然后我把它们都当成子智能体派出去干活。15分钟后,它们居然找出了5个我自己用了两周都没发现的“信任断层”:
- “怀疑一切”的高级工程师:10年经验,对新工具天然不信任,专盯着安全、副作用、隐藏依赖看。
- “心狠手辣”的安全审查员:背景是安全审计,专抓密钥泄露、权限边界、远程执行风险。
- 一脸懵的新手维护者:刚接手项目,啥背景都没有,就看文档清不清晰、上手顺不顺畅。
- “键盘如飞”的CLI重度用户:只看命令行好不好用、命令一不一致、能不能组合起来、是不是幂等的。
- “运维大爹”SRE:负责生产环境稳定,专看可观测性、故障恢复、通知管道靠不靠谱。
- “按图索骥”的文档小白:完全照着文档一步一步操作,绝不看源码,就找README和示例里的茬。
我把这6个“大仙”的任务一股脑全派给子智能体。15分钟后,汇总回来的结果,揭露了5个致命的信任断层:
1. 有个命令执行失败了,但没给任何报错信息,新手维护者完全蒙圈。
2. README里居然没有一个“我第一步该干啥”的30秒快速入门指南。
3. 某个功能的描述和它实际干的事对不上,CLI用户立马就炸了,信任感瞬间归零。
4. 那个查看状态的命令,居然偷偷摸摸改了东西,不是真正只读的。安全审查员第一个就抓住了它。
5. 通知管道没有健康检查,运维大爹拒绝承认这玩意儿能当监控用。
修复完这5个问题后,我又让这6个“大仙”跑了一轮。所有高优先级的信任断层全部清除,剩下的只是些文案和观察性上的小修小补。这种级别的测试,让我自己手动测,一周都够呛。AI呢?15分钟跑完两轮。这已经不只是一个测试技巧了,这是一种全新的质量保障思路:让AI扮演你的用户,在你发布之前就把问题揪出来。你可以说,这是把“人肉测试”的成本,降到了几乎为零。
别给AI当“渣男”,指令越清晰,它越不会“超常发挥”闯大祸
有一次,我懒癌犯了,给Claude Code下了一个非常“含糊”的指令:“帮我优化一下这个函数”。好家伙,它就像脱缰的野马,把这个函数拆成了三个文件,加了一个工厂类,还改了所有引入的路径。我花了二十分钟审阅,最后发现,这特么根本不是我想要的。问题出在哪?指令太模糊,就像你对服务员说“给我来点吃的”,结果人家把满汉全席给你端上来了,你还没法说人家错。一个优秀的指令,只需要三个要素:目标、约束、上下文。
看这个例子:
Goal: Reduce getUserData() response time from 800ms to under 200ms |
目标明确:把响应时间从800毫秒降到200毫秒以内。约束清晰:别改接口签名,别加新依赖,只改这一个函数。上下文精准:用“@”符号加上行号,直接把Claude钉在精确的代码行上。验证标准:所有测试必须通过。最后再用“Don't”给它划一道红线:别动数据库,别加缓存。用“@”加行号来锁定代码,精准度极高。如果是UI问题,我直接Ctrl+V把截图粘贴进去,比用文字描述布局准确十倍。
这里有个秘密:“不要”比“要”更重要。你说“不要加新依赖”,比列一个10个允许的库名单有效得多。因为Claude有时候会过度热情,你让它修个bug,它顺手把周围的代码也给重构了。你说“只改这个函数”,就省去了后面无数的麻烦。当然,凡事都有两面性。探索性的任务,反而需要模糊的指令。比如“看看这个模块有啥潜在问题”,这种开放性的提问,能发现一些你没想到的“五个特定方面”以外的问题。等到了真正要动手实现的时候,再切换到精准模式,把缰绳拉紧。
“计划模式”:给你的冲动戴上紧箍咒,先画图纸再盖楼
有一次,我脑子一热,让Claude Code直接重构一个600行的路由文件。它干到一半,引入了循环依赖,然后它自作主张去修循环依赖,结果越修越乱,整个项目都开始报错。我气得按下了Ctrl+C,结果不仅任务没完成,之前半小时的上下文也全丢了。那次之后,但凡遇到复杂的任务,我一定先用“计划模式”。进入计划模式有三种方式:一是在启动时加参数claude --permission-mode plan;二是在会话中狂按Shift+Tab直到屏幕上出现“Plan Mode”;三是直接跟它说人话:“先别改代码,给我一个实现计划”。
在计划模式下,Claude只输出计划,不执行任何操作。这里最关键的一步是:按下Ctrl+G,它会用你的编辑器打开这个计划文本。你可以像修改自己的作业一样,删除不必要的步骤,增加你想到的约束条件,然后确认,Claude再执行更新后的计划。修改一个计划只需要一句话,而修改已经写错的代码,可能要花十倍的时间。
我的标准四步工作流是这样的:探索(让Claude读代码)→ 计划(输出计划)→ 执行(按步骤来)→ 验证(跑测试)。什么时候不需要计划模式?那些只有唯一实现路径的任务,比如重命名一个变量、改个错别字、加一行日志,这些走直线就能到,不需要绕路。计划模式,就是给那些“条条大路通罗马”的任务准备的,让你在出发前先选好走哪条路,而不是每条路都试一下。
“上下文”不是垃圾桶,别什么都往里扔,学会“断舍离”让AI更清醒
有一次,我正干得起劲,随手敲了个/context看了一眼上下文使用率,好家伙,78%!然后Claude就开始抽风,反复提出我们刚刚已经否决的方案,就像得了失忆症一样。那一刻我明白,“/compact”这个命令该成为我的日常习惯了。Claude Code支持非常大的上下文窗口,但一个塞得满满的上下文,并不会因为超过上限而“崩溃”,它只会因为“注意力涣散”而失效,质量急剧下降。我有五个管理上下文的策略:
1. /clear:把一切都清掉,适合在切换完全不同任务时用。
2. /compact [focus]:压缩历史,但保留关键点。适合在继续同一个任务时用。比如可以这样写:/compact keep: current task goal, completed steps, pending issues,告诉它在压缩时,要留住哪些东西。
3. /context:随时查看上下文使用情况,心里有数。
4. 子智能体:把不同模块的任务交给不同的子智能体,别在主会话里“大锅乱炖”。
5. 压缩保留指令:在CLAUDE.md里告诉它,压缩时什么必须留下。
# Compression instructions |
Claude Code在上下文管理上其实有两套东西:一套是CLAUDE.md文件,另一套是自动记忆。在我的用法里,项目指令是用来共享项目事实和团队标准的,用户指令(~/.claude/CLAUDE.md)则是我个人偏好,跟着我走遍所有项目。自动记忆存在~/.claude/projects/里,会话开始时,MEMORY.md的前200行会自动加载。你可以用/memory命令来查看加载了哪些文件、管理自动记忆。总之,学会给上下文“断舍离”,AI才能保持清醒的头脑。
“权限”就是给你的AI拴上链子,让它在安全区里蹦迪
有一天,Claude在修bug的时候,顺手把一个“看起来没用”的配置文件给删了。那个文件,是生产环境的密钥引用入口。我那个气啊,恨不得顺着网线过去给它一拳。那次之后,我花了半小时,仔仔细细地配置了.claude/settings.json,给它画了个“安全区”:
{ |
这里有个优先级:deny > ask > allow。
“deny”是最高指令,如果一个命令匹配了“deny”,哪怕“allow”里也有它,它也不会执行。设置文件也有自己的层级,从组织策略、命令行参数、本地配置(不提交)、项目配置(共享)、到用户全局配置。这里有个微妙的地方:像权限列表这种数组类型的设置,会在不同层级间合并,而不是覆盖。也就是说,你在全局配了一个“deny”,在项目里又配了一个“deny”,两个都会生效。我通常这样分工:项目层级负责禁止业务风险,比如删数据库迁移文件;全局层级负责禁止安全基线,比如执行“rm -rf”。两层分开维护,互不干扰。
还有一个铁律:只读,就是只读,别给我“顺便”干点别的。我之前写的一个查看状态的命令,偷偷摸摸调用了同步功能,心里想的是“反正都检查了,顺便同步一下呗”。结果让那6个AI人格一测,安全审查员立刻抓住了我:“你的只读脚本有副作用,我无法信任它的输出。”这就是血泪教训,副作用会毁掉信任。一旦失去了信任,它提供的所有信息你都得打个问号,那这工具就废了一半。
Hooks:从“建议”到“法律”,让AI不敢忘记你的“家规”
我在CLAUDE.md里写了一条:“提交前运行lint检查。”Claude有时候会跳过,因为它觉得“这情况特殊”。看,写在文件里的规则,对AI来说就是“建议”,它有时候会觉得自己是特例,可以忽略。但Hooks不一样,它是代码级别的强制执行,永远忘不了。Hooks有四种类型:command(跑个命令,读标准输入里的JSON)、http(发个POST请求)、prompt(让大模型做个是/否判断)、agent(派个子智能体去验证)。
我这里有几个实战场景:
- 自动格式化:每次编辑完文件,自动跑Prettier。这个hook会在“PostToolUse”事件触发,只要工具匹配“Edit”或“Write”,就执行命令,用jq提取文件路径,然后格式化它。
{ |
这里有个关键点:只有“PreToolUse”这种在工具执行前触发的事件,并且退出码为2时,才能真正阻止动作。而“PostToolUse”是事后诸葛亮,木已成舟,你只能看着它发生。
- 压缩后重新注入:当长对话被压缩时,重要的指令可能丢失。一个hook可以自动把它们重新塞回去:
{ |
Hooks真正的价值,在于把工程规范变成系统级的约束。自动格式化只是个小甜点。人总会忘记规则,但代码不会。Hooks就是那个铁面无私的执法官,让AI想犯错都难。
高阶玩法:让AI从我的修改里偷师,自动学习我的“祖传代码风格”
这个部分属于“进阶实验”,比较硬核,如果你只想用好Hooks,前面那章就够了。我这个逆向玩法,核心思想是让AI从我的修改里提取规则。流程是这样的:AI写一版草稿 -> 我把它改成满意的版本 -> 用observe.py记录这两个版本 -> improve.py对比它们,找出“我改了啥” -> 提取出规则,按置信度P0/P1/P2排序 -> 人工审查后,P0规则写回SKILL.md。下面这个python脚本干的事,就是记录AI的初稿和我的终稿:
# observe.py: record AI draft and my final version |
然后improve.py就能自动对比,提取出修改模式,生成规则候选:
# improve.py: extract rules from diff |
结果呢?我提取了48条规则,整整740行。循环的次数越多,AI写出来的代码就越像我自己写的。我甚至设置了一个cron任务,让它每天晚上自动跑一次,完全不需要我手动触发:
0 23 * * * python3 ~/.ai-core/skills/scripts/improve.py auto --skill . |
当然,得泼盆冷水:自动学习不是魔法。
核心的安全规则,比如权限边界、密钥保护、破坏性命令的拦截,这些必须手写,绝对不能交给自动化。有一次,我因为某个文件缩进风格不一致,临时改成了2空格,结果它把“总是用2空格缩进”给学成了规则。但我们的项目标准是4空格,这规则就是错的。所以,所有P0级别的规则,必须经过人工审查,确认它代表的是长期偏好,而不是一次性的随手改动。自动学习只适合处理风格偏好,核心安全底线,还是得自己牢牢攥在手里。
“工作树”:给你的实验建个“平行宇宙”,搞砸了也没代价
以前,我每次重构前都犹豫半天,生怕把代码搞崩。用Git分支吧,但所有分支都共享同一个工作目录,切换分支会影响当前状态。但“工作树”不一样,它让每个分支都拥有自己完全独立的工作目录。你可以这样创建一个实验用的工作树:
# Create an experiment worktree |
然后,Claude就可以在这个实验目录里为所欲为,主线目录纹丝不动。如果实验失败了,执行git worktree remove,成本几乎为零。创建一个工作树只需要几秒钟,而一个失败的实验可能浪费你几小时。关于Git,我还有几条铁律:绝对不让Claude自动推送。它可以提交,但推送必须我确认,因为一旦推送到远端,想回滚就贵了。提交要频繁,每完成一个原子步骤就提交一次,这样万一出问题,可以用/rewind回到任意检查点。对破坏性操作保持警惕,比如git reset --hard、git push --force、rm -rf,批准前想清楚后果,这些操作没有后悔药。从PR里恢复上下文也很方便,用claude --from-pr 123就能自动加载某个PR的改动和讨论。总之,所有探索性任务、架构重构、拿不准的大改动,我都会扔进工作树里,给自己留条后路。
“思考深度”:不是所有任务都值得AI烧脑,把好钢用在刀刃上
Claude Code默认就会做一定程度的推理,但思考的深度不应该总是拉到最满。对简单任务也用高深度思考,纯属浪费令牌,而且那个推理过程本身也会占用上下文,影响后续对话。有一次,我在设计一个复杂的权限系统,涉及多个角色、继承和动态规则。默认的思考深度产出的计划有明显漏洞。我切换到/effort high之后,它思考了将近一分钟,然后给了一个完全不同的架构,覆盖了我没想到的各种边界情况。调整思考深度很简单:
# Adjust reasoning depth |
据我所知,官方调整推理深度的方式就是/effort命令。有时候,输入ultrathink也能让它在当前回合更深入思考,但我把它当成一个非正式的提示,不能保证每次都灵验。我的原则是:只有当改动涉及超过3个文件时,才提高思考深度。单文件修改,默认深度就够用了。架构设计、复杂bug诊断、需要多约束推理的任务,这些才值得多花点令牌,让AI多“烧烧脑”。
MCP:给你的AI装上“手脚”,让它能自己出门办事
MCP,全称Model Context Protocol,它能让Claude Code连接到数据库、支付平台、GitHub等外部服务。安装一个MCP服务器,Claude就能直接从对话中操作那个服务。但这里有个坑:每个MCP服务器都会给上下文增加工具定义,这个开销是累积的。我试过同时跑8个,结果有效上下文明显下降,代码生成质量也变差了。我的经验是,每个服务器大概会吃掉100到500多个令牌。我的做法是,只保留2到3个最常用的:
claude mcp add supabase -- npx @supabase/mcp-server-supabase --project-ref $REF |
.mcp.json的配置是这样的:
{ |
连接上Supabase和Stripe之后,我只需要在对话里说“查一下最近7天的失败支付记录”,Claude就能直接去Stripe里查询,返回结果并分析。以前,我还得写个一次性脚本才能干这事。现在,这就成了一句日常对话。你可以用/mcp命令来管理服务器连接,禁用那些暂时不用的。我把每个服务器带来的上下文开销,当成一个实用的经验法则,而不是某个客户端一定会显示的数据。
“作死”的三大雷区和“精分”的双会话模式,让你少走弯路
用Claude Code,有三个常见问题:
- 过度设计:让它写个简单的工具函数,它给你整出一整套抽象层,什么泛型、接口、工厂模式全招呼上了。解决方案:在CLAUDE.md里写上“prefer simple solutions”。
- 幻觉API:用了不存在的SDK方法,名字听着挺像那么回事,但一查文档根本没有。解决方案:跑测试,用测试来检验真伪。
- 范围蔓延:让你改一个函数,它一口气改了五个文件。解决方案:明确说“only change X, don't touch anything else”。
针对这个问题,我有一个“精分”的双会话模式:一个会话负责写,另一个会话负责审查。两个角色分开,互不干扰。写代码的会话只管写,审查的会话不知道代码是怎么来的,它只看结果,然后问问题:
# Reviewer session instructions |
审查员发现的问题,再丢回给写手去修。一般来个两三轮,代码质量比单会话高出一大截。这就是所谓的“双会话模式”,把代码生成和审查彻底分离,用AI治AI。
四条不可触碰的“红线”:代码可以AI写,但脑子必须自己动
有一次,我让Claude Code帮我配置一个Kubernetes集群,我对这个集群一无所知。它成功了,运行了。但我完全看不懂它是怎么做到的。两周后,某个地方出了问题,我两眼一抹黑,完全不知道从何下手。这是我犯过的最昂贵的错误之一。Claude能生成任何代码,但如果你自己都看不懂,你就没法接手维护。所以,我给自己划了四条红线,绝不越界:
1. 不懂的不要碰:Claude能生成任何代码,但如果你看不懂,你就没法维护。放到生产环境里你看不懂的代码,既是技术债,也是安全风险。
2. 别不用版本控制:没有Git,就意味着没有后悔药。Claude的改动可能覆盖你的文件,没有版本控制,你就是个睁眼瞎。
3. 别扔大型任务:“重构整个认证系统”这种提示就是灾难。正确的做法是“把validateToken里的JWT解析提取成单独的函数”。任务越小,越精准,范围越可控。
4. 别指望一次就完美:初稿永远是草稿。用/rewind回滚,给它精准的反馈哪里不对。迭代才是正确姿势。
这四条红线,不是为了限制AI,而是为了保护你自己的判断力。每当你把一个自己都不懂的决定扔给AI,你就失去了一份对系统的掌控力。
多AI工具的终极奥义:知识层统一,运行层“分家”
这个部分,适合那些已经不满足于只用一种AI工具的高级玩家。如果你只用一种工具,也不跑自动化服务任务,那这章对你来说价值不大,可以直接跳到结尾。我遇到的问题是:Claude Code和Codex各自维护自己的规则。我在这边更新了提示词,忘了同步到那边,三周后两个系统的代码风格和决策逻辑就开始打架。我学到的教训是:唯一需要“单一数据源”的是知识层。我把~/.ai-core作为唯一的知识源头,里面只放共享的行为规则、共享的命令、共享的技能。每个工具从那里生成自己的配置。我现在是三系统分工:
- OpenClaw:负责调度、通知、Telegram交互。
- Codex:负责大规模重编码、跨文件重构。
- Claude Code:负责快速编辑、探索、交互式调试。
关键是要有清晰的边界:共享知识层,不共享运行层。权限设置、认证凭据、MCP令牌、本地客户端状态,这些每个系统自己管自己的。把这个边界搞对了,多系统协作就很稳定。搞错了,就是放大复杂性,自己给自己找麻烦。
从今天开始的“傻瓜三连”:4行配置、白名单、试试计划模式
好了,说了这么多,是时候给你一个最简单的“上车指南”了:
1. 设置一个4行的CLAUDE.md:把你平时最常纠正Claude的那些行为写进去。比如提交格式、动工前先给计划、别过度设计。写一次,受用终生。
2. 设置一个权限白名单:先禁止那些危险操作。至少加上这三条:rm -rf*、Edit(.env*)、git push --force。记住,你不是在防AI使坏,你是在防AI太“热心”。
3. 尝试一次计划模式:下次你遇到一个需要改动超过3个文件的任务,先进入计划模式,看看它给你画的图纸,确认没问题再让它动工。
最后的最后:终点不是AI写代码,而是你只做值得做的决策
AI编程工具的终局,不是人类不写代码了。而是人类只做那些值得做的决策。配置、权限、规则、边界,这些不是负担,而是你保持控制权的方式。真正的门槛,不是你用不用得上Claude Code,而是你能不能管得住它。好了,以上就是我一年来的血泪总结。希望你的AI牛马,也能早日成为你的得力干将,而不是惹祸精。祝你们合作愉快!
最后,附上我常用的一些快捷键和命令,截至2026年3月,不同客户端可能会有些差异:
Keyboard Shortcuts |
对了,/rewind这个命令救了我无数次,如果你发现AI开始犯傻,直接回滚一步,重新下指令。/init在新项目里特别好用,它会分析你的代码库,自动生成一个CLAUDE.md草稿。多数教程都在教你怎么写更好的提示词,但我觉得,真正的杠杆作用,在于那些没人会去读的文件——CLAUDE.md、settings.json、hooks。
对你来说,哪一个配置的改变,带来的效果最大呢?