稠密文本向量化
进行大规模RAG项目的时候, 一定会用到的技术就是文本向量化, 这一个检索开始的第一步, 本文主要介绍的就是这个技术,其中也分为了稠密文本向量化和稀疏文本向量化。
SimCSE
SimCSE是使用对比学习的方式进行训练的,如下图所示, 文本1和文本2经过Transformer编码器变换以后,取[CLS]位置的向量作为句子级别的向量表示。然后计算基于批次内负样本的交叉熵损失函数,并进行反向传播和参数更新。

SimCSE使用的是Transformer编码器的模型结构是BERT,当然可以替换为更加好的模型。
$$
L=-log \frac{e^{sim(h_{i}^{1}),h_{i}^{2})/\tau}}{\sum_{j}^{N}e^{sim(h_{i}^{1}),h_{j}^{2})/\tau}}
$$
h为句向量, r为温度系数, sim为相似度函数,训练的过程中是让第i个样本的$h_{i}^{1}和h_{i}^{2}$更加相似, 让$h_{i}^{1}和h_{j}^{2}$更加不相似,进而起到了对比学习的效果。
SimCSE
- 无监督场景:该场景不需要标注数据,这个时候$h_{1}$和$h_{2}$是同一段原始文本向量表示。唯一的区别就是,将文本向量化的过程中,Transformer编码器的dropout层使用了不同的随机编码器。
- 有监督场景:在该场景下,每条数据是包含了查询文本以及正例文本的二元组$h_{1}$向量对应查询文本, $h_{2}$对应正例文本。在对称检索任务的训练数据中,$h_{2}$对应的是$h_{1}$对应的文本的相关文本;在非对称检索任务的训练数据中,$h_{1}$对应的是文本的query,$h_{2}$对应的是文本的答案。
在监督训练的情况下, 第i个样本的负例文本本质是同一批数据里其他样本j的正例文本,我们也可以在样本中直接加入查询文本的负例文本,构成(查询文本,+文本,-文本)进行训练。
SBERT
SBERT仍然是采用Transformer编码器结果,使用BERT模型,并将BERT模型的最后一层输出的向量序列进行平均池化,作为句子级别的向量表示。 但是SBERT进行推理的时候会有一些不同。

训练过程中可以使用交叉熵学习分类任务,判断句子是不是匹配,另外,也可以使用回归损失进行训练。SBERT的输出经过平均池化层得到句子向量u和v,并计算u和v的差值|u-v|, 将这个三个向量拼接后,经过线性层直接计算损失函数。推理过程中计算向量u和v的cos作为匹配程度。然而SBERT训练的时候并不考虑cos相似度,导致训练和推理的计算逻辑并不一样,这个也是SBERT的一个问题。

SGPT
之前介绍的都是基于Transformer编码架构的, SGPT是基于Transformer解码器结构的一种算法。对于使用Transformer编码架构来说,每个位置的token也可以感知到文本的全局信息,因此模型最后一层[cls]的位置的向量可以作为句向量。但是对于Transformer解码架构来说, 采用的是单向注意力机制, 所以每个位置的token只能感知到之前的信息。因此如果想用单个位置向量来代表句子向量,那么只能选用最后的位置的向量替代。除此以外,我们也可以将模型最后一层输出的所有位置进行平均,或者是加权求和的方式。
基于Transformer解码架构的文本向量模型通常效果不如Transformer编码架构文本向量化模型。因为前者只关注了上文信息,更难捕捉全局信息。
稀疏文本向量模型
其实我们进行大规模的RAG场景构建的时候, 经常使用的就是深度学习这一趴,这类模型更好的捕捉了上下文的语义信息,对拼写错误和同义词不敏感,另一个方式是基于关键词搜索的稀疏向量表示。
TF-IDF
TF-IDF是由词频(TF)和逆文档频次(IDF)相乘得到的。 对词频进行归一化处理。
$$
TF_{i,j}=\frac{n_{i,j}}{\sum_{k}n_{k,j}}
$$
逆文档频次(IDF)描述了词语的普遍程度,通过统计整个文本中包含某个词的文本片段来计算。如果一个词只有少数几次出现,那么它的IDF就会比较高。
$$
IDF_{i}=log \frac{|D|}{|\{j:t_{i} \in d_{j}\}|} +1
$$
D表示文本的总段数,j表示包含t的文本段数。由这个公式可以看出,像“你”这个字很普遍存在,IDF的值就会比较低。最后相乘就是一个综合考虑的结果。

BM25
BM25不是先计算文本向量,再通过向量计算相似度,而是直接根据查询文本和候选词计算相似度。

上图是BM25的相似度计算公式。其中f(q,D)表示查询文本Q中的第i个词$q_{i}$在候选文本D中的出现次数,D是总词数,avgdl是所有候选文本的平均长度。k和b是超参数.k范围一般是[1.2,2] ,b取值是0.75.N表示所有候选文本的数量,$n(q_{i})$表示包含单词$q_{i}$的候选文本数量。
BM25可以认为是对TF-IDF的一个改进,BM25考虑了对词频对相似度评分的饱和度影响。假设有一个100个词的文本, 其中10个词是葡萄,根据BM25的思想, 认为该文本与葡萄相关,而不是要求出现100次才认为是强相关。这里是希望某些词出现达到阈值即可。