RAG技术:从向量检索到分块策略的大白话解析
目录
想象一下,你把一本厚重的技术手册直接扔给AI,然后问它:“配置参数X是多少?”如果AI没有“过目不忘”的本事,它该如何在茫茫字海中精准定位答案?
这就是RAG(检索增强生成)要解决的核心问题。
一、 核心原理:万物皆可“向量化”
AI无法像人类一样理解文字的字面含义,它只能通过数学来“感知”语义。RAG的第一步,就是利用Embedding模型(嵌入模型)将文字转化为机器能读懂的“坐标”。
-
语义的数学表达
Embedding模型的作用是将一段文本映射到高维向量空间中。
-
输入:一段文字(如“IT陈喜欢吃西瓜”)。
-
输出:一个多维数组(向量),例如
[0.12, -0.98, 0.55, ...]。
在这个高维空间里,语义相似的内容,其向量坐标的距离会非常近。
-
“猫”和“狗”的向量距离,会比“猫”和“汽车”的距离更近。
-
检索的本质:计算距离
当用户提问时,RAG系统会执行以下操作:
-
将用户的问题也转化为一个向量。
-
在向量数据库中,计算这个问题向量与库中所有文档片段的相似度(通常使用余弦相似度或欧氏距离)。
-
取出距离最近的Top-K个片段,作为“上下文”喂给大模型。
二、 数据预处理:分块策略的艺术
现实中的文档往往长达数千页,直接将其转化为一个向量会导致信息过于稀释,且超出模型的上下文窗口限制。因此,我们需要Chunking(文本分块)。
-
为什么要切分?
-
精度控制:如果文档太长,检索回来的内容可能包含大量无关噪声。切分得越小,检索越精准。
-
成本控制:大模型的上下文窗口(Context Window)是有限的,我们需要只喂给它最相关的片段。
-
常见的分块方式
-
固定大小切分:按字符数或Token数强行切分(如每500字一段)。
-
按结构切分:按段落、标题或Markdown层级切分。
-
按语义切分:利用算法识别句子边界,尽量保持语义完整。
三、 核心痛点:分块带来的“语义截断”
虽然分块是必须的。无论采用哪种策略,都难以完美适配所有复杂场景,最典型的问题就是上下文丢失。
-
指代关系的断裂
让我们看一个具体的例子:
原文:“我是IT陈。我喜欢吃西瓜。”
如果我们简单地按句子进行切分:
-
块A:“我是IT陈。”
-
块B:“我喜欢吃西瓜。”
当用户询问“IT陈喜欢吃什么?”时,系统会将问题向量化。此时,块B中的“我”失去了与块A中“IT陈”的指代联系。在向量空间中,“我喜欢吃西瓜”与“IT陈喜欢吃什么”的语义距离可能会变远,导致检索失败。AI只看到了“喜欢吃西瓜”,却不知道这个“我”是谁。
-
全局视角的缺失
RAG本质上是“管中窥豹”。如果用户问:“这篇文章里一共出现了多少次‘我’字?”或者“请总结全书的核心思想”,基于局部切片的检索往往无能为力,因为它缺乏对文档整体的全局视野。
四、 进阶优化:如何修补RAG的短板?
针对上述缺陷,业界已经演化出了多种优化策略,让RAG更加智能。
-
上下文窗口扩展
为了解决指代丢失问题,我们在切分时不能“一刀切”,而要采用滑动窗口或重叠切分:
-
重叠策略:在切分块A和块B时,保留一部分重叠内容(如50个字符)。这样,“我是IT陈”这句话可能会同时出现在块A的结尾和块B的开头,保证了语义的连贯性。
-
父子索引:检索时匹配小块(精准),但送给大模型时使用包含该小块的更大文本块(完整上下文)。
-
语义增强与重写
-
指代消解:在存入向量库之前,利用大模型对文本块进行预处理。例如,将“我喜欢吃西瓜”自动改写为“IT陈喜欢吃西瓜”,显式地补充主语,拉近向量距离。
-
假设性问题生成:让大模型阅读文本块,反向生成“这段文字能回答什么问题”,并将这些问题也存入向量库,提高检索命中率。
-
全局检索增强
针对“全文总结”类问题,可以采用文档摘要索引:
-
为每个文本块生成一个摘要。
-
为整篇文档生成一个高层级的摘要。
-
检索时,先匹配高层摘要,再下钻到具体细节,从而赋予RAG“上帝视角”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)