RAG文本分块策略——语义分块

引言

将一个长文档分割为多个小块是RAG系统中一个必不可少的步骤。合理的分块能够在query检索的过程中减少噪声的影响,增强检索效果。

目前的文本分块方法有基于规则的分块,例如按照固定长度大小、按照分隔符分块、递归分块等,更进一步的是基于文本语义的分块。

本篇文章主要探讨了目前使用的基于语义分块的方法。

语义分块

基于naive-Bert的分块方法

在BERT 的预训练过程中,其中的一个二元分类任务 ------ "下一个句子预测(Next Sentence Prediction,NSP)" 是为了让模型理解两个句子之间的关系而设计的。在这种情况下,同时输入两个句子到 BERT 中,模型会预测这两个句子是否连续。

如果 BERT 模型对这两个句子的预测得分低于预设的阈值,则表明两个句子之间的语义关系较弱。

这种方法的优点是可以直接使用,无需进一步训练或微调。

然而,这种方法在确定文本分割点(text segmentation point)时只考虑了紧随在当前句子之后的句子忽略了更多距离较远段落的信息。此外,这种方法的预测效率相对较低。

Cross Segment Attention

《Text Segmentation by Cross Segment Attention》这篇论文提出了三种基于 Cross Segment Attention 的文本分割模型: 图 (a)中的 cross-segment BERT 模型,将文本分割定义为逐句分类任务 (sentence-by-sentence classification task,逐句判断其是否是文本分割点 )。潜在文本分割点附近的局部上下文(两侧的 k 个 tokens)被输入到模型中。与 CLS 相对应的隐藏状态(hidden state)被传递给 softmax 分类器,由其决定是否在潜在断句处进行分割。

这篇论文还介绍了另外两个模型。其中一个使用 BERT 模型获取每个句子的向量表征 。将连续的多个句子转换为向量表征输入到 Bi-LSTM 模型(图(b))或另一个 BERT 模型(图(c))中,以预测每个句子是否是文本分割点的位置。

基于embedding的聚类方法

传统的聚类方法对文本分句,使用聚类方法将不同的句子聚在一起作为分块,但是这种方法可能将文章里面距离较远/非连续的句子划分成同一分块,这显然是不合直觉的做法。

于是乎,改进的方案出现了,

  • 还是先简单粗暴按照句号、分号、问好、感叹号、换行符等分割文本,形成一个个的句子,用sen1、sen2、sen3. ... senN表示
  • 从sen1开始,以此和前后一个句子组合,形成combined_sentence,比如sen1+sen2 = combined_sentence1,sen1+sen2+sen3=combined_sentence2,sen2+sen3+sen4=combined_sentence3,以此类推
  • 以此计算combined_sentence1、combined_sentence2、combined_sentence3 ..... combined_sentenceN之间的相似度,如果相似度突然变化,那么新加入sen的语义肯定不同,从这里截断!举例如下:前面三个combined_sentence的距离都比较近,第4个combined_sentence和第三个的距离突然增加很多,说明sen4和sen1 ~ sen3之间的语义肯定差异较大,可以从sen4开始分割,sen1 ~ sen3合并成一个chunk!

基于命题proposition的分块方式

将文档拆分以命题为单位的块。其中命题的定义原则是:

  1. 每个命题应对应文本中的一个独特意义片段,所有命题的组合应代表整个文本的语义。

  2. 命题应是最小化 的,即不能进一步分割为单独的命题。

  3. 命题应包含上下文情境和自身。命题应包括来自文本的所有必要上下文(例如指代关系),以解释其含义。

以下是一个划分的示例:

在原始段落中包含三个命题,每个命题对应比萨斜塔的三个独特事实:修复前的角度、当前角度和水平位移。

具体的实现

作者微调了一个文本生成模型 ------"命题生成器" 。命题生成器接受段落作为输入,并生成段落内的 命题列表 。作者通过 两步蒸馏过程 来训练命题生成器。

(1)使用一个包含命题定义和one-shot的示例的指示来引导GPT-4生成 42k条(passage -> propostion)的数据对;

(2)使用得到的数据对来微调一个FlanT5-large模型;

利用大模型进行语义分块

待更新。。

相关推荐
To_OC10 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户9385156350715 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC16 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥17 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者18 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者18 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月21 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星1 天前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星1 天前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试