wdgcd logo wdgcd personal lab
全文 4,516 字 约 13 分钟

rag20问-1

agent

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?如何实现?

在初次检索之后,用更精确的模型对候选文档重新打分排序,目的是提高最终给大模型的文档质量

为什么需要?因为初次检索通常是在海量文档中快速召回,追求召回率,可能会引入一些不太够相关的文档,重排序用更精确的方法重新评分;

重排序和 embedding 模型不同,embedding 模型要快速的处理海量文档,做的是单塔编码,query 和 document 分别编码,重排序模型可以用双塔或交叉编码,把 query 和 document 一起送入模型,能捕捉更细致的相关性,但速度慢;

常见的重排序模型有 BGE-reranker、Cohere Reranker API、自训练的 Cross-Encoder 等

13、如何评估 RAG 系统的效果?检索和生成分别看哪些指标?

检索环节:

召回率:相关文档中有多少被检索到了

精确率:检索结构中有多少是真正相关的。

MRR:关注相关文档的排名,如果第一个结果就相关,mrr = 1,如果第二个,mrr = 0.5,mrr 越高,说明相关文档排名越靠前。

生成环节:

事实准确性、答案完整性、上下文相关性、引用准确性

14、如何减少 RAG 系统的幻觉问题?有哪些实用方法?

a、prompt 层面的约束:明确要求只基于提供的文档回答、不要编造、明确说不知道、必须能在文档中找到依据

b、提高检索质量,如果检索到的文档本身就不想关或质量不高,模型也容易产生幻觉

c、要求标注来源

d、降低 temperature 参数

e、使用验证机制:用另一个模型验证答案是否跟文档一致

f、文档质量过低,没有定期审核文档,没有定期审核文档,清理错误和过时内容

g、self-rag 在生成过程中不断自我检查,判断生成的内容是否有文档支撑、是否相关、是否有用

h、用户反馈

15、什么是查询扩展?为什么在 RAG 应用中需要查询扩展?

查询扩展就是把用户的原始问题“补全”,加上同义词、相关术语、隐含意图这些信息,让检索能覆盖更多文档,解决了两个痛点:a、词汇不匹配 b、查询太模糊;

实现:1、基于规则的扩展:维护一份同义词词典 2、基于 LLM 的扩展:让大模型直接改写查询 3、基于检索反馈的扩展:先用原始查询检索一轮,从 top 结果里提取高频词作为扩展词

16、什么自查询?为什么在 RAG 中需要自查询?

自查询是 RAG 系统自动解析用户查询中隐含条件的机制,把模糊的自然语言转换为结构化查询语句,简单来说就是通过 llm 解析出元数据,然后只检索同时满足语义和元数据结构化条件的内容

17、什么提示压缩?为什么在 RAG 中需要提示压缩?

对检索出的文档内容做精简处理,提取核心信息、过滤无关文本,让最终喂给大模型的内容既保留关键信息,又不撑爆上下文窗口:比如检索到一篇 10 页的技术白皮书,压缩后只保留跟用户问题相关的 2 个核心章节和关键数据。

解决 3 个痛点:a、上下文窗口有限 b、无关内容稀释重点 c、节省 token 和时间成本;

实施:一般用小模型和规则算法来做压缩

18、在 RAG 中,你如何选择 Embedding Model 嵌入模型,需要考虑哪些因素?

语义准确性、模型效率、领域适配、多语言支持、数据规模匹配、开放性与生态、成本

19、向量数据库中的 HNSW、LSH、PQ 分别是什么意思?

hnsw 分层可导航小世界图,把所有向量组织成多层图结构,查询时从上层稀疏图贪心跳转,逐层下探到底层密集图,快速定位近似最邻近点;

lsh 局部敏感哈希,设计一组特殊的哈希函数,让相邻向量大概率落入一个桶,查询时只搜目标桶和相邻桶,检索范围能缩小到原来的千分之一

pq 乘积量化,把高维向量切成若干子块,每块用聚类中心的编号代替原始值,128维向量拆成 8 段,每段 1 字节编码,存储空间直接压缩 64 倍;

hnsw:

构建过程:每插入一个新向量,随机决定它能到达的最高层级,层级越高概率越小,大概呈指数分布,然后从最高层开始,贪心找当前层最近的领居,连边,再下探到下一层重复这个过程;

查询过程:从顶层的入口点开始,贪心跳到当前层最近的领居,知道没有更近的为止,然后下探到下一层,到了底层就在局部区域内做精细搜索,返回 Top-K

关键参数:

M: 每个节点的领居数,越大图越稠密,召回率越高但内存也越大,一般设 16-64

efConstruction:构建时的搜索宽度,越大索引质量越好但构建越慢,一般设 100-200

efSearch:查询时的搜索宽度,越大召回率越高但查询越慢,可以动态调整

lsh 的关键是设计一组哈希函数,让相邻向量有高概率哈希到同一个桶,不相似向量有高概率哈希到不同桶

lsh 的优势是查询复杂度接近 O(1),不管数据量多大,只要桶分得好,查询时间几乎不变

pq:把一个高维向量拆成 M 个低维子向量,每个子空间独立做聚类量化

20、向量数据库中的 ANN 是什么?为什么需要用它?

ann 近似最近邻搜索,核心思想是用一点精度换大量速度;精确最近邻搜索的时间是 O(n * d),n 是向量数量,d 是维度,当 n 到了千万、亿级别,d 又是 768、1536 这种 transformer 输出的维度,计算量直接爆炸,更麻烦的是高维空间中,数据分布变得稀疏,传统的树结构索引退化严重,KD-Tree 在超过 20 维后基本跟暴力搜索没区别

ann 的主流实现路线有 4 种:图索引 代表算法 hnsw、nsg 哈希 lsh 量化 pq opq 树结构 annoy

21、向量数据库中,常见的向量搜索方法:余弦相似度、欧几里得距离和曼哈顿距离分别是什么?有什么区别?

余弦相似度只看方向不看长度;欧几里得距离就是空间中两点的直线距离;曼哈顿距离就是把各个维度的差值绝对值加起来,在高维稀疏场景下效率有优势

22、在 RAG 应用的过程中,关于提示工程的设计有什么心得和技巧吗?

a、角色锁定

b、把检索内容、用户问题、输出格式分隔,结构化模板

c、必须加一条“如果提供的资料中找不到答案,直接回复未找到相关信息”,避免模型用训练知识幻觉补位

d、few-shot 示例:给 1-2 个标准问答样例,让模型知道该用什么语气、该用什么结构回答

e、结尾引用溯源