FAISS构建知识库3

出现分数很高的问题主要在于 未对嵌入向量进行适当归一化,导致使用内积度量时分数远超出 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值