项目介绍:RAG-Demystified
RAG 概述
RAG,全称为检索增强生成(Retrieval-Augmented Generation),是当前热门的大型语言模型(LLM)问答系统的先进人工智能范式。它通常包含三个核心组件:
-
数据仓库:这是一个信息集合库,存储了与问答任务相关的各种数据源(比如文档、表格等)。
-
向量检索:针对一个给定问题,通过向量存储系统(如 Faiss)找到与问题最相似的前 K 个数据块。
-
响应生成:利用大型语言模型(比如 GPT-4),根据之前选取的最相似数据块生成回答。
RAG 相比传统的问答系统有两大优势:一是因数据仓库的实时更新,信息总是保持最新;二是允许来源追溯,让用户可以明确了解信息来源,验证准确性并减少模型产生的虚假信息。
构建高级 RAG 管道
为了应对更复杂的问题,像 LlamaIndex 这样的近期 AI 框架引入了先进的抽象,比如"子问题查询引擎"。该应用通过使用子问题查询引擎,揭示高级 RAG 管道的内部机制。过程中,将高级抽象简化为核心组件,并识别其中的一些挑战。
架构设置
我们的数据仓库包含关于不同城市的维基百科文章,每篇文章作为一个独立数据源。在这个示例中,我们设定的问题可能是:
- “芝加哥的人口是多少?”
- “请总结亚特兰大的积极方面。”
- “哪个城市人口最多?”
这些问题可能是针对单一数据源的简单事实/总结问题,或是涉及多个数据源的复杂问题。
调料秘方
先进的 RAG 管道中,每个组件实际上由单次 LLM 调用驱动。整个管道是一系列精心设计的模板提示,通过这些模板提示,复杂任务得以实现。
子问题查询引擎的内部机制可以分解为如下三个步骤:
- 子问题生成:将复杂问题拆解为多个子问题,每个子问题配以合适的数据源和检索方法。
- 向量/摘要检索:根据选定的检索方法和数据源,获取相关信息。
- 响应聚合:将子问题回答汇总为最终回答。
任务细节
-
任务1:子问题生成:将复杂问题拆解为子问题,并为每个子问题确定适当的数据源和检索方法。
-
任务2:向量/摘要检索:对于每个子问题,采用选定检索方法从相应数据源检索信息。例如,通过向量检索方法获取芝加哥人口数据。
-
任务3:响应聚合:将子问题的回答整合为最终答案。
面临的挑战
高级 RAG 管道具有许多复杂性:
-
问题敏感性:系统对问题非常敏感,不同的用户问题可能导致管道出现意想不到的错误。
-
成本问题:高级 RAG 管道的成本与生成的子问题数量、使用的检索函数及查询的数据源有关。这些不透明且敏感的成本结构对系统构建带来了挑战。
结论
虽然 LLM 驱动的高级 RAG 管道在问答系统中发挥了变革性作用,但其背后依赖的精细提示模板和多次链式 LLM 调用使其并非简单的一键解决方案。了解其内部机制有助于开发出更健壮、效率更高的系统,实现其最大潜力。