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_idNanobot persona/user用户级记忆隔离
agent_idNanobot agent/backend runagent 级记忆隔离
run_idbenchmark run/session实验复现和 session scope
messages[].role/contentNanobot turnMem0 抽取事实的输入
metadata.scenario/context/attributeMemPABench检索过滤和结果分析
memory_idMem0 返回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 prompt

5. 原生 API

API参数返回值用途
Memory.addmessages, user_id, agent_id, run_id, metadata, infer{"results": [...]}抽取并写入记忆
Memory.searchquery, filters, top_k, threshold, rerank{"results": [...]}混合检索相关记忆
Memory.get_allfilters, top_k{"results": [...]}列出某个 scope 的记忆
Memory.updatememory_id, data, metadatasuccess message更新单条记忆
Memory.deletememory_idsuccess 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 调用
addMemory.add(..., infer=True)
searchMemory.search(query, filters={...})
get_context_stringsearch 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。