出现分数很高的问题主要在于 未对嵌入向量进行适当归一化,导致使用内积度量时分数远超出 0 到 1 的范围。如果分数要与原始工程代码一致(即在 0 到 1 之间),需要对向量在添加和查询时都进行 L2 归一化。
在 FAISS 中,使用 IndexFlatIP 时,将向量进行 L2 归一化,内积度量结果会等同于余弦相似度,范围为 [0, 1]。下面是对代码的优化,使相似度分数在 0 到 1 之间。
优化后的代码
import faiss
import numpy as np
from transformers import AutoTokenizer, AutoModel
import torch
class VectorStore:
def __init__(self, embedding_model: str, embedding_dim: int = 768, distance_metric: str = "ip"):
"""
初始化向量存储,选择距离度量方式。
:param embedding_model: 嵌入模型名称,例如 "m3e-base" 或 "bge-large"
:param embedding_dim: 嵌入维度
:param distance_metric: 距离度量方式,支持 "l2" (欧氏距离) 或 "ip" (内积)
"""
self.tokenizer = AutoTokenizer.from_pretrained(embedding_model)
self.model = AutoModel.from_pretrained(embedding_model)
self.embedding_dim = embedding_dim
# 初始化FAISS索引
if distance_metric == "ip":
self.index = faiss.IndexFlatIP(embedding_dim) # 内积度量
else:
self.index = faiss.IndexFlatL2(embedding_dim) # 默认为欧氏距离
self.distance_metric = distance_metric
def embed_text

最低0.47元/天 解锁文章
4461

被折叠的 条评论
为什么被折叠?



