rag20问-1
1、什么是 RAG 检索增强生成?它解决了大模型的哪些问题?
rag 是一种结合了信息检索和内容生成的 ai 技术架构,简单来说就是让 ai 在回答问题之前先去查资料,基于查到的真实信息来生成答案,而不是完全依赖训练时学到的知识。rag 主要解决了大模型:a、知识时效性 b、幻觉问题 c、私有 / 专业领域知识
2、RAG 的完整工作流程是怎样的?核心步骤有哪些?
a、文档收集和切割
b、向量转换和存储:用 embedding 模型把每个文档块转换成向量,存入向量数据库
c、查询和检索,返回 top-k 个最相关的文档
d、增强和生成:把检索到的文档和用户问题组合到一起,构造一个完整的 prompt,发送给大模型
3、RAG 为什么需要向量数据库?它和传统数据库有什么区别?
向量数据库专门为存储和搜索高维向量而设计,能快速找到跟查询向量最相似的向量,这正是 rag 检索环节需要的能力。
向量数据库的优势在于专门的索引结构,它使用 HNSW、IVF 等索引算法,能在千万甚至亿级别向量中快速找到最相近的。传统数据库要遍历所有计算距离,O(n) 的复杂度,向量数据库通过索引,复杂度能降到 O(logn) 甚至更低。
其中,HNSW 构建了一个分层的图结构,检索时从粗到细逐层搜索,速度快且准确度高,IVF 先把向量聚类,检索时只在相关的几个聚类中搜索,速度更快但可能牺牲一些准确度;
4、RAG 中如何计算文本相似度?常见算法有哪些?
余弦相似度:计算两个向量之间的夹角,角度越小,相似度越高。余弦相似度在 -1 到 1 之间,1 表示完全相同,0 表示无关,-1 表示无关,余弦相似度的优点是不受向量长度影响,只看方向,这在文本相似度的计算中和合适;
欧式距离:计算两个向量在空间中的直线距离,距离越小越相似;欧式距离的问题是受向量长度影响,在高维空间中可能不稳定,所以在 rag 中用的比较少;
点积:就是把这两个向量对应的位置的数字相乘再求和,点积越大,相似度越高,如果向量都是归一化的(长度为 1),点积和余弦相似度其实是等价的;
相似度阈值的设置很重要,设定太高可能检索不到足够的文档,设定太低可能引入太多不想关的噪音;
在海量向量中计算相似度,即使是简单的点积,计算量也很大,这就是为什么需要向量索引,它通过预先构建的数据结构,避免逐一计算所有向量的相似度,hnsw、ivf 等索引算法本质上都是在速度和准确度之间找平衡
5、RAG 系统中为什么要进行文档切割?有哪些切割策略?
a、模型的上下文窗口限制
b、检索精度的质量,如果不切割,检索的粒度就是整个文档,切割后可以有效提升信息密度
c、一个向量要表示的内容越多,信息越复杂,向量就越难准确表达
切割策略:按字符数切割、以自然段切割、按句子切割、ai 语义分割
5.5、rag 中文档切割的 chunk_size 和 overlap 应该如何设置?
chunk_size 决定每个文档块包含多少字符,通常设置的范围在 500 - 2000,500-800 字符适合信息密度高、结构清晰的文档,比如技术文档、FAQ;1000 - 1500 适合大多数场景;1500 - 2000 适合需要更多上下文的内容,比如故事叙述、学术论文
chunk_overlap 决定相邻块之间重叠多少字符,目的是避免关键信息被切在边界上,通常设置 chunk_size 的 10%-20%
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""]
)
chunks = splitter.split_text(document)
6、如何构建和使用向量索引?HNSW 和 IVF 有什么区别?
没有索引,检索需要遍历所有向量计算相似度,复杂度 O(n),有了索引,复杂度可以降到 O(logn) 甚至更低;
构建索引的基本流程:先把向量数据导入数据库,然后选择索引类型和参数,数据库会构建向量分布构建索引结构;索引构建完成后,检索时数据库会利用索引快速定位相似向量,而不是暴力搜索;
hnsw 构建了一个分层的图结构,每层是一个小世界网络,检索时从最顶层开始,快速缩小范围,然后逐层向下,最终在底层精确搜索,有点事检索速度快,准确率高,缺点是构架索引慢、占用内存较多,适合检索频率高、对准确率要求高的场景;
ivf 先把向量聚类成多个区域,检索时先找到最可能的几个区域,然后只在这些区域内搜索,ivf 的优点是构建快、占用内存小,缺点是准确率略低,因为目标向量可能不在被选中的区域,适合超大规模数据、对准确率要求不是那么高的场景;
hnsw 的主要参数 M(每个节点的连接数)和 efConstruction(构建时的搜索范围),M 越大,检索越准确但构建越慢、内存越多,IVF 的主要参数时 nlist(聚类数量)和 nprobe(检索时探查的聚类数),nlist 越大,聚类越精细;nprobe 越大准确率越高但越速度越慢;
索引的维护也是一个问题:hsfw 支持增量更新,但性能逐渐下降,定期重建索引效果更好,ivf 的更新相对简单,但聚类可能需要调整,要在数据新鲜度和索引性能之间平衡;
7、RAG 系统如何利用元数据过滤提升检索精度?
元数据时文档的附加信息,比如文档类型、创建日期、作者、部门、标签等,在 rag 系统中,元数据过滤是指在向量检索的基础上,增加元数据条件限制,让检索结构更精准;
元数据过滤的工作方式时组合查询,用户提问时,除了语义检索,还可以指定元数据条件,比如“查找 2024 年的技术文档”,系统会在向量检索的同时,只返回 year = 2024 且 type = 技术文档的结构,这样能大幅减少不相关的文档,提高精确度;
常见的元数据包括时间维度、分类维度、内容维度,权限维度,设计元数据时要考虑实际检索需求,不是越多越好;
8、如何处理 RAG 检索不到相关文档的情况?
a、诚实告知
b、查询改写重试。用 ai 改写 query,换个角度或补充信息后重新检索
c、降低阈值,扩大范围
d、提供替代方案,告诉用户没有找到相关信息,但还可以尝试...
9、RAG 中如何实现向量数据库的增量更新?
实现增量更新需要文档版本管理,给每个文档分配唯一 ID,记录它的版本号或最后修改时间,系统定期扫描文档库,比对每个文档的当前状态和数据库中的记录,如果是新文档,就添加,如果文档被删除,就从数据库中移除;
新增文档的处理最简单:加载 -> 切割 -> 向量化 -> 存入数据库,要注意的是给文档分配 ID,记录元数据,确保能跟源文件关联起来;
修改文档:先构建文档 ID 删除数据库中的旧记录(包括所有向量 chunks),然后按新增文件的流程重新处理
删除文档时要清理干净,不只是标记删除,要真正从向量数据库中移除所有相关记录,避免脏数据影响检索,要记录删除日志,以防误删需要恢复;
增量更新的监控很重要,要记录每次更新处理了多少文档,花了多少时间,有多少成功多少失败,定期检查更新日志
版本回滚机制很有用,有时候文档更新是错误的,需要回滚到之前的版本,可以保留文档的历史版本,或至少保留最近几个版本的向量数据;
对于超大规模文档库,可能需要分片处理
10、如何为 RAG 项目选择向量数据库?Milvus、Pinecone、Chroma 怎么选?
chroma 适合入门和小型项目,可以嵌入式运行,不需要单独部署服务,几行代码就可以跑起来,适合数据量在 10 万以下的场景,缺点是性能和扩展性有限,不适合生产环境的大规模应用;
pinecone 是托管式云服务,开箱即用,不需要自己运维,性能好、稳定性高、支持分布式,能处理亿级别数据
milvus 时开源的专业向量数据库,功能强大,支持分布式部署,支持十亿级别甚至更大规模的数据,适合性能要求高、数据量需要私有化部署的项目;
还有 PGVector 时 Pg 的 向量扩展
11、RAG 系统如何标注信息来源和提供引用?
a、元数据保存阶段:在向量化文档时,要保存文档的来源信息,包括文件名、url、页码、章节、作者、日期等,这些元数据跟向量一起存储,检索时会连同文档内容一起返回;
b、prompt 引导阶段,在构建 prompt 时要明确要求模型标注来源
c、前端展示阶段
12、RAG 为什么需要重排序 Reranking?如何实现?
13、如何评估 RAG 系统的效果?检索和生成分别看哪些指标?
14、如何减少 RAG 系统的幻觉问题?有哪些实用方法?
15、什么查询扩展?为什么在 RAG 应用中需要查询扩展?
16、什么自查询?为什么在 RAG 中需要自查询?
17、什么提示压缩?为什么在 RAG 中需要提示压缩?
18、在 RAG 中,你如何选择 Embedding Model 嵌入模型,需要考虑哪些因素?
19、向量数据库中的 HNSW、LSH、PQ 分别是什么意思?
20、向量数据库中的 ANN 是什么?为什么需要用它?
21、向量数据库中,常见的向量搜索方法:余弦相似度、欧几里得距离和曼哈顿距离分别是什么?有什么区别?
22、在 RAG 应用的过程中,关于提示工程的设计有什么心得和技巧吗?