Claude Code 快速入门
从 Prompt Engineering 到 Harness Engineering:如何驾驭 AI 编程 Agent
术语表
本文涉及的核心术语如下,建议先快速浏览,遇到陌生概念时随时回查。
| 术语 | 中文 | 释义 |
|---|---|---|
| Prompt Engineering | 提示词工程 | 通过优化输入文本来引导模型输出,关注"怎么说" |
| Context Engineering | 上下文工程 | 管理模型可见的动态信息,关注"让模型看到什么" |
| Harness Engineering | 驾驭工程 | 通过硬约束、反馈回路和自动验证来确保模型可靠运作 |
| Context Rot | 上下文腐烂 | 对话变长后模型遗忘早期约定、产生幻觉和偏离 |
| Vibe Coding | 氛围编程 | 过度依赖自然语言描述、跳过验证环节的开发模式 |
| Verification Tax | 验证税 | 为确保 AI 生成代码正确性而必须投入的自动化验证成本 |
| Plan Mode | 计划模式 | Agent 只输出变更计划而不执行,用于人工审核 |
| Subagent | 子智能体 | 在独立上下文中执行子任务的智能体,用于隔离噪音 |
| Progressive Disclosure | 渐进式披露 | 按需加载详细文档,避免一次性注入过多信息 |
| Lifecycle Hooks | 生命周期钩子 | 在特定事件后自动触发的回调,执行确定性逻辑 |
CLAUDE.md | — | Claude Code 项目指令文件,定义构建命令、架构边界和禁止事项 |
AGENTS.md | — | 通用 Agent 行为规范,被 Claude Code、Cursor、Windsurf 等广泛支持 |
配置路径参考
- 全局配置(所有项目共享):
CLAUDE.md放于~/.claude/CLAUDE.mdAGENTS.md放于~/.agents/AGENTS.md
- 项目配置:项目根目录存放
CLAUDE.md或AGENTS.md
两者同时存在时,项目级配置会与全局配置合并生效。
前言
在 AI 编程工具层出不穷的今天,选择一个 Coding Agent 不只是选一个聊天框——而是选择一套工程方法论。Claude Code 之所以值得关注,不在于它的模型参数更大或生成速度更快,而在于它代表了一种范式的跃迁:从"怎么跟模型说话"进化到"怎么驾驭模型做事"。
本文将从工程实践的角度,带你快速掌握 Claude Code 的核心概念和最佳实践。
一、AI 编程的范式演进
AI 编程工具的认知层次经历了三次跃迁,每一次都从根本上改变了开发者与模型的协作方式。
第一层:Prompt Engineering(提示词工程)
这是大多数人接触 AI 编程的起点——关注的是"怎么说"。"你是一个资深全栈工程师,请帮我……"这类前缀就是典型的 Prompt Engineering。它的本质是单次、无状态的经验积累,天花板很低。
第二层:Context Engineering(上下文工程)
随着项目规模增大,你会发现问题不在"怎么说",而在"让模型看到什么"。Context Engineering 的核心是管理动态信息,对抗 Context Rot——对话越长,模型越容易遗忘早期约定,产生幻觉和偏离。
ETH Zurich 在 2026 年 2 月的一项研究给出了一个反直觉的结论:上下文配置文件(AGENTS.md 等)反而降低了任务成功率,同时让推理成本增加了 20% 以上。即使是人类精心编写的上下文文件,也只带来约 4% 的改善,且效果不稳定——在某个模型版本上性能甚至下降了 2%。
这说明 Context Engineering 的挑战不在"塞入更多信息",而在"只保留信号,剔除噪音"。
第三层:Harness Engineering(驾驭工程)
将模型视为一匹能力强大但需要约束的"马",通过构建硬约束(缰绳)、反馈回路(马鞍)和自动验证(护具),确保模型在真实工程环境中安全、可靠地运作。
Anthropic 的 Harness 设计实践给出了一个关键洞察:将"做事的 Agent"和"评判的 Agent"分离。让同一个模型既写代码又审查自己的代码,它倾向于自信地夸赞自己的工作——即使质量明显不行。但将外部评估者调教为"怀疑论者",远比让生成者自我批判容易得多。
这个范式的核心转变在于:不再试图通过更好的提示词来消除模型的局限,而是构建一套工程系统来兜底。
二、Coding Agent 这么多,我应该选择哪个?
如今的 Coding Agent 市场百花齐放——Claude Code、OpenCode、Codex、Factory.ai Droid、AmpCode 等等,各有侧重。如果你拿不定主意,我的建议很简单:直接选 Claude Code。
理由只有一个:生态第一。工具本身的能力差距在缩小,但围绕它生长的社区、插件、最佳实践和文档决定了你能走多远。Claude Code 背后是 Anthropic 对 Harness Engineering 范式的完整实践——不通过硬编码逻辑去"猜"模型该做什么,而是提供工具(文件读写、终端执行、浏览器操作)、知识和权限边界,然后信任模型自主推理。这种 "Trust the Model" 的哲学,使其在处理复杂任务时比传统 Workflow 方案更具灵活性。
Factory.ai 的 Agent Readiness 评估从侧面验证了这一点:CockroachDB(四级成熟度,74%)对 Agent 友好,而 Express(二级,28%)虽然同样成功,Agent 在其中工作却困难得多。代码库本身的工程纪律,远比工具选择更能决定 Agent 的产出质量。
三、快速上手:三步建立工作流
Claude Code 不是浏览器里的聊天框,而是一个运行在本地的Agent Process。下面的三步工作流是日常使用的基本框架。
3.1 建立项目契约:/init
进入项目目录后,第一步是执行 /init 生成 CLAUDE.md。这个文件不是团队知识库,而是你与 Claude 之间的协作契约。
好的 CLAUDE.md 只包含模型凭自身无法推断的信息:
- 构建和测试命令:
bun run build、bun test等,让 Agent 知道如何验证自己的工作 - 架构边界:哪些模块可以互相依赖,哪些禁止耦合
- 绝对禁止事项(NEVER 列表):"永远不要修改
schema.prisma中的既有字段" - 项目特有的约定:如统一响应结构
{ code, data, message }、错误处理模式(统一抛出AppError)
应该删掉的:目录结构(Agent 能看见)、技术栈(在 package.json 里)、编码风格(Linter 已强制)、通用最佳实践("写干净的代码"——模型在互联网上早已学会)。
原则:失败了才加,不是觉得需要就加。
Jan-Niklas Wortmann 的修剪方法:从 80+ 行砍到 30 行"失败驱动"的指令后,行为显著改善。每条规则必须能回答四个问题:
- 是否防止过实际错误?——没有具体失败案例的规则删除
- 工具能否替代?——Linter 能做的事,不要写在
CLAUDE.md里 - 是否编码了非显然的决策?——记录的是 trade-off,不是常识
- 是否可触发?——是可执行指令,不是抽象愿望
四个问题全不过,删掉。从空文件开始,每次踩坑再加一条。
常见误区:上下文污染(Context Poisoning)
上下文不是越多越好。塞入的内容越多,并不等于 Agent 越了解你的项目——过大的上下文会让模型推理质量明显下降,表现为答非所问、抓不住重点。
- 规则不是越多越好:模型已知的编码规范不需要重复声明,写了反而浪费 token、稀释注意力
- 避免单次会话过载:不要一次性粘贴大段日志、配置、代码。担心新会话不了解项目而把所有事堆在一起,只会适得其反
- "被看见" ≠ "被用上":模型存在上下文召回率问题,放入的内容不一定都会被有效利用
- 原则:只写模型凭自身无法推断的项目特定知识
3.2 先谋后动:Plan Mode
在让 Agent 动手写代码之前,按 Shift+Tab 切换到 Plan Mode。Agent 不会执行任何操作,而是输出一份变更计划:
- 涉及哪些文件
- 每个文件的改动点
- 预期的 diff 效果
最佳实践:让人类(或另一个 AI 实例充当"高级工程师"角色)审核计划无误后,再切换回执行模式。修改 10 行代码总比重写 200 行代码高效。对于复杂重构或跨模块变更,这一步能显著减少因错误假设导致的无用功。
常见误区:误信"超级 IDE 插件"是银弹
super claude、superpowers、oh-my-opencode 等插件号称"一键扫仓库""自动改代码",本质仍是"聊天 + 代码索引",上限由模型本身、索引质量和提问方式共同决定。
- 把插件当作快捷入口和重复劳动加速器,而不是替你做架构决策的上帝视角
- 警惕部分插件的 Prompt Cache 污染:粗糙的实现会把时间戳、UUID 等动态信息塞进 System Prompt,导致缓存命中率接近 0——贵、慢、还啰嗦
- 相比把希望寄托在"超级插件一口吃掉全仓库"上,有意识地驱动内置的 plan → build 流程更可靠也更可控
3.3 构建自动反馈循环:Build-Verify Loop
Harness Engineering 得以运转的前提是为 Agent 提供充分的验证手段。LangChain 团队在优化 deepagents-cli 时发现,Agent 最常见的失败模式是:写完代码,重新读一遍,确认"看起来没问题",然后停下——从不实际运行测试。
他们的解决方案是一个四阶段循环:
- Plan & Discover:阅读任务,扫描代码库,制定包含验证策略的计划
- Build:以可验证为目标实现功能,同时编写 happy path 和 edge case 测试
- Verify:运行测试,读取完整输出,**对照任务规格(而非代码本身)**判断结果
- Fix:分析错误,重新审视规格,解决问题
在此基础上,原则很简单:成功应该是沉默的,失败才发出声音。
通过配置生命周期 Hooks(如 PostToolUse),在 Agent 每次编辑代码后自动运行测试或 Linter:
- 测试通过:Harness 保持静默,节省宝贵的上下文空间
- 测试失败:只向上下文注入精炼的错误日志,驱动 Agent 自动进入修复循环
Tw93 在 Rust + Lua 混合项目中验证了这种做法的价值:按文件扩展名绑定不同的检查(*.rs → cargo check,*.lua → luajit -b),每次编辑后即时反馈,避免了"写了一堆才发现最初的错误"。每次编辑节省 30-60 秒,100 次编辑累积节省 1-2 小时。
验证手段的层次:
- 最底层:退出码、Lint、类型检查、单元测试
- 中间层:集成测试、截图对比、契约测试、冒烟测试
- 更高层:生产日志验证、监控指标、人工审核清单
验证手段越完善,Agent 的自我修复闭环就越可靠。
四、进阶技巧:驾驭复杂系统
当项目规模变大、任务变复杂时,你需要掌握三项核心能力。
4.1 Skills:按需加载的方法论
Skill 的核心设计原则是:描述"何时触发",而非"能做什么"。
一个好的 Skill 描述是路由条件,不是功能说明书。Tw93 的实验数据:描述中加入反例后,路由准确率从 53% 提升到 85%。一个约 9 token 的描述("用于关注正确性的 PR 审查")比约 45 token 的详细描述效果更好——省 token,且更精准。
Skill 体应该只包含导航和核心约束,大型参考材料放在支持文件中:
.claude/skills/
└── incident-triage/
├── SKILL.md # 任务语义、边界、执行框架
├── runbook.md # 领域细节
├── examples.md # 案例
└── scripts/
└── collect-context.sh三种 Skill 类型:
| 类型 | 用途 | 示例 |
|---|---|---|
| Checklist | 质量门,发布前逐项检查 | release-check |
| Workflow | 高风险操作的标准化流程,含回滚步骤 | config-migration |
| Domain Expert | 决策框架,引导固定证据收集路径 | incident-triage |
自动触发策略:高频(每会话超过 1 次)保持自动触发并优化描述;低频(每会话低于 1 次)关闭自动触发,手动调用;极低频(低于 1 次/月)直接删除 Skill,移到 AGENTS.md 作为文档。
4.2 Subagents:上下文防火墙
主对话窗口的上下文空间是有限的。对于耗时的搜索、试错或大规模代码扫描任务,应该指派Subagent 在独立上下文中执行:
- Subagent 自主完成探索和调试
- 只返回高度压缩的结论给主 Agent
- 防止无关的调试细节污染主对话
Claude Code 内置三种Subagent:Explore(只读,默认 Haiku)、Plan(规划与研究)、General-purpose(通用)。关键约束:
- Subagent 的权限应小于主线程,否则隔离失去意义
- 设置
maxTurns防止失控 - 需要文件修改时使用
isolation: worktree隔离文件系统 - 输出格式必须结构化,否则主线程无法消费
模型分层策略:探索阶段的 Subagent 使用 Haiku 等小模型——推理快、费用极低、可以多开并行。探索完成后,将精炼的高价值上下文交给 Opus 等大模型做深度推理。不是小模型不行,而是用错了角色。
4.3 自动化治理:对抗代码腐化
AI 生成的代码如果不加治理,技术债会以指数级速度累积。两个关键手段:
/simplify 命令:任务完成后执行,要求 Agent 进行三维检查——代码复用性、质量、运行效率,清除 AI 生成残留物。
定期"垃圾回收":让 Agent 扫描代码库是否违反架构约束,对违规处自动发起重构 PR,防止 AI 生成的"快捷方案"逐渐侵蚀系统架构。
Tw93 提出的六层治理模型值得参考:
| 层 | 职责 | 核心问题 |
|---|---|---|
CLAUDE.md / rules / memory | 长期上下文 | "Agent 是什么" |
| Tools / MCP | 行动能力 | "Agent 能做什么" |
| Skills | 按需方法论 | "Agent 怎么做" |
| Hooks | 强制行为 | 不依赖模型判断的硬约束 |
| Subagents | 上下文隔离 | 受控自主执行 |
| Verifiers | 验证闭环 | 让输出可验证、可回滚、可审计 |
五、Vibe Coding 的陷阱
Vibe Coding:用自然语言驱动开发,跳过验证环节。看起来快,实际埋雷。
生产力悖论
Faros AI 的遥测数据揭示了一个反直觉的规律——个人越快,团队越慢。
| 层面 | 指标 | 变化 |
|---|---|---|
| 个人产出 ↑ | 任务完成量 / PR 合并量 | +21% / +98% |
| 团队交付 ↓ | PR 审查时间 / Bug 率 | +91% / +9% |
| 系统级 ↓ | PR 规模(认知过载的根源) | 膨胀 154% |
Google DORA 2025 报告进一步确认:AI 采用率每增加 25%,交付稳定性预计下降 7.2%。更值得警惕的是,2024 年 AI 与吞吐量、有价值工作时间的关系还是负相关,到 2025 年才逆转为正——唯独稳定性从未改善,持续恶化。
DORA 的作者直言:"稳定性,而非速度,才是软件交付成功的定义性指标。"
技术债的自我复制
传统开发中,技术债是线性累积的。AI 协作模式下,它变成了病毒式传播:
AI Agent 看到代码库中的糟糕模式(硬编码、绕过 Service 层),会把它当成"合法先例",系统性地复用到每个角落。
如果不定期清理,AI 生成的低质代码("AI Slop")会迅速侵蚀架构,导致系统不可维护。
真实事故
| 项目 | 经过 | 后果 |
|---|---|---|
| Moltbook | 完全 Vibe Coding,未配置安全默认值 | 150 万 API 密钥泄露 |
| Replit | AI Agent 忽略指令,自主操作数据库 | 删除 1200+ 条生产记录 |
| Gemini CLI | 整理文件时"追逐幻觉" | 误删用户真实文件 |
| Amazon Kiro | AI 自主"修复"配置,重建错误环境 | 13h + 6h 宕机,数百万订单损失 |
根本解法:缴纳 Verification Tax
幻觉无法通过优化提示词消除,只能用硬性防御兜底:
- 自动化验证器:测试 + 类型检查 + Linter → 不通过不合入
- 强类型系统:编译器约束行为,而非依赖注释
- 架构约束 Linter:用规则守护边界,而非口头约定
Tw93 的总结精辟:"明确标成不可信输入"——将外部内容显式标记为不可信来源,在写入操作前要求明确确认,在关键路径上引入独立 LLM 验证。
人类的价值不在于写更多代码,而在于定义**"什么是做对了"**。
六、Claude Code 的架构内幕
理解 Claude Code 的内部机制,有助于更高效地使用它。
Prompt Caching:核心性能杠杆
Claude Code 的整个架构围绕 Prompt Caching 构建。缓存的匹配方式是前缀匹配——从请求开始到每个 cache_control 断点之间的内容被缓存。高缓存命中率不仅省钱,还放宽速率限制。Anthropic 甚至对低命中率发出 SEV 级别告警。
缓存友好的顺序:
- System Prompt(静态,锁定)
- Tool Definitions(静态,锁定)
- Chat History(动态,在后)
- Current User Input(最后)
常见缓存破坏者:在 System Prompt 中放入时间戳、非确定性地打乱工具定义顺序、会话中途增减工具。动态信息(如当前时间)应注入到用户消息中,而非 System Prompt。Claude Code 自身就是这样做的——用 <system-reminder> 标签将动态信息注入用户消息,保持 System Prompt 不变。
不要中途切换模型:Prompt Cache 与模型绑定。如果已经用 Opus 积累了 100K token 的对话,切换 Haiku 回答一个简单问题,实际比继续用 Opus 更贵——因为 Haiku 需要重建全部缓存。
defer_loading:工具发现的优化
Claude Code 有几十个 MCP 工具。全量包含在每次请求中会很昂贵,但中途移除工具会破坏缓存。解决方案:发送只含工具名的轻量 stub,标记 defer_loading: true。模型通过 ToolSearch 发现工具,完整 schema 仅在选中后才加载。缓存前缀保持稳定。
Compaction 机制
当上下文接近上限时,Claude Code fork 一个调用,将完整对话历史发送给模型要求"总结这段对话"。由于此步骤命中缓存,成本仅为正常价格的 1/10。压缩后,几十轮对话被 ~20K token 的摘要替代。System Prompt + Tools 保持不变,文件引用重新附加,空间释放给新一轮对话。
关键陷阱:默认压缩算法倾向于删除早期的工具输出和文件内容——同时也会丢失架构决策和约束理由。两个小时后,模型可能不记得早期的决策,导致难以解释的 bug。
解决方案:在 CLAUDE.md 中显式指定 Compact Instructions:
- 架构决策(绝不总结)
- 已修改文件及关键变更
- 当前验证状态(pass/fail)
- 未完成的 TODO 和回滚记录
- 工具输出(可删除,仅保留 pass/fail)
主动替代方案:HANDOFF.md
比依赖压缩算法更可靠的做法是:在开始新会话前,让 Claude 写一份 HANDOFF.md,记录当前进度、尝试过什么、什么有效、什么走不通、下一步做什么。新会话的 Claude 只读这个文件即可接续——不受压缩算法质量影响。
七、参考资源
- Claude Code 使用经验 & 进阶学习
- Harness Engineering
- DORA 报告
- 上下文管理
Last updated on