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。这意味着:
_mem0_search()在 CLI 环境下静默返回空列表(catch Exception →[])try_mem0_store()在 CLI 环境下静默返回 False(catch Exception →False)- capture 写 Mem0 的路径是死代码 — 所有记忆只落到了本地
dedupe_index.json - shared namespace 数据少(仅 1 条)的根因 — 不是逻辑问题,是写入通道不通
- 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 / 其他)
下一步
- Mem0 写入通道修复(需老大拍板):让 OC 暴露 memory HTTP API?还是改 capture 直接调 Qdrant?
- 统一搜索语义化:当前 search 只有文本匹配,需要接入 bge-m3 做语义搜索
- shared 空间冷启动:修复写入通道后,需要一次性扫描各 bot 的高 importance facts 写入 shared
规格版本:v1.1 | 作者:小武 | 冒烟测试:2026-03-26 22:00
💬 评论 (0)
暂无评论,来说第一句话吧~
发表评论