智能记忆处理
智能记忆处理
相关源文件
本章引用的主要源码文件:
docs/images/openclaw-architecture.pngmem0-ts/src/oss/src/llms/base.tsmem0-ts/src/oss/src/prompts/index.tsmem0-ts/src/oss/src/tests/sqlite-path-resolution.test.tsmem0-ts/src/oss/tests/extract-json.test.tsmem0-ts/src/oss/tests/remove-code-blocks.test.tsmem0/__init__.pymem0/configs/prompts.pymem0/memory/main.pymem0/memory/storage.pymem0/memory/utils.pyopenclaw/.gitignoretests/configs/test_prompts.pytests/memory/test_main.pytests/test_chatty_llm_parsing.pytests/test_main.pytests/test_memory.pytests/test_proxy.py
目的与范围
本文档介绍 Mem0 的智能记忆处理系统,该系统使用大语言模型(LLM)从对话中提取结构化事实、去重信息,并自动维护记忆一致性。这一处理流程代表了核心的"智能"层,使 Mem0 与传统向量数据库区分开来。
关于基本记忆操作,请参阅记忆操作。关于多级记忆架构的信息,请参阅会话作用域与过滤器。关于基于图谱的关系提取,请参阅图谱记忆。
概述
Mem0 支持两种记忆处理模式,由 Memory 类的 add() 方法中的 infer 参数控制:
| 模式 | 参数 | 行为 | 使用场景 |
|---|---|---|---|
| 直接模式 | infer=False | 消息原样存储,不进行处理 | 原始对话日志记录,最小延迟 |
| 智能模式 | infer=True(默认) | 大语言模型提取事实、去重并管理一致性 | 个性化 AI 应用、知识管理 |
在智能模式下,Mem0 执行一个多阶段的大语言模型驱动管线,将对话数据转换为结构化、去重的记忆条目。
来源: mem0/memory/main.py:386-421, mem0/memory/main.py:423-597
架构
高层处理管线
来源: mem0/memory/main.py:386-597, mem0/memory/utils.py:15-29
组件交互(代码实体空间)
来源: mem0/memory/main.py:423-589, mem0/memory/utils.py:15-29, mem0/memory/utils.py:109-142, mem0/configs/prompts.py:63-173
事实提取
用户与智能体记忆提取
Mem0 根据记忆属于用户还是智能体使用不同的提取策略。这由 agent_id 和助手消息的存在与否决定。
来源: mem0/memory/main.py:260-279, mem0/memory/utils.py:15-29
提取过程
_add_to_vector_store() 中的事实提取过程包括:
- 消息解析:
parse_messages()将输入的消息列表转换为供大语言模型使用的字符串格式。mem0/memory/utils.py:61-70 - 提示词选择:
get_fact_retrieval_messages()选择合适的提示词。mem0/memory/utils.py:15-29 - 大语言模型调用:系统调用
llm.generate_response(),并设置response_format={"type": "json_object"}以确保结构化输出。mem0/memory/main.py:434-440 - 响应清理:
remove_code_blocks()和extract_json()处理大语言模型包含 Markdown 或<think>标签的情况(通过正则表达式去除)。mem0/memory/utils.py:109-142 - 规范化:
normalize_facts()确保事实是一个扁平的字符串列表,即使较小的大语言模型返回{"fact": "..."}这样的对象也能处理。mem0/memory/utils.py:84-106
来源: mem0/memory/main.py:423-456, mem0/memory/utils.py:84-106, mem0/memory/utils.py:121-121
记忆去重
相似性搜索阶段
在添加新事实之前,Mem0 会搜索相似的现有记忆,以识别潜在的重复或矛盾。
来源: mem0/memory/main.py:461-494
UUID 映射策略
为防止大语言模型在处理复杂 UUID 时产生幻觉,Mem0 在将 UUID 传递给动作判定提示词之前,会将其映射为简单整数(例如 "0"、"1")。在执行过程中会反转此映射,以确保在 VectorStore 中更新或删除正确的 memory_id。mem0/memory/main.py:490-494, mem0/memory/main.py:541-564
记忆动作
动作判定
大语言模型将提取的事实与检索到的现有记忆进行比较,并根据 MemoryUpdateSchema 分配四种动作之一:
| 动作 | 含义 | 代码执行 |
|---|---|---|
| ADD | 全新的信息。 | _create_memory() |
| UPDATE | 完善或更改现有记忆。 | _update_memory() |
| DELETE | 与现有记忆矛盾(应移除该记忆)。 | _delete_memory() |
| NONE | 信息已存在或无关。 | 仅更新元数据 |
来源: mem0/memory/main.py:524-585, mem0/configs/prompts.py:175-323, mem0-ts/src/oss/src/prompts/index.ts:20-43
动作执行逻辑
_add_to_vector_store() 中的实现处理状态转换:
- ADD:在
VectorStore中创建新条目,并在SQLiteManager中记录事件。mem0/memory/main.py:534-540 - UPDATE:重新生成更新后文本的嵌入向量,并替换向量数据库中的现有向量和载荷。
mem0/memory/main.py:541-555 - DELETE:从存储中移除向量,并在元数据数据库中将历史记录标记为已删除。
mem0/memory/main.py:556-564 - NONE:更新
updated_at时间戳,并确保如果当前调用中提供了agent_id或run_id,则将其与记忆关联。mem0/memory/main.py:565-585
来源: mem0/memory/main.py:524-585, mem0/memory/storage.py:150-192
自定义提示词
用户可以通过在 MemoryConfig 中提供自定义提示词来覆盖智能处理逻辑。
custom_fact_extraction_prompt:覆盖默认的事实提取系统提示词。mem0/configs/base.py:59-66custom_update_memory_prompt:覆盖用于判定 ADD/UPDATE/DELETE/NONE 动作的逻辑。mem0/configs/base.py:59-66
如果直接将 prompt 参数传递给 add() 方法,则该参数在特定调用中优先于配置级别定义的 custom_instructions。tests/memory/test_main.py:93-104
来源: mem0/configs/base.py:59-66, mem0/memory/main.py:405-408, mem0/memory/main.py:425-427
关键函数汇总
| 函数 | 文件 | 作用 |
|---|---|---|
_add_to_vector_store | mem0/memory/main.py | 编排整个智能处理管线。 |
get_fact_retrieval_messages | mem0/memory/utils.py | 生成用于事实提取的提示词。 |
get_update_memory_messages | mem0/configs/prompts.py | 生成用于 ADD/UPDATE/DELETE 判定的提示词。 |
remove_code_blocks | mem0/memory/utils.py | 清理大语言模型输出(去除 Markdown 和思考标签)。 |
normalize_facts | mem0/memory/utils.py | 确保大语言模型输出符合预期的 JSON 模式。 |
来源: mem0/memory/main.py:386-597, mem0/memory/utils.py:15-106