RAG 技术学习笔记
一、 什么是RAG?
检索增强生成(Retrieval-Augmented Generation, RAG)是一种智算框架,它将一个“检索器”(Retriever)和一个“生成器”(Generator,通常是大型语言模型LLM)相结合,旨在利用外部知识库来提升生成内容的准确性、时效性和可信度。
简单来说,传统的LLM像一个“博学但记忆会过时”的学生(闭卷考试),而RAG则允许这个学生在回答问题前,先去图书馆查阅最新的资料(开卷考试)。
与微调(Fine-tuning)的对比:
微调 (Fine-tuning): 通过在特定领域的数据集上继续训练模型,将领域知识“融入”模型的参数中。这个过程成本高昂,且一旦完成,知识就被“固化”了,无法轻松更新。
RAG: 不改变模型本身的参数,而是通过外部、可随时更新的知识库来“注入”知识。这使得知识更新变得廉价而快速,并且能明确知道答案来源于哪份资料。
二、 RAG的核心组件与详细工作流程
一个典型的RAG系统工作流程可分为两个阶段:
阶段一:数据准备/索引 (离线)
此阶段的目标是构建一个高效、可检索的知识库。
-
数据提取与加载 (Data Loading):
从各种数据源(如PDF, Word, Notion, Confluence, 网站等)加载原始数据。使用专门的数据加载器来处理不同的文件格式。 -
数据清洗与分块 (Cleaning and Chunking):
清洗: 去除无关信息,如HTML标签、页眉页脚、广告等。
分块 (Chunking): 这是RAG性能的关键步骤。将长文档切分成更小的、语义完整的文本块(Chunks)。
为什么分块重要? LLM的上下文窗口有限,太大的块会稀释关键信息;太小的块则可能丢失必要的上下文。
常见策略:
固定大小分块 (Fixed-size Chunking): 按固定字符数(如1000个字符)切分,可能在句子中间断开。
递归字符分块 (Recursive Character Text Splitting): 优先按段落、然后按句子、最后按单词进行切分,力求保持语义完整性。这是最常用的策略。
文档特定分块 (Document-specific Chunking): 根据文档格式(如Markdown的标题、代码块)进行结构化切分。 -
向量化与索引 (Embedding and Indexing):
向量化 (Embedding): 使用一个“嵌入模型”(Embedding Model)将每个文本块转换成一个高维的数字向量。这个向量是文本语义的数学表示。
常用模型: Open智算的 text-embedding-ada-002, text-embedding-3-small, 或者开源的 m3e-base, bge-large-zh (中文)。
索引 (Indexing): 将这些向量连同其对应的原始文本块一起,存储在一个专门的“向量数据库”中。
常用向量数据库: Milvus (开源), Pinecone (商业), Chroma (开源, 轻量), F智算SS (Facebook 智算的库, 非完整数据库)。数据库会创建高效的索引(如HNSW),以便快速进行相似度搜索。
阶段二:检索与生成 (在线,实时)
当用户提出一个问题时,系统实时执行以下步骤:
-
查询向量化 (Query Embedding):
使用与索引阶段相同的嵌入模型,将用户的查询(Query)也转换成一个向量。 -
向量检索 (Vector Retrieval):
在向量数据库中,计算“查询向量”与所有“文本块向量”之间的相似度(通常使用“余弦相似度”算法)。然后,系统会找出与查询最相似的 Top-K 个文本块(例如,K=5,表示找出最相关的5个文本块)。 -
上下文增强与提示词构建 (Context Augmentation & Prompting):
将检索到的这 K 个文本块作为“上下文(Context)”,与用户的原始问题一起,按照一个预设的模板,构建成一个内容丰富的“增强提示词”(Augmented Prompt)。示例:
用户问题: "RAG技术有哪些优势?"
检索到的上下文: "上下文1: RAG能减少幻觉... 上下文2: RAG的知识可以实时更新..."
构建的增强提示词:
请根据以下提供的上下文信息来回答用户的问题。请确保你的回答完全基于这些信息,不要使用任何外部知识。
上下文:
RAG能减少幻觉。
RAG的知识可以实时更新。
用户问题: RAG技术有哪些优势?
回答: -
答案生成 (Answer Generation):
将这个增强提示词发送给大型语言模型(LLM,如GPT-4, Llama3)。LLM会遵循指令,主要依据提供的上下文来生成一个连贯、准确的回答。 -
(可选) 引用溯源:
在给出最终答案的同时,附上其所依据的原始文本块来源(例如,来自哪个文档的第几页),极大增强了答案的可信度。
四、 RAG技术的挑战与进阶方向
-
检索质量是天花板:
挑战: 如果第一步检索出的内容不相关或不准确,LLM即使再强大也无法生成正确答案(垃圾进,垃圾出)。"大海捞针"问题依然存在。
进阶方向:
混合搜索 (Hybrid Search): 结合基于关键词的传统搜索(如BM25)和向量搜索,应对用户查询中既有关键词又有语义的复杂情况。
查询重写 (Query Rewriting): 使用LLM先对用户的原始、可能模糊的查询进行分析和改写,生成更适合检索的、更精确的子查询。例如,将“RAG怎么样?”改写为“RAG技术的优点”和“RAG技术的缺点”。 -
分块与上下文的平衡:
挑战: “Lost in the Middle” 问题,即当上下文太长时,LLM可能只关注开头和结尾部分,忽略中间的关键信息。
进阶方向:
上下文重排 (Re-ranking): 在检索到Top-K个文本块后,再用一个更轻量的模型(Cross-encoder)对其进行重新排序,将最相关的块放在提示词的最前面和最后面。 -
处理复杂问题的能力:
挑战: 用户的问题可能需要结合多个文档、进行多步推理才能回答。
进阶方向:
迭代式RAG (Iterative RAG): 进行多轮检索-生成循环。第一轮生成初步答案,如果发现信息不足,则根据初步答案生成新的查询,再次进行检索。
RAG-Fusion: 将用户的查询改写成多个子查询,并行检索,然后将所有结果进行融合排序,再交给LLM生成答案。 -
评估的复杂性:
挑战: 如何科学地评估一个RAG系统的好坏是一个难题。
关键评估指标:
Context Precision/Recall (上下文精确率/召回率): 检索到的上下文中有多少是相关的?所有相关的上下文是否都被检索出来了?
F智算thfulness (忠实度): LLM生成的答案是否完全基于所提供的上下文,没有添加外部信息或“幻觉”。
Answer Relevancy (答案相关性): 最终答案是否直接回答了用户的问题。
RAG技术通过将检索的精准性与LLM的生成能力相结合,有效地解决了传统LLM的知识局限性问题。它不仅仅是一个单一的技术,更是一个可高度定制和优化的系统框架。从基础的“检索-生成”模式,到混合搜索、查询重写、迭代式检索等高级策略,RAG正在不断进化,成为构建可信、可靠、可控的生成式智算应用的核心基石。