Mem0 Memory Plugin for Nanobot
1. 一句话定位
Mem0 是一个事实型个人记忆层:用 LLM 从对话中抽取可复用事实,再用向量、关键词和实体信号检索给 Nanobot。
2. 核心心智模型
- Mem0 的核心不是“保存聊天记录”,而是把聊天转成 memory items。
- 写入时必须走
Memory.add(),因为这里包含 LLM extraction、历史上下文、实体链接和向量写入。 - 检索时必须走
Memory.search(),因为这里包含 semantic search、BM25、entity boost 和可选 rerank。 user_id / agent_id / run_id是隔离边界,Nanobot 不能把不同 persona/run 混在同一 scope。- Adapter 只做格式转换,不重写 Mem0 的算法。
3. 数据模型
Nanobot turn
|
v
messages[] + metadata
|
v
Mem0 Memory
|-- memory item: id, memory text, metadata, hash, timestamps
|-- entity item: entity text, entity type, linked_memory_ids
|-- history DB: recent messages for extraction context
|-- vector store: semantic + keyword searchable records| 字段 | 来源 | 用途 |
|---|---|---|
user_id | Nanobot persona/user | 用户级记忆隔离 |
agent_id | Nanobot agent/backend run | agent 级记忆隔离 |
run_id | benchmark run/session | 实验复现和 session scope |
messages[].role/content | Nanobot turn | Mem0 抽取事实的输入 |
metadata.scenario/context/attribute | MemPABench | 检索过滤和结果分析 |
memory_id | Mem0 返回 | update/delete/snapshot 引用 |
4. 运行时流程
Write path
Nanobot messages
-> Mem0Plugin.add
-> Memory.add(infer=True)
-> recent history + existing memory retrieval
-> one LLM extraction call
-> vector store insert
-> entity extraction/linking
Read path
Nanobot query
-> Mem0Plugin.search
-> Memory.search(filters={user_id/...})
-> semantic + BM25 + entity boost
-> optional rerank
-> formatted context for prompt5. 原生 API
| API | 参数 | 返回值 | 用途 |
|---|---|---|---|
Memory.add | messages, user_id, agent_id, run_id, metadata, infer | {"results": [...]} | 抽取并写入记忆 |
Memory.search | query, filters, top_k, threshold, rerank | {"results": [...]} | 混合检索相关记忆 |
Memory.get_all | filters, top_k | {"results": [...]} | 列出某个 scope 的记忆 |
Memory.update | memory_id, data, metadata | success message | 更新单条记忆 |
Memory.delete | memory_id | success message | 删除单条记忆 |
6. 存储后端
- 默认 vector store provider 是
qdrant。 - 本地源码中有 Chroma、Qdrant、FAISS、Pinecone、PGVector、Redis、Milvus、Weaviate、Supabase、Elasticsearch、OpenSearch、Turbopuffer、Databricks 等后端实现。
- README 说明默认 LLM 是
gpt-5-mini,默认 embedding 是text-embedding-3-small。 - Adapter 不应该假设后端一定是本地文件;远端 vector DB 的 snapshot/reset 需要按 namespace 处理。
7. Nanobot 集成边界
MemPA 当前已有 MemoryBackend:
add(messages, metadata)
search(query, user_id, limit)
get_context_string(user_id)
snapshot()
restore(snapshot)
reset()Mem0 plugin 的映射:
| Nanobot 接口 | Mem0 调用 |
|---|---|
add | Memory.add(..., infer=True) |
search | Memory.search(query, filters={...}) |
get_context_string | search top-k 后格式化 |
snapshot/restore | 保存 config + namespace;本地后端可另存物理数据 |
reset | 只清当前 benchmark namespace |
不能绕过的原生路径:Memory.add() 和 Memory.search()。
8. 性能保留原则
- 不直接 upsert vector store,避免跳过 LLM extraction 和 entity linking。
- 不用
get_all后 Python 过滤替代search。 - 不在每轮做全量 rebuild。
- 不丢 metadata filter,否则 benchmark 结果不可解释。
- 不把所有用户写入同一个 collection/scope。
9. 集成风险 + 校验清单
- 检查不同
user_id的检索结果不串扰。 - 检查
infer=True写入后能产生 memory item,而不是只保存原文。 - 对同一 query 记录 search latency、top-k、score 和 token count。
- reset 只影响当前实验 namespace。
- 本地 Qdrant/FAISS 和远端 DB 使用同一 Nanobot adapter contract。