大语言模型实战

向量数据库通常也称为矢量数据库,是一种专门用于存储和检索向量数据的数据库系统。向量数据通常表示具有大小和方向的量,而像图片、文本、语音、视频这类非结构化数据都可以通过特定方法转换成向量形式,并存储于向量数据库中。相比于传统的数据库系统,向量数据库的主要优势是它能够高效地处理高维度的大数据存储和索引创建。此外,它还能通过计算向量之间的距离或相似性来检索相似内容,从而提高数据处理的效率和准确性。其核心理念在于将原始数据转化为向量形式,并存储在数据库中。当用户需要查询时,它可以将待查询的内容(如文本、图片、语音、视频等)转换为向量,然后向量数据库会搜索与之最相似的向量内容,并将结果返回给用户。目前,向量数据库在人脸识别、推荐系统、图片搜索、视频指纹、语音处理、自然语言处理、文件搜索等多个领域场景中都扮演着重要角色。

在大型语言模型的时代背景下,传统的基于词语层面的检索方法无法深入理解语义层面的含义,所以基于高维特征的向量匹配成为当前的主流检索手段。如何获得更好的文本向量表示,以及如何高效地存储和检索高维向量数据,也就成为研究的焦点。

 

1. 文本的向量表征


文本的向量表征就是将一段文本转换成数值向量的技术,主要包括传统方法、词向量方法、深度学习方法、预训练语言模型方法和大型语言模型方法。传统方法主要包括词袋模型、TF-IDF方法等,其中词袋模型是将文本转换成一个与词表大小一致的向量,向量中的每个元素表示词语出现在文本中的频率;而TF-IDF方法也称作词频-逆文档频率方法,是对词袋方法的改进,不仅考虑词频对于词语出现在文本中的影响,还考虑词语在整个语料库中出现的次数。

词向量方法通常是先通过神经网络模型对整个语料库进行训练,构建一个词向量模型(词向量模型训练方法包括Word2Vec方法、GloVe方法等),再对文本中的每个词语进行词向量表征,用最大池化、平均池化、带权重池化等方法对词向量序列进行文本向量表征获取。

词向量方法虽然对每个词语用大量无监督语料数据进行了高维向量的表征,但将词向量转换为句子向量时仅采用池化的方法,并不能很好地获取文本中上下文的关联信息。深度学习方法通常是将词向量与深度学习网络(包括CNN、RNN等)相结合,结合孪生网络架构进行文本的句子表征训练,如图9-2所示。经过训练的文本表征模型,可以更好地获取文本中每个词语之间上下文的语义信息,使文本向量表征效果更理想。

 

 

2018年以后,以BERT模型为首的预训练语言模型风靡全球。由于模型本身的参数量比CNN、RNN等模型大,并且具有较好的表征效果,因此文本表征模型进入“预训练”架构阶段。“预训练”架构阶段主要采用两阶段模式,第一阶段使用很大的通用语料库训练一个预训练语言模型,第二阶段使用预训练语言模型做相似度计算,即将两个文本输入到预训练模型中,得到信息交互后的向量,计算获取文本表征之间的相似度值,如图9-3所示,从而使相似文本的文本表征向量在高维空间中更相似。基于BERT模型进行文本向量表征的方法主要包括Sentence-BERT方法、BERT-Whitening方法、SimCSE方法、ConSER方法、EASE方法、SNCSE方法、ConSERT方法、DiffCSE方法等。

自ChatGPT出现之后,人工智能进入大型语言模型时代。大型语言模型其实是预训练语言模型参数量达到一定规模后的别称。虽然目前很多自然语言处理任务均被大型语言模型刷榜,但直接采用大型语言模型进行文本表征的效果还不是很理想。这主要是因为大型语言模型都是以文本续写的形式来训练,训练目标是预测下一个词语是否准确,而不是判断整个句子表征的好坏。如果想让大型语言模型具有更好的文本表征能力,还是需要利用对比学习等方式进行针对性的文本表征训练。如图9-4所示,Mistral的70亿参数模型经过针对性训练后,在MTEB英文榜单上是SOTA效果

(截止到2024年1月17日)。

 

 

 

模型越大,部署的成本就越高,如果利用大型语言模型进行向量表征,就意味着在应用端进行模型部署的成本是巨大的。因此,目前在工业应用中仍以BERT模型为主,中文常用的文本表征模型包括BGE模型、M3E模型、IYun-zh模型、Stella模型等。


1. BGE

BGE(Baai General Embedding)是由北京智源人工智能研究院发布的开源的中英文语义向量模型,此模型在多个重要指标上均超越了其他同类模型。BGE的优势在于其高效的预训练和大规模文本微调策略,采用了论文“RetroMAE: Pre-Training Retrieval-Oriented Language Models via Masked Auto-Encoder”中提及的RetroMAE预训练算法来增强模型的语义表征能力。通过引入负采样和难负例挖掘,BGE进一步提升了语义向量的判别力,使模型可以更有效地处理复杂语境和难以理解的文本任务。此外,BGE借鉴了指令微调(Instruction Tuning)的策略,强调在多任务场景下的通用能力,使模型更适应不同领域和任务,提高整体泛化性能。


2. M3E

M3E(Moka Massive Mixed Embedding)是由MokaAI公司开源的一个支持中英双语的文本表征模型。训练过程采用uniem脚本,评估则使用MTEB-zh基准测试。其中,Massive强调了该模型在千万级(2200万以上)的中文句对数据集上进行了训练,以确保其具备强大的性能。Mixed表示该模型支持中英双语的同质文本相似度计算、异质文本检索等功能,未来还将支持代码检索。最后,Embedding表明该模型300是一个文本嵌入模型,能够将自然语言转换成稠密的向量。这些特性使得M3E在处理各种自然语言处理任务时表现出色。


3. IYun-zh

IYun-zh是一款由南京云问科技训练的中文嵌入模型,训练方式采用课程学习的方式,第一阶段主要利用短文本数据进行模型训练,可以在训练过程中尽可能增加训练批次,第二阶段主要利用长文本数据进行模型训练,以提高模型对长文本的表征能力。训练采用对比学习损失,并通过传统检索和语义检索相结合的方式为数据集构造难负例。训练数据来源于开源数据以及通过各领域(涉及医疗、法律、军工、工业等)无监督文本构造的数据,总计1000万。IYun-zh的两阶段训练方式旨在提高模型对中文长文本的语义理解和表征能力。


4. Stella

Stella是一款通用的中文文本编码模型,目前分为base和large两个版本,两者均支持输入长度最大1024。在训练过程中,采用了多种数据源,包括开源数据(如wudao_base_200GB、m3e和simclue),特别强调了长度大于512的文本。此外,在通用语料库上使用大型语言模型构建了一批<问题,段落>类型的数据。在损失函数方面,采用了对比学习损失函数,其中包括最经典的批次内负例,缩放系数设定为30。同时,使用了带有难负例的对比学习损失函数,这些难负例分别基于bm25和vector构造。此外,还应用了EWC(Elastic Weight Consolidation,可塑权重巩固)和CoSENT损失,用于训练带标签的文本对。Stella通过采用这些训练数据和损失函数的策略,致力于提高模型对较长文本的编码和理解能力,使其更好地适应实际应用中的需求。

 

2. 向量的距离度量方法


向量的距离度量方法主要是衡量两个向量之间的差异性或相似性的方法。根据不同应用场景和数据特性,往往会选择不同的方法进行向量之间的度量。目前常用的方法包括欧式距离、余弦距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧式距离、汉明距离、点积距离等。

1)欧式距离,也称作欧几里得距离,主要衡量的是多维空间中两个点之间的绝对距离,对于两个向量之间距离的计算公式如下:

 

其中,a和b是两个n维向量,ai和bi是a和b在第i维的值。

2)余弦距离,也称作余弦相似度,主要利用两个向量在向量空间夹角的余弦值来衡量两个向量之间的差异度,计算公式如下:

 

其中,和分别表示向量a和向量b的模长。

3)曼哈顿距离,也称作城市街区距离,主要利用向量各维度数值差的绝对值之和来衡量两个向量之间的差异度,计算公式如下:

 

其中,表示一个数值的绝对值。

4)切比雪夫距离,以向量中各维度之间的最大差值作为两个向量之间的距离,计算公式如下:

 

其中,max表示取最大值。

5)闵可夫斯基距离,也称作闵氏距离,是欧式距离、曼哈顿距离和切比雪夫距离汇总而成的距离计算方法,计算公式如下:

 

当p=0时,闵可夫斯基距离与曼哈顿距离相同;当p=1时,闵可夫斯基距离与欧式距离相同;当p=∞时,闵可夫斯基距离与切比雪夫距离相同。

6)标准化欧式距离,对向量中各维度进行标准化后的欧氏距离,计算公式如下:

 

其中,σ表示标准差。

7)汉明距离,将两个向量之间各维度值相同个数的总和作为向量之间的距离。

8)点积距离,计算两个向量在同一方向上的成分乘积之和,将其作为向量之间的距离,计算公式如下:

 

在自然语言处理领域,通常采用余弦距离来衡量两个文本向量之间的距离,余弦距离的取值范围在-1到1之间。当距离值为1时,表示两个向量完全相同;当距离值为0时,表示两个向量处于正交位置;当距离值为1时,表示两个向量完全相反。

 

3. 常用的向量数据库


随着人工智能的逐步发展,词语级别的检索已经满足不了人们的需求。大型语言模型时代,基于语义层面的向量检索已经成为检索的必要手段。向量数据库作为处理和查询高维向量数据的关键工具,扮演着越来越重要的角色。目前,向量数据库的发展也十分迅速,以下是一些常用的向量数据库。


1. Faiss

Faiss是由Meta AI Research团队开发的一款高效的开源库,旨在处理相似性搜索和聚类任务,特别适用于大规模的向量数据处理。它基于C++语言实现,同时提供了Python语言的封装API,允许用户以高效的方式处理向量数据。Faiss在计算过程中不仅支持CPU,还能利用GPU加速计算,提高了处理速度和效率。它包含多种索引创建与搜索方法,如基于欧式距离或点积距离的暴力精确搜索、分区搜索、量化搜索以及图搜索等,使其能够应对各种复杂的数据搜索和聚类需求。通过Faiss简单实现向量检索,示例如下:

 

Faiss的强大功能使其在AI领域成为一个极具价值的工具,但在使用过程中需要使用者自行对向量索引进行存储。


2. Milvus

Milvus是由Zilliz公司在2019年开发的一款开源向量数据库,旨在存储和管理由深度学习模型或其他机器学习模型生成的大规模嵌入向量。它能够高效处理达到万亿级别的向量索引。Milvus内嵌了向量存储模块,并提供了一个直观的可视化管理工具,支持带有过滤条件的向量混合检索,增加了在数据处理中的灵活性。此外,Milvus作为一款云原生向量数据库,展现出卓越的可伸缩性和灵活性。它不仅兼容多种数据源,还提供了一系列易于使用的API和SDK,支持多种编程语言,包括Python、Java和C++等。通过强大的功能和用户友好的界面,Milvus为研究人员和开发人员的向量数据管理和检索工作提供了巨大的便利。


3. Pinecone

Pinecone是一个专门为工程师与开发者设计的全托管向量数据库,最大限度地减轻了工程师及运维人员的负担。其API用法简单,用户很容易上手,同时可拓展性强,支持数据过滤、实时数据的更新和查询等功能。


4. Weaviate

Weaviate是由SeMI Technologies研发的一款开源向量数据库,具有快速查询(100ms内实现数百万个对象执行最近邻搜索)、支持不同类型媒体资源(图像、文本等)、结合标量和向量的搜索、水平可扩展等特性。


当然,还有很多其他的向量数据库,如Vespa、Qdrant、Chroma、ZSearch、TensorDB、Om-iBASE等,此处不做过多介绍,感兴趣的读者可以自行学习。