关于 memory-lancedb-pro
memory-lancedb-pro 是面向 OpenClaw 的长期记忆插件,替代内置的 memory-lancedb。它提供混合检索、多范围隔离和管理命令行工具。
主要功能
- 01LanceDB 记忆存储
- 02向量与 BM25 混合检索
- 03多范围访问隔离
- 04记忆自动捕获与回忆工具
- 05命令行管理与迁移
适用场景
- 01为 OpenClaw Agent 保存长期记忆
- 02按范围隔离不同记忆
- 03检索并整理已有记忆
- 04从旧版 memory-lancedb 迁移
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ win4r/ memory-lancedb-pro-skill --skill memory-lancedb-pro安装后在 Claude Code 中输入/memory-lancedb-pro确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdREADME_CN.mdreferences/embedding_system.mdtroubleshooting.mdplugin_lifecycle.mdtools_and_cli.mdstorage_and_schema.mdscope_system.mdretrieval_pipeline.md详细介绍
memory-lancedb-pro 插件维护指南
概述
memory-lancedb-pro 是一款面向 OpenClaw 的增强型长期记忆插件。它以高级检索能力、多范围记忆隔离和管理 CLI 取代内置的 memory-lancedb 插件。
仓库:https://github.com/win4r/memory-lancedb-pro 许可证:MIT | 语言:TypeScript(ESM)| 运行时:通过 OpenClaw Gateway 运行的 Node.js
架构
┌─────────────────────────────────────────────────────────┐
│ index.ts (Entry Point) │
│ Plugin Registration · Config Parsing · Lifecycle Hooks │
└────────┬──────────┬──────────┬──────────┬───────────────┘
│ │ │ │
┌────▼───┐ ┌────▼───┐ ┌───▼────┐ ┌──▼──────────┐
│ store │ │embedder│ │retriever│ │ scopes │
│ .ts │ │ .ts │ │ .ts │ │ .ts │
└────────┘ └────────┘ └────────┘ └─────────────┘
│ │
┌────▼───┐ ┌─────▼──────────┐
│migrate │ │noise-filter.ts │
│ .ts │ │adaptive- │
└────────┘ │retrieval.ts │
└────────────────┘
┌─────────────┐ ┌──────────┐
│ tools.ts │ │ cli.ts │
│ (Agent API) │ │ (CLI) │
└─────────────┘ └──────────┘
文件参考(快速导航)
| 文件 | 用途 | 主要导出项 |
|---|---|---|
index.ts | 插件入口。向 OpenClaw Plugin API 注册、解析配置、挂载生命周期钩子 | memoryLanceDBProPlugin(默认)、shouldCapture、detectCategory |
openclaw.plugin.json | 插件元数据 + 完整的 JSON Schema 配置,包含 uiHints | — |
package.json | NPM 包。依赖项:@lancedb/lancedb、openai、@sinclair/typebox | — |
cli.ts | CLI:memory-pro list/search/stats/delete/delete-bulk/export/import/reembed/migrate | createMemoryCLI、registerMemoryCLI |
src/store.ts | LanceDB 存储层。表创建、FTS 索引、CRUD、向量/BM25 搜索 | MemoryStore、MemoryEntry、loadLanceDB |
src/embedder.ts | 嵌入抽象层。兼容 OpenAI 的 API、任务感知、LRU 缓存 | Embedder、createEmbedder、getVectorDimensions |
src/retriever.ts | 混合检索引擎。完整评分流程 | MemoryRetriever、createRetriever、DEFAULT_RETRIEVAL_CONFIG |
src/scopes.ts | 多范围访问控制 | MemoryScopeManager、createScopeManager |
src/tools.ts | Agent 工具定义:memory_recall/store/forget/update/stats/list | registerAllMemoryTools |
src/noise-filter.ts | 低质量内容噪声过滤器 | isNoise、filterNoise |
src/adaptive-retrieval.ts | 对问候语、命令、表情符号跳过检索 | shouldSkipRetrieval |
src/migrate.ts | 从旧版 memory-lancedb 迁移 | MemoryMigrator、createMigrator |
scripts/jsonl_distill.py | JSONL 会话提炼脚本(Python) | — |
核心子系统参考
如需深入了解各个子系统,请阅读相应的参考文件:
- 检索流程(评分计算、RRF 融合、重排、所有评分阶段):参见 references/retrieval_pipeline.md
- 存储与数据模型(LanceDB Schema、FTS 索引、CRUD、向量维度):参见 references/storage_and_schema.md
- 嵌入系统(提供方、任务感知 API、缓存、维度):参见 references/embedding_system.md
- 插件生命周期与配置(钩子、注册、配置解析):参见 references/plugin_lifecycle.md
- 范围系统(多范围隔离、Agent 访问、模式):参见 references/scope_system.md
- 工具与 CLI(Agent 工具、CLI 命令、参数):参见 references/tools_and_cli.md
- 常见问题与故障排除:参见 references/troubleshooting.md
开发工作流
添加新的嵌入提供方
- 检查它是否兼容 OpenAI(大多数都兼容)。如果兼容,无需更改代码,只需配置
- 如果模型不在
src/embedder.ts的EMBEDDING_DIMENSIONS映射中,将其添加进去 - 如果提供方需要
task和normalized之外的特殊请求字段,请扩展src/embedder.ts中的buildPayload() - 使用
embedder.test()方法测试 - 在 README.md 表格中记录该提供方
添加新的重排提供方
- 将提供方名称添加到
src/retriever.ts中的RerankProvider类型 - 在
buildRerankRequest()中添加对应分支,处理请求格式(标头 + 正文) - 在
parseRerankResponse()中添加对应分支,解析响应 - 将其添加到
openclaw.plugin.json的rerankProvider枚举中 - 使用实际 API 调用进行测试——重排器设有 5s 超时保护
添加新的评分阶段
- 在
MemoryRetriever中创建private apply<StageName>(results: RetrievalResult[]): RetrievalResult[]方法 - 为
RetrievalConfig接口添加相应的配置字段 - 在
hybridRetrieval()和vectorOnlyRetrieval()中的管道顺序里插入该阶段 - 为
DEFAULT_RETRIEVAL_CONFIG添加默认值 - 为
openclaw.plugin.json添加 JSON Schema 字段 - 管道顺序:Fusion → Rerank → Recency → Importance → LengthNorm → TimeDecay → HardMin → Noise → MMR
添加新的 Agent 工具
- 在
src/tools.ts中创建registerMemory<ToolName>Tool() - 使用
@sinclair/typebox中的Type.Object()定义参数 - 枚举参数使用
openclaw/plugin-sdk中的stringEnum() - 始终通过
context.scopeManager验证作用域访问权限 - 在
registerAllMemoryTools()中注册——决定将其设为核心工具(始终启用)还是管理工具(可选) - 返回
{ content: [{ type: "text", text }], details: {...} }
添加新的 CLI 命令
- 在
cli.ts的registerMemoryCLI()中添加命令 - 格式:
memory.command("name <args>").description("...").option("--flag", "...").action(async (args, opts) => { ... }) - 支持
--json标志,以输出机器可读内容 - 出错时使用
process.exit(1) - CLI 通过
index.ts中的api.registerCli()注册
修改自动捕获逻辑
index.ts中的shouldCapture(text)控制自动捕获的内容MEMORY_TRIGGERS正则表达式数组定义触发模式(支持 EN/CJK)detectCategory(text)将捕获内容归类为 preference/fact/decision/entity/other- 自动捕获在
agent_end钩子中运行,每轮最多捕获 3 条 - 重复检测阈值:余弦相似度 > 0.95
修改自动回忆逻辑
- 自动回忆使用
before_agent_start钩子(默认关闭) src/adaptive-retrieval.ts中的shouldSkipRetrieval()控制是否执行检索- 注入为
<relevant-memories>XML 块,并附带不可信数据警告 sanitizeForContext()会移除 HTML 和换行符,并将每条记忆限制在 300 个字符以内- 每轮最多注入 3 条记忆
关键设计决策
- autoRecall 默认关闭——防止模型复述注入的记忆上下文
- autoCapture 默认开启——透明地累积记忆
- sessionMemory 默认关闭——原始会话摘要会降低检索质量;请改用 JSONL 提炼
- LanceDB 动态导入——异步加载以避免阻塞;在单例 Promise 中缓存
- 启动检查采用即发即弃方式——网关立即绑定 HTTP 端口;嵌入和检索测试在后台运行,超时时间为 8s
- 每日 JSONL 备份——间隔 24h,保留最近 7 个文件,启动 1 min 后运行
- BM25 分数归一化——原始 BM25 分数没有上限,使用 sigmoid 归一化:
1 / (1 + exp(-score/5)) - 更新 = 删除 + 重新添加——LanceDB 不支持原地更新
- ID 前缀匹配——长度为 8 个或以上十六进制字符的前缀会解析为完整 UUID,方便用户使用
- 兼顾 CJK 字符的阈值——中文、日文和韩文文本采用更短的最小长度(4–6 个字符,英文为 10–15 个字符)
- 环境变量解析——在解析配置时解析
${VAR}语法;网关服务可能不会继承 shell 环境变量
测试
- 冒烟测试:
node test/cli-smoke.mjs - 手动验证:
openclaw plugins doctor、openclaw memory-pro stats - 嵌入测试:
embedder.test()返回{ success, dimensions, error? } - 检索测试:
retriever.test()返回{ success, mode, hasFtsSupport, error? }
评论
支持 Markdown