1. 什么是 RAG?
RAG(Retrieval
(检索)- Augmented
(增强)- Generation
(生成)) 是一种结合了传统信息检索系统(例如数据库)的优势与生成式大语言模型 (LLM)的功能结合在一起的AI框架。该技术通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等,它的核心思想是通过检索外部知识库中的信息来增强生成式模型的输出,从而提升模型的准确性和上下文相关性。
适用场景
- 问答系统:从大量文档中检索信息并生成回答。
- 知识增强对话:基于外部知识库生成更准确的对话内容。
- 文本生成:生成基于特定领域知识的文本。
2. 为什么要学RAG
假设我是一个刚入职的新能源汽车销售,客户买车时会问出很多的问题,但公司对于不同车型的资料堆成山,我根本记不住。这时,我有两个选择:
- 死记硬背:熬夜背完所有文件(这就是普通AI,比如ChatGPT纯背数据)
- 带个检索小助手:当客户问我提问时,让助手快速查资料,然后照着资料回答(这就是RAG!)
RAG技术的核心:让AI学会先查资料再回答
3. RAG是如何诞生的
这就不得不提到AI系统的困境:
-
生成模型(如GPT)的固有缺陷
- 依赖训练时的静态知识库,无法获取实时信息
- 面对专业领域问题时存在事实性错误风险
- 参数化记忆导致答案不可溯源
-
检索系统的能力局限
- 仅返回相关文档片段,缺乏逻辑整合
- 未与语义理解深度结合,精准度受限
- 无法基于上下文动态优化结果
为了解决问题有了技术突破:检索与生成的范式融合 RAG
4. RAG的工作原理
1.离线知识库的构建
从本地存储的多种格式文档(如Excel、Word、PDF等)中提取原始文本内容,通过规则(如固定长度、自然段落或语义段落)切分文本为独立文本块。随后使用Embedding向量模型将每个文本块转化为向量表示,并将生成的文本向量及其对应的原始文本块持久化存储至向量数据库中,构建可快速检索的知识库索引。
2.用户提问向量化 当用户或问答机器人提出问题后,系统通过完全相同的Embedding向量模型将问题文本转化为向量(即问题向量)。为保持数据处理一致性,该问题向量会同步存入向量数据库中,并与离线知识库的文本向量统一管理以便后续检索。
3.在向量数据库中基于相似性的上下文检索与答案生成
-
混合检索与多级排序
在向量数据库中,基于问题向量执行多阶段相似性查询:- 混合检索:结合语义匹配(向量相似度)与关键词匹配(如BM25算法),初步召回相关文本块候选集。
- 语义匹配(稠密检索):在向量数据库中以余弦相似度搜索与问题向量相近的Top N个候选文本块。
- 关键词匹配(稀疏检索):通过BM25等算法检索包含问题关键词的文本块。
- 合并结果:按权重合并两种检索模式的召回结果(如语义占70%,关键词占30%)。
- 粗排序(进行快速筛选):使用轻量级规则(如相似度阈值过滤)对合并后的候选文本块进行快速初筛,过滤低质量或低相关性的内容(如相似度得分<0.6的文本块),剔除明显不相关的内容。
- 精排序:通过计算密集型模型(计算量更大但精度更高的模型如Cross-Encoder 双塔模型)对粗排后的文本块重新排序打分,筛选出最相关的TOP N个结果(如Top 5)。
- 重排序:
- 根据业务规则对精排序的结果进行最终调整,例如:
- 优先展示特定来源(如内部文档优于外部网页)
- 合并重复内容或去除冲突信息
- 按时间排序保证最新内容优先
- 选定最相关的Top-K文本块。
- 混合检索:结合语义匹配(向量相似度)与关键词匹配(如BM25算法),初步召回相关文本块候选集。
-
提示工程与答案生成
将筛选后的文本块按预设模板与原始问题打包给提示词模板,生成结构化提示词输入大语言模型(如GPT、LLM等),利用模型的知识推理能力生成自然语言答案,最终返回至用户端。
PS:对文档处理的向量模型和对问题处理的向量模型都必须同一个向量模型
上面说到了语义匹配(稠密检索)与关键词匹配(稀疏检索)这里再详细说一下好处与坏处:
-
稠密检索(Dense Retrieval)
-
核心逻辑:
使用Embedding模型将问题与文档块映射到同一向量空间,通过计算 余弦相似度 召回语义相关的Top N候选块。 -
优势:
- 语义泛化能力:可召回相似含义但未共享关键词的内容(如“计算机”-“电脑”)。
- 抗同义词干扰:对问题表述差异(如缩写、俚语)更鲁棒。
-
缺点:
- 黑盒性:无法直观解释检索结果与问题的关联。
- 长尾关键词失效:冷门或技术术语未充分训练时效果下降。
-
-
稀疏检索(Sparse Retrieval)
-
核心逻辑:
使用基于词频-逆文档频率(TF-IDF)改进的 BM25算法 进行关键词匹配,筛选包含问题关键字的文档块。 -
优势:
- 精确匹配:对关键词敏感(如产品型号“iPhone 15 Pro”)。
- 可解释性:检索结果可直接关联问题中的显式关键词。
-
缺点:
- 语义鸿沟:无法匹配同义词、近义词或抽象表述。
- 分词准确性依赖:分词错误导致召回失败(如未识别复合词)。
-
5.向量
1.向量基本概念
向量是数学和物理学中的一个基本概念,具有方向和大小的量。一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。
2.二维向量与三维向量
二维空间中的向量可以表示为 ,表示从原点 到点 的有向线段。
以此类推,我可以用一组坐标 表示一个 维空间中的向量, 叫向量的维度。
3.文本向量(Text Embeddings)
将文本转成一组 $N$ 维浮点数,即**文本向量**又叫 Embeddings向量之间可以计算距离,距离远近对应**语义相似度**大小
4.文本向量是怎么得到的?
文本向量通过向量模型将文本转化为数值向量得来,其核心目标是捕捉语义信息以便计算机处理。
5.向量模型是怎么来的?
向量模型是采用双塔模型训练出来的,其核心思想是将两个输入(如查询与文档)通过独立的编码器映射到同一向量空间,再通过相似度计算进行匹配。
- 构建相关(正例)与不相关(负例)的句子对样本
- 训练双塔式模型,让正例间的距离小,负例间的距离大
假设SentenceA="我在喝水";SentenceB="我在逛街"; 训练最后得出来的向量会很大,他们在空间中距离会很远因为这两句话没有太大关联
目前较好用的模型:www.sbert.net
6.向量间相似度的计算
欧式距离: 在多维空间中,两个向量点之间的直线距离的长短
余弦距离: 测量两个向量在方向上的相似性,与向量长度无关(说人话就是测量两个向量之间夹角)这里的θ就是两个向量之间的夹角。余弦相似度的取值范围在-1到1之间,值越接近1,说明两个向量的方向越接近,夹角越小;相反,值越接近-1,方向越相反,夹角接近180度
6.向量数据库
1.传统数据库的局限性
- 无法理解非结构化数据的意义。
- 无法有效搜索或分类复杂的文档、音频和图像数据。
2.向量数据库的优势
- 用于存储、索引、查询和检索高维向量数据。
- 特别适合处理非结构化数据(如图像、音频、Word、Pdf等)。
- 实现传统数据库难以完成的高级分析和相似性搜索,是专门为向量检索设计的数据库。
向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding) 算法转变为向量数据,然后存储在Chroma等向量数据库中。当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。
3.向量数据库的核心特性
1.数据表示:
数据以向量形式存储,捕捉语义和上下文。
每个向量由ID(唯一标识)、维度(数值表示)、有效负载(元数据)组成。
ID(唯一标识)
-
作用:作为向量的“身份证”,确保全局唯一性。
-
场景
- 用于快速寻址(如通过ID直接更新/删除向量);
- 保障数据一致(如避免高维空间相似向量冲突)。
维度(数值特征向量)
-
作用:表征数据特征的数学抽象(如文本嵌入、图像特征)。
-
技术细节:
- 维度数:通常几百到上千维(如BERT输出768维向量);
- 存储优化:通过量化(Product Quantization)或降维(PCA)减少存储压力;
- 计算加速:结合索引结构(HNSW、IVF-PQ)提升相似性检索速度。
有效负载(Payload,元数据)
-
作用:关联业务属性的键值对,增强查询的语义约束。
-
应用场景
- 混合查询:如“搜索与用户浏览记录相似(向量)且价格<100元(payload)的商品”;
- 数据过滤:用元数据预筛候选集(如仅检索某类别的图像)
距离度量:
欧几里得距离、余弦相似性、点积等方法衡量向量间相似性。
存储方式:
存储方式的设计直接影响数据的访问效率和存储成本平衡,尤其是处理海量高维向量时,向量数据库通常采用双层(或分层)存储架构: 支持基于RAM的快速访问和基于磁盘的高效存储(内存映射)。
1. 分层存储的核心逻辑
-
RAM(内存)层
- 功能:存储索引和热数据(高频访问的向量或部分载入的索引结构)。
- 优势:微秒级访问速度,适合实时查询(如在线推荐)。
- 挑战:内存容量有限,成本高昂。
-
磁盘层
- 功能:存储全量数据及冷数据(低频访问的向量和索引持久化)。
- 优势:支持大容量存储(百亿级向量),成本低。
- 挑战:访问延迟(毫秒级)较高,需通过内存映射或缓存优化。
两种存储方式对比
设计本质
在不同存储介质间建立动态协作规则:
-
短期目标:通过内存加速高频访问路径;
-
长期目标:通过磁盘实现成本可控的持久化存储。
最终在低延迟、高吞吐和低成本中取得平衡。
澄清几个关键概念
- 向量数据库的意义是快速的检索;
- 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
- 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。
主流向量数据库功能对比
- Milvus: 开源向量数据库,同时有云服务 milvus.io/ 目前GitHub上Start最多
- Qdrant: 开源向量数据库,同时有云服务 qdrant.tech/
- FAISS: Meta 开源的向量检索引擎 github.com/facebookres…
- Pinecone: 商用向量数据库,只有云服务 www.pinecone.io/
- Weaviate: 开源向量数据库,同时有云服务 weaviate.io/
- PGVector: Postgres 的开源向量检索引擎 github.com/pgvector/pg…
- RediSearch: Redis 的开源向量检索引擎 github.com/RediSearch/…
- ElasticSearch 也支持向量检索 www.elastic.co/enterprise-…
7.RAG进阶:文本的切割粒度
1.什么是文本的切割粒度
反映文本切割后各单元的语义独立性与上下文完整性,会决定原始文本被切成多大的块。它会直接影响后续的 检索质量 和 生成结果精准度。
通常分为:
-
粗粒度
以段落、章节或长文本序列(如500-1000 tokens)为单位,保留宏观语义结构。 -
细粒度
以句子、子句或短文本片段(如50-200 tokens)为单位,聚焦微观语义单元。举个🌰:你有一篇3000字的《新能源汽车选购指南》文章:
-
粗粒度切割 → 切成3块,每块1000字
(类似大排骨,连骨带肉一起炖) -
细粒度切割 → 切成100块,每块30字
(剁成肉末,适合炒饭)“粒度”就是切块大小的精细程度。
2.不同粒度如何影响效果?
依旧以《新能源汽车选购指南》做例子
(1) 过粗的粒度(块太大)
-
好处:保留完整上下文(比如完整的技术参数解释)
-
问题:
- 检索时会召回太多无关内容(例如用户问“续航里程”,但块里还包含电池材料科普)
- 块中的噪声多,答案定位困难(像在大盘菜里找肉丁)
(2) 过细的粒度(块太小)
-
好处:检索更精准(每块内容聚焦)
-
问题:
- 上下文缺失(比如切断了“特斯拉Model Y的续航里程为660公里”这句的前后说明)
- 容易遗漏关键信息(像芝麻撒一地,捡起来费劲)
✅ 理想的切割效果是:
切割后,每块能 独立支撑回答问题,同时 保留必要的关联信息。
3.如何达到理想的切割效果呢?
继续以《新能源汽车选购指南》为例子假设指南里面有以下原文段落:
新能源汽车的电池技术是选购关键。以比亚迪的「刀片电池」为例,其通过结构创新提升了能量密度,同时保障安全性;特斯拉的「4680 电池」采用无极耳设计,支持快速充电,10分钟可补充300公里续航;蔚来的「固态电池技术」则处于试验阶段,未来有望突破续航瓶颈。此外,需注意电池质保政策(如比亚迪提供首任车主终身质保),并关注低温环境下的续航衰减问题。
1.最大化信息密度(最小化噪声)如何正确切割文本
-
核心意义:在切割文本时,确保每个文本块(chunk)包含尽可能密集的有用信息(例如完整的事件、概念或关键论点),同时排除无关内容(噪声)。
-
实现方式:
- 避免切割后的文本块过于零碎(例如按固定字符长度无脑切割),这可能导致片段脱离上下文,失去实际意义。
- 优先按自然语义边界切割(如段落、章节或逻辑结构),保证每个块独立承载有效的信息。
错误的切割方式
若按固定长度(如每段50字)切割:
块1: 新能源汽车的电池技术是选购关键。以比亚迪的「刀片电池」为例,其通过结构创...
块2: ...新提升了能量密度,同时保障安全性;特斯拉的「4680 电池」采用无极耳设计...
块3: ...支持快速充电,10分钟可补充300公里续航;蔚来的「固态电池技术」则...
-
问题:
- 块1被切断在“结构创”,块2以“新提升”开头,语义断裂。
- 用户检索「刀片电池的特点」时,可能仅返回块1的一部分信息,缺失关键描述。
正确的切割方式
按自然语义边界切割(围绕完整主题):
块1: 新能源汽车的电池技术是选购关键。以比亚迪的「刀片电池」为例,其通过结构创新提升了能量密度,同时保障安全性。
块2: 特斯拉的「4680 电池」采用无极耳设计,支持快速充电,10分钟可补充300公里续航;蔚来的「固态电池技术」则处于试验阶段,未来有望突破续航瓶颈。
块3: 需注意电池质保政策(如比亚迪提供首任车主终身质保),并关注低温环境下的续航衰减问题。
-
优势:
- 每个块独立解释一个核心主题(比亚迪技术、特斯拉/蔚来技术、质保与续航问题);
- 信息密度高,噪声少(无断裂术语或未完成的句子),便于检索时精准召回。
2. 重叠区缓冲关键实体的分割风险
-
核心意义:防止关键信息(如人名、专有名词、技术术语等)因切割位置不当而被分割到不同块中,导致检索时丢失关联。
-
实现方式:
- 在相邻文本块之间设置一定的内容重叠(例如前一个块的末尾和后一个块的开头部分重复)。
- 通过重叠区,确保即使切割点在关键实体附近,该实体仍能同时在相邻块中出现,降低语义断裂的风险。
假设原块2和块3的切割点如下:
块2结尾: ...蔚来的「固态电池技术」则处于试验阶段,未来有望突破续航瓶颈。
块3开头: 需注意电池质保政策(如比亚迪提供首任车主终身质保)...
- 风险:用户若检索「蔚来固态电池的质保政策」,由于“质保”仅在块3提到,而“蔚来”在块2结尾,两块无重叠时可能漏检关联。
通过重叠区缓解风险
在块2和块3之间设置一定重叠(例如重复最后两句):
块2结尾: ...未来有望突破续航瓶颈。需注意电池质保政策(如比亚迪...
块3开头: 蔚来的「固态电池技术」则处于试验阶段,未来有望突破续航瓶颈。需注意电池质保政策(如比亚迪...
-
效果:
- 即使切割点在「蔚来固态电池」附近,重叠区确保其同时出现在块2和块3中;
- 用户检索「蔚来的质保政策」时,块3会触发,同时块2的「蔚来」信息也连带关联,避免语义断层。
3. 切割策略动态选择
根据文本类型选择底层分割方法:
文本类型 | 推荐分割方法 | 参数配置示例 |
---|---|---|
高结构化文本 | 基于显式标记的分割 | 法律合同按条款 标记切分,MD文档按## 标题 分割 |
半结构化文本 | 正则表达式+递归分割 | 按\n\n 分割段落,失败时按句号递归切割 |
非结构化文本 | 语义相似度动态切割 | 用Sentence-BERT计算相邻句子相似度,低于阈值时切割 |
文本的结构化程度越高,文档越像填空题表格;非结构化文本像自由作文。这是根据文本自身的格式规则清晰度划分的
1. 高结构化文本 → 一眼就知道怎么切
特征:有严格的预定义格式标记,类似Excel表格
典型场景:
✅ 法律条款(Article 1: ...)
✅ 产品规格参数表
✅ 带编号的学术论文(Fig.1, Table 2)
✅ Markdown/HTML文档(#标题、粗体)
一刀切法:按显式标记切分
▸ 使用工具:正则表达式(精准匹配标记)
2. 半结构化文本 → 有线索但不明显
特征:存在部分格式暗示但不严格,像一份调研问卷
典型场景:
✅ 带标题但段落不规则的报告
✅ 邮件正文(有标题但内容自由)
✅ 访谈记录(A: ... B: ...交替)
灵活切法:多层分割策略
- 先用明显标记试切(如空行
\n\n
) - 失败时降级按逗号/句号切分
3. 非结构化文本 → 随心所欲的自由体
特征:毫无格式约束,如聊天记录、小说
典型场景:
✅ 小说/散文(纯文字无标题)
✅ 社交媒体评论
✅ 手写笔记
✅ 各种PDF、Word、Excel的文档
学霸切法:根据语义(意思)自然切割
▸ 技术核心:计算句子之间的相似度(前面说的向量的那些操作)