相似度阈值
相似度阈值
相关源文件
以下文件为本维基页面的生成提供了上下文:
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 会对每个实体名称生成嵌入向量,并使用余弦相似度与现有节点进行比较。相似度阈值决定了新实体应该复用现有节点还是创建新节点。这可以防止图谱中充斥着诸如 "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/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 函数实现了最终的排序逻辑。它在将语义分数与其他信号组合之前,先对语义分数应用阈值过滤。
自适应除数
评分系统根据活跃信号自适应调整除数,以将分数保持在 [0, 1] 范围内:
- 仅语义:
max_possible = 1.0 - 语义 + BM25:
max_possible = 2.0 - 语义 + BM25 + 实体:
max_possible = 2.5(实体提升权重ENTITY_BOOST_WEIGHT为0.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 函数的参数(中点和陡度)会根据查询中的词项数量动态调整。
| 查询词项数 | 中点 | 陡度 |
|---|---|---|
| <= 3 | 5.0 | 0.7 |
| 4 - 6 | 7.0 | 0.6 |
| 7 - 9 | 9.0 | 0.5 |
| 10 - 15 | 10.0 | 0.5 |
| > 15 | 12.0 | 0.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
相关页面: