agentic_huge_data_base / wiki
页面 RAGFlow · 10.1 记忆类型与存储·DeepWiki 中文全文译文

10.1 · 记忆类型与存储(Memory Types and Storage)

复杂文档理解与引用检索 · 聚焦本章的模块关系、源码依据与实现要点。

项目RAGFlow 章节10.1 状态全文译文 模块文档对象与元数据、检索、召回与索引、配置治理、测试、发布与运维
源码线索
  • api/apps/restful_apis/memory_api.py
  • api/apps/services/memory_api_service.py
  • api/db/joint_services/memory_message_service.py
  • api/db/joint_services/user_account_service.py
  • api/db/services/doc_metadata_service.py
  • api/db/services/memory_service.py
  • api/utils/memory_utils.py
  • common/doc_store/es_conn_base.py
  • common/doc_store/infinity_conn_base.py
  • conf/infinity_mapping.json
模块标签
  • 文档对象与元数据
  • 检索、召回与索引
  • 配置治理
  • 测试、发布与运维
  • 界面与交互

章节正文

记忆类型与存储

记忆类型与存储

相关源文件

本章引用的主要源码文件:

  • api/apps/restful_apis/memory_api.py
  • api/apps/services/memory_api_service.py
  • api/db/joint_services/memory_message_service.py
  • api/db/joint_services/user_account_service.py
  • api/db/services/doc_metadata_service.py
  • api/db/services/memory_service.py
  • api/utils/memory_utils.py
  • common/doc_store/es_conn_base.py
  • common/doc_store/infinity_conn_base.py
  • conf/infinity_mapping.json
  • conf/mapping.json
  • memory/services/messages.py
  • memory/utils/es_conn.py
  • memory/utils/infinity_conn.py
  • rag/utils/es_conn.py
  • rag/utils/infinity_conn.py
  • rag/utils/opensearch_conn.py
  • test/testcases/test_web_api/test_memory_app/conftest.py
  • test/testcases/test_web_api/test_memory_app/test_create_memory.py
  • test/testcases/test_web_api/test_memory_app/test_list_memory.py
  • test/testcases/test_web_api/test_memory_app/test_rm_memory.py
  • test/testcases/test_web_api/test_memory_app/test_update_memory.py
  • test/unit_test/rag/utils/test_opensearch_doc_meta.py
  • web/src/pages/dataset/dataset/reparse-dialog.tsx
  • web/src/pages/dataset/dataset/use-run-document.ts
  • web/src/pages/dataset/process-log-modal.tsx
  • web/src/pages/memories/add-or-edit-modal.tsx
  • web/src/pages/memories/constants/index.tsx
  • web/src/pages/memories/hooks.ts
  • web/src/pages/memories/interface.ts
  • web/src/pages/memory/memory-message/hook.ts
  • web/src/pages/memory/memory-message/index.tsx
  • web/src/pages/memory/memory-message/interface.ts
  • web/src/pages/memory/memory-message/message-table.tsx
  • web/src/pages/memory/memory-setting/advanced-settings-form.tsx
  • web/src/pages/memory/memory-setting/hook.ts
  • web/src/pages/memory/memory-setting/index.tsx
  • web/src/pages/memory/memory-setting/memory-model-form.tsx
  • web/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)提取步骤。

序列:消息提取与持久化

RAGFlow · 消息存储序列 · 图 1
RAGFlow · 消息存储序列 · 图 1

来源: api/db/joint_services/memory_message_service.py:38-91, memory/services/messages.py:45-51

代码实体映射

下图将概念记忆空间与内部 Python 类和存储连接器关联起来。

记忆实体映射

RAGFlow · 代码实体映射 · 图 2
RAGFlow · 代码实体映射 · 图 2

来源: 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-coarserag-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

元数据管理

消息内容存储在文档存储中,而记忆定义和设置则通过 MemoryServiceDocMetadataService 存储在 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