Hugging Face Transformers FAISS索引scores含义、计算及阈值应用问询
关于Hugging Face FAISS索引返回分数的说明
1. FAISS分数的含义与计算逻辑
你看到的FAISS分数其实是L2欧氏距离,这是Hugging Face add_faiss_index方法默认使用的度量标准。
L2距离的计算公式为:L2(x, y) = sqrt(Σ(x_i - y_i)²)
其中x是你的查询向量,y是数据集中的样本嵌入向量。
从你的结果能看出规律:余弦相似度越高(向量越相似),对应的L2距离越小——比如余弦相似度最高的0.9983,对应FAISS分数75.67(最小的距离值),完全符合这个逻辑。
如果想让FAISS直接返回和余弦相似度一致的分数,可以在创建索引时指定内积作为度量(前提是你的嵌入向量已经做了归一化,此时内积等价于余弦相似度):
import faiss train_ds['train'].add_faiss_index("embedding", metric=faiss.METRIC_INNER_PRODUCT)
此时返回的scores就是内积值,和你计算的余弦相似度趋势完全一致(值越高代表向量越相似)。
2. 如何通过阈值筛选搜索结果
get_nearest_examples本身没有直接的阈值参数,但可以手动对返回结果进行过滤,步骤如下:
- 先获取足够多的候选结果(
k值设得比实际需要大) - 根据使用的度量方式,设定阈值并筛选符合条件的条目
示例1:默认L2距离下筛选(保留距离小、相似度高的结果)
scores, samples = train_ds.get_nearest_examples("embedding", query_embedding, k=100) # 先取足量候选 filtered_scores = [] filtered_samples = {key: [] for key in samples.keys()} for idx, score in enumerate(scores): if score <= 100: # 设定L2距离阈值,值越小越相似 filtered_scores.append(score) for key in samples.keys(): filtered_samples[key].append(samples[key][idx])
示例2:内积/余弦相似度下筛选(保留分数高、相似度高的结果)
scores, samples = train_ds.get_nearest_examples("embedding", query_embedding, k=100) filtered_scores = [] filtered_samples = {key: [] for key in samples.keys()} for idx, score in enumerate(scores): if score >= 0.99: # 设定内积/余弦相似度阈值,值越大越相似 filtered_scores.append(score) for key in samples.keys(): filtered_samples[key].append(samples[key][idx])
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

