🌙 凌晨1点42分,Agent第7次告诉我说"上下文已满"。
这意味着它忘了5分钟前我们讨论的内容。就像一个金鱼只有7秒记忆,只不过这个金鱼的内存贵得吓人——每多一个Token,就要多花一分钱。
世界上有一种技术叫Context Compression,它就像是给AI的记忆做减脂——把重要的记住,把废话扔掉,对话窗口再也不炸了。
🌙 凌晨1点42分,Agent第7次告诉我说"上下文已满"。
这意味着它忘了5分钟前我们讨论的内容。就像一个金鱼只有7秒记忆,只不过这个金鱼的内存贵得吓人——每多一个Token,就要多花一分钱。
世界上有一种技术叫Context Compression,它就像是给AI的记忆做减脂——把重要的记住,把废话扔掉,对话窗口再也不炸了。
Context Compression(上下文压缩)是指在不丢失关键信息的前提下,减少AI Agent上下文窗口中Token占用的技术。
通俗地说:
就像你整理书包——不会把所有的草稿纸、旧胶带、发霉的零食都塞进去,只带今天需要的东西。Context Compression就是帮AI整理"精神书包"。
原始上下文(1,240 Tokens)
"好的,我先检查一下。嗯,这个文件看起来不错。让我看看它的内容。内容显示这是一个报告。报告中写道...等等让我再确认一下。是的,这是一个报告。报告的内容是..."
🔴 废话连篇,占用大量Token
压缩后上下文(180 Tokens,节省85%)
"文件确认:report.pdf,类型:报告,内容摘要:[概要内容],状态:已验证"
🟢 精炼扼要,保留关键信息
把长对话或长文档压缩成摘要。最基础也是最有效的方法。
# 原始对话(500 tokens) User: 帮我看看项目报告 Agent: 好的,我已经读取了报告 User: 报告里说了什么? Agent: 报告显示第三季度营收增长了15% User: 哪些业务推动的增长? Agent: 主要是AI业务线,增长了40% User: 我看一下具体数据 # 压缩后(50 tokens) 摘要: 用户询问项目报告,核心信息为Q3营收增长15%,主要由AI业务(+40%)推动。
识别并丢弃不重要的信息:问候语、确认消息、冗余回答等。
把对话或文档转换为结构化的键值对或JSON格式,减少冗余。
将文本转换为向量,存储到向量数据库,需要时再检索——相当于把"全本词典"压缩成"索引目录"。
# openclaw.json - 启用上下文压缩
{
"session": {
"contextCompression": {
"enabled": true,
// 当上下文使用超过80%时触发压缩
"triggerThreshold": 0.80,
// 压缩策略
"strategy": "hybrid",
// 压缩目标:将上下文缩小到原来的40%
"targetRatio": 0.4,
// 历史消息保留
"historyRetention": {
"summaryOnly": true,
"maxMessages": 10
}
}
}
}
# 效果:
# 原始上下文: 10,000 tokens
# 压缩后: 3,800 tokens
# 节省: 62%
# 关键信息保留率: 95%
// OpenClaw Skill: 智能上下文管理
class SmartContextManager {
constructor(config) {
this.maxTokens = config.maxTokens || 8000;
this.compressThreshold = config.threshold || 0.75;
}
async manageContext(session) {
const currentUsage = session.getContextUsage();
if (currentUsage.ratio > this.compressThreshold) {
console.log(`上下文使用率 ${currentUsage.ratio*100}%,开始压缩...`);
// 1. 清理低价值消息
await this.removeLowValueMessages(session);
// 2. 压缩长消息
if (session.getContextUsage().ratio > this.compressThreshold) {
await this.compressLongMessages(session);
}
// 3. 将老旧历史转为摘要
if (session.getContextUsage().ratio > this.compressThreshold) {
await this.summarizeOldHistory(session);
}
console.log(`压缩完成。新使用率: ${session.getContextUsage().ratio*100}%`);
}
}
async removeLowValueMessages(session) {
// 移除确认性消息、System提示、空响应
const lowValue = ['ok', '好的', '我已经知道了', '收到'];
session.messages = session.messages.filter(msg => {
return !lowValue.includes(msg.content.trim().toLowerCase());
});
}
async compressLongMessages(session) {
for (const msg of session.messages) {
if (msg.content.length > 500) {
// 用LLM压缩长消息
msg.content = await this.llmSummarize(msg.content);
msg.compressed = true;
}
}
}
async summarizeOldHistory(session) {
// 合并前N条消息为摘要
const oldMessages = session.messages.slice(0, -10); // 保留最近10条
const summary = await this.llmSummarize(
oldMessages.map(m => `${m.role}: ${m.content}`).join('\n')
);
session.messages = [
{ role: 'system', content: `对话摘要: ${summary}`, compressed: true },
...session.messages.slice(-10)
];
}
}
# OpenClaw Session配置 - 分层上下文
# 三层上下文架构
# Layer 1: 热数据 - 最近5条消息(完整保留)
# Layer 2: 温数据 - 5-50条之前的消息(摘要形式)
# Layer 3: 冷数据 - 更早的历史(向量化存储,按需加载)
session:
layers:
hot:
type: full
max_messages: 5
priority: highest
warm:
type: summary
max_tokens: 1000
update_strategy: on_new_message
cold:
type: vector
storage: "memory.db"
retrieval:
top_k: 3
relevance_threshold: 0.7
# 压缩统计
statistics:
tokens_before: 15420
tokens_after: 3250
compression_ratio: "79%"
information_retention: "93%"
| 方法 | 压缩率 | 信息保留率 | 延迟 | 适用场景 |
|---|---|---|---|---|
| 摘要压缩 | 70-90% | 85-95% | 中 | 长对话、文档摘要 |
| 选择性丢弃 | 10-20% | 95-100% | 低 | 实时对话、低风险场景 |
| 结构压缩 | 50-80% | 90-95% | 低-中 | 结构化数据、代码 |
| 向量化压缩 | 90-99% | 70-85% | 高 | 长期记忆、知识库 |
| 混合策略 | 70-90% | 90-95% | 中 | ✅ 推荐生产使用 |
坑1:过度压缩
为了省Token,把关键信息也压缩掉了。Agent开始"失忆",问啥都不知道。
坑2:压缩延迟
每次压缩都要消耗Token,搞不好压缩的成本 > 省下的Token。对于短会话不需要压缩!
坑3:上下文断裂
压缩后上下文变得支离破碎,Agent跟不上对话节奏。压缩时保留对话的连贯性!
坑4:忘了压缩历史
Agent启动时上下文占满,但压缩模块还没触发。提前设置触发的阈值!
1. 设置合理的触发阈值
建议在上下文使用率达到70-80%时开始压缩,留出缓冲空间。
2. 分层策略
不要用单一策略。热数据(最近的消息)完整保留,温数据摘要压缩,冷数据向量化。
3. 缓存压缩结果
相同的对话历史不需要反复压缩,缓存结果可以节省大量Token。
4. 监控压缩效果
追踪压缩率、信息保留率、Agent任务完成率,确保压缩不降低性能。
5. 给Agent提供"压缩提示"
告诉Agent哪些信息是关键的必须保留,哪些可以压缩。比如"记住用户的文件路径,忘记闲聊内容"。
其实Context Compression就像你收拾行李箱。去旅游7天,你只有一个小箱子(有限的Context Window)。
一开始你什么都往里塞:3件外套、5条裤子、7双袜子、2本书、一个吹风机...直到拉链崩了(Context Overflow)。
后来你学会了:外套带一薄一中,裤子带两条百搭,袜子买一次性的穿完就扔(日志压缩),书换成Kindle(外部存储),吹风机——酒店有(工具调用)。
最后你用一半的空间装了所有必需品(70%压缩率),还留了空位买纪念品(留出Token给新信息)。
所以啊,给Agent的Context减肥,不是让TA变笨,而是让TA知道什么该带、什么该扔——这叫"聪明的AI" 😏