正文
在构建向量数据库的过程中,首先需要将包含知识的长文本拆分为较小的片段,然后通过文本向量化模型进行处理并存储。虽然文本切分看似简单,但它对大模型最终回答的效果有显著影响。接下来,我们将讨论两种情况:文本切分过长和文本切分过短。
文本切块过长
在 Transformer 架构中,文本被表示为向量,其中每个词对应一个特定的向量。为了获取一段文本的整体向量表示,常见的方法是对句中的词向量求平均。然而,当句子长度过长时,平均化过程可能会导致细节和语义信息的丢失,进而降低召回的准确率。此外,在使用大型模型进行检索和生成(RAG)任务时,如果模型在总结文本内容方面的能力较弱,长文本的召回会限制可供大模型分析的文本块数量。长文本的向量化本身就容易丢失信息,如果同时减少召回文本的数量,无法涵盖有用知识点的风险就会增加,最终可能影响大模型生成答案的质量。
文本切块过短
对短文本进行向量化更有利于保留文本中细粒度的语义信息。然而,这种方式也存在一些问题,比如容易丢失段落和文档层面的主题信息,以及跨段落的上下文信息。对大模型输入这些碎片化的文本块,不利于大模型进行总结。
通过上述分析,我们可以得出一个结论:为向量数据库中的文本采用合适的切分策略,能够确保召回的内容更契合用户的查询意图,从而使大模型更准确地生成正确答案。接下来,我们将介绍几种常见的文本切块策略。需要特别指出的是,并不存在所谓的“最佳”切块策略,选择时需要根据具体应用场景进行分析和实验。
固定大小文本切块
固定大小的文本切块是一种简单的文本分割方法,只需确定每个块的大小即可。然而,在实际使用中,为了减少块与块之间的上下文信息丢失,最好让块之间有些重叠。此外,仅仅按照字数来截断文本而不考虑段落或句子内部的连贯性,可能会影响文本嵌入的效果。因此,为了尽量保持上下文的完整性,文本块的大小可以稍微偏离预设的大小。
特殊格式文本切块
有时候需要对诸如 HTML、Markdown、LaTeX等具有特殊内在结构的文本进行切块。在进行切块时,应充分考虑其结构信息,以减少因文本切块而导致的上下文信息损失。
基于深度学习模型的文本切块
为了让预训练语言模型学习两个句子之间的关系,我们可以在预训练过程中设置一个简单的任务:给模型输入两个句子,预测第二个句子是否是第一个句子的续接句。基于这个方法,可以设计一种简单的文本切分策略,即以句子为最小单位。在完整的文本中,通过滑动窗口依次将相邻的两个句子输入到预训练语言模型进行预测。如果预测结果显示这两个句子之间的关系较弱,那么就在这里进行文本切分。
目前基于预训练语言模型的优化也比较多,比如Cross-Segment模型,该方法充分利用了更长的上下文信息,预测效率也有提升。首先,利用 BERT 模型分别获取每个句子的向量表示。然后,将连续的多个句子的向量表示同时输入到另一个 BERT 或 LSTM 模型中,一次性预测每个句子是否文本分段的边界。又比如SeqModel 利用 BERT 对多个句子同时编码,建模了更长的上下文之间的依赖关系之后再计算句向量。还有达摩院提出的以BERT为底座的ROM模型。
▐
向量嵌入
向量嵌入只是从图像、文本和音频转换而来的数值表示。简单来说,针对每个项目创建一个单独的数学向量,捕捉该项目的语义或特征。这些向量嵌入更容易被计算系统理解,并与机器学习模型兼容,以理解不同项目之间的关系和相似性。
用于存储这些嵌入向量的数据库称为向量数据库。这些数据库利用嵌入的数学属性,将相似的项目存储在一起。使用不同的技术来将相似的向量存储在一起,将不相似的向量分开。这些就是向量索引技术。
什么是特征向量
向量是一种将实体和应用代数化的表示。向量将实体间的关系抽象成向量空间中的距离,距离的远近代表相似程度。例如:身高、年龄、性别、地域等。
除了图像、文本和音频,理论上所有包含文本在内的任意数据都可以向量化,引用一句网上的热门词就是「万物皆可Embedding」。
什么是向量索引
向量索引通过将数据表示为向量,并构建高效的索引结构,可以实现快速的相似性搜索和匹配,提高数据检索和匹配的效率。
什么是距离计算
向量检索的过程是计算向量之间的相似度,最后返回相似度较高的TopK向量返回,而向量相似度计算有多种方式,不同的计算方式也适用于不同的检索场景。
对于浮点型向量和二值型向量有着不同的距离计算方式。
在实际的应用工程应用场景中,绝大多数使用的浮点型计算,故下面核心介绍浮点型计算距离。
内积距离
内积距离计算的是两个向量在方向上的差异,夹角越小越相似,因此内积值越大越相似。
两条向量内积距离的计算公式为: