深浅色
RAG 与向量检索(背诵版)
1. 完整链路
- 离线:文档解析(PDF / HTML / Word)-> 清洗 -> 分块 -> 向量化 -> 入库。
- 在线:query 改写 -> 检索(向量 + 关键词)-> 重排 -> 拼 prompt -> 生成 -> 引用溯源。
- 追问:哪一步对效果影响最大?-> 分块和重排,多数问题出在这两处。
2. 分块策略
- 固定长度:简单,但可能切断语义。
- 语义分块:按段落 / 标题 / 句子边界切,效果好但实现复杂。
- 层级分块:小块检索、大块喂模型(parent-child),兼顾召回和上下文完整。
- 重叠(overlap):避免边界信息丢失,一般 10% 到 20%。
- 追问:块越大越好吗?-> 不是,块大召回噪声多、token 贵;块小语义不完整。
3. Embedding 与相似度
- 选型看四点:语言支持(中文要选多语言模型)、向量维度、最大输入长度、能否本地部署。
- 相似度:余弦相似度最常用;内积要求向量归一化;欧氏距离对模长敏感。
- 追问:为什么要归一化?-> 归一化后内积等于余弦相似度,可以用更快的点积检索。
4. 向量索引
- HNSW:多层图,查询快、召回高,但内存占用大、构建慢。
- IVF-PQ:先聚类分桶再量化压缩,内存小、适合大规模,但召回有损。
- 权衡的是召回率 / 内存 / 延迟;一般先上 HNSW,量大了再考虑量化。
- 追问:为什么不用暴力检索?-> 数据量大时线性扫描太慢。
5. 混合检索与 RRF
- 向量检索擅长语义;关键词检索(BM25)擅长专有名词、编号、代码。
- 混合检索取两者之长;RRF(倒数排名融合)按排名而不是分数融合,避免分数不可比。
- 追问:什么时候关键词比向量更好?-> 查错误码、订单号、人名这类精确匹配。
6. Rerank
- 召回阶段用双塔模型(快但粗),重排用 Cross-Encoder(query 和文档拼一起算相关度,准但慢)。
- 常见配比:召回 50 到 100 条,重排后取 top 3 到 5。
- 追问:Rerank 的代价?-> 延迟和算力,所以只对少量候选做。
7. Query 改写
- 多查询:让模型从不同角度生成几个 query,分别检索后合并。
- HyDE:先让模型生成假设答案,再用它去检索(答案和文档的向量更接近)。
- 指代消解:把「它」补全成具体名词,否则检索会跑偏。
- 追问:什么时候不需要改写?-> query 本身已经很具体时,改写反而引入噪声。
8. 效果评估
- 检索侧:Recall@k、MRR、NDCG。
- 生成侧:忠实度(faithfulness,答案是否有依据)、答案相关性、引用正确率。
- 追问:怎么快速判断是检索问题还是生成问题?-> 看答案需要的信息在不在召回的文档里:在就是生成问题,不在就是检索问题。
9. 多租户与权限
- 过滤必须在检索层做,不能只在前端过滤。
- 方案:向量库 metadata filter、按租户分 collection / 分区、hash tag 隔离。
- 追问:先过滤还是先检索?-> 先过滤,否则会召回无权文档并干扰排名。
10. RAG vs 微调 vs 长上下文
- RAG:知识频繁更新、要溯源、成本低,首选。
- 微调:学风格 / 格式 / 领域语言,不是用来灌事实的。
- 长上下文:实现简单但贵,且存在「中间遗忘」。
- 追问:能一起用吗?-> 能,常见组合是微调调风格 + RAG 供事实。