OpenClaw 无损上下文管理指南:Lossless-Claw + QMD 双剑合璧

在 AI Agent 的长期协作中,上下文管理是决定智能体能力上限的核心瓶颈。传统方案要么因窗口限制导致“失忆”,要么因全量传输造成 Token 成本爆炸。本文将基于 OpenClaw 文档与社区实践,详解 Lossless-Claw(LCM)与 QMD 的无损上下文组合方案,从原理、价值到可直接复制的实操配置,全部经过官方文档与经验验证。

一、为什么做:三大痛点

1.1 滑动窗口失忆

OpenClaw 内置的上下文压缩机制存在一个根本性缺陷:它是有损的(lossy)。当对话超过模型上限(如 8k/16k Token),早期信息直接被截断,AI 彻底“忘记”前期需求、代码细节和关键决策。内置压缩还会把数十轮对话压成一段几百 Token 的摘要,不保留原始消息,压缩后细节永远丢失。

1.2 Token 成本雪崩

长对话全量传输,每轮请求 Token 数指数级增长。经验显示,长对话场景下单次请求可能携带 8 万 + tokens,不仅响应延迟高达 45 秒,API 成本可达 $2.4/次。

1.3 缺乏可定制性

传统压缩规则硬编码在核心中,插件无法介入。近期 OpenClaw 版本开始支持可插拔上下文引擎,新增 ContextEngine 插槽与生命周期钩子,使插件可以在上下文生成、压缩、拼接以及子 Agent 管理的各个阶段介入。OpenClaw 文档支持 lossless-claw 插件——基于 Voltropy 团队 LCM 论文的无损上下文方案。

1.4 破局:Lossless-Claw + QMD

这套组合是 OpenClaw 社区中广泛采用的无损上下文方案,核心价值在于分工明确、互补增效

  • Lossless-Claw(LCM) :负责当前会话内存。用 DAG 分层摘要 + SQLite 全量持久化,对话再长也不丢原始消息,同时把活跃上下文压缩到模型窗口 75% 以内。
  • QMD:负责跨会话硬盘记忆。本地语义搜索引擎,只提取最相关的 2-3 句话注入上下文,杜绝全库扫描的 Token 浪费。

LCM 管“当下对话不中断”,QMD 管“历史知识不丢失” ,两者结合实现“永久记忆 + 零成本膨胀”。

1.5 预期效果对比

| 指标 | 原生 OpenClaw | Lossless-Claw + QMD | 提升 |
|: —|: —|: —|: —|
| 上下文大小 | 5000+ Token(溢出) | 800-1200 Token | 削减 75%-85% |
| 历史追溯 | 无法恢复早期消息 | 100% 无损展开 | 永久记忆 |
| 响应速度 | 8-10 秒 | 1-2 秒 | 提速 80%+ |
| Token 成本 | 100 轮 ≈ 50 万 Token | 100 轮 ≈ 5 万 Token | 节省 90% |
| OOLONG 得分 | Claude Code 70.3 | lossless-claw 74.8 | 击败默认方案 |

在 OOLONG 长上下文推理基准测试中,相同模型(Claude Opus 4.6)搭配 lossless-claw 后得分从 70.3 提升至 74.8,Token 消耗降低 30%+。QMD 端 Token 削减达 60-97%(平均 95% 以上),响应速度提升 5-50 倍,成本降低 90-99%,精准度高达 93%。

二、是什么:双引擎架构解析

2.1 Lossless-Claw:DAG 无损上下文管理

Lossless Claw(LCM)是一个为 OpenClaw 开发的无损上下文管理插件,基于 DAG(有向无向图)结构的摘要系统替代 OpenClaw 内置的滑动窗口压缩机制。它不在上下文爆满后临时补救,而是持续在后台异步处理历史消息。首先将所有原始消息完整写入 SQLite 数据库,不主动丢弃任何内容;随后将较旧的消息分块,调用 LLM 生成摘要;这些摘要被组织成 DAG 结构——底层节点保留时序细节,上层节点逐步浓缩为高层级摘要,既能控制上下文体积,又不会真正失去原始信息。

LCM 的核心架构包含两大层次:

  • 持久化存储:所有对话消息、工具调用记录、文件内容均存入 SQLite 数据库,永不主动删除,作为不可变的原始副本。
  • DAG 摘要层:超出最新 N 条消息后,异步生成 Leaf 层级摘要;同层摘要积累到阈值后向上凝练,形成层级化 DAG 结构。每个摘要都链接回它的源消息——这就是“无损”的含义。

LCM 通过五个关键操作完成工作:将每条消息持久化到 SQLite 数据库;将旧消息分块摘要;随着摘要积累,进一步浓缩为更高层级节点,形成 DAG;每轮通过组合摘要 + 近期原始消息来组装上下文;并提供 lcm_greplcm_describelcm_expand 等工具,让 Agent 可以搜索和回忆已压缩历史中的细节。

OpenClaw 核心开发者 Josh Lehman 在亲身测试后的评价:“对话感觉永远不会丢失信息(因为某种程度上确实不会),始终在 30-100K Token 范围内运行,零维护。”

2.2 QMD:本地语义搜索引擎

QMD(Quantum Memory Database)是由 GitHub 用户 tobi 开发的本地语义搜索引擎。它的核心理念是:不要把整个文件塞给 AI,而是先用本地搜索找到最相关的片段(通常只有 2-3 句话),再把这些精准内容传给 AI。

QMD 采用三层混合检索机制:

  1. BM25 全文搜索:精准匹配端口、变量名、文件名等精确术语;
  2. 向量语义搜索:理解概念关联(如“服务器配置”与“部署网关”的同义表述);
  3. LLM 重排序:轻量模型二次筛选,确保最相关片段优先。

QMD 的核心特性:完全本地运行,所有模型、数据、索引都不上云;混合搜索(BM25 + 向量语义 + LLM 重排序);不消耗任何 API 配额,自带模型;支持 MCP 协议,专为 AI 工作流设计。

OpenClaw 文档将其列为支持的 memory backend,定位为 Local-first sidecar,具备重排序(reranking)、查询扩展(query expansion)以及索引工作区外目录的能力。

2.3 协同工作流

  • 写入:LCM 将每一轮对话、每一次工具调用、每一个决策都完整写入 SQLite 数据库,并异步构建 DAG 摘要层,确保信息永不丢失。
  • 检索:QMD 通过向量检索从长期记忆中精准召回最相关的片段,避免把整个历史上下文塞给模型。
  • 巩固:配合 OpenClaw 内置的 Dreaming 梦境系统(模拟人类睡眠的记忆巩固过程),三者形成“写入 → 巩固 → 检索”的完整记忆闭环。

三、怎么做:完整配置指南

⚠️ 前置条件:OpenClaw 版本需 ≥ 2026.3.7(lossless-claw 要求)且 ≥ 2026.2.2(QMD 要求)。用 openclaw --version 检查版本。

3.1 安装 Lossless-Claw

第一步:检查前置条件

  • 已安装支持插件上下文引擎的 OpenClaw(≥ 2026.3.7);
  • Node.js 版本为 22 或更高;
  • 已在 OpenClaw 中配置好可用于摘要生成的 LLM 提供方;
  • 强烈建议 Node 运行环境支持 SQLite FTS5 编译选项。

第二步:安装插件

使用官方插件安装命令:

1
openclaw plugins install @martian-engineering/lossless-claw

该命令会下载插件、登记配置,并在系统中启用 lossless-claw。OpenClaw 会优先从 ClawHub 拉取,自动回退到 npm。

第三步:将 lossless-claw 设为默认上下文引擎

编辑配置文件 ~/.openclaw/openclaw.json,确保 contextEngine 指向 lossless-claw:

1
2
3
4
5
6
7
{
"plugins": {
"slots": {
"contextEngine": "lossless-claw"
}
}
}

第四步:调整进阶参数(可选)

openclaw.jsonplugins.entries 中添加 lossless-claw 的详细配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"plugins": {
"entries": {
"lossless-claw": {
"enabled": true,
"config": {
"freshTailCount": 32,
"contextThreshold": 0.75,
"incrementalMaxDepth": -1,
"summaryModel": "openai/gpt-5.4-mini"
}
}
}
}
}

参数说明:

  • freshTailCount: 32:保护最近 32 条消息不被压缩,保持短期上下文连贯。
  • contextThreshold: 0.75:当上下文占用达到 75% 时启动压缩流程,为模型回复预留空间。
  • incrementalMaxDepth: -1:允许摘要树无限制扩展,让长期记忆自然增长。
  • summaryModel:将压缩摘要绑定到指定模型(本配置使用 openai/gpt-5.4-mini)。

第五步:重启服务

1
openclaw gateway restart

3.2 安装 QMD

第一步:安装 QMD CLI

方式一(推荐,使用 npm):

1
npm i -g @tobilu/qmd

方式二(使用 Bun,速度更快):

1
2
3
4
5
# 先装 Bun
curl -fsSL https://bun.sh/install | bash
# 装 Qmd
bun install -g @tobilu/qmd
sudo ln -s $(which qmd) /usr/local/bin/qmd

第二步:首次运行自动下载模型

首次运行 QMD 时,会自动下载默认模型文件,通常包括 embeddinggemma 和 query-expansion 相关 GGUF 模型,整体约 1.5GB 左右。首次启动会比后续运行慢,并且需要等待模型下载完毕后才能进入正常索引。

⚠️ 常见问题:模型文件名不匹配

QMD 运行时可能因文件名大小写问题找不到模型,需手动创建软链接:

1
2
cd ~/.cache/qmd/models
ln -sf hf_ggml-org_embeddinggemma-300M-Q8_0.gguf local:embeddinggemma-300m-qat-Q8_0.gguf

第三步:配置 OpenClaw 使用 QMD

编辑 ~/.openclaw/openclaw.json,在 memory 段添加 QMD 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"memory": {
"backend": "qmd",
"citations": "auto",
"qmd": {
"searchMode": "query",
"includeDefaultMemory": true,
"update": {
"interval": "5m",
"debounceMs": 15000,
"onBoot": true
},
"sessions": {
"enabled": true,
"retentionDays": 30
},
"limits": {
"maxResults": 6,
"maxSnippetChars": 600,
"timeoutMs": 120000
},
"scope": {
"default": "deny",
"rules": [
{
"action": "allow",
"match": {
"chatType": "direct"
}
}
]
},
"paths": [
{
"name": "blogs",
"path": "/Users/sean/note/haies.cn/source/_posts",
"pattern": "**/*.md"
},
{
"name": "wans",
"path": "/Users/sean/note/wans",
"pattern": "**/*.md"
}
]
}
}
}

参数说明:

  • backend: "qmd":启用 QMD 记忆后端。
  • searchMode: "query":混合搜索(语义 + 关键词,最准)。可选 search(纯关键词,最快)或 vsearch(纯语义搜索)。
  • paths:配置需要索引的外部路径,支持多个目录。
  • maxResults: 6:最大返回结果数,越多越耗 Token。
  • scope.default: "deny" + rules:默认关闭记忆,仅允许私聊使用。

第四步:初始化 QMD 索引并生成向量嵌入

1
2
3
4
5
# 首次索引(自动扫描 paths 中配置的路径)
qmd index

# 生成向量嵌入(提升搜索精度,必须执行)
qmd embed

💡 建议定期运行 qmd embed(如每天一次)以确保新增文档可被向量检索。

3.3 验证配置

验证 Lossless-Claw

1
2
3
4
5
6
7
# 检查插件列表
openclaw plugins list
# 预期输出包含 @martian-engineering/lossless-claw

# 检查上下文引擎配置
openclaw config get plugins.slots.contextEngine
# 预期输出:"lossless-claw"

验证 QMD

1
2
3
4
5
6
# 查看 QMD 版本
qmd --version

# 检查 OpenClaw 记忆健康状态
openclaw memory status
# 预期看到 Indexed、Store、Vector 状态正常

联合验证

1
openclaw memory status

若输出正常,说明两套系统均已就绪。也可以运行 openclaw memory search "测试关键词" 测试搜索功能。

3.4 验证清单

验证项 命令 预期结果
插件安装 openclaw plugins list 显示 lossless-claw [installed]
引擎配置 openclaw config get plugins.slots.contextEngine 返回 “lossless-claw”
LCM 数据库 ls ~/.openclaw/lcm.db 文件存在
LCM 运行状态 `openclaw logs –limit 50 grep lossless`
LCM 数据统计 sqlite3 ~/.openclaw/lcm.db "SELECT COUNT(*) FROM summaries; SELECT COUNT(*) FROM messages;" 摘要数和消息数
QMD 索引 qmd status 显示 indexed documents 数量
QMD 向量嵌入 qmd embed 显示 Embedded N chunks from M documents
QMD 搜索测试 qmd search "关键词" -c blogs -n 3 返回相关结果
内存搜索 memory_search 工具 返回相关结果

示例验证结果(2026-04-10)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# LCM 状态
$ openclaw logs --limit 50 | grep lossless
2026-04-09T16:08:23.838Z info {"plugin":"lossless-claw"} [lcm] Plugin loaded (enabled=true, db=/Users/sean/.openclaw/lcm.db, threshold=0.75)

$ sqlite3 ~/.openclaw/lcm.db "SELECT COUNT(*) FROM summaries; SELECT COUNT(*) FROM messages;"
159
7855

# QMD 状态
$ qmd status
Documents
Total: 537 files indexed
Vectors: 1882 embedded
Pending: 0

Collections
blogs (qmd://blogs/): 42 files
wans (qmd://wans/): 26 files
memory (qmd://memory/): 275 files
sessions-main (qmd://sessions-main/): 68 files

# 搜索测试
$ qmd search "docker" -c blogs -n 3
qmd://blogs/docker.md:2 #637513 - Score: 85%
qmd://blogs/containerd.md:8 #7d32a7 - Score: 83%
qmd://blogs/geoserver.md:11 #cff5cb - Score: 83%

四、高级优化与故障排除

4.1 黄金参数调优

场景 freshTailCount contextThreshold maxResults
代码调试/编程 40 0.7 3
文档分析 40-64 0.7 4
轻量对话/日常聊天 24 0.8 4

4.2 成本优化策略

  • 摘要模型降级:使用 claude-haiku-4-5 或本地 ollama/llama-3:8b 执行摘要,主对话保持高级模型。
  • 排除噪音会话:通过 ignoreSessionPatterns 过滤 cron job、心跳检测等无状态会话。

4.3 常见问题排查

Q1:配置后 AI 仍“失忆”

1
2
3
4
5
# 检查 contextEngine 是否指向 lossless-claw
openclaw config get plugins.slots.contextEngine
# 若未指向,执行:
openclaw config set plugins.slots.contextEngine "lossless-claw"
openclaw gateway restart

Q2:Token 消耗未降低

1
2
3
4
# 检查 freshTailCount 是否过大
openclaw config get plugins.entries.@martian-engineering/lossless-claw.LCM_FRESH_TAIL_COUNT
# 建议调整为 32,并降低阈值:
openclaw config set plugins.entries.@martian-engineering/lossless-claw.LCM_CONTEXT_THRESHOLD 0.6

Q3:QMD 搜索超时或无结果

1
2
3
4
5
// 调整 openclaw.json 中的超时设置
"limits": {
"timeoutMs": 8000, // 从 4000 增加到 8000
"maxResults": 4 // 减少结果数以降低负载
}

若完全无结果,检查索引是否已生成:qmd embed

Q4:QMD 模型文件未找到

1
2
3
4
5
6
# 检查模型文件
ls -la ~/.cache/qmd/models/

# 如发现文件名不匹配,创建软链接
cd ~/.cache/qmd/models
ln -sf hf_ggml-org_embeddinggemma-300M-Q8_0.gguf local:embeddinggemma-300m-qat-Q8_0.gguf

Q5:SQLite 权限错误(Linux/Docker)

1
2
sudo chmod -R 775 ~/.openclaw/data
sudo chown -R $(whoami):$(whoami) ~/.openclaw/data

五、总结

Lossless-Claw + QMD 是 OpenClaw 社区中广泛使用的无损上下文组合方案,可以有效缓解“失忆、成本、精度”三大痛点。通过 LCM 的 DAG 无损压缩与 QMD 的本地精准检索,目标是实现永久记忆 + Token 膨胀可控 + 更平稳的响应时间

两者分工明确、互补增效:LCM 负责“当下对话不中断”,QMD 负责“历史知识不丢失”,配合 OpenClaw 内置的 Dreaming 梦境系统,形成“写入 → 巩固 → 检索”的完整记忆闭环。在一些测试中表明:在一些长上下文场景中,得分和成本都有明显改善,但实际结果仍依赖具体模型、主题和配置。

本文中的配置、命令和参数基于 OpenClaw、LCM、QMD 的官方文档或社区资料整理,可作为可复制的参考。按此配置,你的 OpenClaw 能更好地支持长期对话与历史记忆场景。

官方参考