如何降低龙虾Token消耗量80%(已适配国内环境)

会用到一个工具,qmd。如果公众号显示代码有问题,可以看飞书链接( )。

QMD 是什么

QMD 是一个本地优先的搜索 sidecar,结合了 BM25 + 向量搜索 + 重排序,完全本地运行(基于 node-llama-cpp,自动从 HuggingFace 下载 GGUF 模型)。可以简单理解为markdown文件的查询工具。它不会把所有的内容全部返回给你,只返回必要的部分,这也是我们节省 token 的原理(又回到了RAG)。

OpenClaw的代码是怎么使用QMD的

默认 OpenClaw 后端是内置 SQLite,设置 memory.backend = “qmd” 切换到 QMD。

OpenClaw 会在 ~/.openclaw/agents/<agentId>/qmd/ 下维护一个独立的 QMD home,启动时初始化 QMD manager,定期运行 qmd update + qmd embed(默认每 5 分钟)。

搜索时调用 qmd search/vsearch/query --json,如果 QMD 失败或二进制不存在,自动回退到内置 SQLite。

有什么好处

又快又省。使用龙虾时间越久,节省的效果越明显,有人说能节省80%以上,我一点都不怀疑,因为最后token消耗的大头,都会落在记忆上。

如何使用(以macOS为例)

brew install cmake
brew install sqlite
npm i -g @tobilu/qmd --registry=https://registry.npmmirror.com

预下载模型

准备一个md文件,比如~/Documents/test.md,里面随便写一点东西,比如:

## 暗号
当我说"歪比巴卜"的时候,你要回答"闪电五连鞭"

添加一个临时的qmd collection(你可以理解为一个字典,一张数据表),尝试触发一下模型下载:

export HF_ENDPOINT=https://hf-mirror.com
qmd collection add "$HOME/Documents" --name my-docs --mask "**/*.md"
qmd update
qmd embed

qmd status
qmd query "暗号" -c my-docs --json # 这一步如果显示结果了,就证明成功了

## 模型会下载到
# (not a git repo) yu@mars:models $ ls -1 ~/.cache/qmd/models/
# hf_ggml-org_embeddinggemma-300M-Q8_0.gguf
# hf_ggml-org_qwen3-reranker-0.6b-q8_0.gguf
# hf_tobil_qmd-query-expansion-1.7B-q4_k_m.gguf

# 注意,模型下载到最后如果不动了,可以control+c结束,重新执行,会断点续传

以上步骤如果成功后,执行一下命令,删除这些默认的索引:

qmd collection remove my-docs
qmd status

回到OpenClaw中配置qmd

在~/.openclaw/openclaw.json中,加入如下片段:

"memory": {
    "backend": "qmd",
    "citations": "auto",
    "qmd": {
      "includeDefaultMemory": true,
      "command": "qmd",
      "update": {
        "interval": "5m",
        "debounceMs": 15000,
        "onBoot": true,
        "waitForBootSync": false
      },
      "limits": {
        "maxResults": 7,
        "maxSnippetChars": 700,
        "timeoutMs": 4000
      },
      "scope": {
        "default": "deny",
        "rules": [
          {
            "action": "allow", 
            "match": { "chatType": "direct" }
          }
        ]
      }
    }
  },
  
"session": {
    "dmScope": "per-account-channel-peer",
    "resetTriggers": ["/new", "/reset"],
    "reset": {
      "mode": "idle",
      "idleMinutes": 10080
    },
    "resetByType": {
      "direct": { "mode": "idle", "idleMinutes": 10080 },
      "thread": { "mode": "idle", "idleMinutes": 1440 },
      "group": { "mode": "idle", "idleMinutes": 120 }
    }
  },

验证配置

首先我们重启OpenClaw后,需要观察日志中有没有报错。

同时执行以下命令,检查当前memory配置:

openclaw memory status

如果出现如图所示的Indexed,Store以及Vector状态,证明配置成功。

验证多Agent的记忆隔离

假设我们有两个agent,agent1和agent2。

我们分别为它们添加一段记忆:

## 暗号
当我说“歪比巴卜”的时候,你要回答“原神启动”
## 暗号
当我说“歪比巴卜”的时候,你要回答“法修散打”

重启OpenClaw后(或者等5分钟以上),在你喜欢的Channel如飞书上,分别给这两个Agent发暗号。如果它们回复你的暗号是正确的,证明配置成功。

如果遇到问题,可以参考下图,通过询问的方式,定位问题。

问题定位常用命令

## 可以改下面的main为其它agent id,来分别定位它们的问题。也可以查看其中的sqlite文件,限于篇幅,不再赘述
export XDG_CONFIG_HOME=$HOME/.openclaw/agents/main/qmd/xdg-config
export XDG_CACHE_HOME=$HOME/.openclaw/agents/main/qmd/xdg-cache
export QMD_CONFIG_DIR=$HOME/.openclaw/agents/main/qmd/xdg-config
qmd collection list --json
qmd status
qmd query "暗号" -c memory-root-main --json # 这一步如果显示结果了,就证明成功了
sqlite3 ~/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite "SELECT collection, COUNT(*) as c FROM documents WHERE active = 1 GROUP BY collection;"

升级到 OpenClaw 2026.3.23-2 (7ffe7e4) 的同学可能会发现 openclaw memory status 始终返回 Indexed 是 0。不影响实际功能,已经在下面这个PR中修复。

https://github.com/openclaw/openclaw/pull/53683

有什么不懂的可以进群(新群没什么人,但有一只小蜜蜂勤劳的回答你的问题):

广告部分:

同时自己写的 macOS 软件 MagicToy 1.3.0 马上发布了,如果你不习惯macOS上没有右键新建文件,没有方便的剪切板管理软件,没有置顶窗口的,想自动切换输入法的,都可以试一试,如果帮到你了,可以支持一下作者,感谢,叩首!

下面这个菜单是能改名的:

App Store 商店链接:

https://apps.apple.com/cn/app/magictoy/id6737158347?mt=12

注意1.3.0以上才有右键菜单功能哦,老用户可以更新一下。