2026年4月13日 · 阅读 —
人虾情未了: **OpenClaw 记忆系统配置与运行状态说明**
人虾情未了: OpenClaw 记忆系统配置与运行状态说明
由于 token 突然“断粮”,被迫和龙虾🦐短暂分居了几天。那几天的日子,可以说是——人还活着,灵魂已经掉线。
不过也没闲着,顺手刷了不少关于「openclaw 优化 & 记忆」的文章,重点研究了一波外挂 memo 方案,以及 soul.md、user.md 这些“灵魂档案”的配置玩法。越看越觉得:原来龙虾不仅能吃,还能养(而且还挺费脑子)。
今天模型续上,重新召唤龙虾那一刻——
好家伙,直接上演《人虾重逢现场》:
👉 一日不见,如隔三秋
👉 几天没撩,浑身不对劲
👉 打开对话的那一刻:嗯,熟悉的味道回来了
重启之后,第一件事当然是——让它自查家底:
看看当前记忆配置怎么样,还有没有可以继续压榨性能的空间。
结果还不错:
整体配置已经算是“能打选手”,不是那种一碰就碎的脆皮方案。
但嘛,搞优化的人都懂——“还能再抠一点”。
所以接下来计划也很明确:
👉 开始折腾「灵魂文件」系列
👉 深挖 soul.md、user.md 这些“人格外挂”
👉 争取把龙虾从“好用”,养成“离不开”
总结一句话:
这波不是简单回归,是——
带着更强外挂归来的养虾二周目 😄
结论
你现在的记忆系统已经是 QMD 后端,而且是正在正常工作的,不是默认的 memory-core / sqlite 那套。
当前是一个:
Markdown 记忆文件 + QMD 检索索引 + 会话导出 + 压缩前记忆刷新
的组合。
一、当前实际生效的记忆配置
1)当前后端
你现在是:
memory.backend = "qmd"
说明:
- 不是默认 builtin sqlite recall
- 而是走 QMD 做记忆检索
2)当前 citations
你现在是:
memory.citations = "auto"
说明:
- memory_search 返回结果时,会按情况附带
Source: <path#line>
- 方便追溯记忆来源
- 不是强制每次都显示,但默认允许引用来源
3)当前 QMD 配置
当前 memory.qmd 关键配置:
includeDefaultMemory = true
update.interval = "5m"
update.debounceMs = 15000
limits.maxResults = 8
limits.timeoutMs = 5000
paths:
main-workspace -> [本机路径已隐藏]
command = [本机路径已隐藏]
sessions.enabled = true
sessions.retentionDays = 30
配置含义说明
includeDefaultMemory = true
会自动索引默认记忆文件:
- MEMORY.md
- memory/**/*.md
paths = workspace//*.md**
除了默认 memory 文件,还把整个 workspace 的 Markdown 纳入索引范围。
也就是说:
不只是 MEMORY.md / memory/*.md,很多文档型 .md 也会进 QMD 检索。
update.interval = 5m
- QMD 每 5 分钟刷新一次索引
debounceMs = 15000
- 文件变化后不会立即刷新索引
- 会等待 15 秒(防抖)
limits.maxResults = 8
- 每次 recall 最多返回 8 条
limits.timeoutMs = 5000
- 单次检索超时:5 秒
sessions.enabled = true
- 会话内容也会进入可检索索引
sessions.retentionDays = 30
- 保留最近 30 天会话用于 recall
二、当前运行状态
你当前 openclaw memory status 状态:
main
• Provider: qmd
• Sources: memory, sessions
• Indexed: 94 chunks
• Vector: ready
code
• Provider: qmd
• Sources: memory, sessions
• Indexed: 79 chunks
• Vector: ready
writer
• Provider: qmd
• Sources: memory, sessions
• Indexed: 83 chunks
• Vector: ready
说明
你现在不是“只配置但没运行”,而是:
- main / code / writer 三个 agent 都有独立 QMD 索引
- QMD vector 状态正常(ready)
- memory + sessions 两类数据源都在工作
三、当前记忆机制
机制 1:Markdown 是记忆源头
OpenClaw 的记忆本体是:
Markdown 文件(不是模型内存)
核心文件:
- MEMORY.md:长期记忆 / 索引
- memory/YYYY-MM-DD.md:日常记录
👉 结论:
真正能长期保留的信息,必须写入文件
机制 2:memory_search / memory_get
当前 recall 工具:
memory_search → 语义搜索(QMD 索引)
memory_get → 精确读取文件内容
典型流程:
1. memory_search
2. memory_get(读取命中文件)
机制 3:QMD 做索引和检索
你当前使用的是:
QMD 检索体系(非简单关键词搜索)
特点:
- 本地索引
- BM25 + 向量 + rerank
- Markdown 仍是 source of truth
- 通过 CLI 调用
👉 意味着:
- 比 grep 强
- 比纯向量 recall 更稳定
- 更适合「记忆文件 + 会话」混合检索
机制 4:会话也进入记忆搜索
你开启了:
memory.qmd.sessions.enabled = true
因此 recall 来源包括:
- Markdown 文件(长期记忆)
- 最近会话(短期记忆)
状态中体现为:
Sources: memory, sessions
优点
- 最近聊过但未写入 memory 的内容也能被召回
风险
- 会话记忆较“热”,可能干扰长期记忆
- 不如写入 MEMORY.md 稳定
机制 5:自动记忆刷新(memoryFlush)
你开启了:
agents.defaults.compaction.memoryFlush.enabled = true
阈值:
softThresholdTokens = 90000
forceFlushTranscriptBytes = 2mb
作用
当会话接近压缩(compaction)时:
会先触发一次「静默记忆刷新」
流程:
先写记忆 → 再压缩上下文
目的
避免:
- 会话被压缩
- 有价值信息未写入 memory
- 导致“聊过但丢失”
阈值分析
softThresholdTokens = 90000
属于:
较高阈值(偏保守)
意味着:
- 会话很长才触发
- 不会频繁打扰
机制 6:上下文裁剪(影响体验)
配置:
contextPruning.mode = "cache-ttl"
ttl = "1h"
keepLastAssistants = 6
softTrimRatio = 0.25
hardClearRatio = 0.5
说明:
- 这不是记忆系统本身
- 但会影响“上下文保留”体验
四、配置优化调整(已完成)
已调整为推荐版
已修改:
limits.maxResults: 8 → 5
sessions.retentionDays: 30 → 14
paths:
- workspace/**/*.md
+ workspace/memory/**/*.md
+ workspace/MEMORY.md
调整效果
- recall 更聚焦
- token 使用更少
- sessions 噪音降低
- 更适合「个人记忆 + 多 agent」场景
五、运行提示说明
重启时出现提示:
[openclaw] missing tool result in session history; inserted synthetic error result for transcript repair.
说明:
- 属于 会话历史修复提示
- ❌ 不是配置错误
- ✅ 不影响记忆系统
六、下一步建议
在本机执行:
openclaw gateway restart
openclaw memory status
可以进一步做的检查
如果你需要,我可以继续帮你:
- ✅ 确认新配置是否完全生效
- ✅ 对比 indexed files / chunks 是否下降
- ✅ 分析 recall 质量是否提升
如果你下一步想做更高级优化(比如:冷热记忆分层 / agent 专属记忆 / 自动写入策略),我也可以帮你把这套系统再往上提一档。
…未完待续…