向量嵌入技术(中)

发布于:2025-06-12 ⋅ 阅读:(50) ⋅ 点赞:(0)

稀疏嵌入+密集嵌入→混合检索

稀疏嵌入 vs 密集嵌入

稀疏嵌入,每个维度语义相对独立

密集嵌入,每个维度语义相关性更强

 

 

密集嵌入 → Float Vector (最常见实现)

稀疏嵌入 → Binary Vector (简化形式) 或 Sparse Float Vector (带权重形式)

BGE – M3

https://huggingface.co/BAAI/bge-m3

BGE-M3 的英文全称是BAAI General Embedding - Multi - Functionality, Multi - Linguality, Multi - Granularity ,其中 BGE 为 BAAI General Embedding(智源通用嵌入模型 ),M3 代表 Multi - Functionality(多功能性 )、Multi - Linguality(多语言性 )、Multi - Granularity(多粒度性 ) ,该模型由北京智源人工智能研究院开发,是具备多语言、多功能、多粒度特征的语义向量模型 。

为什么叫作M3?
• 多功能性(Multi-Functionality):BGE-M3模型集成了密集检索、稀疏检索和
多向量检索3种功能,能够灵活应对不同的检索需求。
• 多语言性(Multi-Linguality):BGE-M3模型支持超过100种语言,具备强大
的多语言和跨语言检索能力。
• 多粒度性(Multi-Granularity):BGE-M3模型能够处理从短句到长达8192个
token的长文档,满足不同长度文本的处理需求。

官方文档Usage教程

Install:

git clone https://github.com/FlagOpen/FlagEmbedding.git
cd FlagEmbedding
pip install -e .

or:

pip install -U FlagEmbedding

测试代码

from FlagEmbedding import BGEM3FlagModel

def main():
    model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=False)
    passage = ["猢狲施展烈焰拳,击退妖怪;随后开启金刚体,抵挡神兵攻击。"]

    # 编码文本,获取稀疏嵌入和密集嵌入
    passage_embeddings = model.encode(
        passage,
        return_sparse=True,     # 返回稀疏嵌入
        return_dense=True,      # 返回密集嵌入
        return_colbert_vecs=True  # 返回多向量嵌入
    )
    # 分别提取稀疏嵌入、密集嵌入和多向量嵌入
    dense_vecs = passage_embeddings["dense_vecs"]
    sparse_vecs = passage_embeddings["lexical_weights"]
    colbert_vecs = passage_embeddings["colbert_vecs"]
    # 展示稀疏嵌入和密集嵌入的示例
    print("密集嵌入维度:", dense_vecs[0].shape)
    print("密集嵌入前10维:", dense_vecs[0][:10])  # 仅显示前10维
    
    print("稀疏嵌入总长度:", len(sparse_vecs[0]))
    print("稀疏嵌入前10个非零值:", list(sparse_vecs[0].items())[:10])  # 仅显示前10个非零值
    
    print("多向量嵌入维度:", colbert_vecs[0].shape) 
    print("多向量嵌入前2个:", colbert_vecs[0][:2])  # 仅显示前2个多向量嵌入

if __name__ == '__main__':
    main()