Skip to main content

基于RAPTOR实现长上下文RAG

· 4 min read
Yingfeng Zhang

RAGFlow v0.6.0 本周发布,解决了自今年四月开源以来出现的许多易用性和稳定性问题。RAGFlow 的未来版本将专注于解决 RAG 能力的深层次问题。不得不说,市场上现有的 RAG 解决方案仍处于概念验证(POC)阶段,无法直接应用于实际生产场景。这主要是由于 RAG 本身存在许多未解决的问题:

数据质量:RAGFlow 提供开源的数据清洗模型和分块模板,以提高数据质量,并将继续迭代和演进这些内置模型和工具。数据检索:在问题意图明确的场景中,需要多次召回以检索相关上下文,当前的 RAGFlow 集成了具有多次召回功能的数据库。检索答案的挑战:在许多情况下,仅使用问题内容进行搜索不一定能捕捉到答案的上下文。在问题和答案的语义之间显然存在需要弥合的差距。

我们可以从多个方面来接近上述的最后一点,包括:实现一个外部知识图谱用于查询重写和用户意图的理解;通过引入代理来提高答案质量,使LLM能够通过增加对话互动来改进其答案;检索更长的上下文以便LLM找到答案。

RAGFlow的路线图包括解决这三个方面的功能。今天,我们将讨论RAGFlow最近添加到主分支(或Docker开发标签)中的一个实验性功能,以解决上述最后一点——基于RAPTOR实现长上下文RAG。

RAPTOR的想法源于今年早些时候发布的一篇题为“递归抽象处理用于树结构检索”的论文。如下图所示,该论文提出了一种增强的文档处理方法:对文档内容进行层次聚类:

将原始文档分割成块后,RAPTOR以递归和分层的方式对这些块进行聚类:聚类过程从叶节点(图中的蓝色块)开始,并通过嵌入将叶节点总结为更高级别的信息。该过程递归执行,形成从叶节点开始的“树”结构。聚类过程的结果是摘要,可以使用LLM生成。聚类和摘要生成的利用至关重要,因为它捕捉了处理复杂主题查询和问答任务中多步推理所需的更精细细节。RAPTOR论文讨论了两种检索聚类内容的过程,如下图所示:

第一个过程维护树结构:检索从根节点开始,并在整个树结构中分层进行。这种检索实现起来有点复杂,并且对多次召回“不友好”。

第二个过程将树结构扁平化以便检索。它易于实现,并且自然地与多个召回集成。

RAGFlow实现了论文中提出的扁平化树结构用于检索:在使用Deepdoc进行文件解析后,您可以选择激活RAPTOR开关以进行聚类和摘要生成。原始块和这些生成的摘要随后被发送到数据库以建立全文和向量索引。后续操作与传统RAG解决方案类似。

请注意,默认情况下,RAPTOR开关是关闭的,因为启用此功能会消耗更多的令牌配额。

当您需要更好地理解长上下文窗口时,您可以激活此RAPTOR开关以从聚类结果生成摘要。

如下图所示:左半部分是由LLM从聚类结果生成的摘要。RAGFlow将这些摘要可视化,这些摘要将与原始数据一起用于RAG的检索过程。

RAPTOR 帮助 LLM 更好地理解上下文。这是因为在聚类树结构中的上层节点对文本具有更“宏观”的理解,使其在需要跨块摘要或多跳问答的场景中具有优势,这些场景中答案无法直接从相应的上下文中检索到。

RAPTOR方法是RAGFlow尝试解决RAG检索中的痛点之一。在即将发布的版本中,我们将带来进一步的改进。敬请期待!