
前言
如果你想做一个智能的
知识客服或者搭建一个能够回答问题的知识库,那就必须使用一门技术:RAG,全称Retrieval-Augmented Generation 即:检索增强生成
什么是 RAG
RAG(Retrieval-Augmented Generation)检索增强生成, 是一种结合了信息检索和文本生成的 AI 框架。它允许大模型在生成文本之前,先从外部知识库检索相关信息,并将这些信息作为上下文输入到模型中。其本质上也就是做了两件事情:
- 从目标资料库中 
检索相关内容 - 基于这些内容来 
生成答案 
所以说它是先检索,后生成!
RAG是目前最常用的AI问答方案之一,大部分企业内部的知识助手、智能客服基本都是基于这项技术
场景举例
公司需要上线一款智能客服,它能够精准回答关于公司产品的问题,该如何实现?
1. 需要有一个大模型,比如:GPT-4o, deepseek等
你可能会想只要有了大模型就可以能实现一个客服问答:在问答时候直接将产品相关手册、文档一并发送给大模型即可。
我们通常使用deepseek或者第三方问答系统(如:元宝,豆包)最简单的方式
是的,这也是一种解决方案! 但是,如果手册、文档很大比如几百上千页?那么就会带来很多问题:
模型可能无法读取所有内容: 模型存储信息有限(上下文窗口大小),超过限度就会内容丢失模型推理成本增高: 输入量(token)越高,成本就会越高模型推理速度变慢: 输入量越高,模型需要理解、推理的内容越多,输出就会变慢
为了避免以上问题,我们考虑把文档相关内容发送给模型,那就需要RAG
2. 用户输入问题和携带的文档接收
3. 将文档切分为多个片段并选择与问题相关的几个片段
4. 将用户的问题和选择的几个片段一起发送给大模型
以上四步就是RAG的基本链路。 当然这里边隐藏了许多细节比如:如何分片(切分文档)、如何选择相关片段等等
整体流程
准备阶段

分片
顾名思义即把文档切分为多个片段,通常分片的方式有很多种:
按照字数切分按照段落切分按照章节切分按照页码切分......
分片的质量会影响后续答案的生成!
索引
- 通过 
Embedding将文本片段转换为向量 - 将文本片段和片段向量存入
向量数据库中 
向量有大小和方向的量(数学概念),通常用数组(Array)表示,比如:[1.1, 2.3, 5.87, 11.2, -9.7]。
- 一维向量:
[1.8] - 二维向量:
[-2.9, 5.3] - 三维向量:
[1.1, 2.3, 5.87] - 多维向量:
[1.1, 2.3, 5.87, ...] 
Embedding是将文本转换为向量的过程。 接下来以二维向量为例来展示

向量
u 和 v 相距比较接近,对应的(张三喜欢吃水果)和(张三爱吃水果)两个句子语义比较接近!向量
w 差距很大,对应的语义不相关。结论:语义相近的文本在经历
Embedding之后,他们对应的向量也是比较接近的。
当用户问 “张三喜欢吃什么”时,首先做Embedding将其转换为向量 a,然后根据向量距离(相似度)找到与问题相关的文本,最后把相关的文本和用户问题(Prompt)一起扔给大模型。大模型就告诉我们张三喜欢吃水果
- 
Embedding通常是由模型来完成的。它不是常规的 GPT-4o, deepseek 等模型,而是专门的Embedding模型。
关于 Embedding 模型排行可以访问: Embedding 模型排行 
向量数据库用于存储和查询向量的数据库,它提供了计算向量相似度等相关函数,方便我们使用向量。用户提出问题通过Embedding得到向量,然后将向量和原始文本(用于抽取)存入向量数据库。
回答阶段

召回
搜索与用户问题(Prompt)相关的片段。通过向量数据库计算向量相似度检索出与问题最为相关的一组(N个)片段内容。搜索出一组片段过程称为召回
向量相似度通常计算方法:余弦相似度、欧氏距离、点积等。点击了解更多
重排
与召回类似,重排也是从多个片段中挑选三个与用户问题(Prompt)相关的片段,不同之处在于重排是从召回结果中挑选出三个与用户问题(Prompt)最为相关的片段
你可能会想直接在召回阶段挑选三个与用户问题(Prompt)相关的片段不就可以了吗,这样就不需要进行重排了。
这样做当然可以,但是效果可能就不是太好。原因是召回和重排使用的文本相似度计算逻辑是不同的!
类比为:召回是简历筛选;重排精准面试。

生成
生成答案的过程:通过将用户的问题和三个与用户问题(Prompt)最为相关的片段发送给大模型,大模型根据片段内容生成最终答案。
总结
RAG是大模型在生成文本之前,先从外部知识库检索相关信息,并将这些信息作为上下文输入到大模型中。
突破了模型自身知识局限性同时降低模型生成不准确或者虚假信息的可能性
- 
准备过程
Step1 - 
回答过程
Step2 

