简介:本文系统讲解检索增强生成(RAG)的技术原理,从概念定义、核心组成到建库与问答两大流程逐步拆解,帮助开发者理解RAG如何让大模型基于外部知识生成可靠回答,并掌握分块、嵌入、检索、生成等关键环节的设计要点与注意事项。
检索增强生成(Retrieval-Augmented Generation,简称 RAG)是一种将“外部知识检索”与“大模型文本生成”相结合的技术架构。它的核心思想是:在让大模型回答问题之前,先从预先构建的知识库中检索出与问题最相关的文本片段,再把这些片段作为上下文一并送入大模型,由大模型在给定上下文的约束下生成最终回答。
从技术视角看,RAG 是一个“检索器 + 生成器”的流水线系统;从业务视角看,它是一种让通用大模型快速具备特定领域知识的低成本方案;从使用视角看,它让用户能够针对私有文档、业务资料提问,并获得有据可依的回答。
RAG 要解决的核心问题是:大模型的参数化知识存在时效性有限、领域覆盖不足、容易产生事实性幻觉等局限。通过引入外部知识源,RAG 在不重新训练模型的前提下,显著提升了回答的准确性、时效性和可追溯性。这正是 RAG 被广泛采用的根本原因。
大模型的能力来自训练阶段学到的参数化知识,但这种知识存在三个典型瓶颈:
常见的应对方式有两种:一是继续训练或微调模型,成本高、周期长,且难以频繁更新;二是在推理阶段动态注入知识,即 RAG。RAG 的优势在于知识更新只需重建索引,无需改动模型参数,成本低、迭代快,同时检索到的原文片段可以作为回答依据,提升可解释性与可信度。
RAG 系统在工程上通常划分为两个阶段:离线建库流程与在线问答流程。前者负责把原始文档加工成可检索的知识索引,后者负责在用户提问时完成检索与生成。
建库流程的目标是把非结构化的原始文档转化为结构化的向量索引,主要包含四个步骤。
第一步:文档清洗。 原始文档往往包含乱码、多余空白、控制字符、不一致的换行符等噪声,需要统一换行符、去除控制字符、压缩多余空白,并保留段落结构感,为后续分块打好基础。示意性伪代码如下:
function clean_text(raw_text):t = normalize_newlines(raw_text) // 统一换行符t = remove_control_chars(t) // 去除控制字符t = normalize_spaces_per_line(t) // 按行压缩多余空白t = compress_blank_lines(t) // 多个空行压缩为双空行return t
第二步:文本分块(Chunking)。 受限于模型的上下文窗口与检索精度,需要把长文本切分为较小的片段。分块通常由两个参数控制:chunkSize 表示每个片段的最大长度,overlap 表示相邻片段的重叠长度。重叠的设计是为了保证跨块边界的上下文连续性,避免关键信息被切断。常见做法是先按空行分段,段内再按长度切分。示意性伪代码如下:
function split_into_chunks(text, chunkSize=1000, overlap=100):paras = split_by_blank_lines(text)chunks = []for para in paras:if length(para) <= chunkSize:chunks.push(para)else:start = 0while start < length(para):end = min(start + chunkSize, length(para))chunks.push(para.substring(start, end))start = end - overlap // 重叠保证上下文连续return chunks
第三步:向量化(Embedding)。 使用嵌入模型把每个文本片段转换为固定长度的高维向量。向量化的意义在于把“语义相似性”转化为“向量空间中的距离”,使后续可以基于向量距离快速找到语义相关的片段。嵌入模型可以选择云端提供的多模态嵌入能力,也可以选择本地部署的嵌入模型,关键在于建库与查询必须使用同一个嵌入模型,以保证向量空间一致。
第四步:写入向量索引。 将片段向量连同其原始文本、标识与元数据(如来源、章节、时间等)一并写入向量索引,形成可供相似度检索的知识库。元数据的价值在于支持过滤检索,例如限定只在某些文档类型或时间范围内查找。
问答流程的目标是在用户提问时,快速找到相关片段并生成回答,主要包含三个步骤。
第一步:问题向量化。 使用与建库阶段相同的嵌入模型,把用户问题转换为查询向量。
第二步:相似度检索。 在向量索引中计算查询向量与各片段向量的相似度,返回最相似的若干片段(通常称为 Top-K)。必要时可结合元数据过滤或关键词检索进行混合召回,以提升召回质量。
第三步:上下文组装与生成。 把检索到的片段按一定策略拼接为上下文,连同用户问题一起构造提示词送入大模型,由大模型在上下文范围内生成回答。提示词中通常会明确要求模型优先依据上下文作答,并在上下文不足时说明无法回答,以降低幻觉风险。
把两个流程串联起来,一次完整的 RAG 问答可以描述为:用户提出问题 → 问题被嵌入为查询向量 → 向量索引返回最相似的若干片段 → 片段作为上下文与问题一起送入大模型 → 大模型基于上下文生成回答。
用类比来理解:检索环节相当于“从书架上翻出几页相关内容”,生成环节相当于“阅读这几页并写出一段答案”。检索负责“找得准”,生成负责“答得好”,两者分工明确、互相配合。
RAG 适合以下类型的使用场景:
RAG 与微调的区别:微调通过更新模型参数把知识“写入”模型,适合改变模型的输出风格或注入相对稳定的领域能力,但更新成本高;RAG 在推理阶段动态注入知识,知识更新只需重建索引,适合频繁变化的事实性知识。两者并不互斥,可以结合使用。
RAG 与纯向量数据库检索的区别:向量检索只是 RAG 的一个环节,RAG 还包含分块策略、上下文组装、提示词设计与生成控制等工程要素,是一个完整的端到端流程。
在实际落地 RAG 时,需要重点关注以下问题:
chunkSize 与 overlap。RAG 是一种通过“先检索、后生成”把外部知识动态引入大模型的技术架构,其本质是在模型参数之外构建一个可更新、可追溯的知识层。它以离线建库与在线问答两大流程为核心,通过清洗、分块、嵌入、索引、检索与上下文生成等环节协同工作,在不大幅改动模型的前提下提升回答的准确性、时效性与可信度。理解 RAG 的关键,在于把握“检索负责找得准、生成负责答得好”的分工逻辑,并在分块策略、嵌入一致性、召回质量与幻觉抑制等工程细节上持续打磨,才能让这一架构真正服务于业务场景。