多语言多粒度模型
这个模型同时提供稠密、稀疏(带学习权重)与多向量(按词片段表示)三种输出,覆盖多语言与较长输入,适合把稠密与稀疏两路检索统一到同一个模型上,省掉单独维护关键词侧的模型与词典。代价是输出更多、计算更重,需要按实际收益决定使用哪几种表示。
基本信息
| 模型 | BAAI/bge-m3 |
|---|---|
| 稠密维度 | 1024 |
| 长度上限 | 8192 token(以模型卡为准) |
| 输出形式 | dense、sparse、colbert 三种 |
三种表示
三种表示
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
out = model.encode(["什么是向量检索"], return_dense=True,
return_sparse=True, return_colbert_vecs=False)
print(len(out["dense_vecs"][0]))
print(list(out["lexical_weights"][0].items())[:2])使用要点
- 按需开启输出:只做稠密检索时不必计算稀疏与多向量表示
- 稀疏权重可写入支持稀疏向量的库,与稠密向量组合做混合检索
- 融合方式按官方示例实现,不要自行简单加权相加
- 长度上限放宽会显著增加显存占用与耗时,按实际文本长度设置
- 入库与查询使用同一种输出组合,混用会让检索口径不一致
三种表示对照
| 表示 | 特点 | 适用 |
|---|---|---|
| 稠密向量 | 语义相似,通用 | 常规语义检索 |
| 稀疏权重 | 词级权重,可解释 | 专名与精确匹配 |
| 多向量 | 细粒度匹配,精度高 | 候选精排或高精度场景 |
常见问题
- 显存不足:多向量表示占用明显更高,先确认设备容量
- 融合效果不及预期:融合权重与归一化方式未按官方示例实现
- 入库与查询表示不一致:只用稠密入库却用融合查询
- 长度设置过大:计算量上升但多数语料用不到那么长
稀疏权重可直接写入支持稀疏向量的库,与稠密向量组合做混合检索,省去单独维护关键词索引与分词词典的工作。
落地建议
- 先用稠密一路跑通基线,确认语义召回水平后再引入稀疏表示
- 稀疏权重按库支持的格式写入,写入前检查词权重是否被截断
- 多向量表示只用在精排环节,避免在线检索阶段的计算量过大
- 同一索引的稠密维度与度量方式要固定,切换表示组合需要重建