Unono
AI

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.mdClaude Code 项目指令文件,定义构建命令、架构边界和禁止事项
AGENTS.md通用 Agent 行为规范,被 Claude Code、Cursor、Windsurf 等广泛支持

配置路径参考

  • 全局配置(所有项目共享):
    • CLAUDE.md 放于 ~/.claude/CLAUDE.md
    • AGENTS.md 放于 ~/.agents/AGENTS.md
  • 项目配置:项目根目录存放 CLAUDE.mdAGENTS.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 buildbun test 等,让 Agent 知道如何验证自己的工作
  • 架构边界:哪些模块可以互相依赖,哪些禁止耦合
  • 绝对禁止事项(NEVER 列表):"永远不要修改 schema.prisma 中的既有字段"
  • 项目特有的约定:如统一响应结构 { code, data, message }、错误处理模式(统一抛出 AppError

应该删掉的:目录结构(Agent 能看见)、技术栈(在 package.json 里)、编码风格(Linter 已强制)、通用最佳实践("写干净的代码"——模型在互联网上早已学会)。

原则:失败了才加,不是觉得需要就加。

Jan-Niklas Wortmann 的修剪方法:从 80+ 行砍到 30 行"失败驱动"的指令后,行为显著改善。每条规则必须能回答四个问题:

  1. 是否防止过实际错误?——没有具体失败案例的规则删除
  2. 工具能否替代?——Linter 能做的事,不要写在 CLAUDE.md
  3. 是否编码了非显然的决策?——记录的是 trade-off,不是常识
  4. 是否可触发?——是可执行指令,不是抽象愿望

四个问题全不过,删掉。从空文件开始,每次踩坑再加一条。

常见误区:上下文污染(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 最常见的失败模式是:写完代码,重新读一遍,确认"看起来没问题",然后停下——从不实际运行测试

他们的解决方案是一个四阶段循环:

  1. Plan & Discover:阅读任务,扫描代码库,制定包含验证策略的计划
  2. Build:以可验证为目标实现功能,同时编写 happy path 和 edge case 测试
  3. Verify:运行测试,读取完整输出,**对照任务规格(而非代码本身)**判断结果
  4. Fix:分析错误,重新审视规格,解决问题

在此基础上,原则很简单:成功应该是沉默的,失败才发出声音。

通过配置生命周期 Hooks(如 PostToolUse),在 Agent 每次编辑代码后自动运行测试或 Linter:

  • 测试通过:Harness 保持静默,节省宝贵的上下文空间
  • 测试失败:只向上下文注入精炼的错误日志,驱动 Agent 自动进入修复循环

Tw93 在 Rust + Lua 混合项目中验证了这种做法的价值:按文件扩展名绑定不同的检查(*.rscargo check*.lualuajit -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 密钥泄露
ReplitAI Agent 忽略指令,自主操作数据库删除 1200+ 条生产记录
Gemini CLI整理文件时"追逐幻觉"误删用户真实文件
Amazon KiroAI 自主"修复"配置,重建错误环境13h + 6h 宕机,数百万订单损失

根本解法:缴纳 Verification Tax

幻觉无法通过优化提示词消除,只能用硬性防御兜底:

  1. 自动化验证器:测试 + 类型检查 + Linter → 不通过不合入
  2. 强类型系统:编译器约束行为,而非依赖注释
  3. 架构约束 Linter:用规则守护边界,而非口头约定

Tw93 的总结精辟:"明确标成不可信输入"——将外部内容显式标记为不可信来源,在写入操作前要求明确确认,在关键路径上引入独立 LLM 验证。

人类的价值不在于写更多代码,而在于定义**"什么是做对了"**。


六、Claude Code 的架构内幕

理解 Claude Code 的内部机制,有助于更高效地使用它。

Prompt Caching:核心性能杠杆

Claude Code 的整个架构围绕 Prompt Caching 构建。缓存的匹配方式是前缀匹配——从请求开始到每个 cache_control 断点之间的内容被缓存。高缓存命中率不仅省钱,还放宽速率限制。Anthropic 甚至对低命中率发出 SEV 级别告警。

缓存友好的顺序

  1. System Prompt(静态,锁定)
  2. Tool Definitions(静态,锁定)
  3. Chat History(动态,在后)
  4. 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:

  1. 架构决策(绝不总结)
  2. 已修改文件及关键变更
  3. 当前验证状态(pass/fail)
  4. 未完成的 TODO 和回滚记录
  5. 工具输出(可删除,仅保留 pass/fail)

主动替代方案:HANDOFF.md

比依赖压缩算法更可靠的做法是:在开始新会话前,让 Claude 写一份 HANDOFF.md,记录当前进度、尝试过什么、什么有效、什么走不通、下一步做什么。新会话的 Claude 只读这个文件即可接续——不受压缩算法质量影响。


七、参考资源

Last updated on

On this page