有一个现象正在变得普遍:同一个 AI 编程工具,在小项目里用起来像"同事",切到大仓里就变成"实习生"。它会读错文件、改错函数、在几十万行代码里迷路,甚至把两周前已经废弃的模块当成最新版本去修改。
这个问题通常被归结为"模型不够强"。但 Anthropic 在 2026 年 5 月发布的一篇 Claude Code 大规模部署(Claude Blog: How Claude Code works in large codebases: Best practices and where to start)回顾中给出了一个反直觉的结论:那些最成功的大型代码库落地案例,靠的不是更强的模型,而是一套围绕模型搭建的工程配置体系——他们称之为 Harness。
这篇文章以 Claude Code 的实践为轴,拆解 AI 编程工具在大代码库中从"能用"到"好用"的关键环节:代码库如何被导航、配置体系如何分层搭建、以及什么样的组织架构能让这套东西持续运转下去。
AI 编程工具在大代码库中的表现,80% 取决于代码库的配置质量和扩展体系,20% 取决于模型本身。模型决定下限,Harness 决定上限。
一、两种代码库导航路线:谁在"看"代码,差别很大
要理解为什么 AI 编程工具在大仓里容易失灵,先要搞清楚它是怎么"看"代码的。目前主流的代码库导航方式分为两条技术路线:基于 RAG 的索引检索和基于 Agent 的实时遍历。它们的工作原理不同,失效模式也完全不同。
路线一:RAG 索引检索
RAG(检索增强生成)方案的思路是先对整个代码库做一次嵌入(Embedding),把代码片段转成向量存进索引,查询时检索语义最接近的片段注入模型上下文。Cursor、Continue 等工具早期都采用过这种设计。
在小项目里这个方案运转得不错。但在大代码库中,它有一个根本性的失效路径:索引过时。几千个开发者每天提交新代码,嵌入管线的更新速度永远跟不上。等一个开发者发起查询时,索引反映的是几天前甚至几周前的代码状态。检索结果里可能出现一个上个月已经改名的函数、一个上轮 Sprint 里被删掉的模块,而模型不会收到任何"这已经过时了"的信号,它会当最新代码来用。
这也解释了某些工具在小项目里很聪明、切到大仓就变得不可靠的深层原因——不是模型变笨了,而是检索给它的上下文本身就是过期数据。
路线二:Agentic Search 实时遍历
Claude Code 走的是另一条路:不做全局索引,而是像人类开发者一样实时在文件系统里遍历——用 grep/ripgrep 搜关键字符串、按文件路径推断模块结构、跟随引用关系跨文件追踪。每次搜索都命中当前磁盘上的最新代码。
这种方式避开了索引过时的问题,不需要维护中心化的嵌入管线,每个开发者的实例直接从当前代码库读数据。但它也有自己的约束:它依赖模型知道"该去哪找"。如果模型对代码库结构一无所知,随便一个模糊的 grep 就会返回几千条命中,上下文窗口直接爆掉。
这引出了下一步的关键问题:如何让模型在遍历之前就有一个"地图"?答案就是下一节要展开的 Harness 配置体系。
二、Harness 五层扩展阶梯:模型是引擎,配置是方向盘
Claude Code 团队在实践中观察到一个共识:影响 Claude Code 产出质量的不是模型参数,而是围绕模型搭建的扩展体系。他们把这一体系称为 Harness,由五个层次组成,每一层解决一类不同的问题,顺序搭建才能形成自增强的正反馈。
Harness 五层结构图
下面逐一展开每层在做什么、为什么按这个顺序、以及最常见的误区。
第一层:CLAUDE.md — 先有地图,再出发
CLAUDE.md 是 Claude Code 每次会话启动时自动读取的上下文文件。它的设计类似于一个按目录层级叠加的"说明书":根目录文件描述全局架构和关键原则,子目录文件补充特定模块的构建命令、测试约定和局部规则。模型在目录树中移动时会自动加载沿途所有 CLAUDE.md 内容,形成一个累积的上下文底座。
这一层之所以是第一步,是因为它直接决定了后面所有层的信息起点。一个写好的 CLAUDE.md 文件不需要很长,但必须覆盖以下三类信息:项目的高层架构边界(哪些是核心模块,哪些是辅助代码)、本目录适用的命令(build/test/lint 命令和参数)、必须避开的陷阱(哪些文件是生成产物、哪些目录是第三方依赖、哪些操作不能做)。
最常见的错误是把 CLAUDE.md 当成一个"万能配置",把所有规则、提示、最佳实践都塞进去。结果就是每次会话的起点都被大量与当前任务无关的指令占据,反而降低了模型的有效上下文利用率。一个有效的原则是:根目录文件只写"指针"和"致命禁区",具体细节放到子目录文件和 Skills 里去。
第二层:Hooks — 让配置自己变聪明
大部分团队把 Hooks 理解成"防止 Claude 做错事的护栏",比如在文件写入前检查 linter、在退出前验证测试通过。但 Hooks 更被低估的价值是让配置体系持续自我改进。
Stop Hook 可以在会话结束时反思整个过程中的偏差,在上下文还热乎的时候自动生成 CLAUDE.md 的更新建议。Start Hook 可以根据当前开发者的模块归属动态注入团队级上下文,而不需要每个开发者手动配置。这种"用完即改进"的机制,让 Harness 从静态说明书升级为会进化的系统。
此外,对于 lint、format、安全检查这类确定性规则,Hooks 的执行结果比模型"记得遵守"可靠得多——脚本不会走神,也不会被上下文里的其他指令干扰。
常见误区:用 prompt 引导模型遵守规则,而不是用 Hooks 强制执行。在确定性行为上,脚本永远比提示词可靠。
第三层:Skills — 专家经验按需调取
在大代码库里,不同任务类型的专业知识需求差异巨大。做安全审查需要一套方法,生成文档需要另一套模板,部署到生产环境又需要完全不同的检查清单。把这些全部塞进 CLAUDE.md 会拖垮每一次会话的起点。
Skills 通过"渐进披露"(progressive disclosure)解决这个问题:每个 Skill 封装一类专业工作流,只在任务触发时才加载,不浪费不在使用中的上下文空间。更关键的是,Skills 可以按路径作用域绑定——某个支付模块的部署 Skill 只在那个子目录下激活,永远不会在别人修前端样式时弹出来占位置。
常见误区:把 CLADE.md 写得越来越长、包罗万象。当某个规则只适用于某一类操作时,把它提取为 Skill 是更正确的选择。
第四层:Plugins — 把好经验从个体扩散到组织
大代码库的一个隐形成本是"部族化"配置:某个小团队摸索出一套极好的 Skills + Hooks 组合,但只在那几个开发者的本机存在。其他人不知道有这套东西,或者知道了也懒得手动复制配置。
Plugins 把 Skills、Hooks、MCP 配置打包成一个可安装的单元。一个有经验的开发者可以把自己验证过的最佳实践做成插件,新加入的工程师安装这个插件就能立刻获得相同的上下文和能力。托管市场可以集中分发和更新,避免同一套好东西在组织内部被重复发明几十次。
Anthropic 提到一个典型案例:某大型零售企业为一个连接内部分析平台的 Skill 做了 Plugin,在业务侧大规模推广之前先在小范围验证,然后用 Plugin 机制一键分发给所有业务分析师。
第五层:MCP、LSP、Subagents — 扩展的纵深
前三层搭好了配置体系后,这一层解决的是更具体的工程问题:
MCP 服务器扩展 Claude 的工具边界,让它能连接内部文档、工单系统、分析平台等外部数据源。有的团队把结构化搜索封装成 MCP 工具让模型直接调用;有的连接内部 API 实现端到端的自动化。
LSP 集成给 Claude 提供 IDE 级别的代码导航精度。没有 LSP 时,模型靠字符串匹配找函数引用,在大型 C/C++ 代码库里可能返回上千条无关命中。有了 LSP,它可以区分同名不同类的函数、跟踪准确的引用链。对多语言代码库来说,这一层的投资回报率极高。
Subagents把"探索"和"修改"拆分到独立的上下文窗口中。一个只读的子 Agent 先去某个子系统摸清结构、把发现写进文件,主 Agent 再基于完整理解去编辑。这既避免了上下文窗口在探索过程中被大量中间结果填满,又让并行任务成为可能。
但这一层绝不能提前搭建。在 CLAUDE.md、Hooks、Skills 都没跑通之前,MCP 和 Subagents 只会增加调试复杂度而不带来可感的改进。
Harness 组件速查
三、三个来自实战的配置模式
Anthropic 在总结多个大型组织的部署经验时,发现了三个反复出现的配置模式。这些模式不依赖于特定的技术栈或语言,但能显著影响 Claude Code 在大仓里的导航效率和输出质量。
模式一:让代码库对 AI 可读
Claude 在大型代码库中的有效工作边界,等于它"能找到正确上下文的概率"乘以上下文窗口的总容量。如果每次会话都灌入大量无关信息,有效上下文被稀释;如果什么都不提供,模型就靠 guess 来导航。最有效的部署都会在前期投入让代码库"对 Claude 可读"。
保持 CLAUDE.md 精简且分层。 根目录文件只写全局指针和致命禁区,子目录文件负责具体约定。模型会沿着目录树自动叠加所有 CLAUDE.md 内容,根级信息绝不会丢失。
从子目录初始化会话,而不是从仓库根目录。 在 monorepo 里,这看起来违反直觉——因为很多工具链习惯在根目录运行。但 Claude 会自动沿目录树上溯并加载所有 CLAUDE.md,所以把范围缩小到与当前任务相关的子目录不会丢失根级上下文,反而避免了那些不相关模块的配置噪音。
按子目录指定 test 和 lint 命令。 在微服务架构的代码库里,每个目录有自己独立的构建和测试命令。全量运行整个仓库的测试不仅耗时,还把不相关的错误输出灌入上下文。CLAUDE.md 在子目录级精确指定本地命令,让模型只运行和当前变更相关的验证。
用 .ignore 文件排除生成代码和第三方依赖。 把排除规则提交到 .claude/settings.json 中做版本控制,确保团队里每个开发者看到的代码搜索范围一致。对于需要开发代码生成器本身的人,可以在本地 settings 中覆盖项目级别的排除规则。
当目录结构本身不够清晰时,补一个轻量级的代码库地图。 在根目录下放一个 markdown 文件,列出每个顶层文件夹和一行功能描述。模型可以在真正打开文件之前快速扫一遍这个"目录"。几百个顶层文件夹的场景下把它做成分层结构——根文件描述最高层,子目录 CLAUDE.md 提供下一级细节。
运行 LSP 服务器,让模型按符号搜索而不是字符串匹配。 在一个大仓里 grep 一个通用的函数名可能返回几千条结果。LSP 只返回指向同一个符号的引用,在模型读到任何文件之前就完成了过滤。这对 C/C++ 这类大量使用宏和同名函数的多语言代码库来说,可能是性价比最高的单项投资。
模式二:把 CLAUDE.md 当成活的资产来维护
这是一个容易被低估的问题:模型在进化,为当前模型写的规则可能在下一次模型升级后反过来限制它。
举个例子:某个 CLAUDE.md 里有一条规则"每次重构限制为单文件修改",这是在旧模型容易把一次改动扩散成全仓重构的背景下加进去的。但当新模型已经能够处理跨文件的协调编辑时,这条规则就不再是保护,而是约束。
同样,某个 Hook 拦截文件写入是为了实现 Perforce 的 p4 edit,这个 Hook 在 Claude Code 原生支持 Perforce 模式后就成了多余的代码。
Anthropic 建议每 3 到 6 个月做一次有意义的配置审查,尤其是在主模型重大升级之后。审查的核心问题是:目前的 CLAUDE.md 规则和 Hooks 里,哪些是为老模型的短板写的、在新模型下反而限制了能力?
这个审查不仅是删东西,也是补东西——新模型解锁了哪些老模型做不到的能力,新的 CLAUDE.md 是否可以引导模型去做那些事?
模式三:指派明确的配置管理者
技术配置再精巧,没有人的维护也会慢慢变质。Anthropic 观察到一个清晰的规律:推广最快的部署都提前投入了专门的人或团队来搭建基础设施。
有的公司投入一到两个人,在全员推广之前就把 Plugins 和 MCP 搭好,开发者第一次触碰工具时就有一个现成的工作环境。有的公司成立了一个完整的团队,专门管理 AI 编程工具的配置和推广。无论哪种形式,共同点是有一个人对以下事情有明确的决策权和维护责任:CLAUDE.md 的层级结构、权限策略、插件市场的准入、以及配置的定期更新。
自下而上的推广能点燃热情,但如果没有人把各个团队摸索出来的好实践收拢、标准化、分发出去,这些知识会停留在个别的开发者本地,最终造成配置质量的不一致和推广的停滞。
在大型组织和受监管行业里,治理问题会更早浮出:谁来决定哪些 Skills 和 Plugins 可用?怎么避免几千个工程师各自独立开发同一套东西?AI 生成的代码怎么融入已有的 code review 流程?Anthropic 建议从一个小范围开始——限定的 Skills 白名单、必须经过 code review、分批开放访问权限——然后在信心积累中逐步扩展。
实践表明,最顺畅的部署都早早设立了跨职能工作组,把工程、信息安全和治理代表拉到一起共同定义需求并制定推广路线图。
四、落地推力:从哪开始,按什么顺序
如果你的团队正在考虑把 AI 编程工具引入大代码库,Claude Code 的实践给出了一个清晰的推进路径。下面按优先级排列:
第一周:建立基础可读性
1. 在仓库根目录创建一个精简的 CLAUDE.md,只写:项目是什么、核心模块列表(每个一行描述)、需要避开的禁区(生成文件、第三方代码)。
2. 在 2-3 个最常用的子目录下补充局部 CLAUDE.md,指定本目录的 build/test/lint 命令。
3. 配置 .ignore 规则排除 node_modules、build、dist、vendor 等目录。
4. 提交这些配置文件,让团队里的其他人直接使用。
第一个月:启动自改进循环
1. 添加 Stop Hook,在会话结束后自动分析偏差并建议 CLAUDE.md 更新。
2. 为 lint 和 format 加 Hooks 做强制执行,不再依赖模型"自觉遵守"。
3. 识别 2-3 个高频任务(如代码审查、文档生成),把它们封装为 Skills。
4. 指定一个 DRI(直接负责人),负责配置审查、权限管理和 Skills 的准入。
第一个季度:扩散和纵深
1. 把验证过的 Skills 和 Hooks 打包成 Plugin,通过托管市场分发给全团队。
2. 为多语言代码库部署 LSP 集成——先覆盖使用最频繁的语言。
3. 在基础层跑通后,识别需要外部连接的场景(工单系统、内部文档、监控面板),搭建 MCP 服务器。
4. 对复杂多步骤任务,用 Subagents 拆分探索和修改阶段。
5. 在每次模型重大升级后做一次 CLAUDE.md 审查,清理为旧模型短板而设的规则。
总结快照
AI 编程工具在大仓里好不好用,模型决定下限,Harness(配置体系)决定上限。
Agentic Search 避免了 RAG 方案在大仓里"索引过时"的根本失效模式,但依赖代码库配置质量。
Harness 五层按顺序搭建:CLAUDE.md → Hooks → Skills → Plugins → MCP/LSP/Subagents。跳过前三层直接上后两层只会增加调试成本。
CLAUDE.md 需要像代码一样维护:模型升级后,很多旧规则从"保护"变成了"约束"。
技术配置之外,必须有一个人或一个小团队对这套体系有明确的 ownership——否则好经验会停留在个体本机,推广也会卡住。
夜雨聆风