4705 字
24 分钟

Mem0 Memory Pipeline 源码深潜:ADD-only 提取、混合检索与多存储一致性

Agent Memory Engineering 专栏 · 4/6。 Mem0 最值得研究的不是 memory.add() 这个 API,而是它如何把会话事件变成带 Scope、来源、Hash、Lexical Projection、Entity Link、History 与 Expiration 的 Memory Pipeline。

专栏导航:总览与选型地图 · Codex · Claude Code · Hermes · Mem0 · Letta · Graphiti


0. 版本基线:先区分 OSS、Platform 与旧算法#

本文于 2026-07-15 联网核对以下材料:

  • mem0ai/mem0 Commit ccbe5861a138c7583e01bb3a3aa6168e52526a23
  • Mem0 V3 Migration 文档;
  • Mem0 Memory Evaluation 文档;
  • Mem0 论文与公开 Benchmark 说明。[M1][M2][M3]

必须先澄清三个对象:

对象本文如何使用
OSS 固定版本用于逐行分析同步 Memory 的真实读写与故障语义
Mem0 Platform V3用于理解官方对新算法的产品契约与迁移说明
旧算法 Prompt只用于对比,不冒充 V3 主路径

0.1 最关键的版本纠正:V3 是 ADD-only#

代码库中仍能找到旧的 DEFAULT_UPDATE_MEMORY_PROMPT,它让 LLM 输出 ADD / UPDATE / DELETE / NONE。[M4]

但固定版本的 V3 主写路径 _add_to_vector_store(..., infer=True) 使用的是:

ADDITIVE_EXTRACTION_PROMPT
→ only ADD
→ Prompt requests optional links
→ this commit does not persist those links

官方迁移文档也明确说明:V3 从“两次 LLM 调用 + 写时合并”转为“一次 ADD-only 提取”,历史 Memory 不在 Extraction 阶段被覆盖或删除。[M2]

这不代表系统没有 Update/Delete:显式 API 仍提供 update()delete()。准确说法是:

自动推断写路径改为 ADD-only;显式管理 API 仍能 Update/Delete。

0.2 本文要回答的十二个问题#

  1. 为什么 user_id / agent_id / run_id 是隔离约束,不是普通 Metadata?
  2. infer=Falseinfer=True 的数据语义有何区别?
  3. 为什么 V3 在 Extraction 前先取最近消息与 Existing Memory?
  4. 为什么源码构造了 UUID → Integer 映射,却没有把它接回持久化路径?
  5. ADD-only 如何表达偏好变化与历史关系?
  6. Provider Failure 与“没有可提取 Memory”如何区分?
  7. Batch Embedding 和单条 Fallback 会制造什么部分成功窗口?
  8. Hash、BM25、Vector 与 Entity 分别解决什么问题?
  9. 为什么 Keyword Search 不扩大当前实现的 Candidate Pool?
  10. Vector、History、Entity 三套存储如何发生不一致?
  11. Expiration 与 Delete 的语义为什么不同?
  12. Benchmark 分数如何在相同 Token、TopK 和模型约束下解释?

1. Memory Record 不是 Text,而是带 Scope 的事实投影#

Memory.add() 要求 user_idagent_idrun_id 至少存在一个,并通过 _build_filters_and_metadata() 形成持久化 Metadata 与查询 Filter。[M5]

1.1 Scope 是 Authorization Predicate#

Memory Identity
= content
+ user_id
+ agent_id
+ run_id
+ actor / role
+ timestamps
+ expiration

如果写入带 user_id=alice,搜索却只做全局 Vector TopK,再在应用层过滤,Alice 的候选内容已经进入错误租户的检索与日志路径。

所以 Scope 应尽量下推到 Store:

Query
→ build authorized filters
→ vector / keyword / entity retrieval under same scope
→ rank

1.2 三种 ID 不是互斥的“任选标签”#

ID典型语义错用风险
user_id跨会话用户事实与偏好多用户泄漏
agent_id某个 Agent 的经验或自我特征不同 Agent 互相污染
run_id任务、线程或 Workflow 边界临时状态永久扩散

固定版本还用 Metadata 判断是否采用 Agent Memory Extraction:同时存在 agent_id 且消息中包含 Assistant Role 时,才进入 Agent-oriented Extraction。[M5]

1.3 attributed_torole#

V3 Prompt 要求每条提取结果带 attributed_to=user|assistant。Raw Path 则把原始 Role 和可选 Actor Name 写入 Payload。[M4][M6]

这两个字段解决不同问题:

role
→ transport-level message role
attributed_to
→ extracted fact is about / originates from whom

“Assistant 建议用户迁移到 Postgres”不应被错误抽取成“用户偏好 Postgres”。


2. infer=False:Raw Persistence Path#

infer=False 时,Mem0 不调用 Extraction LLM,而是逐条处理 Message:[M6]

validate role + content
→ skip system messages
→ preserve role / actor metadata
→ embed raw content
→ create one memory
→ insert vector
→ append ADD history

2.1 Raw Path 的契约#

它适合:

  • 已由上游完成结构化提取;
  • 法规要求保留原始事件;
  • 测试需要绕过 LLM 不确定性;
  • 业务自己拥有 Write Policy。

它不自动提供:

  • 事实压缩;
  • 语义去重;
  • 冲突判断;
  • 重要性筛选;
  • 跨消息归因修正。

所以 infer=False 不是“更低质量模式”,而是:

调用方接管 Semantic ETL,Mem0 只负责持久化与检索基础设施。

2.2 System Message 为什么跳过#

Raw Path 明确跳过 role=system。这是合理的默认边界:System Prompt 通常是应用 Policy,不应被当成用户长期事实写回 Memory。

如果需要持久化 Agent Policy,应进入配置、版本控制或专用 Policy Store,而不是让它和观察到的 Memory 共享召回路径。


3. infer=True:V3 Phased Batch Pipeline#

固定版本在源码中直接标注 V3 PHASED BATCH PIPELINE。[M6]

flowchart LR
A["Messages + Scope"] --> P0["P0 gather recent messages"]
P0 --> P1["P1 retrieve existing memories"]
P1 --> P2["P2 single-pass ADD-only extraction"]
P2 --> P3["P3 batch embeddings"]
P3 --> P4["P4 metadata + lemmatization"]
P4 --> P5["P5 hash dedup"]
P5 --> P6["P6 vector + history persist"]
P6 --> P7["P7 entity linking"]

3.1 Phase 0:最近消息为 Extraction 提供局部连续性#

session_scope = user / agent / run filters
last_messages = db.get_last_messages(scope, limit=10)
parsed_messages = parse_messages(current_input)

仅看当前消息会把:

“是的,就按上次那个方案”

错误提取成缺少指代对象的 Memory。最近消息不是为了把 Full History 全塞给模型,而是给 Extraction 一个受控窗口。

3.2 Phase 1:Read-before-Write#

系统用当前 Parsed Messages 做 Query,在相同 Scope 下搜索 Top 10 Existing Memories。[M6]

Read-before-Write 在 V3 中不再用于决定原地 Update/Delete。按 Extraction Prompt 的设计,它承担两件事:

  • 让模型跳过与 Existing Memory 语义等价的新输出;
  • 让新事实通过 linked_memory_ids 指向相关旧事实。

但固定版本只完整兑现了第一件事:Existing Memories 确实进入 Prompt,模型可以据此不输出重复事实;linked_memory_ids 却没有进入后续 Record Metadata。因而“保留偏好变化的历史链”在这个 Commit 中仍是 Prompt 意图,不是已落盘的数据结构保证。[M4][M6]

3.3 UUID → Integer:正确的接口思想,未闭合的实现#

Vector Store 返回 UUID,但 Prompt 中映射为:

0 → 9d1f...
1 → 3c82...
2 → a06b...

这种短句柄本来可以降低模型抄写高熵 UUID 的错误率。但固定版本存在明确的实现断点:

uuid_mapping[str(idx)] = mem.id
existing_memories.append({"id": str(idx), "text": ...})
# 后续持久化只消费这两个模型字段
text = mem.get("text")
attributed_to = mem.get("attributed_to")

uuid_mapping 在同步和异步 V3 路径中都没有再次被读取;模型输出的 linked_memory_ids 也没有写入 Vector Payload、History 或独立关系存储。[M6]

所以这个 Commit 的准确结论不是“Runtime 再映射回真实 UUID”,而是:Runtime 为短 ID 映射做了准备,但关联字段尚未接入持久化路径。 这是源码审计必须区分“Prompt Schema”“局部变量”和“最终可观察状态”的典型案例。

这是通用的 Tool Interface 原则:

不要让模型复制高熵内部标识符;给它一个受限、短小、可验证的句柄。

3.4 Phase 2:Single-pass ADD-only Extraction#

V3 Prompt 强调:

  • 只输出值得记忆的自包含事实;
  • 每条输出只执行 ADD;
  • Prompt 要求可链接 Existing Memory,但固定版本不会持久化该关联;
  • 必须标注 attributed_to
  • 新输出使用顺序 ID;Existing Memory 在 Prompt 中同样显示为短 Integer ID,尽管 Prompt 文案仍称其为 UUID。[M4][M6]

这把 Write-time Conflict Resolution 推迟到 Retrieval:新旧事实共同存在,由时间、关系和排序决定当前查询看到什么。

3.5 ADD-only 的收益与成本#

收益:

  • 不在一次 LLM 判断中破坏历史;
  • 避免错误 DELETE 导致不可恢复的 Recall Ceiling;
  • 偏好变化可以保留演进轨迹;
  • 单次 LLM 调用降低 Extraction Latency。

成本:

  • Memory 数量持续增长;
  • Retrieval 必须处理近重复和冲突;
  • Expiration / Cleanup 变得重要;
  • 如果 Temporal Metadata 不足,“保留历史”可能退化成“召回矛盾”。

4. Empty Extraction 与 Provider Failure 必须分开#

固定版本对 LLM 调用异常会重新抛出 LLMError,源码注释明确指出:旧的 Silent return [] 让上游无法区分 429/5xx/Timeout 与“本轮没有事实”。[M6]

4.1 三类结果#

SUCCESS_WITH_MEMORIES
→ extracted list non-empty
SUCCESS_NO_MEMORY
→ valid response, no memorable fact
FAILED_PROVIDER / FAILED_PARSE
→ extraction did not complete reliably

如果把后两者都编码为 []

  • Retry Policy 无法判断;
  • SLA 把失败算成正常空结果;
  • Memory Write Recall 会被悄悄拉低;
  • 上游无法切换 Provider。

4.2 Parse Failure 当前仍有降级风险#

固定版本会先去 Code Fence、直接 JSON Parse,再尝试提取 JSON;最终 Parse Exception 会记录日志并把结果置空。[M6]

这意味着 Provider Exception 与部分 Parse Error 的外部语义并不完全一致。生产化建议:

provider_error
schema_error
empty_valid_result

分别计数,并将 Schema Error 纳入有限重试或 Dead-letter Queue。

4.3 即使无 Memory 也保存 Message#

当没有提取结果时,当前 Messages 仍写入 Session DB。这样未来 Extraction 的 Last-k Context 不会因为本轮无长期事实而断裂。[M6]

这是一个很好的职责拆分:

Conversation continuity
Long-term memory creation

5. Batch Embedding、Hash 与 Lexical Projection#

5.1 Batch First,Individual Fallback#

全部提取文本先调用 embed_batch。失败后逐条调用 embed;单条失败只记录 Warning,该条不会进入后续 Record。[M6]

N memories
→ 1 batch request
→ on failure, up to N individual requests

收益是正常路径减少网络往返;代价是 Fallback 可能造成长尾延迟和部分 Memory 丢失。

5.2 Exact Hash Dedup#

每条 Text 计算 MD5:

hash(text)

并同时对:

  • Existing Results 中已有 Hash;
  • 当前 Batch 已见 Hash;

做去重。[M6]

它解决的是 Exact Duplicate,不解决:

User lives in Beijing
用户目前住在北京

这类 Semantic Duplicate。

Hash 还不是安全完整性证明:MD5 在这里承担快速内容键,而不是抗攻击签名。

5.3 text_lemmatized#

写入时生成 Lemmatized Text,为 Keyword / BM25 Retrieval 提供稳定投影。[M6]

一个 Record 因而至少有:

data
embedding
text_lemmatized
hash
created_at
updated_at
scope metadata
attributed_to
expiration_date?

这是典型的 Canonical Text + Derived Projections 模型。问题在于固定实现把多种投影共同塞入 Vector Store Payload;如果各投影更新不一致,需要 Reconciliation 才能修复。


6. Persist:Vector、History、Entity 的部分成功窗口#

Phase 6 先批量写 Vector Store;失败时逐条 Fallback。随后批量写 History;再失败时逐条 Fallback。Phase 7 最后做 Entity Linking。[M6]

flowchart LR
R["Extracted ADD records"] --> V["Vector Store"]
V --> H["History Store"]
H --> E["Entity Projection"]
E --> S["Session Messages"]
V -. "partial failure" .-> X["searchable / audit / entity state may diverge"]
H -. "partial failure" .-> X
E -. "partial failure" .-> X
S -. "partial failure" .-> X
X --> Q["Reconciliation + idempotent replay"]

图 1:固定版本的真实主路径是 ADD-only 后按顺序写多个状态域。Batch-first / Item-fallback 提高完成率,但没有把 Vector、History、Entity 与 Session Message 包进一个跨存储事务;Reconciliation 与 Idempotent Replay 属于生产化补强。

6.1 可能状态#

Vector ✓ History ✓ Entity ✓
→ complete
Vector ✓ History ✗ Entity ✓/✗
→ searchable but audit incomplete
Vector ✓ History ✓ Entity ✗
→ searchable but entity boost incomplete
Vector partial
→ only subset of extracted memories visible

6.2 为什么 Fallback 不等于事务#

Fallback 提高 Availability:批接口不支持或偶发失败时,单条仍可能成功。

但它没有提供:

  • All-or-nothing;
  • 已成功项 Rollback;
  • 全局 Commit Marker;
  • Exactly-once History;
  • Entity Projection 与 Vector Version 对齐。

6.3 Production Reliability Envelope#

更稳妥的设计:

Canonical Memory DB transaction
→ write records + outbox
→ asynchronous projectors
├── vector index
├── BM25 index
├── entity index
└── history / audit
→ projector checkpoint
→ reconciliation scans

Vector / Keyword / Entity 都应被视为可重建 Projection,而不是彼此独立的真相源。


7. Entity Linking:轻量 Graph Signal 如何进入 Ranking#

V3 会批量抽取 Entity,在当前 Batch 内做全局归一化去重,然后批量 Embedding。[M6]

Existing Entity 匹配有两条路径:

Exact normalized text match
or
semantic top-1 match with score >= 0.95

命中后合并 linked_memory_ids;否则插入新 Entity Record。

7.1 Entity Store 表达什么#

它不是完整 Temporal Knowledge Graph,更接近:

Entity Node
→ set of linked memory IDs

它能帮助:

  • Proper Noun;
  • 产品名、人名、地点;
  • 同一 Entity 相关 Memory 聚合;
  • Query Entity 对相关 Memory 提升排序。

它不能天然表达:

  • 关系有效时间;
  • 事实边的 Provenance;
  • 多跳逻辑约束;
  • 互相矛盾的状态区间。

7.2 High-degree Entity 降权#

查询 Entity 命中后,Boost 会结合相似度与 Linked Memory 数量。源码对链接很多的 Entity 施加衰减,避免“高频超级节点”把大量 Memory 全部抬高。[M7]

这类似图检索中的 Hub Penalty:

boost = similarity × weight × degree_penalty

8. Search:Semantic Candidate Pool + Signal Enrichment#

固定版本搜索流程:[M7]

lemmatize query
→ extract query entities
→ embed query
→ semantic over-fetch
→ keyword search for BM25 scores
→ entity search for boosts
→ score_and_rank
→ expiration filter
→ format result / explanation

8.1 Over-fetch#

内部候选数:

internal_limit = max(limit * 4, 60)

最终 TopK=10 时仍取至少 60 个 Semantic Candidates,给 BM25 与 Entity Signal 留出重排空间。

8.2 一个非常重要的实现细节#

Keyword Search 会生成 memory_id → normalized_bm25_score,但 Candidate List 仍由 Semantic Results 构建。[M7]

所以当前路径更准确是:

Semantic retrieval defines candidate recall
BM25 and Entity enrich candidate ranking

而不是严格意义上的:

Vector candidates ∪ Keyword candidates

这意味着一个 Vector 完全漏掉、但 Keyword 精确命中的 Memory,可能没有机会进入最终排名。

8.3 真正的 Hybrid Candidate Fusion#

生产化可改为:

semantic_candidates
∪ keyword_candidates
∪ entity_linked_candidates
→ dedup by memory_id
→ feature enrichment
→ rank / rerank

并分别记录:

candidate_source = vector|keyword|entity
raw_rank
raw_score
normalized_score
final_score

8.4 Explainability#

固定版本支持 explain,将 score_details 放入结果。这是调优 Multi-signal Retrieval 的基础:没有每个 Signal 的贡献,只能看到一个无法行动的 Final Score。


9. Expiration、Update、Delete 与 Procedural Memory#

9.1 Expiration 是 Read-time Visibility#

expiration_date 被规范化后写入 Payload。Search / Get All 默认隐藏 Expired Memory,除非 show_expired=True。[M5][M7]

Expired
≠ physically deleted

这适合:

  • 临时旅行计划;
  • 有效期内优惠;
  • 短期项目偏好;
  • 待过期授权状态。

但如果合规要求删除,Read-time Hide 不足以证明 Vector、History、Entity 和 Backup 都不可恢复。

9.2 显式 Update#

_update_memory() 会:[M8]

  1. 读取 Existing Record;
  2. 保留 created_at
  3. 更新 updated_at、Hash、Lemmatized Text 与 Embedding;
  4. actor_id 创建后保持不可变;
  5. 写 Vector Store;
  6. 追加 UPDATE History;
  7. Text 变化时清理旧 Entity Links,再链接新 Text Entity。

Vector Update 成功、History 或 Entity Cleanup 失败时仍有投影不一致风险。

9.3 显式 Delete#

_delete_memory() 的顺序是:[M8]

get existing
→ vector delete
→ append DELETE history
→ remove memory id from entity records (non-fatal)

这不是跨存储原子删除。需要 Tombstone / Reconciliation 才能向用户证明所有读路径已不可见。

9.4 Procedural Memory#

memory_type=procedural_memory 且存在 agent_id,系统调用 LLM 把对话整理成 Procedure,再走普通 Create Path。[M8]

它保存的是:

Goal
→ ordered actions
→ tool use
→ observations
→ outcome / lesson

Procedure 如果没有版本、适用条件和失败边界,很容易把一次偶然成功固化成错误 SOP。生产系统应附加:

environment fingerprint
source run ids
success evidence
last validated at
applicability constraints

10. Retrieval Quality 不能只看相关性#

一个 Memory 进入最终 Context 要经过:

Write Extraction
→ Persistence
→ Candidate Recall
→ Ranking
→ Context Packing
→ Model Use

所以“答案错了”可能是:

  • Write Miss;
  • Vector Candidate Miss;
  • BM25 / Entity Ranking Miss;
  • Expiration Filter Error;
  • Packing Budget Drop;
  • 模型没有使用已注入 Memory。

10.1 诊断事件#

{
"query_id": "...",
"memory_id": "...",
"scope_match": true,
"candidate_sources": ["vector", "keyword"],
"semantic_rank": 17,
"bm25_score": 0.74,
"entity_boost": 0.18,
"final_rank": 4,
"packed": true,
"used_by_answer": true
}

10.2 Candidate Recall 与 Ranking Quality 分开#

如果 Gold Memory 不在 Candidate Pool,调 Reranker 没用;如果它在 Pool 但排第 80,才是 Ranking Problem。

Candidate Recall@N
MRR / NDCG@K
Context Precision@K
Answer Attribution

必须分开计算。


11. 官方 Benchmark 如何严谨解读#

Mem0 论文、Migration 与 Evaluation 页面展示的分数并不完全相同,反映算法版本、数据集、模型栈、检索约束或文档更新时间不同。[M2][M3][M9]

因此不应把一个数字脱离约束写成“绝对优于所有系统”。至少同时记录:

benchmark version
retrieval top_k / top_200 budget
average context tokens
answer model
judge model
latency
confidence interval

11.1 Token Efficiency#

官方 Evaluation 强调在 LoCoMo、LongMemEval、BEAM 上同时观察 Accuracy、Context Token 和 Latency,并指出小 Benchmark 可以通过大 Context 与 Frontier Model 被激进检索“做高”。[M3]

这是正确的工程方向:

Utility=f(accuracy,token cost,latency,harm)Utility = f(accuracy, token\ cost, latency, harm)

只比较 Accuracy 会鼓励把 TopK 拉到 200、把大量近重复 Memory 塞进 Context。

11.2 Equal Constraints#

公平比较至少要求:

  • 相同 Answer Model;
  • 相同 Judge;
  • 相同 Retrieval Budget;
  • 相同 Context Token 上限;
  • 相同时间切分;
  • 相同是否允许 Full History;
  • 相同是否使用 Reranker。

12. Security 与 Privacy#

Memory Poisoning、跨租户召回与派生数据删除失败都属于持久 Agent Memory 的独立安全面,不能用普通 Prompt Injection 测试代替。[M10]

12.1 Scope Bypass#

所有 Vector、Keyword、Entity、History 操作必须共享同一 Scope。任何一个 Projection 忘记 Filter 都可能形成跨租户泄漏。

12.2 Memory Poisoning#

V3 会把 User 与 Assistant 内容提取为持久事实。外部网页中的 Prompt Injection 如果被 Assistant 复述,可能被错误标记为 Assistant Memory。

Write Path 应保留:

source_message_ids
source_role
source_trust
extractor_model
extractor_version
extraction_prompt_hash

12.3 Sensitive Metadata#

固定版本有 Sensitive Field 识别与 Config Safe Copy,但这不等于完整 DLP。[M5] 生产系统仍需要:

  • PII Classification;
  • Secret Redaction;
  • Tenant-specific Encryption Key;
  • Retention / Legal Hold;
  • Derived Index Delete Verification;
  • Access Audit。

13. 生产化补强蓝图#

13.1 Canonical Store#

MemoryRecord
├── id / version
├── scope
├── canonical text
├── provenance
├── valid / expiration time
├── status
└── tombstone

13.2 Outbox + Projectors#

Canonical transaction
→ Outbox
→ Vector Projector
→ Keyword Projector
→ Entity Projector
→ History / Audit Projector

每个 Projector 维护 Watermark,失败可重放;读结果带 memory_id + version,Context Builder 注入前回查 Canonical Status。

13.3 Reconciliation#

周期检查:

canonical ids - vector ids
vector ids - canonical ids
history latest version vs canonical version
entity linked ids not found
expired / deleted ids still searchable

13.4 Idempotency#

API 应接受:

event_id
extraction_job_id
mutation_id

Exact Text Hash 不能替代请求幂等键,因为同一事实可能合法地在不同 Scope 或时间重复出现。


14. Mem0 路线的优势与边界#

14.1 优势#

  • Scope、Extraction、Embedding、History、Entity 与 Retrieval 集成完整;
  • Raw 与 Inferred Write Path 清晰分离;
  • V3 单次 ADD-only Extraction 降低写时破坏与 LLM Latency;
  • Batch-first / Item-fallback 提高 Provider 兼容性;
  • Hash、Lexical 与 Entity 提供多信号;
  • Expiration、Explicit Update/Delete、Procedural Memory 覆盖常用生命周期;
  • Explain Score 为检索调优提供基础。

14.2 边界#

  • 自动提取质量依赖 LLM;
  • ADD-only 会持续增长 Memory 数量;
  • Keyword 当前主要重排 Semantic Candidates,Candidate Recall 仍受 Vector 限制;
  • 多 Store 顺序写入存在部分成功;
  • Hash 只做 Exact Dedup;
  • Entity Link 不是完整 Temporal Graph;
  • Expiration Hide 不等于可验证删除;
  • 论文与产品 Benchmark 必须在同等约束下解释。

14.3 最准确的架构定义#

Mem0 不是:

LLM + Vector DB

而是:

Scoped Semantic Extraction Pipeline
+ ADD-only Historical Accumulation
+ Batch Embedding / Persistence
+ Hash + Lexical + Entity Projections
+ Multi-signal Ranking
+ Mutation History
+ Expiration and Explicit Lifecycle APIs

它最值得学习的结论是:

Memory 的工业化关键不在某一种存储,而在把 Extraction、Scope、Projection、检索信号、错误语义和维护任务做成可观测的数据管线。


参考资料与源码#

[M1] Mem0 OSS 固定版本#

[M2] V3 Migration#

[M3] Memory Evaluation#

[M4] Extraction Prompts#

  • prompts.py
  • 核对内容:Legacy Update Prompt、ADDITIVE_EXTRACTION_PROMPTattributed_to、Existing Link 与 Prompt Builder。

[M5] Scope 与 Public Add Contract#

[M6] V3 Write Pipeline#

  • _add_to_vector_store
  • 核对内容:Raw Path、Context Gathering、Existing Retrieval、ID Mapping、Error Semantics、Batch Embed、Hash、Vector / History / Entity Persist。

[M7] Hybrid Search 与 Entity Boost#

[M8] Explicit Lifecycle APIs#

[M9] Mem0 Paper#

[M10] OWASP Agent Memory Security#


上一篇:Hermes Memory 源码深潜 · 下一篇:Letta / MemGPT Memory 深潜

Mem0 Memory Pipeline 源码深潜:ADD-only 提取、混合检索与多存储一致性
https://jupiter-ws.cn/posts/ai-coding/agent-memory-mem0-deep-dive/
作者
Jupiter
发布于
2026-07-15
许可协议
CC BY-NC-SA 4.0