agentic_huge_data_base / wiki
页面 Mem0 · 4.4 图谱检索与召回·DeepWiki 中文全文译文

4.4 · 图谱检索与召回(Graph Search and Retrieval)

长期记忆与上下文管理 · 聚焦本章的模块关系、源码依据与实现要点。

项目Mem0 章节4.4 状态全文译文 模块检索、召回与索引、图谱与关系、界面与交互、入库与解析
源码线索
  • docs/components/vectordbs/dbs/milvus.mdx
  • mem0-ts/src/oss/src/utils/scoring.ts
  • mem0/__init__.py
  • mem0/configs/prompts.py
  • mem0/configs/vector_stores/chroma.py
  • mem0/configs/vector_stores/milvus.py
  • mem0/configs/vector_stores/qdrant.py
  • mem0/memory/main.py
  • mem0/memory/storage.py
  • mem0/memory/utils.py
模块标签
  • 检索、召回与索引
  • 图谱与关系
  • 界面与交互
  • 入库与解析
  • 系统架构

章节正文

图谱检索与召回

图搜索与检索

相关源文件

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

  • docs/components/vectordbs/dbs/milvus.mdx
  • mem0-ts/src/oss/src/utils/scoring.ts
  • mem0/__init__.py
  • mem0/configs/prompts.py
  • mem0/configs/vector_stores/chroma.py
  • mem0/configs/vector_stores/milvus.py
  • mem0/configs/vector_stores/qdrant.py
  • mem0/memory/main.py
  • mem0/memory/storage.py
  • mem0/memory/utils.py
  • mem0/utils/scoring.py
  • mem0/vector_stores/chroma.py
  • mem0/vector_stores/milvus.py
  • mem0/vector_stores/qdrant.py
  • tests/configs/test_prompts.py
  • tests/memory/test_main.py
  • tests/test_chatty_llm_parsing.py
  • tests/test_main.py
  • tests/test_memory.py
  • tests/test_proxy.py
  • tests/utils/test_scoring.py
  • tests/vector_stores/test_chroma.py
  • tests/vector_stores/test_milvus.py
  • tests/vector_stores/test_qdrant.py

本文档介绍了 Mem0 中的图搜索与检索系统,该系统能够查询存储在图数据库中的关系型知识。图搜索通过遍历实体关系,并基于图结构和词汇相关性对结果进行排序,从而补充了基于向量的语义搜索。

总览

Mem0 中的图搜索执行一个多阶段管线:

  1. 实体提取:大语言模型(LLM)从搜索查询中提取实体。
  2. 向量相似度:每个实体被转换为嵌入向量,并使用余弦相似度与图节点进行匹配。
  3. 关系检索:通过 Cypher 查询获取与匹配节点相连的关系。
  4. BM25 重排序:使用 BM25 评分对结果进行相关性重排序。

该搜索系统在 MemoryGraph 类中实现,并集成到主 Memory 类的混合搜索管线中。

图搜索管线

Mem0 · 总览 · 图 1
Mem0 · 总览 · 图 1

来源:mem0/memory/main.py:832-856, mem0/utils/scoring.py:43-48

搜索方法

搜索功能在 Memory.search() 方法中触发。当配置了图存储时,系统会通过结合向量存储和图存储的结果来执行混合检索。

实现流程

  1. Memory.search() 方法使用 _validate_search_params() 校验参数 mem0/memory/main.py:144-170
  2. 使用 extract_entities() 识别查询中的实体 mem0/memory/main.py:35-35
  3. 系统通过向量存储执行语义搜索 mem0/memory/main.py:806-810
  4. 同时,如果存在 self.graph,则查询图存储以获取相关实体和关系 mem0/memory/main.py:832-843
  5. 使用 score_and_rank() 工具对结果进行重排序 mem0/utils/scoring.py:47-48

系统通过拒绝顶层实体参数(如 user_idagent_id)来强制执行多租户应用的严格作用域限制,要求这些参数必须通过 filters 字典传递 mem0/memory/main.py:103-110

来源:mem0/memory/main.py:103-110, mem0/memory/main.py:144-170, mem0/memory/main.py:832-843

从查询中提取实体

系统使用大语言模型(LLM)工具调用来从搜索查询中提取实体及其类型。此过程确保自然语言引用能够正确映射到标识符。

实体提取过程

Mem0 · 从查询中提取实体 · 图 2
Mem0 · 从查询中提取实体 · 图 2

后处理: 实体 ID 会通过 _validate_and_trim_entity_id() 进行校验和修剪,该方法会拒绝空字符串或包含内部空格的标识符 mem0/memory/main.py:113-141

来源:mem0/utils/entity_extraction.py:1-35, mem0/memory/main.py:113-141

混合搜索与 BM25 重排序

Mem0 实现了一种混合搜索方法,该方法结合了语义(向量)相似度和关键词(BM25)相关性。

BM25 重排序

系统使用 lemmatize_for_bm25 来改进匹配准确性,该方法在评分前将单词还原为其基本形式 mem0/utils/lemmatization.py:1-20。然后,score_and_rank 函数将向量相似度得分与 BM25 得分相结合。

BM25 重排序过程

Mem0 · BM25 重排序 · 图 3
Mem0 · BM25 重排序 · 图 3

来源:mem0/utils/lemmatization.py:1-20, mem0/utils/scoring.py:43-48, mem0/memory/main.py:42-48

相似度阈值

相似度阈值决定了哪些实体或记忆被视为匹配项。_validate_search_params 确保阈值在 0 到 1(含)之间,并且 top_k 为非负整数 mem0/memory/main.py:144-170

来源:mem0/memory/main.py:144-170

与向量存储搜索的集成

Memory.search() 方法负责协调向量存储和图存储之间的编排。对于像 Qdrant 或 Milvus 这样的提供商,如果集合模式支持关键词组件(例如,Qdrant 中的 bm25 稀疏向量槽 mem0/vector_stores/qdrant.py:81-86 或 Milvus 中的 sparse 字段 mem0/vector_stores/milvus.py:89-92),则向量存储搜索会包含该关键词组件。

并发搜索执行

Mem0 · 与向量存储搜索的集成 · 图 4
Mem0 · 与向量存储搜索的集成 · 图 4

来源:mem0/memory/main.py:832-843, mem0/vector_stores/qdrant.py:81-86, mem0/vector_stores/milvus.py:89-92

搜索参数

搜索操作使用一组一致的参数:

参数类型描述
querystr自然语言查询字符串。
filtersdict作用域过滤器(user_idagent_idrun_id)。
limitint返回结果的最大数量。
thresholdfloat相似度阈值(0.0 到 1.0)。

来源:mem0/memory/main.py:787-810, mem0/memory/main.py:144-170

工具函数

format_entities

mem0/memory/utils.py 中的 format_entities 函数将提取的关系对象转换为简化的字符串格式:source -- relationship -- destination

来源:mem0/memory/utils.py:73-82

lemmatize_for_bm25

用于预处理查询和记忆文本以进行关键词搜索,确保单词的不同变体能够匹配到同一个基础 Token。

来源:mem0/utils/lemmatization.py:1-20