RAG,Retrieval-Augmented Generation,检索增强生成,是目前最常用的 AI 问答方案之一。它的核心思路是:先从资料库里检索相关的内容,再基于这些内容来生成答案——先检索,再生成。
RAG 会把文档切分成多个片段。当用户提出问题后,系统就用这个问题在所有片段中寻找相关内容。比如在一份上百页的产品手册中,可能只有三个片段真正和用户的问题相关,系统就把这三个片段拿出来,和用户的问题一起发给大模型。这样模型就只会感知三个相关片段,而不是整个文档。
通常来说,RAG 分为两大部分:
数据的准备部分:发生在用户提问前,把相关文档准备好并完成预处理,包含分片和索引两个环节。
回答部分:发生在用户提问后,会触发回答问题的各个环节,分别是查询处理、召回、重排和生成。
一、分片(Chunking)
分片就是把文档切分成多个片段。分片可以按照字数来分(比如 1000 个字一个片段),可以按照段落来分(一个段落一个片段),或者是按照章节分、按照页码分,有很多种切分方式。但无论怎么切,最终都需要把一篇文档切成多份。
在实际操作中,相邻片段之间通常会设置一定的重叠区域(比如前后各重叠 50~200 字)。这是因为如果恰好在一个关键句子的中间切断,会导致上下文断裂,模型无法理解。重叠可以显著降低这种边界损失。
二、索引(Indexing)
索引是将处理好的片段构建成可高效检索的数据结构的过程。最常见的是用 Embedding 模型生成向量并构建向量索引(如 HNSW 等 ANN 索引结构),但同时也可能构建关键词索引(如 BM25)、元数据索引(如文档来源、时间、类别、权限标签等),便于后续过滤和溯源。
1.向量索引(如HNSW)——按意思找书,假设走进一个图书馆,想找一本讲人工智能怎么帮助医生看病的书,向量索引就像是图书馆把每本书的内容提炼成一个“味道”,当你说“AI 辅助医疗”,系统也能把你的话变成一个“味道”,然后在书库里找“味道”最接近的书。HNSW/ANN可以理解成,图书馆提前把书按“味道相似度”分好了区,一说需求,就能把你带到最可能相关的那个区域,找的是“意思相近”,即是关键词不一样也能找到。
2.关键词索引(如BM25)——按“字眼”找书,就像传统的书名或者目录卡片索引,想找“人工智能”,它就去找书名、目录、正文中明确出现了“人工智能”四个字的书,出现次数越多、位置越重要。特点是找“字眼匹配”,非常精准。
3.元数据索引——按“标签”过滤,每本书进图书馆时,都会贴一些标签:这本书是哪个出版社的?哪一年出版的?属于医学类还是计算机类?这本书的阅读权限是什么(公开/内部/机密)?元数据索引就是把这些标签整理好,方便你快速过滤。特点是不判断内容相不相关,而是帮你快速排除不需要的,还能溯源。
实际 RAG 系统里,这三个往往是配合着用的:先用元数据索引过滤掉你没权限看的、时间不对的文档;同时用向量索引找语义相关的,用关键词索引找精确匹配的;最后把两边的结果合并,一起进入重排和生成。这样既能理解你的意思,又不会漏掉关键的专业名词,还能保证数据来源可靠。
三、向量与 Embedding
向量从概念上来讲,是有大小和方向的量,通常用数组来表示。每个向量都有维度,维度的大小等于数组中数字的个数。低维度的向量可以直接在坐标轴里画出来,而 RAG 里面用到的向量维度通常比较大(常见 768、1024、1536 维等)。高维空间能容纳更丰富的语义信息,但向量所包含的信息丰富程度主要取决于 Embedding 模型的质量和训练方式,而非单纯由维度大小决定。
Embedding 就是把文本转换为向量的过程,由预训练好的 Embedding 模型完成。
以"爱丽丝喜欢吃水果"为例,假设对应的向量是 [1, 2],"爱丽丝爱吃水果"是 [1, 1],"天气真好"是 [-3, -1](实际维度远高于 2,这里仅为示意)。前两个句子的向量很接近,说明它们语义上是相近的;而后者完全不相关。含义相近的文本在经历 Embedding 之后,对应的向量在空间中也是相近的。
当用户询问"爱丽丝爱吃什么"的时候,系统会先把问题做个 Embedding,转化为向量,然后根据向量相似度把与这个问题相关的文本找出来。常见的相似度计算方式包括余弦相似度(最常用)、欧氏距离和点积。余弦相似度计算两个向量夹角的余弦值,值越接近 1,夹角越小,语义相似度越高;欧氏距离则计算两个向量之间的直线距离。
夜雨聆风