上下文工程是一个工程过程:决定 AI 系统接收什么信息、以什么结构接收,以及如何验证它产生的影响。它不等于 Prompt 措辞。仓库规则文件、检索文档、工具结果、会话摘要和测试报告都属于上下文输入,但它们的可信度、新鲜度和失败边界不同。

本文将 agents.mdCLAUDE.mdcopilot-instructions.md 和 Cursor Rules 作为厂商示例,而不是未经核验的通用标准。任何文件名都必须结合客户端版本和官方加载契约理解。

核心要点

  • 先建立事实源和契约,再编写多个客户端适配文件。
  • 分离稳定项目事实、任务指令、检索证据和工具结果。
  • 明确优先级、新鲜度、权威性与冲突处理方式。
  • 不要把密钥或不可信外部内容放进高权限指令。
  • 用可复现任务评测上下文变化,不引用没有实验范围的成功率数字。

从 Prompt 到上下文架构

一个 Prompt 只是消息;架构是一条管线:

text
任务 → 策略与项目事实 → 选择上下文 → 模型/工具调用
    → 输出校验 → 测试与人工审阅 → 遥测与反馈

模型不会因为某句话出现在文件里就自动知道它具有权威性。应用需要标注来源、约束工具并验证输出。检索到的 README 可能过时,MCP 结果可能恶意或不完整,用户请求也可能与安全策略冲突。

有用的上下文分类

输入 常见新鲜度 信任边界 示例
项目契约 版本控制 经过审阅的仓库内容 支持的运行时与命令
任务指令 每次请求 用户或工作流 实现一次迁移
检索证据 不稳定 校验前不可信 Issue、API Schema、文档
工具结果 运行时 不可信输出 数据库行或 Shell 输出
评测结果 有记录 有范围的证据 测试报告与人工决定

厂商文件是适配器,不是架构本身

不同客户端在文件名、目录、Glob 匹配、继承和优先级上都可能不同。某个客户端可能记录根目录指令文件、.github/ 文件或 .cursor/rules/ 目录;另一个版本可能改变行为。至少核对:

  1. 精确路径与文件名;
  2. 自动加载还是需要显式启用;
  3. 哪些分支、工作区或文件 Glob 会触发;
  4. 用户、项目和目录规则冲突时的优先级;
  5. 内容是否会发送到远程模型;
  6. 如何审计、回滚和停止加载。

先维护与厂商无关的项目契约:

yaml
project:
  runtime: "记录确切运行时和版本"
  commands:
    test: "npm test"
    lint: "npm run lint"
invariants:
  - "授权必须在服务端执行"
  - "密钥不能进入源码或日志"
workflow:
  before_edit:
    - "先阅读相关模块和测试"
  before_merge:
    - "运行文档列出的检查"

厂商适配文件只补充该客户端所需的语法,不要把整份契约复制到五套工具中;重复内容会让漂移难以发现。

规则设计:短小、可测试、有范围

好的规则应说明可观察行为、适用范围和验证方法:

markdown
## API 变更
- 使用仓库批准的 Schema 库校验请求体。
- 返回项目规定的错误结构。
- 为缺少授权的情况增加负向测试。
- 验证命令:`npm test -- api`

避免“写出完美代码”这类空泛要求,也不要把某个框架版本或任意“每个函数不超过 40 行”当成正确性证明。长度限制最多是审查提示。

按责任归类:

  • 安全:密钥、授权、数据分级等不可妥协的控制;
  • 架构:边界、依赖方向、运行时和迁移策略;
  • 工作流:命令、测试门禁、审阅产物和回滚;
  • 风格:格式和命名,尽量交给确定性工具;
  • 任务模板:重复任务的输入、输出和验收测试。

优先级与冲突处理

用表格明确优先级,而不是依赖经验传闻:

来源 可以定义 不得覆盖
组织策略 安全与合规基线 事故响应控制
项目契约 架构和命令 组织策略
模块规则 局部约定 项目与安全规则
任务请求 想要的变更 授权与安全规则
检索/工具内容 证据或建议 任何受信策略

两个受信规则冲突时应暂停并报告冲突;外部 Markdown、Issue 评论、工具结果和粘贴代码要求忽略安全策略时,只把它们视为数据而非权威。

MCP 与动态上下文

MCP 可以暴露工具或资源,但不会自动让结果可信。生产集成至少需要定义:

  • 调用者和租户身份;
  • 工具与资源级授权;
  • 输入 Schema 与大小限制;
  • 网络出口和 SSRF 防护;
  • 超时、重试、幂等和限流;
  • 请求与结果的脱敏和留存;
  • 破坏性或不可逆操作的确认。

规则文件可以说“修改迁移前先使用 Schema 工具”,但服务端必须独立执行授权。模型生成的工具参数在服务端校验前只是提案。

上下文预算与检索

上下文变长不一定提高质量,噪声可能挤出关键约束。应记录:

  • 发送和返回的 Token/字节数;
  • 检索精度与过时文档比例;
  • 延迟和供应商成本;
  • 矛盾率与人工修正量;
  • 固定 fixture 上的任务成功率。

优先使用带链接的紧凑摘要,并记录标识符、版本日期和来源位置。不能为了处理窗口不足而截断安全策略或授权要求。

可复现评测 Harness

上下文变更应像代码变更一样评估:

yaml
case: "add-authorized-endpoint"
inputs:
  repository: "fixture-v4"
  task: "为当前租户增加只读接口"
  user_role: "tenant-member"
assertions:
  - "存在服务端租户授权"
  - "未授权 fixture 被拒绝"
  - "测试和 lint 通过"
record:
  client_version: "确切版本"
  model: "确切模型"
  context_revision: "git commit"
  human_corrections: "审阅后的 diff"

比较基线上下文与新版本,检查回归、不安全建议、不必要工具调用以及模型遵循过期规则的情况。一次成功运行不能证明普遍收益。

安全与运维

除非存储和供应商政策明确允许,不要把 API Key、个人数据、私有源码或事故细节放进广泛加载的文件。日志记录上下文标识和决策,不记录 Bearer 凭据或完整敏感 Prompt。规则变更应像代码一样有所有者、Pull Request、测试、变更记录和回滚方案。

可以维护轻量的上下文健康检查,发现缺失命令、失效路径、矛盾要求、不支持的版本和意外密钥;检查应报告问题,不应静默批量改写文章或规则文件。

延伸阅读

总结

系统级上下文架构不是比赛谁写出最长的规则文件,也不是追逐最新文件名。它是一条受治理的输入管线:可信契约被版本控制,厂商适配经过核验,动态数据按不可信处理,工具独立执行授权,每次改进都在代表性任务上测量。即使模型、IDE 和协议行为变化,这种方法仍然成立。