教你使用bge-m3生成稀疏向量和稠密向量
前言:
现在RAG这么火,对应的语义检索就是必不可少的工具,那么怎么来进行语义检索了?这里就有两个概念需要了解一下,一个是稀疏向量,类似于ES里面的根据字词来进行搜索的,另外一个就是稠密向量,根据语义来生成向量
代码:
from FlagEmbedding import BGEM3FlagModel
import json
model = BGEM3FlagModel('/data/dh/model/bge-m3',device=3)
string = "What is BGE M3?"
sentences_1 = [string]
output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=False)
dense_vecs = output_1['dense_vecs'].tolist()
lexical_weights = output_1['lexical_weights'][0]
regular_dict = {}
for key, value in lexical_weights.items():regular_dict[key] = float(value)
response_dict = {}
response_dict['dense_vecs'] = dense_vecs
response_dict['lexical_weights'] = regular_dict
print(json.dumps(response_dict))
注意事项:
1、稀疏向量是 <Long,Float>的键值对
2、稠密向量是<Float>的数组
3、bge-m3生成的稠密向量是np格式的,需要转换成普通的数组才能进行JSON化
4、bge-m3生成的稀疏向量也是不能直接进行JSON化的,需要做进一步的处理