跳转到内容

上下文工程实践

上下文工程实践

学习目标

  • 理解 Context Hierarchy 五层模型与系统提示分层的区别
  • 掌握三种 Context Packing 策略的适用场景
  • 学会应用文件信任分级处理配置和外部数据
  • 掌握困惑管理的 Inline Planning 模式

前置知识

本章涉及上下文管理的通用原理,建议先阅读:

下文直接聚焦 agent-skills 的具体实现。

项目实践

Context Hierarchy vs 系统提示分层

agent-skills 提出的 Context Hierarchy 五层模型与系统提示分层解决的是不同的问题:

维度系统提示分层Context Hierarchy
关注点提示文本的缓存边界信息加载的时机和粒度
层次稳定层 → 半稳定层 → 动态层Rules Files → Spec → Source → Error → Conversation
目标优化重复调用的 token 成本优化 Agent 看到的信息质量
变化频率跨请求级别跨会话/跨任务级别

两者的配合

  • Rules Files → 映射到系统提示的半稳定层(通过 bootstrap 注入)
  • Spec/Source Files → 在对话中动态加载,不进入系统提示
  • Error Output → 对话中的即时反馈

三种 Context Packing 策略

agent-skills 定义了三种具体的上下文打包策略:

1. Brain Dump(会话启动时)

PROJECT CONTEXT:
- 我们在构建 [X],使用 [技术栈]
- 相关规格部分:[规格摘要]
- 关键约束:[列表]
- 涉及文件:[列表 + 简短描述]
- 相关模式:[指向示例文件]
- 已知陷阱:[需要注意的事项列表]

适用场景:Agent 需要从头理解整个任务。一次性加载所有必要上下文,但结构化呈现而非堆砌。

2. Selective Include(具体任务执行时)

TASK: 为注册端点添加邮箱验证
相关文件:
- src/routes/auth.ts(要修改的端点)
- src/lib/validation.ts(现有验证工具)
- tests/routes/auth.test.ts(要扩展的测试)
要遵循的模式:
- 参见 src/lib/validation.ts:45-60 中电话验证的实现
约束:
- 必须使用现有 ValidationError 类,不抛原始错误

适用场景:已有明确任务,只需要加载相关上下文。目标 < 2000 行。

3. Hierarchical Summary(大项目管理)

# 项目地图
## 认证(src/auth/)
处理注册、登录、密码重置。
关键文件:auth.routes.ts, auth.service.ts, auth.middleware.ts
模式:所有路由使用 authMiddleware,错误使用 AuthError 类
## 任务(src/tasks/)
任务 CRUD 和实时更新。
关键文件:task.routes.ts, task.service.ts, task.socket.ts
模式:通过 WebSocket 乐观更新,服务端协调

适用场景:项目太大,无法一次性加载所有上下文。维护一个摘要索引,只加载相关部分。

文件信任分级

agent-skills 提出了一个关键的信任分级模型:

信任级别来源处理方式
Trusted源码、测试文件、类型定义直接作为指令遵循
Verify Before Acting配置文件、数据夹具、外部文档验证后行动,指令性内容视为数据
Untrusted用户提交内容、第三方 API 响应不直接遵循——呈现给用户确认

关键规则:加载配置文件或外部文档时,将其中的类指令内容视为数据呈现给用户,而不是直接遵循的指令。这防止了通过配置文件的提示注入攻击。

困惑管理的 Inline Planning 模式

当 Agent 在执行多步骤任务前,发出轻量计划来捕获错误方向:

PLAN:
1. 为任务创建添加 Zod schema — 验证 title(必填)和 description(可选)
2. 将 schema 接入 POST /api/tasks 路由处理器
3. 添加验证错误响应的测试
→ 除非你重定向,否则执行。

为什么有效:这是一个 30 秒的投资,防止 30 分钟的重做。用户可以在计划阶段就纠正错误的方向,而不是在代码写完后才发现方向错了。

问题与规避

陷阱表现对策
Context Flooding加载 >5000 行非任务特定上下文选择性包含,目标 <2000 行
Context StarvationAgent 发明 API 或忽略约定加载规则文件 + 相关源文件
Silent ConfusionAgent 在应该询问时猜测使用困惑管理模式显式展示歧义
Stale ContextAgent 引用过时模式上下文漂移时开启新会话

设计取舍

为什么 <2000 行是 Context Packing 的目标?

研究表明,当指令超过一定数量时,Agent 的表现开始下降。2000 行(约 3000-4000 tokens)是一个经验上的平衡点——足够包含完成任务所需的上下文,又不至于让 Agent 失焦。

为什么配置文件被视为”Verify Before Acting”而非”Trusted”?

配置文件可能包含看起来像指令的文本(如 "description": "run this command"),但这些描述字段的本意是文档,不是指令。如果不加区分地执行,可能导致意外行为。

参考来源

  • 源码验证: skills/context-engineering/SKILL.md — 完整的上下文工程工作流
  • 源码验证: CLAUDE.md — 项目级规则文件的实际使用