使用LangChain的Faiss与BGE模型时相似性分数偏低问题求助
问题:BGE-Large-ZH-V1.5嵌入模型与Faiss检索时,完全匹配文本的相似度分数未达1.0
我在使用LangChain的Faiss向量库搭配BAAI/bge-large-zh-v1.5嵌入模型时遇到异常:查询语句“无纸化发送失败?”已明确存在于向量库中,但调用similarity_search_with_score()方法返回的相似度分数仅为0.9069208,而非预期的1.0。
代码片段
model_name = "BAAI/bge-large-zh-v1.5" model_kwargs = {'device': 'cuda'} encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity model = HuggingFaceBgeEmbeddings( model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs, cache_folder="../model/", ) db = FAISS.load_local('../dataset/bge_faiss_db', embeddings=model, index_name='index') query = '无纸化发送失败?' res = db.similarity_search_with_score(query, k=3)
运行结果
[(Document(page_content='无纸化发送失败?'), 0.9069208), (Document(page_content='凭证打包失败?'), 0.57983273), (Document(page_content='edi发送不了?'), 0.5719995)]
潜在原因分析
- 浮点运算的微小误差:即使是完全相同的文本,模型在入库和查询时的前向传播过程中,GPU浮点计算(如FP16/FP32精度差异)可能产生极细微的向量偏差,经过归一化和余弦相似度计算后,分数会接近1但不等于1。Transformer架构的模型普遍存在这类数值级误差。
- 文本隐形差异:检查入库文本与查询文本是否存在肉眼不可见的差异:
- 全角/半角符号:比如入库用全角问号,查询用半角问号;
- 不可见字符:文本中包含空格、换行符或控制字符;
- 预处理不一致:入库时做了额外处理(如去标点、分词),但查询时未执行相同操作。
- Faiss索引的精度损失:如果创建Faiss索引时使用了量化策略(如IVF_PQ),向量存储会被有损压缩,导致加载后的向量与原始嵌入存在偏差,影响相似度计算。可检查索引创建代码是否包含量化参数。
- 编码参数不一致:确认入库和查询时的
HuggingFaceBgeEmbeddings参数完全一致,尤其是normalize_embeddings是否都设为True,其他如batch_size等参数差异也可能影响嵌入结果。
内容的提问来源于stack exchange,提问作者Jaycee
相关产品推荐
相关产品推荐

