milvus向量数据库
milvus支持混合搜索,多个向量同时检索,然后进行重排序最终返回结果。多向量包括(多个密集向量或稀疏向量)
Embedding嵌入
它是一种机器学习概念,用于将数据映射到高维空间,其中具有相似语义的数据被放置在一起。通常是来自 BERT 或其他 Transformer 家族的深度神经网络,嵌入模型可以有效地用一系列称为向量的数字表示文本、图像和其他数据类型的语义。这些模型的一个关键特征是高维空间中向量之间的数学距离可以指示原始文本或图像的语义相似性。
嵌入有两个主要类别,每个类别产生不同类型的向量:
- 密集嵌入(Dense embedding) :大多数嵌入模型将信息表示为数百到数千维的浮点向量。输出被称为“密集”向量,因为大多数维度具有非零值。例如,流行的开源嵌入模型 BAAI/bge-base-en-v1.5 输出 768 个浮点数的向量(768 维浮点向量)。
- 稀疏嵌入(Sparse embedding) :相反��稀疏嵌入的输出向量大多数维度为零,即“稀疏”向量。这些向量通常具有更高的维度(数万甚至更多),这取决于标记词汇的大小。稀疏向量可以通过深度神经网络或对文本语料库进行的统计分析生成。由于它们的可解释性和观察到的更好的跨领域泛化能力,开发人员越来越多地采用稀疏嵌入作为密集嵌入的补充。
Milvus支持的稀疏嵌入函数
嵌入函数 | 类型 | API 或开源 |
---|---|---|
bm25 | 稀疏 | 开源 |
Splade | 稀疏 | 开源 |
bge-m3 | 混合 | 开源 |
BM25应用
BM25是信息检索中使用的排名函数,用于估计文档与给定搜索查询的相关性。它通过包含文档长度归一化和词项频率饱和度来增强基本的词项频率方法。BM25可以通过将文档表示为词项重要性分数的向量来生成稀疏嵌入,从而在稀疏向量空间中实现高效的检索和排名。他是TF-IDF(词频-逆文档率)的升级版。
重要的几个概念
- 分词器:用来标记文本进行分解,根据不同的语言进行分词
- 语料库:收集所有的文档数据,评估文档内容
- 评估词项得分:评估词项在文档中的频率和分布,计算每个标记的相关性分数,较稀有的标记获得更高的得分
from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
from pymilvus.model.sparse import BM25EmbeddingFunction
# 有一些内置的分析器适用于几种语言,现在我们使用 'zh' 代表中文。
analyzer = build_default_analyzer(language="zh")
corpus = [
"此前,在男单1/4决赛中,樊振东在开局0-2大比分落后的情况下实现大逆转,最终以4-3击败日本选手张本智和,挺进四强",
"张本智和也称赞樊振东:他的这个心劲儿比我们都厉害,希望他打得更好。"
]
# 分析器可以将文本标记化为标记
tokens = analyzer(corpus[0])
print("tokens:", tokens)
输出分词项
['此前', '男单', '1', '4', '决赛', '中', '樊振东', '开局', '0', '2', '大比分', '落后', '情况', '下', '大逆转', '最终', '4', '3', '击败', '日本', '选手', '张本', '智', '挺进', '四强']
收集语料库的统计信息,使用__fit()__方法:
# 使用分析器实例化 BM25EmbeddingFunction bm25_ef = BM25EmbeddingFunction(analyzer) # 在语料库上拟合模型,获取语料库的统计信息 bm25_ef.fit(corpus)
然后构建查询嵌入,使用__encode_queries()__方法:
queries = ["人工智能是在哪一年成立的", "艾伦·图灵出生在哪里?"] query_embeddings = bm25_ef.encode_queries(queries) # 打印嵌入 print("Embeddings:", query_embeddings)
到这里BM25的简单使用就结束了,细细想来,这怎么应用到真实场景中。
BM25总结
BM25语料库,直接影响文档的相关打分,所有语料库选取比较难,适合业务的场景数据。(很难做到这个)或者选取一个通用的语料库。基于这个问题,本人对BM25不抱希望,所以研究SPLADE模型嵌入。
标签:嵌入,BM25,语料库,稀疏,文档,Milvus,向量 From: https://blog.csdn.net/liuyanqun_q/article/details/141162943