图谱检索与召回
图搜索与检索
相关源文件
本章引用的主要源码文件:
docs/components/vectordbs/dbs/milvus.mdxmem0-ts/src/oss/src/utils/scoring.tsmem0/__init__.pymem0/configs/prompts.pymem0/configs/vector_stores/chroma.pymem0/configs/vector_stores/milvus.pymem0/configs/vector_stores/qdrant.pymem0/memory/main.pymem0/memory/storage.pymem0/memory/utils.pymem0/utils/scoring.pymem0/vector_stores/chroma.pymem0/vector_stores/milvus.pymem0/vector_stores/qdrant.pytests/configs/test_prompts.pytests/memory/test_main.pytests/test_chatty_llm_parsing.pytests/test_main.pytests/test_memory.pytests/test_proxy.pytests/utils/test_scoring.pytests/vector_stores/test_chroma.pytests/vector_stores/test_milvus.pytests/vector_stores/test_qdrant.py
本文档介绍了 Mem0 中的图搜索与检索系统,该系统能够查询存储在图数据库中的关系型知识。图搜索通过遍历实体关系,并基于图结构和词汇相关性对结果进行排序,从而补充了基于向量的语义搜索。
总览
Mem0 中的图搜索执行一个多阶段管线:
- 实体提取:大语言模型(LLM)从搜索查询中提取实体。
- 向量相似度:每个实体被转换为嵌入向量,并使用余弦相似度与图节点进行匹配。
- 关系检索:通过 Cypher 查询获取与匹配节点相连的关系。
- BM25 重排序:使用 BM25 评分对结果进行相关性重排序。
该搜索系统在 MemoryGraph 类中实现,并集成到主 Memory 类的混合搜索管线中。
图搜索管线
来源:mem0/memory/main.py:832-856, mem0/utils/scoring.py:43-48
搜索方法
搜索功能在 Memory.search() 方法中触发。当配置了图存储时,系统会通过结合向量存储和图存储的结果来执行混合检索。
实现流程:
Memory.search()方法使用_validate_search_params()校验参数mem0/memory/main.py:144-170。- 使用
extract_entities()识别查询中的实体mem0/memory/main.py:35-35。 - 系统通过向量存储执行语义搜索
mem0/memory/main.py:806-810。 - 同时,如果存在
self.graph,则查询图存储以获取相关实体和关系mem0/memory/main.py:832-843。 - 使用
score_and_rank()工具对结果进行重排序mem0/utils/scoring.py:47-48。
系统通过拒绝顶层实体参数(如 user_id 或 agent_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)工具调用来从搜索查询中提取实体及其类型。此过程确保自然语言引用能够正确映射到标识符。
实体提取过程
后处理: 实体 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/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/memory/main.py:832-843, mem0/vector_stores/qdrant.py:81-86, mem0/vector_stores/milvus.py:89-92
搜索参数
搜索操作使用一组一致的参数:
| 参数 | 类型 | 描述 |
|---|---|---|
query | str | 自然语言查询字符串。 |
filters | dict | 作用域过滤器(user_id、agent_id、run_id)。 |
limit | int | 返回结果的最大数量。 |
threshold | float | 相似度阈值(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