通往模块化RAG之路¶
🤷♂️ 什么是模块化RAG?¶
在一篇关于RAG的论文调查中,他们提出了RAG的三种范式。

最初,Naive RAG是一种简单的RAG范式。 它将文档片段嵌入到向量数据库中,通过用户查询进行检索,并利用检索到的文档片段生成答案。
如今构建基础版RAG系统非常简单。 你只需要参考Langchain或LlamaIndex的教程,或者其他现有的RAG框架即可。 但基础版RAG存在性能问题。 如果你尝试过基础版RAG,就会知道在实际应用场景中其表现可能不尽如人意。
接下来介绍第二种范式:高级RAG。 高级RAG支持若干检索前和检索后的功能特性,比如重排序、查询扩展等。 它比基础RAG更强大,但仍不够完美。
高级RAG的主要问题在于它仍然缺乏循环机制。为什么循环机制如此重要?
例如,大型语言模型生成的答案可能存在事实性幻觉。 若直接将此类答案呈现给用户,会导致用户获取错误信息,从而造成不良体验。 为防止这种情况,我们需要验证答案的真实性。 当发现幻觉现象时,可要求生成器重新生成答案或再次检索文档片段。 在Naive RAG和Advance RAG这类DAG范式中,由于缺乏循环机制,无法实现这种验证流程。 这正是模块化RAG的价值所在。
模块化RAG具有循环和模块结构,因此能够自主决定下一步操作,为用户提供最佳答案。
想了解更多关于模块化RAG的信息吗?
推荐阅读这份调查论文。
🚀 模块化RAG之路¶
在此版本的AutoRAG中,我们目前仅支持高级RAG功能。
但我们深知模块化RAG对RAG流程的重要性,因此计划尽快实现对模块化RAG的支持。
让我来解释我们实现模块化RAG的计划。
AutoRAG早期版本¶

以下是高级RAG的简单示意图。 将每个圆圈视为一个节点。 用户查询进入检索器,检索文档片段,重新排序,生成提示并产生答案。
从现在开始,你可以轻松使用AutoRAG构建这类流程。
提示
如果您还不了解如何构建流水线并进行优化, 请参阅优化指南。
策略节点¶
警告
本文档是关于我们的计划,因此未来可能会有所变更。
此外,该功能尚未在AutoRAG中实现。

我们计划新增一个策略节点(Policy Node)。 看到图中那个蓝色小节点了吗? 那就是策略节点。 它会获取之前节点的处理结果,并根据该结果决定下一步操作。
在本示例中,策略获取提示并选择最适合生成最终答案的Generator模型。
合并节点¶
策略节点存在一个限制,即它无法再次合并结果。
一旦策略执行其操作,在没有Merger Node的情况下就无法再次合并结果。
通过合并节点,我们现在可以在RAG管道中创建循环。

这是一个使用合并节点的流程图。
首先,有一个策略节点接收检索到的文档片段作为输入。
它决定是重新排序还是直接将长文档片段压缩为短段落。
之后,必须传递给单个提示生成节点。
接着出现Meger Node。
它从多个节点获取结果并传递给下一个节点。
这样,无论策略节点如何决定,提示生成节点都能获得文本来生成提示。
那么,如何使用Merger Node创建循环呢?
让我来演示一个例子。

效果不错吧? 上图中的策略决定了将重新排序的结果传递给提示生成器进行生成, 或者要求重新检索。 在检索节点之前的合并器中,它会获取用户查询并将其传递给检索节点。
瞧!我们在RAG流程中实现了一个循环。
但在将其应用到AutoRAG时遇到了问题。
如何将其转换为单个YAML文件?
如何仅通过YAML文件构建复杂的模块化RAG流程?
模块化RAG的节点线路¶
解决方案是Node Line。
如果您了解过AutoRAG配置文件的结构,您会对Node Line感到熟悉。
什么是节点线?
如果您不熟悉Node Line,请参阅optimization指南。
在高级RAG中,节点线路类似于文件夹。 它没有太多功能,只是节点的集合。
但换个角度想。单节点线路就像一条直线。它是线性结构。 没有任何分支或循环。
神奇之处在于仅通过策略节点和合并节点实现。 您可以在策略节点处输入哪条节点线可以作为下一步。 如果该节点线是策略的目标,则必须设置一个合并节点来整合来自该节点线的结果。

在上图中,我绘制了两条节点连线来实现循环流程。 您可以通过编写如下所示的YAML配置文件来构建上述管道。
node_lines:
- node_line_name: node_line_1
nodes:
- node_type: merger
pass_value: query
- node_type: retrieval
strategy:
metrics: [retrieval_recall]
top_k: 10
modules:
- module_type: bm25
- node_type: passage_reranker
strategy:
metrics: [reranker_recall]
top_k: 3
modules:
- module_type: upr
- node_type: policy
target_node_lines:
- node_line_1
- node_line_2
modules:
- module_type: kf1_policy
- module_type: rl_policy
- node_line_name: node_line_2
nodes:
- node_type: prompt_maker
modules:
- module_type: fstring
prompt: "Answer the question: {query} \n\n Passage: {retrieved_contents}"
- node_type: generator
strategy:
metrics: [bleu, rouge, meteor]
modules:
- module_type: llama_index_llm
llm: openai
看起来很酷,对吧?
联系我们¶
我们正在AutoRAG全力推进模块化RAG的研发。
如果您对模块化RAG感兴趣,欢迎随时联系我们。
我们乐于接收任何问题、建议、功能需求及反馈等。
联系我们
GitHub问题反馈:https://github.com/Marker-Inc-Korea/AutoRAG/issues
Discord : https://discord.gg/P4DYXfmSAs