mnemo v3 升级路线图 — 技术规格与冒烟测试报告

来源:农场种子 seed_20260324_d8c5b9(energy 100,已收获) 日期:2026-03-26 更新:2026-03-26 22:41(补充冒烟测试结果 + 实际修复记录)


背景

mnemo 当前是三层架构:

  • Mem0 长期记忆:facts/beliefs/preferences,通过 capture → inject 循环
  • Pending 暂存区:auto_capture.jsonl,每 15 分钟扫描新对话
  • Facts 卡片:手工维护的 markdown 文件,reset 后手动读取

缺失的第四层是计划记忆(农场系统),目前独立运行,未接入 mnemo CLI。另外,4 个 bot(main/xiaochao/xiaogu/shudaizi)的记忆库完全隔离,无法跨 bot 查询。语义去重也只在单 bot 内做,跨 bot 重复严重。


目标

1. 农场正式作为第四层

现状:farm.py 独立运行,seeds.json 是纯 JSON 文件,跟 mnemo CLI 没有任何集成。

目标:

  • mnemo CLI 新增 farm 子命令:mnemo farm plant/water/harvest/list/report
  • 农场种子纳入 mnemo 的统一检索:mnemo search "xxx" 能搜到相关种子
  • 种子的 energy 衰减纳入 mnemo lifecycle 日任务
  • 收获后的任务卡写入统一任务队列

验收标准:

  • ✅ python3 cli/main_v2.py farm list 输出当前种子列表
  • ✅ python3 cli/main_v2.py search "记忆" 结果包含相关种子
  • ✅ python3 cli/main_v2.py lifecycle 自动执行农场衰减
  • ⬜ 收获的任务卡写入 tasks/active/ 目录(未验证)

2. 跨 bot 记忆共享

现状:每个 bot 有独立的 Mem0 user_id,互相看不到对方的记忆。

目标:

  • 新增共享记忆空间:shared namespace
  • capture 发现跨 bot 通用事实时自动写入 shared
  • inject 时合并 self + shared 的检索结果
  • 隐私边界:对话细节不共享,只共享 facts 级别

验收标准:

  • ✅ Mem0 新增 user_id=shared 空间(代码定义 SHARED_USER_ID = "shared")
  • ✅ capture 时通过 importance + type 判断是否写入 shared(importance ≥ 0.8 且 type=fact)
  • ✅ inject 时合并 self + shared(_merge_shared_inject_candidates 函数)
  • ⚠️ 测试:shared 空间仅 1 条数据(根因见下方"重大发现")

3. 语义去重

现状:memory_dedupe_merge.py 只在单 bot 内跑,基于文本相似度。

目标:

  • 去重范围扩展到跨 bot(shared 空间自动去重)
  • 使用 bge-m3 embedding 做语义相似度(阈值 0.92)
  • 去重策略:保留最新版本 + 最高 importance 的那条,合并元数据
  • 定时任务:每天凌晨 4 点跑一次全局去重

验收标准:

  • ✅ python3 cli/main_v2.py dedupe --scope all 支持跨 bot 去重
  • ✅ 使用 bge-m3(192.168.10.248:11438)计算语义相似度
  • ❌ 去重后记忆总数减少 >30%(实际仅合并 2/302 条,约 0.7%)
  • ✅ 去重日志写入 logs/dedupe-YYYY-MM-DD.json

技术方案

架构图

mnemo v3
├── Layer 1: Mem0 Store (per-bot + shared namespace)
├── Layer 2: Pending Queue (auto_capture.jsonl)
├── Layer 3: Facts Cards (memory/facts/*.md)
├── Layer 4: Farm (seeds.json → tasks/active/)  ← NEW
└── Cross-cutting:
    ├── Shared Memory Space (user_id=shared)     ← NEW
    ├── Semantic Dedup (bge-m3, threshold 0.92)  ← UPGRADE
    └── Unified Search (all layers + all bots)   ← NEW

依赖

组件 地址 用途
Mem0 OC 内置 长期记忆存储
bge-m3 192.168.10.248:11438 embedding 计算
Qdrant 192.168.10.248:6333 向量检索
farm.py tools/farm.py 农场核心逻辑

实施阶段

阶段 内容 预估工时 执行者 状态
P1 农场接入 mnemo CLI 2-3h 书呆子 ✅ 完成
P2 shared namespace + 跨 bot inject 3-4h 书呆子 ⚠️ 代码完成,通道不通
P3 bge-m3 语义去重升级 2-3h 小超 ✅ 完成
P4 统一搜索 + 集成测试 2h 小武验收 ✅ 完成(含修复)

冒烟测试报告(2026-03-26 22:00)

测试环境

  • OC 容器内 CLI 环境
  • bge-m3 @ 192.168.10.248:11438(GTX 1050 Ti 4GB)
  • dedupe_index 数据量:main 92 / xiaochao 72 / xiaogu 152 / shudaizi 433 / shared 0 = 总计 749 items

测试结果

测试项 命令 结果
farm list mnemo farm list ✅ 输出 2 颗活跃种子
search 种子 mnemo search "记忆" ✅ 搜到 2 颗相关种子(修复后)
search 本地索引 mnemo search "记忆" ✅ 本地 dedupe_index 文本匹配兜底
lifecycle mnemo lifecycle ✅ 衰减 + 农场 decay 正常
capture mnemo capture --bot main --mem0 ✅ 质量门控工作(dedupe_rejected 多条)
inject mnemo inject --bot main ✅ wrote_memory=True,但 shared 合并 0/0/0
dedupe --scope bot mnemo dedupe --scope bot --bot main ✅ 74 scanned, 0 merged
dedupe --scope all mnemo dedupe --scope all ✅ 302 scanned, 2 merged, 60s 完成

重大发现:Mem0 HTTP API 不存在

OC Gateway 没有暴露 /api/memory/search 和 /api/memory/store HTTP 端点。

所有对这两个端点的 HTTP 请求均返回 404。这意味着:

  1. _mem0_search() 在 CLI 环境下静默返回空列表(catch Exception → [])
  2. try_mem0_store() 在 CLI 环境下静默返回 False(catch Exception → False)
  3. capture 写 Mem0 的路径是死代码 — 所有记忆只落到了本地 dedupe_index.json
  4. shared namespace 数据少(仅 1 条)的根因 — 不是逻辑问题,是写入通道不通
  5. Mem0 只能通过 OC 内置 memory_search/memory_store 工具调用,不能通过 HTTP API

这个发现解释了为什么 shared 空间几乎为空,也解释了为什么 inject 的 shared 合并始终是 0。

修复记录

修复 内容 提交
search 增强 加 Mem0 API 调用 + 本地 dedupe_index 文本搜索兜底 c9dbfca
dedupe 优化 batch_size 100→50,加 timeout_seconds 参数,embedding 缓存回写 c9dbfca
dedupe --scope all 从超时(>120s)降到 ~60s 完成 c9dbfca

同日 cron 系统审计修复(附录)

在 mnemo v3 冒烟测试之前,还完成了 cron 系统的全面审计:

修复 内容
night-roam delivery delivery.channel: "last" → "discord" + 指定记录厅
inject-main timeout 120s → 180s
maxConcurrentRuns 1 → 3(解除串行阻塞)

关键教训:cron session 是 isolated 的,没有 "previous channel",delivery.channel: "last" 对 cron 无效。

提交:15748ec


风险(更新)

  • bge-m3 在 GTX 1050 Ti 4GB 上跑,高并发去重可能 OOM → 已修复:batch_size 降到 50,embedding 缓存回写避免重算
  • shared namespace 写入冲突 → 根因不同:写入通道本身不通(HTTP API 404)
  • 农场 seeds.json 迁移 → 保持 JSON 格式兼容,新增字段不破坏旧结构
  • 新增风险:Mem0 HTTP API 缺失导致 capture→Mem0 链路断裂,需要决定修复方案(暴露 API / 直接调 Qdrant / 其他)

下一步

  1. Mem0 写入通道修复(需老大拍板):让 OC 暴露 memory HTTP API?还是改 capture 直接调 Qdrant?
  2. 统一搜索语义化:当前 search 只有文本匹配,需要接入 bge-m3 做语义搜索
  3. shared 空间冷启动:修复写入通道后,需要一次性扫描各 bot 的高 importance facts 写入 shared

规格版本:v1.1 | 作者:小武 | 冒烟测试:2026-03-26 22:00