相似度分布诊断是什么
相似度分布诊断指抽样一批查询,统计它们与召回结果的相似度分布(分位数、均值、标准差),用分布形态而不是单条分数判断索引是否健康。单条查询的高分只能说明这一条命中,分布才能暴露系统性问题:整体偏低往往意味着模型与索引不配套或数据未更新,分布过窄说明结果区分度不足,分数普遍偏高则常见于库内重复内容过多。它属于「无报错但变差」的静默退化监测手段。
基本信息
| 依赖 | numpy,做分位数与统计量 |
|---|---|
| 输入 | 固定查询集 × top_k 结果的相似度分数 |
| 输出 | p10 / p50 / p90、均值、标准差 |
| 取样量 | 一两百条查询即可看趋势,越多越稳 |
| 适用库 | Qdrant / Milvus / pgvector / FAISS 等任何返回分数的检索层 |
| 配套 | 与 recall@k、MRR 一起看,单看分布易误判 |
典型使用场景
- 索引重建后对比前后分布,确认新索引没有整体退化
- embedding 模型升级前后对同一查询集做分布比对
- 日常巡检:分布连续下滑是数据陈旧或索引异常的早期信号
- 排查答案变差但无报错的故障:先看分数分布,再看召回质量
- 定阈值:用分布确定相似度截断线,而不是拍脑袋写常数
分布采样
分布采样
import numpy as np
scores = [h.score for q in sample_queries for h in search(q, top_k=20)]
arr = np.array(scores)
print("p10/p50/p90 =", np.percentile(arr, [10, 50, 90]).round(3)) # 分位点看整体水平
print("均值/标准差 =", arr.mean().round(3), arr.std().round(3)) # 标准差小说明区分度低
# 低于预期时按顺序排查:模型是否换过、索引是否重建、归一化是否一致
# 建议把统计结果按周落库,形成可比的时间序列分布形态对照
| 形态 | 常见原因 | 下一步动作 |
|---|---|---|
| 整体偏低 | embedding 版本不一致、归一化设置不同、数据未更新 | 核对模型版本与归一化方式,确认索引已刷新 |
| 分布过窄 | 向量区分度低、库内内容高度同质 | 检查重复率,重跑嵌入评测 |
| 分数普遍很高 | 库内重复内容多、查询与文档同模板生成 | 先去重再重新统计 |
| 呈双峰 | 库内混入两类来源或新旧版本 | 按来源分组分别统计再判断 |
把分布统计做成离线报表:每次索引重建、模型升级后自动对比前后分布,能提前发现尚未影响业务的静默退化。
分布只说明检索的区分能力,不说明有没有答对;缺少标注时需要搭配用大模型判定召回的近似评估一起看。