Skip to Content

17d - 开发中的上下文工程

本文是《AI Agent 实战手册》第 17 章第 4 节。 上一节:17c-微任务执行与人工审查 | 下一节:18a-2026-AI测试工具全景

概述

上下文工程是 Spec-Driven Agentic Workflow 的隐形支柱——规划再好、任务拆分再细,如果 AI Agent 在执行时”看不到”正确的信息,输出质量依然会崩塌。Martin Fowler 团队在 2025 年的总结一针见血:“上下文工程就是策划模型看到的内容,让你得到更好的结果。“本节聚焦开发阶段的上下文工程实践:如何精确选择文件、如何通过 MCP 连接外部工具、如何编写和组织 Steering/Rules 规则文件,以及如何在编码会话中管理有限的上下文窗口。这些技术与第 3 章的上下文工程方法论一脉相承,但更侧重”写代码时怎么用”。


1. 文件选择策略:给 AI 看什么

核心原则

上下文窗口不是越大越好。2025 年的研究表明,即使模型支持 200K 甚至 1M+ token,无差别地塞入大量文件反而会降低输出质量——模型的注意力被分散,关键信息被淹没。文件选择的核心原则是:精确、最小、相关

工具推荐

工具文件选择方式价格适用场景
Kiro#File#Folder 引用;Spec 文件自动注入免费(预览)Spec-Driven 开发,自动上下文管理
Cursor@file@folder@codebase 语义搜索$20/月灵活的手动上下文控制
Claude Code/add 命令、CLAUDE.md 自动加载、/compact 压缩$20/月(Pro)CLI 环境,大型代码库
WindsurfCascade 自动索引 + 手动引用$15/月多步骤 agent 自动发现
GitHub Copilot#file@workspace 全局搜索$10/月轻量级内联补全
Augment Code全代码库索引 + 智能检索$50/月超大型代码库(100万+ 行)

操作步骤

步骤 1:建立文件选择心智模型

每次向 AI 发起编码请求前,问自己三个问题:

  1. 这个任务需要修改哪些文件? → 直接引用
  2. 这个任务依赖哪些接口/类型定义? → 引用类型文件和接口文件
  3. 有没有类似的已有实现可以参考? → 引用示例文件
文件选择决策树: 任务描述 → 需要修改的文件(必选) → 相关类型/接口定义(必选) → 设计文档/Spec(推荐) → 类似实现的参考文件(可选) → 测试文件(如果任务包含测试) ❌ 不要加入的: - 整个 node_modules 或 vendor 目录 - 无关模块的实现文件 - 历史变更日志 - 构建产物

步骤 2:按工具执行精确引用

在 Kiro 中:

# 引用单个文件 #File src/sync_engine.rs # 引用整个目录(Kiro 会智能筛选相关文件) #Folder src/components/ # Spec 文件自动注入——无需手动引用 # Kiro 的 Spec 工作流会自动将 requirements.md、design.md # 作为上下文提供给 AI Agent

在 Cursor 中:

# 引用文件 @file src/sync_engine.rs # 引用文件夹 @folder src/components/ # 语义搜索整个代码库(适合不确定文件位置时) @codebase "文件同步的冲突检测逻辑在哪里?" # 引用外部文档 @docs https://docs.rs/tokio/latest/tokio/

在 Claude Code 中:

# 添加文件到当前会话上下文 /add src/sync_engine.rs src/types.rs src/config.rs # 添加整个目录 /add src/components/ # 当上下文过大时,压缩历史对话 /compact # 清除上下文重新开始 /clear

步骤 3:分层文件选择策略

根据任务复杂度,采用不同的文件选择层级:

┌─────────────────────────────────────────────┐ │ 层级 1:最小上下文(简单修改) │ │ • 目标文件 + 直接依赖的类型定义 │ │ • 适合:修 bug、改样式、加字段 │ │ • 示例:修改按钮组件 → Button.tsx + types.ts │ ├─────────────────────────────────────────────┤ │ 层级 2:模块上下文(功能开发) │ │ • 目标文件 + 同模块文件 + 接口定义 + Spec │ │ • 适合:实现新功能、重构模块 │ │ • 示例:实现同步引擎 → engine.rs + types.rs │ │ + config.rs + design.md │ ├─────────────────────────────────────────────┤ │ 层级 3:跨模块上下文(架构变更) │ │ • 多个模块的核心文件 + 架构文档 + 测试 │ │ • 适合:跨模块重构、API 变更 │ │ • 示例:修改 API 层 → routes/ + services/ │ │ + models/ + tests/ + openapi.yaml │ └─────────────────────────────────────────────┘

提示词模板

请实现 [任务描述]。 相关上下文: - 设计文档:参考 design.md 中的 [具体章节] - 类型定义:见 [types 文件路径] - 参考实现:[类似模块路径] 中有类似的实现模式 - 编码规范:遵循项目 Steering/Rules 文件中的约定 只修改以下文件: - [文件1路径] - [文件2路径] 不要修改其他文件。不要引入新的依赖。

2. MCP 连接外部工具:扩展 AI 的能力边界

为什么开发阶段需要 MCP

编码不只是写代码——开发者需要查数据库 schema、看 GitHub issue、读 API 文档、检查部署状态。MCP(Model Context Protocol)让 AI Agent 直接连接这些外部工具,省去”复制粘贴”的上下文传递。Martin Fowler 团队将 MCP Server 归类为”上下文接口”——它们是 AI 获取更多上下文的通道,模型可以按需调用。

关于 MCP 的完整概念和架构,详见 08a-MCP概念入门。本节聚焦开发阶段最实用的 MCP 配置。

工具推荐

MCP Server用途价格适用场景
GitHub MCP读写 issue、PR、代码搜索免费(需 token)任务管理、代码审查
PostgreSQL MCP查询数据库 schema 和数据免费(开源)数据库相关开发
Filesystem MCP文件读写、目录浏览免费(内置)基础文件操作
Context7 MCP实时获取库文档免费(开源)查阅第三方库最新文档
Sentry MCP查看错误日志和堆栈免费(需账号)调试线上问题
Linear/Jira MCP读写项目管理任务免费(需 token)任务状态同步
Docker MCP管理容器和镜像免费(开源)容器化开发
Playwright MCP浏览器自动化测试免费(开源)E2E 测试、UI 验证
Chrome DevTools MCP实时浏览器调试免费(开源)前端调试、性能分析
Figma MCP读取设计稿免费(需 token)设计到代码转换

操作步骤

步骤 1:配置 MCP Server

Kiro 配置(.kiro/settings/mcp.json):

{ "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } }, "postgres": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-postgres"], "env": { "DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb" } }, "context7": { "command": "npx", "args": ["-y", "@upstash/context7-mcp@latest"] } } }

Cursor 配置(.cursor/mcp.json):

{ "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx" } } } }

Claude Code 配置(.mcp.json,项目根目录):

{ "mcpServers": { "postgres": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://user:pass@localhost:5432/mydb"] }, "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx" } } } }

步骤 2:按开发场景选择 MCP 组合

场景 1:全栈 Web 开发 ├── GitHub MCP(任务管理 + PR) ├── PostgreSQL MCP(数据库 schema 查询) ├── Context7 MCP(查阅框架文档) └── Playwright MCP(E2E 测试) 场景 2:前端开发 ├── Figma MCP(设计稿读取) ├── Chrome DevTools MCP(实时调试) ├── Context7 MCP(组件库文档) └── GitHub MCP(issue 追踪) 场景 3:后端 API 开发 ├── PostgreSQL MCP(数据库操作) ├── Docker MCP(容器管理) ├── Sentry MCP(错误追踪) └── GitHub MCP(代码审查) 场景 4:DevOps / 基础设施 ├── Docker MCP(容器管理) ├── GitHub MCP(CI/CD 配置) └── Sentry MCP(监控告警)

步骤 3:安全注意事项

⚠️ MCP 安全清单: 1. 永远不要在配置文件中硬编码密钥 ✅ 使用环境变量:${GITHUB_TOKEN} ❌ 直接写入:ghp_abc123... 2. 数据库 MCP 使用只读连接 ✅ postgresql://readonly_user:pass@host/db ❌ postgresql://admin:pass@host/db 3. 限制 MCP Server 的权限范围 - GitHub MCP:只授予必要的 scope(repo:read) - 文件系统 MCP:限制可访问的目录 4. 不要将 .mcp.json 提交到公开仓库 → 添加到 .gitignore → 或使用环境变量引用

提示词模板

我正在开发 [功能描述],需要了解数据库结构。 请通过 PostgreSQL MCP: 1. 查询 [表名] 的完整 schema(列名、类型、约束) 2. 查看与 [表名] 相关的外键关系 3. 获取 [表名] 的示例数据(LIMIT 5) 基于查询结果,生成对应的 [TypeScript/Rust] 类型定义。

3. Steering / Rules 规则文件实践

什么是 Steering / Rules 文件

Steering 文件(Kiro)、CLAUDE.md(Claude Code)、.cursorrules(Cursor)本质上是同一个概念的不同实现——它们是持久化的 AI 上下文,告诉 AI Agent “在这个项目中应该怎么做”。Martin Fowler 团队将其归类为”指导”(Guidance)型上下文:不是让 AI 做某件具体的事,而是设定通用的行为准则。

关于规则文件的完整编写指南,详见 03b-规则文件编写指南。本节聚焦开发阶段的实战配置。

工具推荐

工具规则文件格式位置价格特点
Kiro SteeringMarkdown (.md).kiro/steering/免费支持 always/manual 两种加载模式,全局+项目两级
CLAUDE.mdMarkdown项目根目录 / 子目录$20/月层级继承(根→子目录),自动加载
.cursorrulesMarkdown项目根目录$20/月单文件,全局生效
Cursor Rules (MDC)Markdown + Frontmatter.cursor/rules/$20/月支持 always/auto/agent/manual 四种模式
Codex AGENTS.mdMarkdown项目根目录 / 子目录按 API 计费类似 CLAUDE.md 的层级继承
Copilot InstructionsMarkdown.github/copilot-instructions.md$10/月GitHub 生态集成

操作步骤

步骤 1:设计规则文件结构

最佳实践是按职责拆分规则文件,而不是把所有规则塞进一个文件。QES 团队的研究表明,按角色拆分文件(如 API 标准、安全规范)能有效减少 AI 的混淆和幻觉。

Kiro Steering 推荐结构:

.kiro/ ├── steering/ │ ├── coding-standards.md # 编码规范(always 模式) │ ├── architecture.md # 架构约定(always 模式) │ ├── testing-standards.md # 测试规范(always 模式) │ ├── security-rules.md # 安全规则(always 模式) │ └── migration-guide.md # 迁移指南(manual 模式) ├── specs/ │ └── my-feature/ │ ├── requirements.md │ ├── design.md │ └── tasks.md └── settings/ └── mcp.json

CLAUDE.md 推荐结构:

项目根目录/ ├── CLAUDE.md # 全局规则(自动加载) ├── src/ │ ├── CLAUDE.md # 前端特定规则(进入 src/ 时加载) │ └── components/ │ └── CLAUDE.md # 组件开发规则(进入 components/ 时加载) ├── server/ │ └── CLAUDE.md # 后端特定规则 └── tests/ └── CLAUDE.md # 测试特定规则

Cursor Rules 推荐结构:

.cursor/ └── rules/ ├── general.mdc # 通用规则(always 模式) ├── react-components.mdc # React 组件规则(auto 模式,匹配 *.tsx) ├── api-routes.mdc # API 路由规则(auto 模式,匹配 routes/*.ts) └── database.mdc # 数据库规则(agent 模式,按需加载)

步骤 2:编写高质量规则文件

规则文件的质量直接影响 AI 输出。2025 年的研究发现,LLM 生成的规则文件在 8 个测试场景中有 5 个反而降低了性能,而人工精心编写的规则文件平均提升约 4 个百分点。关键在于:规则要具体、可执行、不冗余。

Kiro Steering 实战示例(RustSync 项目):

<!-- .kiro/steering/coding-standards.md --> --- inclusion: always --- # RustSync 编码规范 ## Rust 代码规范 - 错误处理使用 `thiserror` 定义错误类型,禁止在生产代码中使用 `unwrap()``expect()` - 所有公共函数和结构体必须有 `///` 文档注释 - 异步运行时统一使用 `tokio`,不混用其他异步运行时 - 使用 `clippy` 的所有默认 lint,CI 中 `clippy -- -D warnings` - 文件操作使用 `tokio::fs`,不使用 `std::fs` 的同步版本 ## TypeScript 代码规范 - 样式使用 CSS Modules(`*.module.css`),不用内联样式或 Tailwind - 组件使用函数式组件 + hooks,不使用 class 组件 - 类型定义集中在 `src/types/index.ts`,组件 props 类型与组件同文件 - 状态管理使用 React hooks(useState/useReducer),不引入 Redux ## 通用规范 - 提交信息使用 Conventional Commits 格式 - 每个模块必须有对应的单元测试文件(`*.test.ts``*_test.rs` - 不引入未在 design.md 中规划的新依赖

CLAUDE.md 实战示例:

# CLAUDE.md ## 项目概述 RustSync 是一个基于 Tauri 的文件同步工具,前端 React + TypeScript,后端 Rust。 ## 关键约定 - Tauri 命令定义在 src-tauri/src/commands.rs - 前端 API 调用封装在 src/api/ 目录 - 所有 Tauri 命令必须返回 Result<T, String> 类型 ## 不要做的事 - 不要修改 Cargo.toml 添加新依赖(除非任务明确要求) - 不要使用 `console.log` 调试,使用项目的 logging 模块 - 不要在组件中直接调用 Tauri invoke,通过 api/ 层封装 ## 测试 - Rust 测试:cargo test - 前端测试:npm run test - 类型检查:npm run typecheck

步骤 3:规则文件的加载策略

不同的规则需要不同的加载时机。过多的 always 规则会占用宝贵的上下文空间。

加载策略决策树: 这条规则每次编码都需要吗? ├── 是 → always 模式(编码规范、架构约定、安全规则) └── 否 → 这条规则能通过文件路径自动判断吗? ├── 是 → auto 模式(前端规则匹配 *.tsx,后端规则匹配 *.rs) └── 否 → 这条规则需要 AI 自己判断何时使用吗? ├── 是 → agent 模式(数据库迁移指南、性能优化建议) └── 否 → manual 模式(一次性迁移指南、特殊场景处理)

Kiro Steering 加载模式:

<!-- always 模式:每次对话都注入 --> --- inclusion: always --- # 编码规范 ... <!-- manual 模式:只在用户通过 @steering 显式引用时加载 --> --- inclusion: manual --- # 数据库迁移指南 ...

Cursor MDC Rules 加载模式:

<!-- always 模式 --> --- alwaysApply: true --- # 通用编码规范 <!-- auto 模式:匹配特定文件时自动加载 --> --- globs: ["src/components/**/*.tsx", "src/components/**/*.css"] --- # React 组件开发规范 <!-- agent 模式:AI 自行判断是否需要 --> --- alwaysApply: false --- # 数据库查询优化指南

提示词模板

请审查当前项目的 Steering/Rules 文件,检查以下问题: 1. 是否有冗余或矛盾的规则? 2. 是否有规则过于模糊,AI 难以执行? 3. 是否有重要的项目约定没有被规则覆盖? 4. always 模式的规则是否过多(建议不超过 [N] 个文件)? 输出改进建议,包括: - 需要删除的冗余规则 - 需要细化的模糊规则 - 需要补充的缺失规则 - 需要调整加载模式的规则

4. 上下文窗口管理:编码会话中的实战技巧

为什么需要管理上下文窗口

即使 2025-2026 年的模型上下文窗口已经很大(Claude Sonnet 4.6 达到 1M token,Gemini 2.5 Pro 达到 1M+),在实际编码会话中,上下文依然是稀缺资源。原因有三:

  1. 成本:每个 token 都有成本,200K token 的会话比 20K 贵 10 倍
  2. 注意力衰减:模型在超长上下文中的注意力会分散,“中间丢失”(Lost in the Middle)现象依然存在
  3. 竞争:MCP 工具描述、Steering 规则、历史对话、代码文件都在争夺上下文空间

操作步骤

步骤 1:监控上下文使用量

Claude Code: - 使用 /cost 命令查看当前会话的 token 消耗 - 使用 /compact 在上下文过大时压缩历史对话 - 观察 "Context window usage" 指示器 Cursor: - 查看聊天窗口底部的 token 计数 - 使用 "New Chat" 开始新会话释放上下文 Kiro: - 关注 Spec 文件的大小——过大的 design.md 会占用大量上下文 - 使用 #File 精确引用而非 #Folder 批量引用

步骤 2:上下文压缩技术

技术 1:会话分段 ├── 每完成一个微任务,开始新的会话 ├── 在新会话中只加载下一个任务需要的上下文 └── 避免一个会话跨越多个不相关的任务 技术 2:渐进式上下文加载 ├── 先给 AI 最小上下文,让它开始工作 ├── 当 AI 需要更多信息时,按需添加 └── 比一次性加载所有文件更高效 技术 3:上下文摘要 ├── 对于大型设计文档,提供摘要而非全文 ├── 对于长对话历史,使用 /compact 压缩 └── 对于大型代码文件,只引用相关函数而非整个文件 技术 4:四文件工作记忆系统 ├── progress.md:当前任务进度和已完成的工作 ├── decisions.md:关键技术决策和原因 ├── context.md:项目上下文摘要 └── next-steps.md:下一步计划 → 每次新会话加载这四个文件,恢复工作状态

步骤 3:交叉引用设计文档

在 Spec-Driven 工作流中,设计文档是最重要的上下文来源之一。但直接把整个 design.md 塞进上下文往往不是最优选择。

交叉引用策略: 1. 任务级引用(推荐) "请实现 Task 3.2。参考 design.md 中'差异计算引擎'章节的算法设计。" → AI 只需要关注设计文档的特定部分 2. 类型级引用 "请参考 design.md 中的数据模型定义,实现对应的 Rust 结构体。" → 聚焦数据模型,忽略其他设计细节 3. 接口级引用 "请参考 design.md 中的 API 设计,实现 /sync/status 端点。" → 只关注 API 接口定义 ❌ 避免: "请阅读整个 design.md 然后实现这个功能。" → 浪费上下文空间,AI 可能被无关信息干扰

提示词模板

当前会话的上下文已经比较大了。请帮我: 1. 总结到目前为止我们完成的工作(3-5 句话) 2. 列出当前正在进行的任务和关键决策 3. 列出下一步需要做的事情 我会用这个摘要开始一个新的会话,以释放上下文空间。

5. 上下文工程的协同:把四个支柱串起来

Spec + 文件选择 + MCP + Steering 的协同工作流

在实际开发中,四个上下文支柱不是孤立使用的,而是协同工作:

┌─────────────────────────────────────────────────────────┐ │ 开发中的上下文工程协同模型 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ Steering 规则 │ ← 始终注入,设定行为基线 │ │ │ (编码规范、 │ │ │ │ 架构约定) │ │ │ └──────┬───────┘ │ │ ↓ │ │ ┌──────────────┐ │ │ │ Spec 文件 │ ← 任务级注入,提供需求和设计上下文 │ │ │ (requirements │ │ │ │ + design) │ │ │ └──────┬───────┘ │ │ ↓ │ │ ┌──────────────┐ │ │ │ 精选代码文件 │ ← 按需引用,提供实现上下文 │ │ │ (目标文件 + │ │ │ │ 类型 + 参考) │ │ │ └──────┬───────┘ │ │ ↓ │ │ ┌──────────────┐ │ │ │ MCP 工具 │ ← 按需调用,获取外部信息 │ │ │ (DB schema, │ │ │ │ GitHub, docs)│ │ │ └──────────────┘ │ │ │ │ → AI Agent 在这个精心策划的上下文中执行任务 → │ │ │ └─────────────────────────────────────────────────────────┘

操作步骤

完整的上下文工程工作流(每个微任务): 1. 开始新会话(或 /compact 压缩旧会话) 2. Steering 规则自动加载 ← 无需手动操作 3. 引用当前任务的 Spec 上下文 - Kiro:自动注入 - Claude Code:"参考 SPEC.md 中的 Task 3.2" 4. 精确引用需要的代码文件 - 目标文件 + 类型定义 + 参考实现 5. 如需外部信息,通过 MCP 获取 - "查询 users 表的 schema" - "查看 GitHub issue #42 的描述" 6. 执行任务 7. 审查输出,确认符合 Steering 规则 8. 完成后更新工作记忆文件(progress.md)

实战案例:RustSync 项目的上下文工程配置

项目背景

RustSync 是一个基于 Tauri 的文件同步工具(前端 React + TypeScript,后端 Rust),使用 Kiro 的 Spec-Driven 工作流开发。以下是该项目的完整上下文工程配置。

目录结构

rustsync/ ├── .kiro/ │ ├── steering/ │ │ ├── coding-standards.md # 编码规范(always) │ │ ├── rust-patterns.md # Rust 特定模式(always) │ │ └── testing-guide.md # 测试指南(always) │ ├── specs/ │ │ └── rustsync-tool/ │ │ ├── requirements.md # 12 个用户故事 │ │ ├── design.md # 架构设计 │ │ └── tasks.md # 25 个实现任务 │ └── settings/ │ └── mcp.json # MCP 配置 ├── src-tauri/src/ # Rust 后端 │ ├── sync_engine.rs │ ├── diff.rs │ ├── config.rs │ └── ... ├── src/ # React 前端 │ ├── components/ │ ├── hooks/ │ ├── api/ │ └── types/index.ts └── .gitignore # 包含 .kiro/settings/mcp.json

Steering 文件配置

<!-- .kiro/steering/coding-standards.md --> --- inclusion: always --- # RustSync 编码规范 ## Rust 代码 - 使用 `thiserror` 处理错误,不要用 `unwrap()` - 所有公共函数必须有文档注释(`///` - 使用 `clippy` 的所有默认 lint - 异步代码使用 `tokio` - Tauri 命令返回 `Result<T, String>` ## TypeScript 代码 - 使用 CSS Modules,不用内联样式 - 组件使用函数式组件 + hooks - 类型定义集中在 types/index.ts - API 调用封装在 api/ 目录 ## 测试 - 每个模块必须有单元测试 - 核心逻辑必须有 Property-Based Testing - 测试文件与源文件同目录

MCP 配置

// .kiro/settings/mcp.json { "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } } } }

典型任务的上下文选择示例

Task: 实现文件差异计算模块(diff.rs) 上下文选择: ├── Steering:coding-standards.md(自动加载) ├── Spec:design.md 中"差异计算引擎"章节 ├── 代码文件: │ ├── src-tauri/src/diff.rs(目标文件) │ ├── src-tauri/src/types.rs(类型定义) │ ├── src-tauri/src/sync_engine.rs(调用方,了解接口需求) │ └── src-tauri/src/config.rs(配置项) ├── MCP:无需外部工具 └── 总上下文估算:~15K tokens(远低于 200K 限制) 提示词: "请实现 Task 4:文件差异计算模块。 参考 design.md 中差异算法的设计。 diff.rs 需要实现 compute_diff() 函数, 接受两个文件路径,返回 DiffResult。 类型定义见 types.rs。 遵循 Steering 中的 Rust 编码规范。"

案例分析

这个配置的关键决策点:

  1. Steering 文件按职责拆分:编码规范、Rust 模式、测试指南各一个文件,而不是一个巨大的文件。这样 AI 更容易理解和遵循。

  2. MCP 配置最小化:只配置了 GitHub MCP,因为 RustSync 是本地应用,不需要数据库 MCP。按需添加,不预先配置所有可能用到的 MCP。

  3. 文件选择精确到函数级别:不是引用整个 src-tauri/src/ 目录,而是只引用与当前任务直接相关的 4 个文件。

  4. Spec 引用精确到章节:不是”参考 design.md”,而是”参考 design.md 中差异算法的设计”。


避坑指南

❌ 常见错误

  1. 把所有文件都塞进上下文

    • 问题:上下文过载导致模型注意力分散,输出质量下降。即使 1M token 窗口也不意味着应该填满它
    • 正确做法:遵循”精确、最小、相关”原则,只引用当前任务需要的文件
  2. 用 AI 生成 Steering/Rules 文件

    • 问题:研究表明 LLM 生成的规则文件在多数场景下反而降低性能——规则过于泛化、缺乏项目特定的洞察
    • 正确做法:人工编写规则文件,基于项目实际踩过的坑和团队约定
  3. MCP 配置过多导致上下文膨胀

    • 问题:每个 MCP Server 的工具描述都会占用上下文空间。配置 10 个 MCP Server 可能消耗数千 token 仅用于工具描述
    • 正确做法:只配置当前开发阶段需要的 MCP Server,按需启用
  4. 不管理会话长度

    • 问题:长时间的编码会话中,历史对话、错误尝试、废弃方案都在消耗上下文空间
    • 正确做法:每完成一个微任务就考虑开始新会话或使用 /compact 压缩
  5. Steering 规则相互矛盾

    • 问题:多个规则文件中的指令冲突,AI 无所适从,输出不一致
    • 正确做法:定期审查规则文件,确保无矛盾;使用层级结构(全局→模块→文件级)明确优先级
  6. 忽略上下文的”四种失败模式”

    • 问题:上下文中毒(错误信息)、干扰(无关信息)、混淆(格式混乱)、冲突(信息矛盾)
    • 正确做法:每次提供上下文前检查信息的准确性、相关性、一致性和清晰度

✅ 最佳实践

  1. “三问法”选择文件:每次编码前问自己——要改什么文件?依赖什么接口?有没有参考实现?
  2. Steering 文件保持精简:每个文件不超过 200 行,规则要具体可执行,避免空泛的”写好代码”类指令
  3. MCP 按场景组合:为不同开发场景(前端/后端/全栈/DevOps)准备不同的 MCP 配置组合
  4. 会话分段执行:一个微任务一个会话,避免上下文漂移
  5. 维护工作记忆文件:用 progress.md 等文件在会话间传递关键上下文,避免每次从零开始
  6. 定期审计上下文效率:观察 AI 的输出质量,如果下降了,检查是否上下文过载或缺失关键信息
  7. 规则文件版本化:将 Steering/Rules 文件纳入 Git 管理,团队共享,随项目演进更新

相关资源与延伸阅读

  1. Context Engineering for Coding Agents - Martin Fowler  — 编码 Agent 上下文工程的系统化分类框架
  2. Kiro Steering 官方文档  — Kiro Steering 文件的完整配置指南
  3. Kiro Steering 文件优先级指南  — 多个 Steering 文件的优先级管理实践
  4. Kiro Steering 最佳实践配置  — 按角色拆分规则文件的推荐方法
  5. CLAUDE.md 工作流指南  — CLAUDE.md 编写和使用的完整指南
  6. Softcery Agentic Coding 最佳实践  — 上下文文件、工作记忆和结构化工作流实践
  7. 四文件工作记忆系统  — 用四个 Markdown 文件为 AI 编码助手建立持久记忆
  8. AI-Ready Codebase Guide  — 让代码库对 AI 友好的实践指南
  9. MCP 开发者集成工作流  — GitHub、Jira、数据库的 MCP 集成实战
  10. AI 编码工具配置参考  — Cursor、Claude Code、Codex 的规则文件格式对比

参考来源

Content was rephrased for compliance with licensing restrictions.


📖 返回 总览与导航 | 上一节:17c-微任务执行与人工审查 | 下一节:18a-2026-AI测试工具全景

Last updated on