高级功能:自训练稀疏向量 Encoder

最近更新时间:2024-09-29 10:49:11

我的收藏
考虑到内置的 BM25 Model 是基于通用语料库训练得到,在特定领域下通常不能表现出最佳的效果。因此,在一些特定场景下,用户可以选择上传自己的数据,来调整稀疏向量生成模型的超参数,以确保模型能够准确地反映特定领域的文本特性和用户查询的意图。

步骤1:准备特定领域语料

通常需要提前准备好一定数量 Document 来入库,这些 Document 需要和特定的业务领域直接相关。语料直接决定了 BM25模型的参数。
语料来源应尽可能反映对应场景的特性及对应真实场景的词频信息。
调节合理的语料切片长度和切片数量,避免出现语料当中只有少量长文本的情况。

步骤2:训练模型,获取参数

训练模型是一个“统计”参数的过程。fit_corpus:根据用户传入的文本集调整计算稀疏向量时用到的词频、文档数等参数,使得结果更贴近用户数据集。如下以向量数据库的内容为例。
from tcvdb_text.encoder import BM25Encoder

bm25 = BM25Encoder.default('zh')

bm25.fit_corpus([ '腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、索引、检索、管理由深度神经网络或其他机器学习模型生成的大量多维嵌入向量。', '作为专门为处理输入向量查询而设计的数据库,它支持多种索引类型和相似度计算方法,单索引支持10亿级向量规模,高达百万级 QPS 及毫秒级查询延迟。', '不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、NLP 服务、计算机视觉、智能客服等 AI 领域。', '腾讯云向量数据库(Tencent Cloud VectorDB)作为一种专门存储和检索向量数据的服务提供给用户, 在高性能、高可用、大规模、低成本、简单易用、稳定可靠等方面体现出显著优势。 ', '腾讯云向量数据库可以和大语言模型 LLM 配合使用。企业的私域数据在经过文本分割、向量化后,可以存储在腾讯云向量数据库中,构建起企业专属的外部知识库,从而在后续的检索任务中,为大模型提供提示信息,辅助大模型生成更加准确的答案。', '腾讯云数据库托管机房分布在全球多个位置,这些位置节点称为地域(Region),每个地域又由多个可用区(Zone)构成。每个地域(Region)都是一个独立的地理区域。每个地域内都有多个相互隔离的位置,称为可用区(Zone)。每个可用区都是独立的,但同一地域下的可用区通过低时延的内网链路相连。腾讯云支持用户在不同位置分配云资源,建议用户在设计系统时考虑将资源放置在不同可用区以屏蔽单点故障导致的服务不可用状态。' ]) print('download bm25 params')

# 下载Encoder参数,并指定下载路径 bm25.download_params('./params.json')

步骤3:上传参数

在步骤2中,您已经下载了训练后的参数文件。在后续的使用过程中,可以通过 set_params() 接口上传参数文件,从而保证通过 tcvdb-text 工具生成的稀疏向量都有相同的统计参数。
# 上传参数文件
bm25.set_params('./params.json')

步骤4:应用训练的参数生成稀疏向量

# 根据文本内容,生成对应的稀疏向量
texts = ['腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务',
'腾讯云向量数据库可以和大语言模型 LLM 配合使用']
sparse_vectors: List[SparseVector] = bm25.encode_texts(texts)

步骤5:给数据库写入稀疏向量

client.upsert( documents=[ { "id": "0000", ... "sparse_vector": sparse_vectors[0] }, { "id": "0001", ... "sparse_vector": sparse_vectors[1] } ]

步骤6:应用训练的参数将检索的文本信息转为稀疏向量,进行高阶混合检索

调用 bm25.encode_quires() 接口转换检索的文本为稀疏向量,综合稠密向量与稀疏向量权重进行混合检索.
# 执行混合检索,并使用指定权重(Weighted)的Rerank方法
doc_lists = client.hybrid_search(
......
ann=[
AnnSearch(
field_name="vector",
data=[0.3123, 0.43, 0.213],
),
],
match=[
KeywordSearch(
field_name="sparse_vector",
data=bm25.encode_quires('向量数据库'),
),
],
rerank=WeightedRerank(
field_list=['vector', 'sparse_vector'],
weight=[0.9, 0.1],
),
......
)