1. 什么是RAG(retrieval-augmented-generation)技术?

RAG(Retrieval-Augmented Generation)技术是一种结合信息检索和生成模型的混合方法,旨在提高文本生成任务的质量和准确性。具体来说,RAG将检索(Retrieval)和生成(Generation)两个步骤融合在一起:
检索阶段(Retrieval Stage):在生成文本之前,系统首先从一个大型文档库中检索出与输入查询最相关的文档或段落。这一步通常使用信息检索技术,例如基于TF-IDF或BM25的传统方法,或者使用更现代的基于深度学习的检索模型。
生成阶段(Generation Stage):生成模型会将输入查询和检索到的文档或段落作为上下文,生成最终的回答或文本。这通常使用预训练的大型语言模型(如GPT-3或BERT)的生成能力。
2. RAG是谁提出来的?

现在流行的基于embedding检索的RAG技术是在2020年由Meta提出:https://arxiv.org/abs/2005.11401v4

论文提到:将预训练的检索器(查询编码器 + 文档索引)与预训练的 seq2seq 模型(生成器)相结合,并进行端到端微调。对于查询 x,我们使用最大内积搜索 (MIPS) 来查找前 K 个文档 z。对于最终预测 y,我们将 z 视为一个潜在变量,并在给定不同文档的情况下对 seq2seq 预测进行边缘化。
但只探索了开放领域的抽取式问答。在这里,将混合参数和非参数内存引入“NLP的主力”,即序列到序列(seq2seq)模型。
通过通用微调方法赋予预训练的参数化记忆生成模型非参数记忆,我们称之为检索增强生成 (RAG)。我们构建了 RAG 模型,其中参数存储器是预训练的 seq2seq 转换器,非参数存储器是 Wikipedia 的密集向量索引,可通过预训练的神经检索器访问。
将这些组件组合在一个端到端训练的概率模型中(图 1)。检索器(Dense Passage Retriever [ 26],以下简称DPR)提供以输入为条件的潜在文档,然后seq2seq模型(BART [32 ])将这些潜在文档与输入一起进行条件以生成输出。
用 top-K 近似将潜在文档边缘化,无论是在每个输出的基础上(假设同一个文档负责所有令牌)还是基于每个令牌(其中不同的文档负责不同的令牌)。与 T5 [51] 或 BART 一样,RAG 可以在任何 seq2seq 任务上进行微调,从而共同学习生成器和检索器。
3. RAG有什么优势?
RAG的主要优势在于它能够利用外部知识库中的信息,生成更准确和信息丰富的回答。相比于仅依赖预训练语言模型的生成方法,RAG在处理需要精确事实和详细信息的任务时表现得更好。
以下是RAG技术的一些关键特性:
增强上下文理解:通过检索相关文档,RAG能更好地理解输入查询的上下文,生成更加相关和有用的回答。
提高生成准确性:利用检索到的精确信息,减少了生成模型产生错误或不准确内容的可能性。
多领域适用性:RAG可以应用于各种任务,如问答系统、对话生成、内容摘要等。
比较形象的说法是:开卷考试(Open book)。
4. RAG的主要挑战有哪些?
RAG(Retrieval-Augmented Generation)技术在提升文本生成任务的质量和准确性方面展现了巨大潜力,但也面临一些主要挑战:
a. 检索质量:检索阶段的质量直接影响生成的结果。如果检索到的文档或段落不相关或包含错误信息,会导致生成模型生成不准确的回答。
b. 检索与生成的整合:如何高效地将检索到的信息与生成模型整合起来是一个复杂的问题。需要确保检索信息的内容被生成模型充分理解和利用,而不是简单地拼接或引用。
c. 计算资源需求:RAG方法通常需要大量的计算资源,因为它结合了信息检索和大型语言模型的生成能力。特别是在实时应用中,需要快速检索和生成结果,对硬件和算法的性能要求很高。
d. 上下文一致性:确保生成的文本在上下文中保持一致是一个挑战。检索到的多个文档可能会包含相互矛盾的信息,生成模型需要有效地筛选和整合这些信息,避免生成混淆或矛盾的内容。
e. 信息过载:当检索到大量相关文档时,如何从中提取最有用的信息是一个难题。生成模型可能会受到信息过载的影响,难以决定哪些信息最为重要和相关。
f. 更新和维护:知识库需要定期更新以保持最新和准确。对于RAG系统来说,维护一个不断更新和扩展的知识库是必要的,但这也增加了系统的复杂性和管理难度。
g. 安全性和隐私:在处理涉及敏感或私人信息的任务时,RAG系统必须确保信息检索和生成过程中的数据安全和隐私保护,避免泄露用户的敏感信息。
h. 多语言支持:处理多语言任务是另一个挑战。RAG系统需要在检索和生成阶段都能有效地支持和处理多种语言,确保生成内容的准确性和流畅性。
i. 评估与调试:对于RAG系统的评估和调试较为复杂,因为需要同时评估检索和生成两个阶段的表现。如何制定有效的评估指标来衡量系统的整体性能是一个难题。
j. 响应时间:实时应用对响应时间要求较高,而RAG系统的两阶段处理方式可能会导致较长的延迟。优化系统的响应速度以满足实际应用需求是一个重要挑战。
尽管RAG技术面临这些挑战,它仍然代表了文本生成技术的一个重要进步,通过不断的研究和改进,这些挑战有望得到解决,从而进一步提升RAG系统的性能和实用性。
5. 如何来实现RAG?
典型的 RAG 应用程序有两个主要组件:
索引:用于从源引入数据并对其进行索引的管道。这通常发生在离线状态。
检索和生成:实际的 RAG 链,它在运行时接受用户查询并从索引中检索相关数据,然后将其传递给模型。
第一步:索引
加载:首先我们需要加载数据。这是使用 DocumentLoaders 完成的。
拆分:文本拆分器将大 Documents 块拆分为更小的块。这对于索引数据和将数据传递到模型都很有用,因为大块更难搜索,并且不适合模型的有限上下文窗口。
存储:我们需要某个地方来存储和索引我们的拆分,以便以后可以搜索它们。这通常是使用 VectorStore 和 Embeddings 模型完成的。

第二步:检索和生成
检索:给定用户输入,使用 Retriever 从存储中检索相关拆分。
生成:ChatModel LLM 使用包含问题和检索数据的提示生成答案

6. RAG开发需要GPU吗?
是否需要GPU,首先需要分析一下哪些地方计算量比较大:
本地数据的预处理,Embedding处理(需要Embedding模型):
计算量较大,但一次处理后可以反复使用。
数据检索: 计算量可控,学习用可以使用使用较小的数据。
LLM处理:计算量大,并且需要反复使用(通常建议使用7B,14B以上模型)。也可以使用商用大模型的API。
7. RAG和语义搜索有什么区别?
语义搜索可以提高 RAG 结果,适用于想要在其 LLM 应用程序中添加大量外部知识源的组织。现代企业在各种系统中存储大量信息,例如手册、常见问题、研究报告、客户服务指南和人力资源文档存储库等。上下文检索在规模上具有挑战性,因此会降低生成输出质量。
语义搜索技术可以扫描包含不同信息的大型数据库,并更准确地检索数据。例如,他们可以回答诸如 “去年在机械维修上花了多少钱?”之类的问题,方法是将问题映射到相关文档并返回特定文本而不是搜索结果。然后,开发人员可以使用该答案为 LLM 提供更多上下文。
RAG 中的传统或关键字搜索解决方案对知识密集型任务产生的结果有限。开发人员在手动准备数据时还必须处理单词嵌入、文档分块和其他复杂问题。相比之下,语义搜索技术可以完成知识库准备的所有工作,因此开发人员不必这样做。它们还生成语义相关的段落和按相关性排序的标记词,以最大限度地提高 RAG 有效载荷的质量。
8. 如何快速实现一个RAG?
快速实现一个RAG(Retrieval-Augmented Generation)系统可以遵循以下步骤。这里提供了一个简化的流程,从基础准备到实现,再到测试和优化:
准备环境,安装依赖:确保你有一个运行深度学习框架(如PyTorch或TensorFlow)的环境,并安装相关的库,如transformers、faiss(用于高效检索)等。
pip install torch transformers faiss-cpu




