AI 编程接手项目:上下文工程实战指南

0阅读8分钟

问题本质:上下文缺失

AI 编程工具接手我的项目时,上下文缺失导致的返工比代码质量更致命。工具能写出语法正确的代码,却不了解项目的隐性约束——目录边界、样式约定、验证流程。这些约束藏在代码结构和团队默契里,AI 接手的第一步是把它们变成显性上下文。

截至 2026 年 6 月,AGENTS.md 已被超过 60000 个开源项目采用(agents.md),成为 Claude Code、Codex、Cursor、Copilot 等 30 多种工具共同支持的跨工具标准。Martin Fowler 在 2026 年 2 月的文章中把这件事定义为「上下文工程」(Context Engineering)——给 AI 编程工具提供正确的项目上下文,让它不必每次都靠猜测理解你的仓库。

上下文工程不等于写一个 AGENTS.md 就完事。ETH Zurich 2026 年 3 月的研究发现,写得差的上下文文件反而让成功率下降了约 3%(Medium 分析)。上下文需要精准、结构化、可执行。

本文拆三件事:上下文为什么重要、怎么写一份有效的上下文文件、接手项目时该按什么顺序检查。

上下文工程:四层模型

Sourcegraph 在 2026 年初提出一个四层上下文模型(Sourcegraph Blog),对理解 AI 编程接手项目的问题很有用:

层级内容生命周期例子
静态上下文项目约束、目录边界、代码风格、验证命令跨会话持久AGENTS.mdCLAUDE.md.cursor/rules
动态上下文当前打开的文件、最近的编辑、对话历史单次会话IDE 当前 tab、git diff
检索上下文从代码库搜索到的相关实现、文档、issue按需拉取grep 结果、API 文档、设计稿链接
持久上下文跨会话记忆、学到的偏好、历史决策跨会话增量上次的修改记录、review 反馈

AI 接手项目时翻车,绝大多数出在静态上下文缺失。项目有约定但没写下来,AI 只能按通用模式猜测。一个 Next.js 项目可能用 App Router 也可能用 Pages Router,可能用 pnpm 也可能用 npm,测试可能在 src/__tests__/ 也可能在顶层 tests/——这些差异,静态上下文文件是唯一可靠的传递方式。

Anthropic 在 2025 年 9 月的工程博客里强调:系统提示应该「清晰、直接、在正确的抽象层级上」(Anthropic Engineering)。套到项目上下文里:给 AI 当前任务需要的约束和边界,别扔一整本架构文档。

arXiv 2026 年 3 月的论文《Building AI Coding Agents for the Terminal》进一步提出,终端 AI 编程工具的架构可以分为四层:agent reasoning、context engineering、tooling、persistence(arXiv)。其中 context engineering 层负责的就是把项目知识从「人脑中的默契」转成「AI 可以消费的指令」。

典型翻车场景与修复路径

案例一:Monorepo 目录归属错位

问题:AI 按通用习惯放代码——组件写在页面文件里、测试扔进 src/——全因不知道我的目录约定。

修复:我在根目录写了 AGENTS.md,记录关键约束:

# AGENTS.md
 
## 项目事实
- Monorepo,pnpm + Turborepo;Node.js 22+
- `apps/` 是 Next.js App Router 主应用
- `packages/ui/` 是共享 UI 组件
 
## 代码边界
- 页面文件只做路由装配;复杂 UI 放 `_components/``features/`
- 环境变量通过 `apps/src/config/env/` 读取,不直接 `process.env`
 
## 验证命令
- 提交前运行 `pnpm verify`(typecheck + lint + test + build)

效果:同样的需求,AI 先读 AGENTS.md,然后从 apps/src/api/ 读数据、组件放 apps/src/components/、测试写在 apps/tests/,完成后跑 pnpm verify。一次通过。

AI 的通用知识和项目特定约束之间存在一条必须显式跨越的鸿沟,AGENTS.md 就是跨越它的方式。

案例二:缺少验证命令导致的静默失败

问题:AI 改完字段名后只跑了 typecheck,通过了。但项目有个自定义的 pnpm validate:content 脚本——检查所有文章的 slug、日期格式和标签白名单。AI 不知道这个脚本,改坏了 slug 格式,部署后才发现。

修复:在 AGENTS.md 按改动类型列出验证命令:

## 验证命令(按改动类型)
- 内容改动:`pnpm validate:content` + `pnpm check:slug` + `pnpm typecheck`
- UI 改动:`pnpm typecheck` + `pnpm build` + 浏览器验收
- API 改动:`pnpm typecheck` + `pnpm test` + `pnpm test:integration`

关键在于不同改动类型对应不同验证命令。validate:content 的存在只写在团队流程默契里,AI 无法从代码结构推断出来。

案例三:上下文过载

问题:我把 12000 字架构文档全塞进 AGENTS.md,包含数据库 ER 图、部署拓扑、三年路线图。AI 处理一个简单前端修改时,被无关信息淹没,开始根据后端微服务拆分方式来决定前端组件位置。

ETH Zurich 的研究量化了这个问题:写得差的上下文文件让成功率下降 3%。上下文窗口是有限的认知资源,无关信息会稀释有效指令的权重。

修复:我把 AGENTS.md 拆成三层——根文件只放核心约束(约 50 行),详细架构文档放 docs/ 让 AI 按需检索,流程指南放 .agents/skills/ 按任务匹配加载。Martin Fowler 的建议是上下文要「不多不少」,让信息在正确的层级上可被发现。

项目接手流程图

AI 接手一个项目任务时,建议按以下顺序执行:

流程图画布 · 115%
Mermaid 流程图加载中...

这个流程的核心是「先读后做」——在写第一行代码之前,AI 应该能回答三个问题:项目有什么约束、现有代码怎么做的、我准备改什么和不改什么。

好上下文 vs 坏上下文

维度坏上下文好上下文为什么
项目描述「这是一个现代化的全栈 Web 应用」「Next.js 16 App Router,pnpm monorepo,Node.js 22+」具体技术栈让 AI 不用猜
目录约定「组件放在 components 目录」「可复用 UI 放 packages/ui/;页面级展示组件放 apps/src/components/;feature 内聚组件放 features/xxx/_components/三级目录各有归属,AI 能正确放置新组件
验证命令「记得跑测试」「提交前运行 pnpm verify(含 typecheck + lint + test + build)」具体命令可执行,不是模糊要求
代码风格「遵循项目代码风格」「Biome:单引号、无尾分号、trailing comma all;TypeScript strict mode」工具 + 配置名 = 可查可执行
边界约束「不要改不该改的文件」「页面文件只做路由装配,复杂逻辑放 _components/;环境变量走 config/env/,禁止直接 process.env正反两面都写了,AI 有明确的 do 和 don't
上下文量12000 字架构文档全塞进去根文件 50 行核心约束 + 子目录按需加载精准 > 全面;噪声会稀释有效指令

上下文清单模板

以下是一份可以直接复用的项目接手上下文清单。分三层:根文件放全局约束,子目录放模块指南,任务级放单次任务边界。

根目录 AGENTS.md 模板

# AGENTS.md
 
## 项目事实
- 技术栈:[框架] + [包管理] + [运行时版本]
- 仓库结构:[monorepo / 单应用 / ...]
- 主要目录:[一句话描述每个顶层目录的职责]
 
## 代码边界
- [归属 A] → 放 [目录 X]
- [归属 B] → 放 [目录 Y]
- [容易出错的归属]:错误做法 → 正确做法(用表格)
 
## 验证命令
- 内容改动:[具体命令]
- UI 改动:[具体命令]
- API 改动:[具体命令]
- 通用:[提交前必须跑的完整命令]
 
## 非目标(本项目不做什么)
- [不用的框架/库/模式]
- [不支持的浏览器/环境]
- [明确的技术选型排除项]

任务级上下文传递模板

交给 AI 新任务时,除了 AGENTS.md,还需要任务级上下文:

## 本次任务
- 目标:[用户完成什么动作后能看到什么结果]
- 非目标:[本次不处理哪些相邻问题]
- 预计触达:[目录、模块、接口]
- 约束:[兼容性、性能、安全注意事项]
- 验收标准:[必须通过的验证 + 人工检查点]
 
## 相关上下文
- 相关 issue / PR 链接
- 相关设计稿链接
- 已有实现参考:[类似功能的文件路径]

常见踩坑点

踩坑点发生场景后果避免方式
上下文文件过大把架构文档、API spec、数据库 schema 全塞进一个文件AI 被无关信息干扰,引用不相关内容指导当前任务根文件 ≤ 100 行;详细内容放 docs/,按需检索
缺验证命令AGENTS.md 只写了代码约定,没写怎么验证AI 改完只跑 typecheck,漏掉 lint、build、集成测试按改动类型列出具体命令,不要只写「记得测试」
不写非目标只写要做什么,不写不做什么AI 范围漂移,顺手改了不该改的模块每次任务显式列出「本期不做」的相邻问题
测试目录不明没说明测试文件放哪里AI 把测试写在 src/ 里,和项目结构不一致明确测试目录 + 镜像规则(源码路径 → 测试路径)
上下文文件互相矛盾AGENTS.md 说用 npm,CLAUDE.md 说用 pnpmAI 不确定该听哪个,可能随机选一个定义优先级:用户指令 > 项目文件 > 工具默认
只有正面约束没有反面写了「组件放 components」,没写「页面文件不做复杂 UI」AI 仍然可能把逻辑写在页面文件里容易出错的地方同时写 do 和 don't
没检查工作区状态AI 直接开始改代码,覆盖了他人未提交的改动冲突、丢失工作流程第一步加 git status + git log --oneline -10

三个验证问题

写完上下文文件后,我用三个问题自检:

问题一:AI 能根据这份上下文找到正确的文件位置吗? 给它一个新组件需求,看它放在哪个目录。如果它放对了,说明目录边界写清楚了;如果放错了,说明你的上下文里缺少这条归属规则。

问题二:AI 能选对验证命令吗? 给它一个内容改动任务,看它跑什么命令验证。如果只跑了 typecheck 没跑 content validate,说明验证命令部分缺少按改动类型的区分。

问题三:AI 能说出「不改什么」吗? 让它描述任务边界。如果它只能说「我准备改什么」但说不出「我不改什么」,说明非目标没有传递到位。一个理解任务边界的 AI,应该能同时列出目标和非目标。

上下文工程的原则

我归纳出五条可操作的原则:

1. 精准优于全面。上下文窗口的容量是有限的认知资源。给 AI 当前任务需要的约束,不是整个项目的百科全书。根文件控制在 50-100 行,详细内容通过目录结构按需发现。

2. 命令优于描述。「记得跑测试」不如 pnpm verify。「遵循代码风格」不如 `Biome:单引号、无尾分号」。可执行的命令比自然语言描述更不容易被误解。

3. 正反双向约束。容易出错的地方,同时写 do 和 don't。「环境变量走 config/env/」不够,加上「禁止直接 process.env」才能有效防止 AI 凭通用经验犯错。

4. 分层而非堆叠。静态约束放根文件,模块指南放子目录,任务边界在对话中传递。每一层只解决一个抽象层级的问题。PixelMojo 的分析把这种结构称为「五层上下文层级」,AGENTS.md 只是第一层(PixelMojo)。

5. 验证闭环。上下文文件不只是告诉 AI「怎么做」,还要告诉它「怎么证明做对了」。没有验证命令的上下文文件只完成了一半的工作。

结论

上下文工程要做的,是把我们团队的隐性知识——目录约定、验证流程、归属规则、技术选型排除项——转成 AI 可以消费的显性指令。它需要持续维护:项目演进时上下文文件也要同步更新,我发现 AI 反复犯同一个错误时,说明上下文里缺少对应约束。

下次我让 AI 接手项目任务时,先检查三件事:AGENTS.md 是否覆盖了这次任务需要的约束、验证命令是否按改动类型列出、任务边界是否包含非目标。这三件事做到位,AI 的返工率会显著下降。

上下文文件是对齐工具——让 AI 的理解和我的预期在同一个坐标系里。


参考资料

评论 0

0 / 1000