ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Claude Code 高效指南:10个隐藏技巧玩转AI编程代理

Claude Code 高效指南:10个隐藏技巧玩转AI编程代理

很多人第一次打开 Claude Code 的时候,都把它当成一个增强版的聊天窗口:问一句,它答一句,拿到代码,复制粘贴,关掉终端。一天用下来,感觉也就是个“会写代码的对话机器人”。但我想说,这种用法大概只发挥了这个工具 10% 的能力。真正把 Claude Code 和普通聊天式 AI 工具拉开差距的,是把它当成一个能自主规划、自己动手读写文件、自己跑命令、还能按你定好的纪律持续干到任务结束的“虚拟研发成员”。这不是概念宣传,是我这段时间一直在用的工作方式。下面这 10 个隐藏技巧,我会按“记忆管理、会话控制、自动化、外部工具”这条线拆开讲,每个技巧都配了可以直接上手的用法,以及我自己踩过的坑。

1. 先聊清楚:为什么说大部分人都只用了 10%?

1.1 你把工具用成了“聊天框”,而不是“执行者”

我见过太多人把 Claude Code 挂在终端里,但使用姿势跟网页版 AI 助手几乎没区别:把一段报错贴进去,让它解释;把一段代码扔进去,让它重构;再把它给的代码复制回编辑器。这当然有用,但它本质上还是“人主导、AI 辅助”的单轮问答,模型只看到了你喂它的那点上下文,既不知道项目全貌,也做不了跨文件操作。

但 Claude Code 真正的设计目标恰好相反。它被做成一个驻留在你项目目录里的终端代理,可以直接读取目录结构、搜索符号、读写文件、执行命令。如果你只把它当聊天框用,就等于买了一台多功能工程车,却只用它当手推车。最典型的区别在于:聊天框里的 AI 只能给建议,而终端里的 Claude Code 可以自己动手改代码、跑测试、根据跑出来的报错再改代码,形成一个完整的“做–看–改”闭环。

1.2 一个比喻:从“搜索引擎”变成“新同事”

你可以把普通 AI 助手想象成搜索引擎加一个话痨解说员,问什么答什么,但不会帮你去修天然气管道。而 Claude Code 更像一个实习生同事:你给它一个目标,它会打开项目目录、翻代码、查文档、改文件、跑命令,然后拿着结果再回来跟你确认。你能发指令让它去“梳理这几个模块的依赖关系,并生成一张重构方案”,它不是只给你一段建议,而是一个个文件地读、画依赖、做标记、甚至直接产出改动。

所以“10%”这个数字并不是营销噱头,而是我真实的体感:大多数用户只启用了它的问答能力,还没有启用“代理执行”这层能力。而后面要讲的技巧,本质上都在把“代理执行”这件事做得更稳、更可控、更适合工程化场景。

2. 隐藏技巧前两个:让模型真正“记住”你的项目

2.1 CLAUDE.md:把约定写进模型的大脑

很多人没有意识到,Claude Code 支持一个项目级记忆文件,默认约定是放在项目根目录下的CLAUDE.md。每轮对话开始前,它会自动读取这个文件里的内容,作为整个会话的长期背景。这就相当于你招了一个新同事,先给他发了一本岗位手册,告诉他“项目结构长什么样、代码风格用什么、测试怎么跑、发布前要过哪些检查”。

我见过一个最典型的浪费场景:有人在每一轮对话里都重复粘贴一遍“我们的技术栈是 React 加 TS,组件库用的是某某内部库,别用 CSS 文件,用 CSS Modules”等约定。这不仅费 token,而且很容易在某一次粘贴中漏掉关键信息。正确做法是把这些一次性写进CLAUDE.md,之后不管开多少个会话,模型都能自动读到。

我的CLAUDE.md一般分四块:

  • 项目概览:这个系统是做什么的,核心业务逻辑是什么;
  • 架构约束:目录分层规则、哪些目录不能乱动、依赖方向是什么;
  • 编码规范:命名习惯、状态管理方式、样式方案、测试要求;
  • 常用命令:构建命令、测试命令、lint 命令、单测跑法。

需要注意的是,这个文件不宜太长。如果塞进去几千行,反而会稀释重要约定。我一般控制在 100 行以内,只保留“换了人也能立刻接手”的关键信息。另外,全局层面还支持~/.claude/CLAUDE.md,用来放个人通用的偏好,比如“默认提交信息风格”“希望回应尽量简洁”等等,项目级文件优先级更高,二者可以互相叠加。处理这类记忆文件的时间,值得你一次投进去。

2.2 @引用:让模型精准锁定需要看的文件

第二个很容易被忽视的技巧是“上下文引用”。在提问或下任务时,你可以用@文件名直接把某个文件的内容带入当前上下文,也可以用@目录名或 glob 模式一次性引入一批相关文件。比如:

@src/utils/date.ts 帮我看看这个文件里格式化函数是否有时区问题。

看起来只是一个不起眼的输入方式,但它解决了一个大问题:模型不再靠“猜”来定位代码位置,而是被你直接引导到正确的文件上。尤其是在大型项目里,如果你不给引用,模型会花大量时间去读目录结构、猜函数位置,既慢又容易跑偏。

我的经验是,涉及跨文件改动时,先给出核心入口文件,再让它自己顺着引用关系去搜索补充上下文;如果是明确的 bug 定位,就把可疑文件全部@进去,让它一次性看完再回答。避免过早把整个仓库的上下文全塞进来,那既浪费 token,也会让模型的注意力分散。对几百个文件的大仓库来说,@引用比“让它自己翻”要可靠得多。

3. 隐藏技巧 3~5:控制会话节奏,别让对话变成脱缰野马

3.1 /compact:在上下文爆炸之前做“记忆压缩”

Claude Code 每轮对话都会把历史消息一起发出去,一旦任务复杂、文件读得多,会话的 token 消耗会快速增长,而且超出一定规模后,模型的响应质量会明显下降——开头读到的东西被一堆中间步骤淹没,它开始“忘事”。这时候最有效的操作不是开新对话,因为开新对话往往意味着把之前的上下文全部丢掉,而是用内置命令/compact。

这个命令会压缩当前会话的上下文,把过去冗长的过程性信息提炼成一份摘要,然后继续沿用当前会话文件继续聊天。相当于你给同事开了一个冗长会议之后,拿出五分钟做了个会议纪要,之后的讨论都围绕纪要展开。我自己的习惯是:当感觉模型开始重复提问、或回答逐渐变得含糊时,先主动用/compact,然后在压缩后的摘要里补充一句“下面我们继续解决 xxx,记住我们最后确认的结论是 yyy”,这样能非常有效地拉回注意力。

3.2 /rewind:撤销的不是代码,而是思路

很多终端工具都有/undo之类的操作,但 Claude Code 的/rewind有着完全不同的价值:它不只是撤销某次文件改动,而是把整个对话状态回退到之前某个位置。比如你发现模型跑偏了,在一个错误方向上做了五六次多余修改,与其一个个手动改回来,不如直接回到它跑偏之前的那个节点,重新给更明确的指令,让它换个方向执行。

这里有个使用诀窍:当你感到需要在对话里“反复纠正同一件事”时,别硬纠正,直接用/rewind退回分岔点。因为如果模型在一个错误框架里越走越深,你继续给它追加纠正信息,反而可能让它把错误方向和纠正信息缝合得更复杂。回退后重新定义任务,代价最低。

3.3 自定义 Slash 命令:把固定套路变成一条指令

Claude Code 支持自定义斜杠命令,原理很简单:在项目目录下的.claude/commands/里放一个 Markdown 文件,文件名就是命令名。例如我创建一个.claude/commands/review.md,内容可以是这样:

你要以资深代码评审人的身份,全面审查本次改动的代码。 重点检查: 1. 是否存在逻辑漏洞和边界条件缺失; 2. 是否有重复代码或明显可简化的结构; 3. 是否遵循项目 CLAUDE.md 里声明的编码规范; 4. 是否存在性能隐患或并发问题。 输出要求: - 先给我一份按严重程度排序的问题清单; - 每个问题附带定位文件和修改建议; - 最后总结该不该合并这次改动。

之后我只需要输入/review,模型就会自动按这套标准去执行审查,不必每次重新写一长串提示词。这套机制尤其适合那些高频但格式固定的操作,比如“生成提交信息”“写接口文档”“补单元测试模板”“按模板输出周报”等等。

我在实践中还发现,自定义命令里可以直接用变量占位符,比如$ARGUMENTS代表命令后面的参数,这样就能做出更灵活的模板命令。比如说在@file $ARGUMENTS之类的场景里,你输一句/checkout src/main.js,它就能自动把你指定的文件纳入上下文范围。把固定套路沉淀成命令,是让团队所有人保持一致工作质量的最快路径。

4. 隐藏技巧 6:用 Hooks 把质量门禁装进工作流

4.1 Hooks 到底在什么时机触发

很多人不知道 Claude Code 有一套事件钩子机制,它可以在模型调用工具的前后、或者对话停止时,自动执行你指定的脚本。Hooks 官方支持的事件主要有几个:PreToolUse(模型准备调用某个工具前触发)、PostToolUse(某个工具执行完后触发)、Stop(本轮模型输出结束后触发)、UserPromptSubmit(用户提交消息时触发)等。

这套机制的最大价值,是把“工程化规范”硬编码进模型的工作流。比如你可以约定:任何时候模型准备执行 shell 命令,先拦截检查一下,如果发现是危险命令(比如删除整个目录、覆盖.env文件),就直接阻止;也可以约定:模型每次读取完一个文件,就在后台记录审计日志,方便你复盘它到底做了什么。

我用得最多的是PostToolUse类的钩子,效果最直观的是“在模型改完代码之后自动跑一遍 lint”。以往模型改完代码,我还要手动执行npm run lint,有问题再贴回去让它改。现在让它改完自动触发 lint,整个过程不需要我介入。

4.2 我常用的两个 Hook 配置实例

举个例子,项目根目录.claude/settings.json里添加如下配置:

{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "bash .claude/hooks/post_edit_lint.sh" } ] } ], "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "bash .claude/hooks/pre_bash_guard.sh" } ] } ] } }

在pre_bash_guard.sh里,我可以写一个简单的黑名单检查。当脚本检测到模型准备执行的命令包含危险的删除操作时,就以非零状态退出,从而阻止工具执行。这里有一个必须注意的点:hook 脚本本身必须保持快,并且要有超时控制。如果 hook 执行时间过长,会拖慢整个代理循环,模型可能会开始“自己找理由”绕过 hook,因此建议 hook 内只做轻量检查,不要把重活放在这里。

还有一次,我为某个团队搭过一个Stop钩子,把每次会话的完整输出追加到日志文件。那个日志后来变成了很有价值的“留痕材料”,因为你可以清楚看到模型在什么时间点改过哪些文件、跑过哪些命令。这在大项目里特别重要,否则你很难排查“这堆代码到底是哪一次 AI 操作引入的”。

5. 隐藏技巧 7:通过 MCP 连接外部工具,让模型不再“闭门造车”

5.1 MCP 是什么,为什么值得折腾一下

如果你只知道让 Claude Code 读项目代码、改文件,那还是低估了它。它支持一种叫 MCP 的标准协议,可以连接外部工具和数据源。你可以把它理解成给模型加装了一个“外接器官”:模型不再只能读写本地文件,而是可以实时查询数据库、调用搜索服务、访问内部 API、读取监控系统状态等。

举一个实际场景:某次我在排查线上问题时,不再需要手动把数据库里的几条记录复制粘贴给模型,而是直接把 MCP 连接到一个只读的数据库查询服务,让它自己连过去检索相关数据。排查链路从“导数据→贴给模型→等回答”变成了“直接下达排查指令”,少了好几个手动步骤。

5.2 配置一个 MCP 服务器的步骤

配置过程不算复杂。目前常用的是在项目根目录下用配置文件声明 MCP 服务器,或者用命令行工具添加。一般做法是运行claude mcp add 服务器名 -- 启动命令,比如要接一个本地的检索服务,命令大致是:

claude mcp add my-search -- node mcp/search-server.mjs

添加完成后,可以用claude mcp list查看已连接的服务器。之后在会话里,你就直接对模型说“用 my-search 检索关于 xxx 的资料”,模型会自动调用对应的工具去执行。如果你的 MCP 服务器是通过网络访问的远程服务,配置里加一个 URL 地址和鉴权 token 即可。

为了安全,我在配置外部 MCP 时只给它最小的权限,甚至专门建一个只读账号。给模型的权限越多,它闯祸的空间就越大,尤其当 MCP 连接到生产数据库时,务必保证那是一个“只读副本”或开启了事务自动回滚的环境。

5.3 安全边界:允许列表和权限模式

模型接入了外部工具以后,“能力越强,风险越大”这句话就应验了。所以在启用 MCP 时,我会同时在权限设置里做好控制。官方提供了一系列启动参数,比如--permission-mode可以控制模型在什么模式下执行操作,--allowedTools可以显式列出允许模型调用的工具名,--disallowedTools则用于强力禁止某些工具。

比如我用如下命令启动一个会话,只允许模型读文件和连接某个 MCP 服务,但禁止它执行任意 shell 命令:

claude --permission-mode plan --allowedTools "Read,Glob,Mcp__my-search__search"

计划模式(plan)下模型一般只能规划任务和读取信息,不能直接改文件或执行命令,非常适合先让它给出方案。并且把工具限制到一个极小的白名单里,这让自动化操作变得安全可控。如果你发现模型在干活时总是被权限提示卡住,与其直接放开所有权限,不如细化到具体工具,否则它可能在你不知情的情况下执行了风险操作。

6. 隐藏技巧 8~10:从“交互式聊天”升级到“脚本化执行”

6.1 非交互模式:一次调用一个任务,拿 JSON 结果

Claude Code 不只能开交互式终端,它还支持非交互模式,也就是一条命令只执行一个任务,跑完就退出。这个能力很多人没注意到,但恰恰是它把 Claude Code 从“人工陪聊工具”变成了可以集成进脚本和 CI 流水线的“批量执行器”。基本用法是:

claude -p "请检查 src/utils 目录下所有函数的边界条件,输出问题列表" --output-format json

加了--output-format json之后,输出就不再是一大段对话文本,而是一个带结构化字段的 JSON,里面包含模型回复内容、工具调用记录、耗时和 token 消耗。这样脚本就能很轻松地解析结果,并基于返回内容继续做后续处理。我通常还会配合--verbose看模型每一步工具调用到底做了什么,方便排查出错环节。

非交互模式的隐藏价值在于支持--max-turns参数。你可以控制模型最多执行多少个“思考–行动”循环,这对于那些要求严格的任务特别实用,能防止模型在一个任务上失控地跑上几十轮。比如下面这个命令限制模型最多跑 20 轮,并只允许它调用 Bash、Read、Edit 三个工具:

claude -p "把项目里所有 TODO 注释整理成一份带优先级的工作清单,写到 docs/todos.md" \ --max-turns 20 \ --allowedTools "Bash,Read,Edit" \ --output-format json

6.2 会话恢复:把长任务安全地拆成多个阶段

很多长任务不适合一次性完成。比如一个仓库有几十个文件需要迁移,如果让模型一口气干完,中间很容易出现上下文膨胀、遗忘前面结论的问题。这时候可以用会话恢复机制:先开一个会话完成第一阶段,记下会话 ID,再在下一个批次里通过claude --resume <会话ID>接着上一轮的状态继续干。

这种方式非常像“断点续训”。我不需要每次重新解释项目背景,因为CLAUDE.md和恢复的会话历史已经把上下文带回来了。另外还有一个--continue标志,它的语义更直接:如果当前目录下存在最近一个未结束会话,就直接继续它。配合脚本使用时,你可以把一个大的重构任务拆成多个claude -p命令轮流执行,每个命令只负责一个明确目标,跑完即退出,下一个命令再继续上一个会话。

6.3 组合起来:批量重构脚本示例

这里给一个可以直接改着用的思路。假设你有 20 个测试文件需要迁移到新的测试框架,手写一个 bash 循环去逐个调用 Claude Code:

for file in tests/*.test.js; do claude -p "将 $file 迁移到新测试框架,保持断言逻辑不变,迁移后直接运行对应测试命令验证。遇到失败要主动修复并重跑。" \ --permission-mode acceptEdits \ --max-turns 30 \ --output-format json \ --resume "$SESSION_ID" \ --allowedTools "Read,Edit,Write,Bash" || break done

这个脚本的核心思路是:每个文件一个独立任务,但都在同一个会话里累积上下文,同时用--permission-mode acceptEdits免去每轮编辑文件的询问确认,让脚本能自动跑完。如果你对某一步的结果不放心,加一个--allowedTools白名单,去掉Write,只让它生成改动但不动手,然后你自己 review 差异再统一应用。

我实际用下来,这样的批量脚本在重构场景里效率提升非常明显。以前我要手动复制粘贴一刀刀改,现在只需要把任务清单整理好,脚本会自动跑,甚至能直接对接 CI:在合并请求前跑一个“AI 审查脚本”,让它检查 PR 差异并输出问题清单。

7. 实战踩坑记录与排查速查表

7.1 上下文膨胀导致“记忆漂移”

这是最常遇到的问题。表现是对话前半段还正常,越到后面模型越听不懂你在说什么,甚至反复做出与之前结论矛盾的行为。遇到这种情况,不要以为模型“变笨了”,更不用急着重装或换模型,而是要先检查上下文。

检查点很简单:看看这个会话读了几个大文件、中间有没有跑过长测试。如果有,第一时间用/compact压缩一下,或者直接重新开一个会话,把关键结论提炼后重新丢回去。但要注意,/compact之后并不是保险箱,压缩后模型仍然可能丢掉某些细节,因此在压缩前,最好让它先输出一份“当前进度总结和待办事项”,然后拿这个总结作为新上下文的基础。

7.2 权限提示一直弹,自动化脚本卡死

很多人第一次跑非交互模式时,会遇到一个尴尬情况:脚本在某个工具调用处被卡住,等待用户确认。这是因为没有设置好权限模式。在交互式对话里,弹提示让你按一下回车没问题;但在claude -p的脚本化执行里,这种等待就是死循环。

解决方式就是用--permission-mode配合--allowedTools明确授权。如果你希望它自动修改文件而不逐次询问,用acceptEdits;如果你想让它连执行命令都无需确认,可以启用更宽松的选项,但我个人不建议在自己不了解项目环境时直接全放权。最稳的做法是开一个最小白名单,只放它真正需要的几个工具。

7.3 Hook 没生效和 MCP 连接不上

Hook 如果没触发,多半是配置里的事件名写错或 matcher 不匹配。比如PostToolUse对应工具名是Edit、Write、MultiEdit、Bash等,如果你写成Edit|Write,但实际模型调用的是MultiEdit,钩子就不会触发。排查时先用--verbose启动,日志里会输出 hook 的加载和执行结果。

MCP 连接不上则要分两层看:是服务器进程没起来,还是认证失败了。最简单的排查方式是直接手动执行一遍配置里的命令,看看能不能正常启动。另一个常见坑是配置的启动命令使用了相对路径,本地跑没问题,但换一个工作目录启动 Claude Code 就找不到了。所以在配置 MCP 时尽量用绝对路径或已加入 PATH 的可执行文件路径。

8. 最后的个人体感

我实际操作下来的体会是,这 10 个技巧并不是单独割裂的,它们组合起来才是真正的“完全体”。CLAUDE.md负责让模型懂项目,@引用负责让模型聚焦,/compact和/rewind负责控制会话节奏,hooks 负责兜住质量底线,MCP 把外部世界接进来,而脚本化执行让这一切能挂在 CI 和批处理任务里反复跑。每加一层,模型的自主性就高一点,同时你的可控性也并没有下降,因为权限和工具白名单始终握在你手里。

曾经有一次,我让模型在一个大型仓库里做全量日志改造,涉及几十个文件,第一次跑通花了两个小时,中间我又调了三次权限配置。但之后同样的改造需求再来时,我只需要把任务描述替换一下,脚本跑完,自己重点 review 差异就行。那种“从陪聊天到管团队”的感觉,才是 Claude Code 真正值得折腾的地方。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进