LLM大模型: RAG的上下文语义聚类retrieval — RAPTOR
1、RAG有很多优点,但是缺点也很明显,其中一个硬伤就是:只会“断章取义”!如果文本有明确的答案,现有的retrieve方式大概率能找到,但是如果文本没有明确的答案了?比如android逆向和windows逆向,哪个更有钱途?很多资料会介绍android逆向、windows逆向的原理和技术细节,但是没有哪个更有钱途的对比说明,retrieve的时候很难直接找到现成的chunk,这种总结性的问题(query focused summerization)怎么准确地回答了?这类问题的答案并不在某个特定的chunk中(explicit retrieval task),要回答这类问题,可能要遍历很多个chunk(甚至要跨文本检索不连续的、主题分散的chunk),然后总结、提炼和归纳,这又该怎么查找了?
问题1:文本内部可能有多个细分主题,并且散落在不同的段落;甚至有些细分主题还散落在不同的文本中,为了高效准确检索,肯定要把属于同样细分语义主题的token聚在一起,才能精准检索
问题2:经过上面步骤,把散落的token按照细分主题聚集后,怎么高效检索?
2、Stanford 2024.1月份发了篇论文:https://arxiv.org/pdf/2401.18059 提出了一种算法:RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL,处理的算法流程如下:
- chunk:按照固定长度切分,每个chunk size = 100,简单粗暴!然后使用合适的embedding模型对每个chunk计算embedding。这一步得到了所有的叶节点。
- 递归构建 RAPTOR 树:
- 按照语义对chunk做聚类,形成多个cluster
- 利用LLM给每个cluster内的文本生成摘要总结,并为对总结也生成 embedding,作为树的非叶节点;越接近root节点,语义越精简;
- 检索retrieve,查询和query相关的cluster,有两种方式:
- Tree Traversal Retrieval:从根级节点开始,基于向量相似性与父子关系,进行逐层向下检索,最后检索出全部相关的节点文档,作为最终输出的相关文档。(思路有点类似lanchain的ParentDocumentRetriever)
- Collapsed Tree Retrieval:将树展开单层,然后直接对所有文档节点进行向量相似性检索,检索出所有的相关节点文档
- 不论哪种retrieve方式,核心的要点就是:既召回了颗粒度大、概括性的chunk,又召回了颗粒度小、体现小细节的chunk!
RAPTOR 树构建流程图示如下:
RAPTOR 树查询流程:
从作者实验的结果来看,貌似第二种collapsed tree retrieval效果更好,我猜测可能是因为第二种方式遍历每个节点,不会遗漏:
3、作者用了BLEU (B-1, B-4), ROUGE (R-L), and METEOR (M) metrics等方法,测试了很多数据集,效果都还不错(效果不好可能也不会发出来了)
传统的retrieve方式效果不如联合PARTOR后的retrieve:
4、整个流程和原理很简单,没啥突出的新意,最大的亮点应该是聚类了!聚类效果好了,相当于语义提取地好,本质和sematic chunk是一样的【和sematic chunk相比,RAPTOR对每个cluster提取了摘要,对语义进一步做了抽象和总结】!这里聚类采用的是GMM高斯混合模型,每个样本都有一定的概率被划分到不同的cluster,实现了软聚类的效果,这一点非常符合业务直觉 : "我感到骄傲",这句话可能是褒义,也可能是贬义,所以以不同的概率被划分到不同的cluster是符合业务规律的!整个聚类的过程如下:
- 数据降维:使用UMAP将高维数据降维到低维空间,便于后续处理和聚类
- 初步聚类:在降维后的数据上应用初步聚类算法,生成初始聚类结果
- 细化聚类:使用高斯混合模型(GMM)对每个cluster进行细化聚类,估计各子类的高斯分布参数
- 参数选择:
- 使用BIC选择最优的GMM模型,包括确定最优的cluster数量和参数估计
- 计算不同cluster数量下的BIC值,选择BIC值最小的模型作为最终的聚类模型。
5、RAPTOR方案的优点总结
- 在不同层次、不同颗粒度的多个级别上构建了语义表示并实施嵌入,粗细颗粒度都能匹配,提高了检索的召回能力
- 可以有效且高效的回答不同层次的问题,有的问题在低阶叶子节点解决,有的则由高阶非叶子节点完成
- 适合需要多个文档的理解才能回答的输入问题,因此对于综合性的问题有更好的支持
参考:
1、https://arxiv.org/pdf/2401.18059
2、https://blog.csdn.net/star1210644725/article/details/136241523 RAG中如何解决上下文知识连贯性问题 || 如何更好的切分和组织非结构化的文档数据
3、https://cloud.tencent.com/developer/article/2423159 文档树:如何提升长上下文、非连续文档、跨文档主题时的检索效果
4、https://www.cnblogs.com/gzyatcnblogs/p/18011582 RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能
5、https://mp.weixin.qq.com/s/KqJt4-Yhab5chi8YJglMiw 长文本的高效处理:RAPTOR 检索技术及其在 RAG 中的应用
6、https://github.com/parthsarthi03/raptor/blob/master/raptor/cluster_tree_builder.py raptor的官方实现