agentic_huge_data_base / wiki
页面 Mem0 · 4.5 相似度阈值·DeepWiki 中文全文译文

4.5 · 相似度阈值

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

项目Mem0 章节4.5 状态全文译文 模块检索、召回与索引、界面与交互、图谱与关系、系统架构
源码线索
  • 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 会对每个实体名称生成嵌入向量,并使用余弦相似度与现有节点进行比较。相似度阈值决定了新实体应该复用现有节点还是创建新节点。这可以防止图谱中充斥着诸如 "john_smith"、"john_s" 和 "j_smith" 这类指向同一人物的近似重复节点。

默认阈值0.7(可通过 graph_store.threshold 配置)

来源:mem0/memory/main.py:155-161, mem0/utils/scoring.py:57-65

相似度阈值的工作原理

该阈值作用于实体嵌入向量之间的归一化余弦相似度分数。系统计算的分数范围为 [0, 1](或 [-1, 1],取决于后端),数值越高表示相似度越大。

Mem0 · 相似度阈值的工作原理 · 图 1
Mem0 · 相似度阈值的工作原理 · 图 1

校验逻辑

mem0/memory/main.py 中的 _validate_search_params 函数确保用户提供的阈值是介于 0 和 1 之间的有效数值。

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

阈值取值与权衡

不同的阈值取值会在记忆系统中产生不同的行为:

阈值行为使用场景
0.9-1.0严格匹配——仅合并近乎相同的实体需要高精度,实体有严格定义
0.7-0.9平衡匹配——合并相似实体默认值——通用图谱构建
0.5-0.7宽松匹配——合并大致相似的实体激进去重,实体名称非正式
< 0.5非常宽松——存在错误合并风险不推荐

来源:mem0/memory/main.py:158-161, mem0/utils/scoring.py:60-70

混合检索评分

除了图实体匹配之外,Mem0 还在向量存储层利用阈值和加性评分进行混合检索。这涉及结合语义分数、BM25 分数和实体提升分数。

加性评分逻辑

mem0/utils/scoring.py 中的 score_and_rank 函数实现了最终的排序逻辑。它在将语义分数与其他信号组合之前,先对语义分数应用阈值过滤。

Mem0 · 加性评分逻辑 · 图 2
Mem0 · 加性评分逻辑 · 图 2

自适应除数

评分系统根据活跃信号自适应调整除数,以将分数保持在 [0, 1] 范围内:

  • 仅语义max_possible = 1.0
  • 语义 + BM25max_possible = 2.0
  • 语义 + BM25 + 实体max_possible = 2.5(实体提升权重 ENTITY_BOOST_WEIGHT0.5

来源:mem0/utils/scoring.py:44-48, mem0/utils/scoring.py:57-93, mem0/utils/scoring.py:101-110

BM25 归一化

BM25 分数是原始且无界的。Mem0 通过 normalize_bm25 中的逻辑斯谛 Sigmoid 函数将其归一化到 [0, 1] 范围。该 Sigmoid 函数的参数(中点和陡度)会根据查询中的词项数量动态调整。

查询词项数中点陡度
<= 35.00.7
4 - 67.00.6
7 - 99.00.5
10 - 1510.00.5
> 1512.00.5

来源:mem0/utils/scoring.py:16-40, mem0/utils/scoring.py:43-54

向量存储中的实现

不同的向量存储使用各自的本地查询语言来实现过滤和阈值处理。

Qdrant 实现

mem0/vector_stores/qdrant.py 中的 Qdrant.search 使用 query_points,并根据提供的元数据过滤器构建 Filter 对象。

来源:mem0/vector_stores/qdrant.py:214-235, mem0/vector_stores/qdrant.py:273-300

Milvus 实现

mem0/vector_stores/milvus.py 中的 MilvusDB.search 将过滤器转换为字符串表达式(例如 (metadata["user_id"] == "alice")),并将其传递给 MilvusClient.search 方法。

来源:mem0/vector_stores/milvus.py:139-155, mem0/vector_stores/milvus.py:186-218

ChromaDB 实现

mem0/vector_stores/chroma.py 中的 ChromaDB.search 使用 where 子句进行过滤,并通过 _parse_output 解析输出,以确保一致的 OutputData 格式。

来源:mem0/vector_stores/chroma.py:76-107, mem0/vector_stores/chroma.py:143-161

相关页面