名称: context-compression
描述: 当用户要求“压缩上下文”、“总结对话历史”、“实施压缩”、“减少令牌使用”,或提及上下文压缩、结构化摘要、任务令牌优化、或超出上下文限制的长时间运行代理会话时,应使用此技能。
当代理会话生成数百万令牌的对话历史时,压缩变得必不可少。简单粗暴的方法是进行激进压缩以最小化每次请求的令牌数。正确的优化目标是任务令牌数:完成一个任务所消耗的总令牌数,包括因压缩丢失关键信息而重新获取所产生的成本。
在以下情况下激活此技能:
- 代理会话超出上下文窗口限制
- 代码库超出上下文窗口(500万+令牌的系统)
- 设计对话摘要策略
- 调试代理“忘记”修改了哪些文件的情况
- 构建压缩质量评估框架
上下文压缩在节省令牌和丢失信息之间进行权衡。存在三种可用于生产环境的方法:
锚定迭代摘要:维护结构化的、持久的摘要,明确包含会话意图、文件修改、决策和后续步骤等部分。触发压缩时,仅总结新截断的片段,并与现有摘要合并。通过为特定类型信息分配专门部分,这种结构强制保留信息。
不透明压缩:生成优化重建保真度的压缩表示。实现最高的压缩率(99%以上),但牺牲了可解释性。无法验证保留了哪些内容。
再生式完整摘要:每次压缩时生成详细的结构化摘要。产生可读的输出,但由于完全重新生成而非增量合并,可能在多次压缩周期中丢失细节。
关键洞见:结构强制保留。专用部分充当摘要器必须填写的检查清单,防止信息无声漂移。
传统的压缩指标针对每次请求的令牌数。这是错误的优化方向。当压缩丢失了文件路径或错误消息等关键细节时,代理必须重新获取信息、重新探索方法,并浪费令牌来恢复上下文。
正确的指标是任务令牌数:从任务开始到完成所消耗的总令牌数。一个节省0.5%更多令牌但导致重新获取成本增加20%的压缩策略,总体成本反而更高。
在所有压缩方法中,工件追踪完整性是最薄弱的维度,在评估中得分仅为2.2-2.5(满分5.0)。即使具有明确文件部分的结构化摘要,也难以在长时间会话中保持完整的文件跟踪。
编码代理需要知道:
- 创建了哪些文件
- 修改了哪些文件以及更改了什么
- 读取了哪些文件但未更改
- 函数名、变量名、错误消息
这个问题可能需要超越通用摘要的特殊处理:在代理脚手架中使用单独的工件索引或显式的文件状态跟踪。
有效的结构化摘要包含明确的部分:
## 会话意图
[用户试图实现的目标]
## 已修改文件
- auth.controller.ts: 修复了JWT令牌生成
- config/redis.ts: 更新了连接池配置
- tests/auth.test.ts: 为新配置添加了模拟设置
## 已做决策
- 使用Redis连接池而非每次请求连接
- 为瞬时故障添加指数退避重试逻辑
## 当前状态
- 14个测试通过,2个失败
- 剩余:会话服务测试的模拟设置
## 后续步骤
1. 修复剩余的测试失败
2. 运行完整测试套件
3. 更新文档
这种结构防止了文件路径或决策的无声丢失,因为每个部分都必须被明确处理。
何时触发压缩与如何压缩同样重要:
| 策略 | 触发点 | 权衡 |
|---|---|---|
| 固定阈值 | 上下文利用率达70-80% | 简单,但可能压缩过早 |
| 滑动窗口 | 保留最后N轮对话 + 摘要 | 上下文大小可预测 |
| 基于重要性 | 先压缩低相关性部分 | 复杂,但能保留信号 |
| 任务边界 | 在逻辑任务完成时压缩 | 摘要清晰,但时机不可预测 |
对于大多数编码代理用例,结合结构化摘要的滑动窗口方法在可预测性和质量之间提供了最佳平衡。
ROUGE或嵌入相似度等传统指标无法捕捉功能性压缩质量。一个摘要可能在词汇重叠上得分很高,却遗漏了代理需要的那一个文件路径。
基于探针的评估通过压缩后提问直接衡量功能性质量:
| 探针类型 | 测试内容 | 示例问题 |
|---|---|---|
| 回忆 | 事实保留 | “原始错误消息是什么?” |
| 工件 | 文件跟踪 | “我们修改了哪些文件?” |
| 延续 | 任务规划 | “我们接下来应该做什么?” |
| 决策 | 推理链 | “关于Redis问题我们做了什么决定?” |
如果压缩保留了正确的信息,代理就能正确回答。否则,它会猜测或产生幻觉。
六个维度捕捉了编码代理的压缩质量:
不同压缩方法之间,准确性差异最大(0.6分差距)。工件追踪普遍较弱(2.2-2.5分范围)。
对于超出上下文窗口的大型代码库或代理系统,通过三个阶段应用压缩:
当提供手动迁移示例或参考PR时,将其用作模板来理解目标模式。该示例揭示了静态分析无法呈现的约束:哪些不变量必须保持、哪些服务会在更改时中断,以及干净的迁移是什么样子。
当代理无法区分本质复杂性(业务需求)和偶然复杂性(遗留变通方法)时,这一点尤其重要。示例工件编码了这种区别。
在以下情况下使用锚定迭代摘要:
- 会话是长时间运行的(100+条消息)
- 文件跟踪很重要(编码、调试)
- 需要验证保留了哪些内容
在以下情况下使用不透明压缩:
- 需要最大限度的令牌节省
- 会话相对较短
- 重新获取成本较低
在以下情况下使用再生式摘要:
- 摘要可解释性至关重要
- 会话有清晰的阶段边界
- 每次压缩时允许完整上下文审查
| 方法 | 压缩率 | 质量得分 | 权衡 |
|---|---|---|---|
| 锚定迭代 | 98.6% | 3.70 | 质量最佳,压缩率稍低 |
| 再生式 | 98.7% | 3.44 | 质量良好,压缩率中等 |
| 不透明 | 99.3% | 3.35 | 压缩率最佳,质量损失 |
结构化摘要保留的额外0.7%令牌换来了0.35的质量分。对于任何重新获取成本重要的任务,这种权衡倾向于结构化方法。
示例1:调试会话压缩
原始上下文(89,000令牌,178条消息):
- /api/auth/login 端点出现401错误
- 追踪了认证控制器、中间件、会话存储
- 发现Redis连接陈旧
- 修复了连接池,添加了重试逻辑
- 14个测试通过,2个失败
压缩后的结构化摘要:
## 会话意图
调试 /api/auth/login 端点在使用有效凭据时仍返回401未授权错误。
## 根本原因
会话存储中的Redis连接陈旧。JWT生成正确,但会话无法持久化。
## 已修改文件
- auth.controller.ts: 无更改(仅读取)
- middleware/cors.ts: 无更改(已检查)
- config/redis.ts: 修复了连接池配置
- services/session.service.ts: 为瞬时故障添加了重试逻辑
- tests/auth.test.ts: 更新了模拟设置
## 测试状态
14个通过,2个失败(模拟设置问题)
## 后续步骤
1. 修复剩余的测试失败(模拟会话服务)
2. 运行完整测试套件
3. 部署到预发布环境
示例2:探针响应质量
压缩后,询问“原始错误是什么?”:
良好响应(结构化摘要):
“原始错误是来自 /api/auth/login 端点的401未授权响应。用户在使用有效凭据时收到此错误。根本原因是会话存储中的Redis连接陈旧。”
较差响应(激进压缩):
“我们正在调试一个认证问题。登录失败。我们修复了一些配置问题。”
结构化响应保留了端点、错误码和根本原因。激进响应丢失了所有技术细节。
此技能与集合中的其他几个技能相关联:
内部参考:
- 评估框架参考 - 详细的探针类型和评分细则
本集合中的相关技能:
- context-degradation - 理解压缩能防止什么
- context-optimization - 更广泛的优化策略
- evaluation - 构建评估框架
外部资源:
- Factory Research: Evaluating Context Compression for AI Agents (December 2025)
- Research on LLM-as-judge evaluation methodology (Zheng et al., 2023)
- Netflix Engineering: "The Infinite Software Crisis" - 三阶段工作流和大规模上下文压缩 (AI Summit 2025)
创建日期:2025-12-22
最后更新:2025-12-26
作者:上下文工程代理技能贡献者
版本:1.1.0