首页/AI/RAG 与向量库速查/相似度分布诊断
Embedding 与检索50 条

相似度分布诊断

抽样统计查询与召回结果的相似度分布,可以快速发现索引异常:分布整体偏低说明召回弱或数据未更新,分布过窄通常意味着结果区分度不足,分数全高则可能是重复内容过多。

RAG 与向量库速查AI更新于 2026-10-13

相似度分布诊断是什么

相似度分布诊断指抽样一批查询,统计它们与召回结果的相似度分布(分位数、均值、标准差),用分布形态而不是单条分数判断索引是否健康。单条查询的高分只能说明这一条命中,分布才能暴露系统性问题:整体偏低往往意味着模型与索引不配套或数据未更新,分布过窄说明结果区分度不足,分数普遍偏高则常见于库内重复内容过多。它属于「无报错但变差」的静默退化监测手段。

基本信息

依赖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 版本不一致、归一化设置不同、数据未更新核对模型版本与归一化方式,确认索引已刷新
分布过窄向量区分度低、库内内容高度同质检查重复率,重跑嵌入评测
分数普遍很高库内重复内容多、查询与文档同模板生成先去重再重新统计
呈双峰库内混入两类来源或新旧版本按来源分组分别统计再判断
把分布统计做成离线报表:每次索引重建、模型升级后自动对比前后分布,能提前发现尚未影响业务的静默退化。
分布只说明检索的区分能力,不说明有没有答对;缺少标注时需要搭配用大模型判定召回的近似评估一起看。

易错点

  • 拿单一查询的高分结果下结论:噪声样本会误导判断,必须先固定查询集再做统计
  • 前后两次对比换了查询集:样本不同,分布没有可比性,结论不成立
  • 把分数区间当绝对质量:不同模型、不同度量(余弦、内积、L2)分数尺度不同,跨版本横比必须先核对度量与归一化
  • 只看均值不看分位数:均值被少量高分掩盖,p10 下滑这类真实退化会被漏掉

数据来源与参考

  • Qdrant 官方文档(search 结果分数)
  • Anthropic, Contextual Retrieval(检索质量分析)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌