RAG 核心概念和工作原理详解,为想理解现代 AI 应用架构的程序员提供基础认知。
检索增强生成(Retrieval-Augmented Generation,RAG)将外部信息检索整合到大型语言模型(LLM)生成回答的过程中。它会从数据库中搜索超出模型预训练知识库的信息,从而显著提高生成回答的准确性和相关性。
自从 ChatGPT 问世以来,语言模型迅速席卷互联网,这并非没有道理。它们能写文章、编写完整的程序,甚至还能制作表情包(尽管我们仍在讨论这究竟是不是一件好事)。
但无论这些聊天机器人变得多么聪明,在需要外部知识和事实信息的任务中,它们依然存在局限。没错,它可以事无巨细地描述蜜蜂的摇摆舞。但如果它们不仅能使用原始训练数据,还能根据我们提供的任意数据生成洞见,那么价值就会高得多。由于从头重新训练这些大型语言模型需要花费数百万美元,并且耗时数月,我们需要更好的方法,让现有的 LLM 能够访问我们的自定义数据。
你当然可以在 prompt 上多花些心思,但这只能解决短期问题。LLM 在生成回答时,只能处理有限数量的文本,这一容量被称为上下文窗口(context window)。GPT-3 等模型最多可以看到大约 12 页文本,也就是 4,096 个 token 的上下文。对于大多数知识库而言,这远远不够。
上图展示了一个基础 RAG 系统的工作方式。在将问题转发给 LLM 之前,我们会设置一个中间层,从知识库中搜索回答用户查询所需的“相关知识”。具体到这个例子,检索的是上个月的支出数据。这样一来,LLM 就能针对我们的预算生成相关且没有幻觉的回答。
随着数据不断增长,你需要一种高效的方法,从中找出与 LLM 有限内存最相关的信息。这时,你就需要一套合适的机制来存储和检索查询所需的特定数据,而不必让 LLM 自己记住这些数据。
向量数据库以向量嵌入(vector embeddings)的形式存储信息。这种格式支持高效的相似性搜索,从而检索与查询相关的数据。例如,Qdrant 专门针对高速检索而设计,即使面对数十亿个向量,也能快速完成搜索。
本文将重点介绍 RAG 系统及其架构。如果你想进一步了解向量搜索,我们推荐阅读以下文章:《什么是向量数据库?》和《什么是向量嵌入?》。
RAG 架构的核心由检索器(retriever)和生成器(generator)组成。我们先来了解这两个组件分别负责什么。
当你向检索器提出问题时,它会通过相似性搜索扫描由大量向量嵌入组成的知识库,然后提取最相关的向量,用于辅助回答该查询。它可以通过几种不同的技术来判断哪些内容具有相关性。
索引过程会对数据进行组织,并将其存入向量数据库,使这些数据可以被轻松搜索。这样,RAG 在回答查询时就能访问相关信息。
如上图所示,整个过程如下:
首先使用加载器收集包含数据的文档。这些文档可以是文章、书籍、网页或社交媒体帖子等任何内容。
接下来,拆分器会将文档划分成更小的块,通常是句子或段落。
之所以这样做,是因为 RAG 模型处理较小的文本片段时效果更好。在图中,这些片段被称为文档片段(document snippets)。
随后,每个文本块都会被送入嵌入机器。嵌入机器使用复杂算法,将文本转换成向量嵌入。
所有生成的向量嵌入都会存储在由索引信息组成的知识库中。这样一来,系统就能在需要时高效检索相似的信息片段。
完成知识库的向量化后,你可以用同样的方法处理用户查询。当模型收到新查询时,会采用相同的预处理和嵌入技术,以确保查询向量与索引中的文档向量兼容。
当系统需要寻找与查询最相关的文档或段落来生成回答时,它会使用向量相似性技术。向量相似性是机器学习和自然语言处理(NLP)中的一个基础概念,用来量化不同向量之间的相似程度;这些向量是数据点的数学表示。
系统可以根据用于表示数据的向量类型,采用不同的向量相似性策略。
稀疏向量的特点是维度很高,但其中绝大多数元素都为零。
经典方法是关键词搜索,它会扫描文档,寻找查询中完全匹配的单词或短语。搜索系统通过统计单词出现次数,并降低常见词的权重,为文档创建稀疏向量表示。包含更少见词语的查询会被优先处理。
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)和 BM25 是两种经典且相互关联的算法。它们简单且计算效率高,但在处理同义词时可能表现不佳,也不一定能捕捉语义上的相似性。
如果你想深入了解,可以参阅我们的《稀疏向量》一文。
这种方法使用 BERT 等大型语言模型,将查询和段落编码为稠密向量嵌入。这些向量是紧凑的数值表示,能够捕捉语义含义。Qdrant 等向量数据库会存储这些嵌入,并通过余弦相似度等距离度量,根据语义相似性而不只是关键词来检索内容。
因此,检索器可以基于语义理解进行匹配,而不只是匹配关键词。比如,当我询问“导致 BO 的化合物”时,即使原文没有使用这些完全相同的词,它仍然可以检索到与“产生体味的分子”有关的信息。我们在《什么是向量嵌入?》一文中对此进行了更详细的解释。
不过,无论是关键词搜索还是向量搜索,都不可能始终完美。关键词搜索可能会漏掉使用不同表达方式描述的相关信息,而向量搜索有时难以保证足够的精确性,也可能忽略重要的统计词语模式。混合方法试图将不同技术的优势结合起来。
一些常见的混合方法包括:
先通过关键词搜索获得一组初始候选文档,然后使用语义向量表示对这些文档重新排序或重新评分。
先使用语义向量寻找主题上大致相关的文档,然后根据关键词匹配或其他元数据对文档进行过滤或重新排序。
在一个组合评分模型中,同时考虑语义向量的接近程度以及关键词的统计模式和权重。
设置多个阶段,并在不同阶段使用不同技术。例如,先进行初步关键词检索,再执行语义重排序,最后使用更加复杂的模型完成最终重排序。
通过互补的方式结合不同搜索方法的能力,就能提供质量更高、覆盖更全面的结果。如果你想了解更多,可以阅读我们的《混合搜索》一文。
检索出最相关的段落后,就轮到生成器综合这些信息,并使用自然语言表达出来,生成最终答案。
这里的 LLM 通常是 GPT、BART 或 T5 等模型。它们使用海量数据集完成训练,能够理解并生成人类风格的文本。现在,模型的输入不仅包含查询或问题,还包含检索器识别出的、可能含有答案的相关文档或段落,模型会利用这些内容生成回答。
检索器和生成器并不是彼此独立运行的。下图展示了检索结果如何输入生成器,进而生成最终回答。
RAG 模型可以提供知识更丰富、上下文更充分的回答,因此如今已经被应用于许多领域,尤其适合对事实准确性和知识深度有要求的场景。
问答:这可能是 RAG 模型最突出的使用场景。它们为高级问答系统提供支持,让系统可以从大型知识库中检索相关信息,再生成流畅的回答。
语言生成:RAG 能够生成事实性更强、上下文更充分的文本,例如根据多个来源生成具备上下文信息的文本摘要。
数据到文本生成:通过检索相关的结构化数据,RAG 模型可以根据数据库生成产品或商业智能报告,也可以描述数据可视化和图表中呈现的洞见。
多媒体理解:RAG 并不局限于文本。它可以检索图像、视频和音频等多模态信息,从而增强理解能力。例如,通过检索相关文本上下文来回答有关图像或视频的问题。
准备好从零开始创建自己的 RAG 聊天机器人了吗?我们准备了一个视频,从头讲解整个过程。Daniel Romero 将指导你完成:
构建完 RAG 聊天机器人后,你将能够把它的表现与完全由大型语言模型(LLM)驱动的聊天机器人进行比较和评估。
有一个想要实现的 RAG 项目吗?欢迎加入我们的 Discord 社区,我们会在那里持续分享向量搜索和检索方面的技巧,并解答相关问题。
进一步了解如何正确评估 RAG 回答:《评估检索增强生成——一种评估框架》。