记忆类型与存储
记忆类型与存储
相关源文件
本章引用的主要源码文件:
api/apps/restful_apis/memory_api.pyapi/apps/services/memory_api_service.pyapi/db/joint_services/memory_message_service.pyapi/db/joint_services/user_account_service.pyapi/db/services/doc_metadata_service.pyapi/db/services/memory_service.pyapi/utils/memory_utils.pycommon/doc_store/es_conn_base.pycommon/doc_store/infinity_conn_base.pyconf/infinity_mapping.jsonconf/mapping.jsonmemory/services/messages.pymemory/utils/es_conn.pymemory/utils/infinity_conn.pyrag/utils/es_conn.pyrag/utils/infinity_conn.pyrag/utils/opensearch_conn.pytest/testcases/test_web_api/test_memory_app/conftest.pytest/testcases/test_web_api/test_memory_app/test_create_memory.pytest/testcases/test_web_api/test_memory_app/test_list_memory.pytest/testcases/test_web_api/test_memory_app/test_rm_memory.pytest/testcases/test_web_api/test_memory_app/test_update_memory.pytest/unit_test/rag/utils/test_opensearch_doc_meta.pyweb/src/pages/dataset/dataset/reparse-dialog.tsxweb/src/pages/dataset/dataset/use-run-document.tsweb/src/pages/dataset/process-log-modal.tsxweb/src/pages/memories/add-or-edit-modal.tsxweb/src/pages/memories/constants/index.tsxweb/src/pages/memories/hooks.tsweb/src/pages/memories/interface.tsweb/src/pages/memory/memory-message/hook.tsweb/src/pages/memory/memory-message/index.tsxweb/src/pages/memory/memory-message/interface.tsweb/src/pages/memory/memory-message/message-table.tsxweb/src/pages/memory/memory-setting/advanced-settings-form.tsxweb/src/pages/memory/memory-setting/hook.tsweb/src/pages/memory/memory-setting/index.tsxweb/src/pages/memory/memory-setting/memory-model-form.tsxweb/src/services/memory-service.ts
本文档记录了 RAGFlow 中的持久化记忆子系统。记忆系统通过将交互数据分类为特定类型、使用大语言模型(LLM)提取结构化信息,并将其存储在按用户隔离的专用文档存储索引中,为智能体提供长期上下文。
记忆类型
RAGFlow 实现了四种不同的记忆类型,用于处理智能体与用户交互的不同方面。"原始"记忆是强制基线,而其他三种类型使用大语言模型(LLM)分析和结构化对话内容,以实现更好的检索效果。
| 记忆类型 | 描述 | 实现细节 |
|---|---|---|
| 原始 | 用户与智能体之间对话的逐字记录。 | 作为基线对话内容存储。如果仅选择原始类型,则跳过提取步骤 api/db/joint_services/memory_message_service.py:62-63。 |
| 语义 | 关于用户和世界的通用知识与事实。 | 提取后用于表示抽象概念和持久化事实 api/db/joint_services/memory_message_service.py:54-58。 |
| 情景 | 带有时间戳的特定事件和经历记录。 | 捕获具有特定时间上下文的独特交互 api/db/joint_services/memory_message_service.py:54-58。 |
| 程序 | 习得的技能、习惯和自动化流程。 | 存储行为模式或特定的指令遵循逻辑 api/db/joint_services/memory_message_service.py:54-58。 |
来源: api/db/joint_services/memory_message_service.py:38-63, common/constants.py:20
数据流与存储架构
RAGFlow 采用多语言持久化策略。配置和记忆定义等元数据通过数据库服务层(MySQL/PostgreSQL)管理,而大量消息内容和向量则由专门的文档存储连接器(Elasticsearch、Infinity 或 OpenSearch)处理。
按用户索引与隔离
消息存储在按用户 ID 分区的索引中,以确保数据隔离。这些索引的命名约定为 memory_{uid} memory/services/messages.py:24。在这些索引内,消息进一步通过 memory_id 限定作用域 memory/services/messages.py:32。
消息存储序列
下图展示了从用户交互到持久化存储的流程,包括非原始记忆类型的大语言模型(LLM)提取步骤。
序列:消息提取与持久化
来源: api/db/joint_services/memory_message_service.py:38-91, memory/services/messages.py:45-51
代码实体映射
下图将概念记忆空间与内部 Python 类和存储连接器关联起来。
记忆实体映射
来源: api/db/joint_services/memory_message_service.py:31, memory/services/messages.py:27-30, memory/utils/es_conn.py:36, rag/utils/infinity_conn.py:30, rag/utils/opensearch_conn.py:65
MessageService 接口
MessageService 是记忆内容操作的核心接口。它抽象了底层存储引擎,为智能体和记忆管理系统提供统一的 API。
关键接口方法
| 方法 | 描述 | 参考 |
|---|---|---|
create_index | 为用户的记忆创建新索引,并指定向量大小。 | memory/services/messages.py:35-37 |
insert_message | 格式化消息并将其持久化到文档存储中。 | memory/services/messages.py:45-51 |
list_message | 检索消息,支持关键词(会话 ID)、智能体过滤和分页。 | memory/services/messages.py:66-86 |
search_message | 执行混合搜索(向量 + 标量过滤),以召回相关记忆。 | memory/services/messages.py:150-170 |
update_message | 更新消息状态或内容。 | memory/services/messages.py:54-58 |
来源: memory/services/messages.py:27-170
存储模式与配置
记忆条目作为文档存储在所选 DocStore 中。每个文档包含原始或提取后的文本、其向量表示以及操作元数据。
公共存储字段
系统通过 map_message_to_es_fields 将内部消息字典映射到存储特定的模式 memory/utils/es_conn.py:53-59。
| 字段名 | 类型 | 描述 |
|---|---|---|
message_id | 字符串 | 消息的唯一标识符 memory/utils/es_conn.py:62。 |
message_type_kwd | 字符串 | 记忆类型(原始、语义、情景、程序)memory/utils/es_conn.py:63。 |
content_ltks | 文本 | 文本内容,已分词用于全文搜索 memory/utils/es_conn.py:74。 |
tokenized_content_ltks | 文本 | 细粒度分词后的内容,用于搜索 memory/utils/es_conn.py:75。 |
q_{n}_vec | 向量 | 大小为 n 的嵌入向量 memory/utils/es_conn.py:76。 |
status_int | 整数 | 活动(1)或非活动(0)状态 memory/utils/es_conn.py:72。 |
forget_at | 字符串 | 指示记忆被"遗忘"的时间戳 memory/utils/es_conn.py:71。 |
来源: memory/utils/es_conn.py:53-78, conf/infinity_mapping.json:1-43
索引与检索策略
- Elasticsearch:使用带有
must_not过滤器的Q("bool")对forget_at字段实现遗忘逻辑memory/utils/es_conn.py:140-142。它支持weighted_sum融合用于混合搜索memory/utils/es_conn.py:162-167。 - Infinity:使用表前缀
memory_,并支持元数据字段上的二级索引memory/services/messages.py:24。它处理粗粒度和细粒度分析器(例如rag-coarse、rag-fine)的特定字段转换rag/utils/infinity_conn.py:62-88。 - OpenSearch:使用
OSConnection单例实现逻辑,将字段映射到os_mapping.json配置rag/utils/opensearch_conn.py:65-101。
来源: memory/utils/es_conn.py:127-168, rag/utils/infinity_conn.py:30-88, rag/utils/opensearch_conn.py:65-101
元数据管理
消息内容存储在文档存储中,而记忆定义和设置则通过 MemoryService 和 DocMetadataService 存储在 MySQL 中。
DocMetadataService
该服务管理 ES/Infinity 中的文档级元数据,在移除 MySQL meta_fields 列后作为唯一的事实来源 api/db/services/doc_metadata_service.py:16-21。
- 索引命名:按租户划分的元数据索引遵循模式
ragflow_doc_meta_{tenant_id}api/db/services/doc_metadata_service.py:40-50。 - 搜索逻辑:实现通用搜索逻辑,支持分页以及在 ES、Infinity 和 OceanBase 格式之间的内部转换
api/db/services/doc_metadata_service.py:103-160。
来源: api/db/services/doc_metadata_service.py:16-160