郭震 AI公众号:郭震AI

6 OpenClaw如何处理上下文压缩

发布日期:

分类: 龙虾OpenClaw

预计阅读: 7 分钟

阅读次数: 0

系列进度

龙虾OpenClaw · 第 7 / 7

预计阅读7 分钟
结构重点12 个
图文要点5 张
正文规模3.3k 字

很多人第一次理解 OpenClaw 的时候,会把“记忆”和“上下文”混在一起:既然它是长期运行的个人 AI 助手,是不是每次都把过去所有对话、所有工具调用、所有文件结果全部塞回模型?

答案是否定的。

真正可用的 Agent 系统,不能一直背着完整历史往前跑。OpenClaw 处理上下文压缩的核心,不是简单把旧聊天记录砍掉,而是把长历史压缩成“可继续执行的短状态”。

OpenClaw 上下文压缩查看大图
OpenClaw 上下文压缩

你可以把它理解成一句话:

长历史不是全部丢掉,而是沉淀成任务状态;最近消息保留原文,保证细节不丢。

这就是 OpenClaw 这类个人 Agent 能够长期工作的关键。它既要省 token、降成本、提速度,又不能在压缩后忘记用户目标、当前进度和下一步动作。

上下文压缩总览图查看大图
上下文压缩总览图

1. 为什么不能一直保留完整 history

OpenClaw 的每次任务,都会产生一串历史信息:

  • 用户发来的消息。
  • Agent 的回复。
  • 工具调用参数。
  • 工具返回结果。
  • 读到的文件内容。
  • 执行过的命令。
  • 失败过的尝试。
  • 用户临时补充的约束。

这些内容都会先进入 history

问题是,history 会不断变长。如果每次模型调用都把完整历史塞进去,会遇到三个问题。

第一,token 会超限。模型上下文窗口再大,也不适合无限堆历史。

第二,推理会变慢。旧内容越多,模型每次都要重新消化一遍,响应速度和成本都会变差。

第三,注意力会被干扰。很多旧消息已经不重要了,但它们还占着上下文位置,反而会冲淡当前任务。

所以,长期运行的 OpenClaw 不能只依赖“完整对话回放”。它需要一种机制,把旧历史整理成更短、更稳定、更适合继续执行的状态。

2. 压缩后的内容不是普通摘要

这里最容易误解。

普通摘要可能写成:

用户讨论了 OpenClaw 的部署、域名绑定、SSH 安全设置和上下文压缩。

这句话看起来没错,但对 Agent 继续干活帮助很小。因为它没有回答几个关键问题:

  • 用户最终目标是什么?
  • 已经完成了哪些步骤?
  • 哪一步失败过?
  • 现在阻塞在哪里?
  • 哪些事情不能做?
  • 下一步应该先做什么?

OpenClaw 更需要的是状态摘要,而不是文章摘要。

任务状态摘要卡查看大图
任务状态摘要卡

例如,一个更有用的压缩结果应该像这样:

用户目标:部署 OpenClaw,并把域名绑定到新加坡服务器。

已完成:
- Docker 已安装。
- OpenClaw 镜像已拉取。
- 端口 18789 已暴露。

当前问题:
- 域名 ai-jupyter.com 需要解析到 43.160.250.49。
- 还需要检查 Nginx 和 HTTPS 配置。

重要约束:
- 用户使用 key-only ssh。
- 不要开启密码登录。
- 不要把服务器凭据写进日志或仓库。

下一步:
- 检查 DNS 解析。
- 检查反向代理。
- 确认 HTTPS 证书状态。

这类 summary 的价值在于:下一轮模型看到它,就能接着任务往下做,而不是重新问一遍“我们刚才做到哪了”。

3. 真正送进模型的是 summary 加 recent messages

压缩不是把所有内容都变成 summary。

更合理的结构是:

System Prompt
+ Tool Definitions
+ Compact State Summary
+ Recent Messages
+ Current User Message

也就是说:

  • 老历史,压缩成状态摘要。
  • 新历史,保留最近几轮原文。
  • 当前问题,完整放入窗口。

这样做有一个好处:既保住了任务主线,又保住了最近几轮的精确细节。

比如用户刚刚说“不要部署,只本地构建”,这句话不能被粗糙压缩掉,因为它直接影响下一步动作。最近消息保留原文,就是为了避免这种关键细节丢失。

4. 压缩应该发生在模型运行前

上下文压缩最关键的时机,是模型运行前。

不是模型输出结束后,随手写一段总结。而是在下一次构建 prompt 之前,先判断当前历史是否太长。如果太长,就把旧内容和已有 summary 合并成新的 summary,然后再构建模型输入。

上下文压缩流程图查看大图
上下文压缩流程图

一个比较稳的流程是:

  1. 用户发来新消息。
  2. 消息追加到 history
  3. 系统估算当前上下文长度。
  4. 如果超过阈值,就拆分旧消息和最近消息。
  5. 用 summarizer 把 old_summary + old_messages 压成 new_summary
  6. 构建本轮模型输入:系统提示词、工具定义、状态摘要、最近消息、当前问题。
  7. 模型运行,必要时调用工具。
  8. 输出和工具结果再保存回 history

这套流程的重点是:模型每次运行时看到的是“当前最有用的上下文”,而不是越积越厚的聊天记录。

5. 上下文压缩要保留哪些信息

压缩时,最应该保留的是和“继续执行”有关的信息。

建议至少保留 7 类:

  • 用户目标:用户到底想完成什么。
  • 当前进度:哪些步骤已经做完。
  • 工具结果:关键命令、接口、文件检查的结论。
  • 失败方法:哪些路走过但不可行,避免重复踩坑。
  • 明确要求:用户说过的偏好、禁止项和确认条件。
  • 环境信息:操作系统、项目路径、端口、分支、服务名等。
  • 下一步计划:下一轮最应该先做什么。

不重要的信息可以弱化,比如寒暄、重复解释、临时跑偏的讨论、已经被新结论覆盖的旧判断。

但有一类信息不能随便进 summary:敏感信息。

密码、API Key、私钥、验证码、生产数据库凭据,不应该被总结进长期状态里。压缩不是“把秘密换个位置保存”,而是要明确过滤风险内容。

6. 两种常见实现方式

上下文压缩通常有两条路线。

两种上下文压缩策略查看大图
两种上下文压缩策略

6.1 滚动摘要

滚动摘要最简单。

系统维护一个 conversation_summary 字段。当历史超过阈值时,把旧 summary 和旧消息交给 summarizer:

old_summary + old_messages -> new_summary

然后只保留最近 N 轮完整消息。

这种方式适合大多数聊天和普通任务,成本低,实现简单,也容易接入现有系统。

但它有一个问题:如果 summarizer 写得不够稳定,重要约束可能会在多轮压缩后越来越模糊。比如一开始 summary 里有“不要部署”,压缩几次后变成“讨论了部署”,含义就变危险了。

所以滚动摘要一定要用任务状态格式约束输出。

6.2 结构化状态

结构化状态更适合长期任务。

它不让 summary 自由发挥,而是固定成字段:

{
  "user_goal": "Deploy OpenClaw and connect domain",
  "completed_steps": [
    "SSH key-only login confirmed",
    "PasswordAuthentication disabled",
    "PermitRootLogin disabled"
  ],
  "current_issue": "Bind ai-jupyter.com to Singapore server",
  "environment": {
    "server": "43.160.250.49",
    "openclaw_port": 18789
  },
  "constraints": [
    "Do not enable password SSH",
    "Use Docker deployment",
    "Do not store credentials in files"
  ],
  "next_actions": [
    "Check DNS A record",
    "Configure reverse proxy",
    "Issue or verify HTTPS certificate"
  ]
}

这种方式对 Agent 更友好,因为字段稳定,后续也更容易校验。

比如系统可以检查 constraints 是否为空,可以检查 next_actions 是否过期,也可以在执行高风险操作前读取 constraints 做二次拦截。

7. 一个实用的压缩提示词模板

如果你要自己实现 OpenClaw 风格的上下文压缩,可以给 summarizer 一个更明确的提示词:

你是一个 Agent 上下文压缩器。

请把旧对话压缩成可继续执行的任务状态,而不是普通文章摘要。

必须保留:
1. 用户最终目标;
2. 已完成步骤;
3. 当前阻塞或待确认事项;
4. 重要工具结果;
5. 失败过的方法;
6. 用户明确要求和禁止项;
7. 环境信息;
8. 下一步建议。

必须删除:
1. 寒暄和重复解释;
2. 已被新结论覆盖的旧猜测;
3. 密码、私钥、API Key、验证码等敏感信息。

输出要短,但不能丢失继续执行所需的信息。

这段提示词的关键不是“总结得漂亮”,而是“保证下一轮能接着做”。

8. 判断压缩是否合格

一个 summary 写完后,可以用 5 个问题检查:

  1. 看不到旧消息时,模型还能知道用户目标吗?
  2. 模型能知道哪些事情已经做完了吗?
  3. 模型能知道哪些操作禁止执行吗?
  4. 模型能避免重复尝试失败方法吗?
  5. 模型能说出下一步应该做什么吗?

如果答案是否定的,说明压缩太像普通摘要,还没有变成任务状态。

对 OpenClaw 这类会调用工具的 Agent 来说,压缩质量直接影响安全性。忘记一个约束,可能就会误执行;忘记一个失败记录,可能就会重复浪费时间;忘记当前目标,可能就会把任务带偏。

9. 不要把上下文压缩当成长期记忆

最后要分清一个边界:上下文压缩不等于长期记忆。

上下文压缩解决的是“当前这条任务线怎么继续”。它通常和会话、线程、任务有关。

长期记忆解决的是“跨任务反复有用的信息”。比如你的写作风格、常用项目路径、默认语言偏好、常用发布流程。

两者都重要,但不能混用。

如果把所有临时任务细节都写进长期记忆,记忆会越来越脏。如果把长期偏好只放在一次上下文 summary 里,换一个任务就可能丢失。

比较稳的做法是:

  • 任务状态放在 compact summary。
  • 长期偏好放在 memory。
  • 最近对话保留原文。
  • 敏感信息哪里都不要长期保存。

10. 本节小结

OpenClaw 的上下文压缩,本质是把长对话历史压缩成“可恢复任务状态”,再和最近几轮完整消息一起交给模型。

它不是为了让历史变短而变短,而是为了让 Agent 在有限上下文里继续保持目标、进度、约束和下一步动作。

你只要记住这个公式就够了:

Context Compression = State Summary + Recent Detail

好的上下文压缩,会让 OpenClaw 像一个真正能持续工作的助手:不会被旧历史拖慢,也不会因为压缩丢掉主线。

下一步,如果你要把 OpenClaw 用在长期项目、服务器运维或内容生产里,建议先把自己的 summary 模板写出来。模板越清楚,Agent 越不容易在长任务里迷路。

相关教程

相关入口

AI 教程总索引

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

相关内容

相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...