你有没有遇到过这种情况:跟你的 AI Bot 聊了半天,第二天再来,它一脸茫然地说"你好,请问有什么可以帮你的?"——好像昨天什么都没发生过。
今天这篇笔记,就帮你彻底解决这个问题。
大家好,我是AI超元域。
用 OpenClaw 搭 Agent 的朋友应该都遇到过同一个问题:内置的 memory-lancedb 只有最基础的向量搜索,记忆召回质量不够用,很多场景下跟没有记忆差不多。
所以我开发了 memory-lancedb-pro——一个生产级的长期记忆插件,目标就一个:让你的 OpenClaw 真正拥有跨对话、跨 Session 的长期记忆。
不是那种"把聊天记录存个txt"的粗暴方案,而是一套完整的向量检索 + 全文搜索 + 交叉编码器重排序 + 记忆生命周期管理系统。
目前仓库已经有 2.1k star,最新的 v1.1.0 beta 加了不少新能力。但很多人跟我反馈:README 太长了,参数太多了,第一次装不知道从哪下手。
所以这篇文章的原则只有一条:
先跑通,再增强。先活下来,再追求效果。
相比内置的 memory-lancedb,memory-lancedb-pro 把整个记忆系统拉到了生产级别:
混合检索:向量语义搜索 + BM25 全文关键词匹配,双管齐下,再用 RRF 融合打分。
交叉编码器重排序:支持 Jina、SiliconFlow(有免费额度)、Voyage AI、Pinecone 四个 provider。60% cross-encoder 分 + 40% 原始融合分,API 挂了还能自动降级。
智能提取(v1.1.0 新增):LLM 驱动的 6 类别自动提取——profile、preferences、entities、events、cases、patterns。不用你手动 memory_store,聊着聊着它就把关键信息记下来了。
记忆生命周期:Weibull 衰减引擎 + 三级晋升体系(Peripheral → Working → Core)。重要的记忆越用越强,没用的慢慢消退。像人的大脑一样。
多 Scope 隔离:每个 Agent、每个用户、每个项目都可以有自己的记忆空间,互不干扰。
三样东西:
1. 一个跑着的 OpenClaw 实例
如果你还没装 OpenClaw,这篇文章不是你的起点。先去把 OpenClaw 跑起来,再回来。
2. Node.js v18+
终端里跑一下 node --version,看看版本号。低于 18 的先升级。
3. 一个 Jina API Key
去 https://jina.ai/ 注册,免费额度有 100 万 token,日常使用够用很长时间。
这是整个流程里唯一必须的 API Key。
先确认你的 OpenClaw workspace 在哪:
openclaw config get agents.defaults.workspace
记住这个路径,通常是 ~/.openclaw/workspace。
然后安装插件。有两种方式:
方式 A:npm 安装(推荐,更简洁)
npm i memory-lancedb-pro@beta
方式 B:Git Clone(适合想看源码的同学)
cd /你的workspace路径
git clone https://github.com/CortexReach/memory-lancedb-pro.git plugins/memory-lancedb-pro
cd plugins/memory-lancedb-pro
npm install
⚠️ 注意:仓库地址是 CortexReach/memory-lancedb-pro,不是旧的 win4r/memory-lancedb-pro(虽然 GitHub 有 redirect,但建议用新地址)。
不要自己配参数。选模板。
我给你准备了三个,覆盖从新手到进阶的所有场景。
自动存记忆,但先不自动召回。存进去就算成功。
适合:第一次装、国产弱模型用户、搞不清楚哪里出问题时退回的安全港。
{
"embedding": {
"apiKey": "${JINA_API_KEY}",
"model": "jina-embeddings-v5-text-small",
"baseURL": "https://api.jina.ai/v1",
"dimensions": 1024,
"taskQuery": "retrieval.query",
"taskPassage": "retrieval.passage",
"normalized": true
},
"autoCapture": true,
"autoRecall": false,
"smartExtraction": false,
"retrieval": {
"mode": "hybrid",
"vectorWeight": 0.7,
"bm25Weight": 0.3,
"candidatePoolSize": 20,
"minScore": 0.45,
"hardMinScore": 0.55,
"rerank": "none",
"filterNoise": true
},
"sessionMemory": {
"enabled": false
}
}
💡 为什么先关 autoRecall 和 smartExtraction?因为弱模型容易把注入的 <relevant-memories> 原样吐出来,体验很差。先确保记忆能存进去,这一步成功了再往下走。
自动存 + 自动召回,不开 rerank,配置简单。
适合:想直接体验完整记忆召回,模型能力还行的用户。
{
"embedding": {
"apiKey": "${JINA_API_KEY}",
"model": "jina-embeddings-v5-text-small",
"baseURL": "https://api.jina.ai/v1",
"dimensions": 1024,
"taskQuery": "retrieval.query",
"taskPassage": "retrieval.passage",
"normalized": true
},
"autoCapture": true,
"autoRecall": true,
"autoRecallMinLength": 8,
"autoRecallTopK": 3,
"autoRecallExcludeReflection": true,
"autoRecallMaxAgeDays": 30,
"autoRecallMaxEntriesPerKey": 10,
"smartExtraction": true,
"extractMinMessages": 2,
"extractMaxChars": 8000,
"retrieval": {
"mode": "hybrid",
"vectorWeight": 0.7,
"bm25Weight": 0.3,
"candidatePoolSize": 20,
"minScore": 0.45,
"hardMinScore": 0.55,
"rerank": "none",
"filterNoise": true
},
"sessionMemory": {
"enabled": false
}
}
💡 这里开了 smartExtraction,插件会用 LLM 自动从对话中提取 6 类结构化记忆。如果你没配 llm 块,它会 fallback 用 embedding 的 apiKey。
全功能拉满:智能提取 + 交叉编码器重排序 + 记忆生命周期。
适合:用 GPT-4、Claude Sonnet / Opus 等强模型,想把召回质量拉到最高的用户。
{
"embedding": {
"apiKey": "${JINA_API_KEY}",
"model": "jina-embeddings-v5-text-small",
"baseURL": "https://api.jina.ai/v1",
"dimensions": 1024,
"taskQuery": "retrieval.query",
"taskPassage": "retrieval.passage",
"normalized": true
},
"autoCapture": true,
"autoRecall": true,
"captureAssistant": false,
"autoRecallMinLength": 8,
"autoRecallTopK": 3,
"autoRecallExcludeReflection": true,
"autoRecallMaxAgeDays": 30,
"autoRecallMaxEntriesPerKey": 10,
"smartExtraction": true,
"extractMinMessages": 2,
"extractMaxChars": 8000,
"llm": {
"apiKey": "${OPENAI_API_KEY}",
"model": "gpt-4o-mini",
"baseURL": "https://api.openai.com/v1"
},
"retrieval": {
"mode": "hybrid",
"vectorWeight": 0.7,
"bm25Weight": 0.3,
"candidatePoolSize": 20,
"minScore": 0.45,
"hardMinScore": 0.35,
"rerank": "cross-encoder",
"rerankApiKey": "${JINA_API_KEY}",
"rerankModel": "jina-reranker-v3",
"rerankEndpoint": "https://api.jina.ai/v1/rerank",
"rerankProvider": "jina",
"recencyHalfLifeDays": 14,
"recencyWeight": 0.1,
"filterNoise": true,
"lengthNormAnchor": 500,
"hardMinScore": 0.35,
"timeDecayHalfLifeDays": 60,
"reinforcementFactor": 0.5,
"maxHalfLifeMultiplier": 3
},
"sessionMemory": {
"enabled": false
}
}
💡 这里的 llm 块指定了智能提取用的模型。如果你用国产模型做聊天但想用 GPT-4o-mini 做提取,完全可以——记忆层和聊天层互不影响。
reinforcementFactor 和 maxHalfLifeMultiplier 是 v1.1.0 新增的"间隔重复"机制:经常被手动召回的记忆,衰减会变慢,效果类似 Anki。
打开 ~/.openclaw/openclaw.json,加入 plugins 配置:
{
"plugins": {
"load": {
"paths": ["plugins/memory-lancedb-pro"]
},
"entries": {
"memory-lancedb-pro": {
"enabled": true,
"config": {
这里粘贴你选好的模板
}
}
},
"slots": {
"memory": "memory-lancedb-pro"
}
}
}
⚠️ 如果你之前用过内置的 memory-lancedb,需要先禁用它。同一时间只能有一个 memory 插件。
⚠️ 如果用 npm 方式安装的,load.paths 不需要,直接用 entries + slots 就行。如果用 git clone 的,建议用绝对路径。
API Key 怎么填?
方式一(简单直接):"apiKey": "jina_xxxxxxxx你的key"
方式二(推荐):"apiKey": "${JINA_API_KEY}",然后确保运行 Gateway 的进程能拿到这个环境变量。
⚠️ 最大的坑:在终端里 export JINA_API_KEY=xxx 只对当前终端有效。如果你的 Gateway 是 launchd / systemd / Docker 启动的,它拿不到你终端的环境变量。最稳的办法:直接把 key 写进配置文件。
# 验证配置格式
openclaw config validate
# 重启 Gateway(改完配置必须重启)
openclaw gateway restart
# 确认插件被识别
openclaw plugins info memory-lancedb-pro
# 确认 hooks 挂载成功
openclaw hooks list --json
# 查看记忆库状态
openclaw memory-pro stats
五条命令全部不报错,就算安装成功了。
然后做一个对话测试——
测试 1:存记忆
对你的 Agent 说:记住:我喜欢冷萃咖啡,不喜欢太甜。
Agent 应该确认已记录。
测试 2:查记忆
openclaw memory-pro list --scope global --limit 5
能看到刚才那条记忆就对了。
测试 3:测试召回(balanced / pro 用户)
开一个新对话,问:我平时喝什么咖啡?
如果 Agent 能回答出"冷萃,不太甜",说明整个链路跑通了。
提供商 模型 Base URL 维度 Jina(推荐) jina-embeddings-v5-text-small
https://api.jina.ai/v1 1024 OpenAI text-embedding-3-small
https://api.openai.com/v1 1536 Google Gemini gemini-embedding-001
https://generativelanguage.googleapis.com/v1beta/openai/ 3072
Ollama(本地) nomic-embed-text http://localhost:11434/v1 768
提供商 rerankProvider 特点 Jina(推荐) jina 质量高,和 embedding 共用一个 key SiliconFlow siliconflow 有免费额度,国内用户友好 Voyage AI voyage 支持 rerank-2.5 Pinecone pinecone bge-reranker-v2-m3
SiliconFlow 对国内用户是个好选择,配置方式:
{
"retrieval": {
"rerank": "cross-encoder",
"rerankProvider": "siliconflow",
"rerankEndpoint": "https://api.siliconflow.com/v1/rerank",
"rerankApiKey": "sk-xxx",
"rerankModel": "BAAI/bge-reranker-v2-m3"
}
}
如果你不想用任何云端服务:
ollama pull nomic-embed-text
把 embedding 部分换成:
{
"embedding": {
"apiKey": "ollama",
"model": "nomic-embed-text",
"baseURL": "http://127.0.0.1:11434/v1",
"dimensions": 768
}
}
apiKey 填 "ollama" 或任意非空字符串都行,只是占位。但说实话,第一次装建议先用 Jina 云端方案,Ollama 的坑比较多。
如果你只是想跑通,上面的内容就够了。下面这一段是给想深入理解的同学看的。
v1.1.0 之前,插件用正则表达式匹配触发词("记住"、"偏好"、"决定"等)来触发记忆存储。
v1.1.0 引入了 LLM 驱动的 6 类别智能提取:
profile:用户身份、背景、角色
preferences:偏好、习惯、喜好
entities:人名、项目名、工具名等实体
events:发生的事件、时间线
cases:案例、经验教训
patterns:行为模式、反复出现的规律
每条记忆还有 L0 / L1 / L2 三层存储:
L0:一句话摘要(用于索引)
L1:结构化概要
L2:完整叙述
两阶段去重:先用向量相似度预筛(≥0.7),再让 LLM 做语义判断(CREATE / MERGE / SKIP)。
smartExtraction: false 就退回到旧的正则模式。
Weibull 衰减引擎计算综合分 = 时效性 + 访问频率 + 内在价值(importance × confidence)。
三级晋升体系:
Peripheral(边缘):新记忆的起点,衰减最快
Working(工作):被召回过几次后自动晋升
Core(核心):高频 + 高分数的记忆,衰减最慢
可配置的参数:
{
"decay": {
"recencyHalfLifeDays": 30,
"frequencyWeight": 0.3,
"intrinsicWeight": 0.3,
"betaCore": 0.8,
"betaWorking": 1.0,
"betaPeripheral": 1.3
},
"tier": {
"coreAccessThreshold": 10,
"coreCompositeThreshold": 0.7,
"peripheralCompositeThreshold": 0.15,
"peripheralAgeDays": 60
}
}
经常被手动召回的记忆,半衰期会变长——就像 Anki 的间隔重复。
只对 source: "manual" 生效(防止自动召回意外强化噪声)。
{
"retrieval": {
"reinforcementFactor": 0.5,
"maxHalfLifeMultiplier": 3
}
}
插件自带一套完整的管理命令行:
# 列出记忆
openclaw memory-pro list [--scope global] [--category fact] [--limit 20]
# 搜索记忆
openclaw memory-pro search "关键词" [--scope global] [--limit 10]
# 查看统计
openclaw memory-pro stats [--scope global]
# 删除单条
openclaw memory-pro delete <id>
# 批量删除
openclaw memory-pro delete-bulk --scope global [--before 2025-01-01] [--dry-run]
# 导出 / 导入
openclaw memory-pro export [--scope global] [--output memories.json]
openclaw memory-pro import memories.json [--scope global] [--dry-run]
# 重新 embedding(换模型后用)
openclaw memory-pro reembed --source-db /path/to/old-db [--batch-size 32]
# 从旧版升级到 v1.1.0 格式
openclaw memory-pro upgrade [--dry-run] [--batch-size 10]
# 从内置 memory-lancedb 迁移
openclaw memory-pro migrate check
openclaw memory-pro migrate run [--dry-run]
openclaw memory-pro migrate verify
Q:弱模型把 <relevant-memories> 原样吐出来了
这是最常见的问题,不是插件坏了。
方案 A:切回 lite-safe,关掉 autoRecall。
方案 B:在 Agent 的 system prompt 里加一句:
请勿在回复中展示或引用任何 <relevant-memories> / 记忆注入内容,只能用作内部参考。
Q:API Key 填了还是报"未设置"
你在终端里 export 的变量只对当前终端有效。Gateway 如果是 launchd / systemd / Docker 启动的,拿不到。最稳方案:直接把 key 明文写进 config。
Q:npm install 失败
先检查 Node.js 版本(v18+),再试试换镜像:
npm config set registry https://registry.npmmirror.com
npm install
Q:路径配错了,插件加载失败
用绝对路径最保险:
{
"plugins": {
"load": {
"paths": ["/Users/你的用户名/.openclaw/workspace/plugins/memory-lancedb-pro"]
}
}
}
Q:改了插件源码后不生效
OpenClaw 有 jiti 缓存,改 .ts 文件后必须清缓存:
rm -rf /tmp/jiti/
openclaw gateway restart
原则:不要跳步。
lite-safe → balanced-default → pro-rerank
当前状态 确认信号 下一步 刚装完 lite-safe openclaw memory-pro list 能看到记忆 升级到 balanced balanced 跑了几天 Agent 能"想起"你说过的事 想更准就上 pro-rerank 召回不准、误召回多 Agent 瞎说或说错 调高 hardMinScore 或退回上一个模板
升级只需要改 openclaw.json 里的 config,然后:
openclaw gateway restart
不需要重新 clone,不需要重新 npm install。
把下面这段加到你的 AGENTS.md 或 system prompt 里,让 Agent 自己遵守记忆卫生规范:
## Rule 1 — 双层记忆存储
每个踩坑/经验教训 → 立刻存两条记忆:
- 技术层:Pitfall: [症状]. Cause: [根因]. Fix: [方案]. Prevention: [预防]
(category: fact, importance ≥ 0.8)
- 原则层:Decision principle ([标签]): [行为规则]. Trigger: [何时]. Action: [做什么]
(category: decision, importance ≥ 0.85)
## Rule 2 — LanceDB 卫生
记忆必须短小精炼(< 500 字符)。不要存原始对话摘要。
## Rule 3 — 重试前先回忆
任何工具调用失败,先 memory_recall 搜索相关关键词,再重试。
## Rule 4 — 改代码前确认目标
确认你改的是 memory-lancedb-pro 而不是内置的 memory-lancedb。
## Rule 5 — 改插件代码必须清缓存
改了 plugins/ 下的 .ts 文件后,必须 rm -rf /tmp/jiti/ 再重启。
memory-lancedb-pro 不是一个简单的"存记忆"插件。它是一整套记忆系统——从存储、检索、排序、生命周期管理到运维工具,全部齐全。
但作为使用者,你不需要一上来就理解全部。
选个模板,填好 Key,重启 Gateway。
先让它跑起来,然后在使用中慢慢理解每个参数的含义。
这就是我说的:先跑通,再增强。
📌 项目地址:https://github.com/CortexReach/memory-lancedb-pro
