为生产环境构建高性能 RAG 应用程序#
快速原型化 RAG 应用程序很容易,但要使其性能优越、稳健且可扩展到大型知识语料库则很困难。
本指南包含了各种技巧,可帮助提升您的 RAG 流程的性能。我们首先概述了一些通用技术 - 它们按照从最简单到最具挑战性的顺序松散排序。然后,我们将更深入地探讨每种技术,它们解决的用例以及如何在 LlamaIndex 中实现!
最终目标是优化您的检索和生成性能,以便能够准确回答更多关于更复杂数据集的查询,而不会出现幻觉。
构建生产级 RAG 的通用技术#
以下是构建生产级 RAG 的一些重要考虑因素
- 将用于检索的块与用于合成的块解耦
- 面向更大文档集的结构化检索
- 根据任务动态检索块
- 优化上下文嵌入
我们在我们的生产级 RAG 网络研讨会中讨论了这些内容。查看此推文线程以获取更多综合详情。
将用于检索的块与用于合成的块解耦#
更好的检索的关键技术是将用于检索的块与用于合成的块解耦。
动机#
用于检索的最佳块表示可能与用于合成的最佳考虑不同。例如,原始文本块可能包含 LL 模型合成更详细答案所需的详细信息。然而,它可能包含填充词/信息,可能会偏向嵌入表示,或者可能缺乏全局上下文,在相关查询到来时可能根本不会被检索。
关键技术#
有两种主要方法可以利用这个想法:
1. 嵌入文档摘要,链接到与文档相关的块。
这可以帮助在检索块之前以高层次检索相关文档,而不是直接检索块(可能在不相关文档中)。
资源:
2. 嵌入句子,然后链接到句子周围的窗口。
这允许更精细地检索相关上下文(嵌入巨大块会导致“中间丢失”问题),同时确保 LL 模型合成所需的足够上下文。
资源:
面向更大文档集的结构化检索#
动机#
标准 RAG 栈(top-k 检索 + 基本文本拆分)的一个大问题是随着文档数量的增加而扩展性不佳 - 例如,如果您有 100 个不同的 PDF。在这种情况下,给定一个查询,您可能希望使用结构化信息来帮助更精确地检索;例如,如果您提出的问题只与两个 PDF 有关,使用结构化信息确保这两个 PDF 被返回,而不仅仅是与块的嵌入相似度。
关键技术#
有几种执行更结构化标记/检索以用于生产级 RAG 系统的方法,每种方法都有其优缺点。
1. 元数据过滤器 + 自动检索 使用元数据为每个文档打标签,然后存储在向量数据库中。在推断时,使用 LL 模型推断正确的元数据过滤器来查询向量数据库,除了语义查询字符串。
- 优点 ✅:受支持于主要向量数据库。可以通过多个维度过滤文档。
- 缺点 🚫:可能难以定义正确的标签。标签可能不包含足够相关信息以进行更精确的检索。此外,标签代表文档级别的关键字搜索,不允许进行语义查找。
资源:
2. 存储文档层次结构(摘要 -> 原始块)+ 递归检索 嵌入文档摘要并将其映射到每个文档的块。在块级别之前首先在文档级别获取。
- 优点 ✅:允许在文档级别进行语义查找。
- 缺点 🚫:不允许通过结构化标签进行关键字查找(可能比语义搜索更精确)。此外,自动生成摘要可能会很昂贵。
资源
根据任务动态检索块#
动机#
RAG 不仅仅是关于特定事实的问答,而这正是 top-k 相似度所优化的。用户可能会提出各种各样的查询。Naive RAG 堆栈处理的查询包括询问特定事实,例如“告诉我关于2023年该公司的多元化和包容性倡议”或者“叙述者在 Google 期间做了什么”。但查询也可能包括摘要,例如“你能给我一个关于这份文件的高层概述吗”,或者比较“你能比较 X 和 Y”。所有这些用例可能需要不同的检索技术。
关键技术#
LlamaIndex 提供了一些核心抽象,帮助你进行特定任务的检索。这包括我们的 路由器 模块以及我们的 数据代理 模块。 这还包括一些高级查询引擎模块。 这还包括其他将结构化和非结构化数据结合的模块。
你可以使用这些模块来进行联合问答和摘要,甚至将结构化查询与非结构化查询结合起来。
核心模块资源
详细指南资源
优化上下文嵌入#
动机#
这与上述“解耦用于检索与综合的块”的动机有关。我们希望确保嵌入针对您特定的数据语料库进行了优化检索。 预训练模型可能无法捕捉与您的用例相关的数据的显著特性。
关键技术#
除了上面列出的一些技术,我们还可以尝试微调嵌入模型。 我们实际上可以在无标签的文本语料库上进行这样的操作。
在这里查看我们的指南: