稀疏嵌入+密集嵌入→混合检索
稀疏嵌入 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()