资讯动态

OpenClaw 上下文压缩与记忆刷新机制:Pre-compaction Flush 与 NO_REPLY 的配置验证

发布时间:2026/10/15 13:37:18 来源:尧图企业网站定制
1. 长会话为什么突然“失忆”从一次上下文溢出说起如果你用 OpenClaw 跑过超过几十轮的长会话大概率遇到过这种场景前面聊得好好的用户偏好、任务进度、关键决策都记得清清楚楚结果某一轮之后 Agent 突然像换了个人之前说过的约束全忘了甚至开始重复提问。这不是模型变笨了而是上下文窗口被填满后触发了压缩而压缩过程如果没有做好记忆保护重要信息就会在总结环节被丢掉。OpenClaw 的上下文压缩与记忆刷新机制本质上就是解决这个“失忆”问题的。它由两个关键环节协作完成一个是 Pre-compaction Flush预压缩内存刷新负责在压缩发生之前把重要信息主动写入磁盘另一个是 NO_REPLY 协议负责让这个刷新过程对用户完全静默。两者配合才能实现“压缩不丢记忆、刷新用户无感”的效果。这篇文章聚焦的是长会话场景下压缩触发时机与记忆刷新流程的拆解以及如何在本地复现压缩前后记忆状态的变化确认刷新是否按预期生效。适合已经在用 OpenClaw 跑 Agent、但还没搞清楚 compaction 配置细节的开发者。下面我会给出可复制的配置片段和分步验证动作你可以直接跟着操作。先明确一个核心检索词OpenClaw 上下文压缩指的是当会话 token 接近模型窗口上限时系统自动把历史对话总结为紧凑摘要的过程记忆刷新指的是在压缩前通过静默轮次把持久信息写入 memory 文件的过程。这两个动作的触发阈值不同执行顺序也有严格要求搞反了就会丢数据。我试过在一个 32K 窗口的模型上跑长任务没配 memoryFlush 的时候压缩后用户偏好丢失率很高配上 Pre-compaction Flush 之后压缩前后 memory 文件能稳定落盘。下面把完整流程拆开讲。2. TaoToken 前置把模型接入和 Key 准备好在验证 OpenClaw 的压缩机制之前你需要先有一个能稳定调用的模型后端。OpenClaw 本身是 Agent 运行时它需要对接大模型 API 才能跑起来。这里我用 TaoToken 作为模型接入层原因是它的 Base URL 和 Key 管理比较清晰方便你在配置里直接替换。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置的时候直接写这个就行。你需要准备三件套Base URL、API Key、Model ID。Base URL 填 https://taotoken.net/api API Key 在控制台的 API Keys 页面生成Model ID 根据你用的模型填比如 claude-sonnet 系列或者 gpt 系列。这三个值在 OpenClaw 的配置里会分别用到。如果你还没生成 Key可以走这个路径先打开官网进控制台找到 API Keys 菜单新建一个 Key 并复制保存。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。生成后不要泄露配置里用环境变量或者本地配置文件存。模型对话的调试入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 你可以先在网页上发一条消息确认 Key 能用。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有 Base URL 和鉴权头的写法。如果你打算长期跑编码类 Agent可以考虑 Coding Plan入口是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关的接入说明在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。准备好这三件套之后OpenClaw 的模型调用才能跑通后面的压缩验证才有意义。因为压缩触发依赖真实的 token 计数如果模型调不通你连溢出错误都看不到。这里提醒一点OpenClaw 的 compaction 配置和模型接入配置是分开的。模型接入解决“能不能调用”compaction 解决“调用长了之后怎么不丢记忆”。两者都要配缺一不可。3. 可复制配置openclaw.json 里的 compaction 与 memoryFlush这一节给出可以直接复制的配置片段。OpenClaw 的主配置文件通常是 openclaw.json路径一般在项目根目录或者 ~/.openclaw/ 下。你需要把模型接入和 compaction 配置都写进去。先看模型接入部分这里用 TaoToken 的 Base URL 和 Key{ models: { default: { baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, model: claude-sonnet-4-20250514 } } }注意 apiKey 用环境变量引用不要硬编码。你可以在 shell 里 export TAOTOKEN_API_KEY你的Key或者写进 .env 文件。然后是 compaction 和 memoryFlush 的核心配置{ agents: { defaults: { compaction: { mode: default, reserveTokensFloor: 24000, identifierPolicy: strict, memoryFlush: { enabled: true, softThresholdTokens: 6000, systemPrompt: Session nearing compaction. Store durable memories now., prompt: Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store. } } } } }这段配置里几个关键参数的含义mode 选 default 表示严格按溢出恢复和阈值维护两种条件触发reserveTokensFloor 是安全底线默认 20000这里设 24000 留更多空间softThresholdTokens 是 Pre-compaction Flush 的软阈值设 6000 表示比压缩阈值提前 6000 token 触发刷新。memoryFlush 里的 systemPrompt 和 prompt 是双层提示词。systemPrompt 告诉 Agent 当前会话即将压缩prompt 给出具体写入指令和退出条件。NO_REPLY 就写在 prompt 末尾作为没有内容可存时的退出标记。如果你用的是 Pi 运行时它内部还有一套独立的 compaction 设置不在 openclaw.json 里而是在 Pi 的 settings 中{ compaction: { enabled: true, reserveTokens: 16384, keepRecentTokens: 20000 } }这里要注意Pi 的 reserveTokens 默认 16384但 OpenClaw 会通过 reserveTokensFloor 强制提升到 20000 以上。如果你把 reserveTokensFloor 设为 0就禁用了这个安全底线压缩后可能立即再次溢出不建议这么干。配置写完后重启 OpenClaw 让配置生效。你可以用 openclaw config validate 之类的命令检查配置格式具体命令看你的版本。确认无误后再进入下一步验证。4. 验证请求复现压缩前后记忆状态变化配置好之后怎么确认 Pre-compaction Flush 真的生效了这一节给出分步验证动作你可以在本地复现压缩前后 memory 文件的变化。第一步准备一个干净的 workspace确保 memory 目录存在。OpenClaw 默认会把记忆写到 memory/YYYY-MM-DD.md日期是当天。你可以先手动创建 memory 目录避免写入失败。第二步启动一个长会话故意把上下文撑到接近阈值。你可以连续发多条长消息或者用脚本批量灌入。目标是让 contextTokens 超过 contextWindow - reserveTokensFloor - softThresholdTokens触发 flush。第三步观察 session store 里的状态字段。OpenClaw 会在 sessions.json 里记录三个关键字段{ compactionCount: 0, memoryFlushAt: 0, memoryFlushCompactionCount: 0 }当 flush 执行后memoryFlushAt 会更新为时间戳memoryFlushCompactionCount 会记录当时的 compactionCount。如果 compactionCount 还是 0 但 memoryFlushAt 已经有值说明 flush 先于压缩执行了顺序正确。第四步检查 memory/YYYY-MM-DD.md 文件内容。如果 Agent 在 flush 轮次里识别到了重要信息文件里应该出现对应的笔记。如果没有任何重要信息Agent 会回复 NO_REPLY文件保持为空或不存在这也是正常行为。第五步继续发消息直到触发压缩。压缩完成后compactionCount 会加 1。此时再检查 memory 文件确认压缩前写入的内容还在没有被压缩过程覆盖。第六步对比压缩前后的对话可见内容。压缩后历史消息会被替换为摘要加 firstKeptEntryId 之后的消息。你可以通过 session 的 JSONL 文件看到 compaction entry 的写入。整个验证过程的关键是memoryFlushAt 的时间戳要早于 compactionCount 增加的时间点。如果顺序反了说明软阈值设置有问题需要调大 softThresholdTokens。你还可以用 memory_search 工具检索写入的内容确认语义搜索能命中。memory_search 会自动分块相邻 chunk 有 80 token 重叠支持 BM25 加向量混合搜索。如果搜不到检查向量 provider 是否可用系统会按 local → openai → gemini → voyage → mistral 的顺序降级。5. 常见错排查401、local proxy failed、reading choices、OAuth验证过程中最容易卡在几个报错上。这一节对照真实报错给出排查方向。401 Unauthorized这个通常是 API Key 没配对。检查 openclaw.json 里的 apiKey 是否正确引用了环境变量以及环境变量是否在当前 shell 生效。如果你用的是 TaoToken确认 Key 是从控制台生成的没有多余空格。Base URL 要写 https://taotoken.net/api 不要漏掉 /api 路径。local proxy failed这个报错说明 OpenClaw 尝试走本地代理但失败了。检查你的网络配置确认没有残留的代理环境变量比如 HTTP_PROXY 或 HTTPS_PROXY。如果你在容器里跑确认容器网络能直连 API 地址。reading choices 相关报错这个通常出现在模型返回格式不符合预期时。检查 Model ID 是否写对有些模型名带日期后缀写错了会返回非标准响应。另外确认 API 版本兼容TaoToken 的接入文档里有推荐的模型列表。OAuth 报错如果你用的是需要 OAuth 的接入方式检查 token 是否过期。OpenClaw 的某些后端会走 OAuth 流程token 刷新失败就会报这个。重新走一遍授权流程或者换成 API Key 方式接入。还有一个容易忽略的点如果你同时用了 CC Switch 或 Cline MCP配置里要写全三件套 Base URL、Key、Model ID。缺任何一个都会导致调用失败。Codex 的 auth.json 也是类似三个字段都要有。另外memoryFlush 不执行还有几个边界条件只对嵌入式 Pi sessions 执行CLI 后端会跳过workspace 只读时跳过每个压缩周期只执行一次通过 memoryFlushCompactionCount 追踪。如果你发现 flush 没触发先确认这几个条件。如果压缩后记忆还是丢了检查 identifierPolicy 设置。strict 模式会严格保留标识符custom 模式可以自定义保留规则。你可以设 identifierInstructions 来指定哪些内容必须保留。6. 语义一致 CTA把验证流程跑通之后把上面的配置和验证步骤跑一遍你应该能在本地看到 memoryFlushAt 时间戳先更新、compactionCount 后增加的正确顺序也能在 memory 文件里找到压缩前写入的笔记。这套机制的核心价值就是让长会话在压缩时不丢关键信息同时用户完全无感。如果你在接入模型时还需要调试可以先用模型对话入口发几条消息确认 Key 可用https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入文档里有 Base URL 和鉴权头的完整写法https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Key 管理在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你打算长期跑编码类 Agent需要更稳定的调用配额可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 接入说明在https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。最后给一个实用技巧验证阶段可以把 softThresholdTokens 调小比如设成 2000这样能更快触发 flush方便你观察状态字段变化。确认流程跑通后再调回正常值。另外记得每次改配置后重启 OpenClaw配置不会热加载。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑