RAG检索优化:向量检索与重排序
向量检索、重排序、查询扩展三大策略详解
原题:在RAG系统的检索阶段,通常采用哪些优化策略来提升检索效率和准确性?请从向量检索、重排序、查询扩展等方面进行阐述。
重排与优化 · 小鹏真题
30 秒回答
- 向量检索优化:HNSW索引、量化压缩、分区策略
- 重排序策略:Cross-Encoder、ColBERT、多阶段排序
- 查询扩展:HyDE、Query Rewriting、子查询分解
- 混合检索方案:向量+关键词融合
回答与解析
答案要点
- 向量检索优化:HNSW索引、量化压缩、分区策略
- 重排序策略:Cross-Encoder、ColBERT、多阶段排序
- 查询扩展:HyDE、Query Rewriting、子查询分解
- 混合检索方案:向量+关键词融合
- 实际落地中的工程权衡
一、向量检索优化
索引层面
- HNSW(Hierarchical Navigable Small World):主流近似最近邻算法,平衡召回与速度;关键参数
M(邻居数)和ef(搜索宽度)需根据数据规模调优 - 量化压缩:PQ(Product Quantization)、SQ降低内存占用,适合十亿级向量场景
- 分区策略:IVF(倒排文件索引)将空间划分为Voronoi单元,先定位粗粒度再精细搜索
工程实践
- 预过滤(metadata filtering)+ 向量搜索的混合查询,减少候选集
- 多副本+本地缓存热点查询,降低RT
二、重排序(Reranking)
两阶段架构
- 第一阶段:向量检索快速召回Top-K(如100-1000)
- 第二阶段:精排模型打分,输出Top-N(如5-10)
常用精排模型
| 方案 | 特点 | 适用场景 |
|---|---|---|
| Cross-Encoder | 拼接query+doc编码,精度高但O(n)延迟 | 延迟敏感低、精度要求高 |
| ColBERT | 延迟交互,token级相似度,平衡效率 | 中等规模在线场景 |
| Bi-Encoder微调 | 领域适配后的向量直接排序 | 特定领域、资源受限 |
三、查询扩展
语义扩展
- HyDE(Hypothetical Document Embeddings):让LLM生成假设答案再检索,解决query-doc语义鸿沟
- Query Rewriting:LLM改写歧义/口语化查询,如"那个车"→"小鹏G9"
结构化扩展
- 子查询分解:复杂问题拆分为多个子问题并行检索,结果聚合
- Step-back Prompting:先问通用概念再具体到细节
四、混合检索融合
- BM25 + 向量:关键词匹配兜底专有名词、ID,向量捕捉语义
- 融合策略:RRF(Reciprocal Rank Fusion)或线性加权,避免单一模态失效
关键权衡:精度vs延迟、内存vs召回,需根据业务SLA选择组合。
口语版讲法(约4分钟)
- 本质是精度与效率的平衡
- 向量检索层的优化与工程取舍
- 重排序是最后一公里
- 查询扩展解决语义鸿沟
- 混合检索兜底与风险
这道题其实问的是,在RAG系统里,怎么在保证检索精度的同时,把延迟和成本压下来。本质是个工程平衡问题。我主要从检索、重排、查询改写、混合方案几个方向来说。
先说向量检索层。最常用的索引是 HNSW,它本质是图索引,在召回率和速度之间做得比较均衡。但有两个关键参数要调:M控制每个节点的邻居数,ef控制搜索宽度。M太小图会不连通,召回会崩;ef太大延迟就上去了。一般我会先拿业务数据跑一下,看Recall@100在什么水平,再决定参数。另一个常见优化是量化压缩,像 Product Quantization,可以把向量从32位压缩到8位,内存直接降到四分之一。但代价是精度损失,所以如果业务对召回要求很高,比如合同风控场景漏掉一条可能出法律风险,那量化就要慎用,或者只在粗排阶段用,精排再用原始向量。
工程上还有个常见套路是预过滤加向量搜索。比如电商场景,用户搜"苹果手机",但只想要黑色256G的,那就先用metadata过滤掉不匹配的SKU,再对剩下的做向量检索,候选集能小一个数量级。这里有个坑:如果过滤条件太强,候选集太小,向量检索的精度反而会下降,因为近邻不够了。所以我会设一个最小候选数,低于它就放宽过滤。
再一个重点是重排序。说白了,向量检索是粗筛,快速拿回Top-K,比如100条;重排是精排,用更复杂的模型从里面选出Top-5。精排模型我常用 Cross-Encoder,精度高但延迟大,因为每对query-doc都要过一遍。所以线上一般只对Top-50或Top-100做重排。另一种方案是 ColBERT,它用token级交互,比Cross-Encoder快,但精度稍低。具体选哪个要看业务SLA:如果要求100毫秒内返回,那ColBERT更现实;如果精度优先级高,比如医疗问答错一个可能误诊,那Cross-Encoder加缓存也能扛。
还有查询扩展。很多query是模糊的或口语化的,比如用户问"那个车",直接检索肯定不行。我会用LLM做query改写,把"那个车"扩成"特斯拉Model Y"或者根据上下文补全。另一个技巧是 HyDE,让LLM先生成一个假设答案,再用这个答案去检索。这能缓解query和文档的语义鸿沟。但前提是LLM生成的质量要够,如果LLM跑偏了,检索反而变差。所以上线前我会用一批bad case跑一下,看改写后的召回率有没有提升,没有就回滚。
最后说混合检索。纯向量检索对专有名词、ID号、精确匹配很弱,比如搜"订单号OD2024001",语义上它就是个字符串,向量可能找不到。所以我会把 BM25 和向量检索结合起来。融合策略用 RRF 最简单稳定,不用调权重,直接按排名倒序求和。但混合不是万能的,它会引入两套系统的维护成本,而且如果关键词和向量的结果差异很大,融合后可能两边都不讨好。所以我的做法是:先跑离线实验,看单独用向量和单独用关键词的Recall@K,再决定混合的权重,甚至做动态路由,比如检测到query里有数字或ID,就走关键词,否则走向量。
其实还有一个方向是自适应检索,根据query的难度动态决定召回多少条,或者决定要不要触发重排。比如简单问题只向量检索就够,复杂问题才走全链路。这个在线上能省不少算力,但实现起来要小心,因为判断query难易本身就不容易,搞错了反而降低体验。
所以整体上,我会把RAG检索看成一套组合拳,没有银弹。核心是理解业务场景的精度和延迟要求,然后选最合适的方案组合,上线前一定要用业务数据验证,特别关注bad case,因为往往就是那1%的case决定了用户对系统的信任度。
关键一句:自适应检索,根据query难度动态决定检索深度和是否触发重排
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个企业知识库问答系统,用户搜“今年的报销政策”,你从向量库里召回100条,但发现很多是去年的旧政策。你怎么优化检索,既能快速召回又能保证结果是最新、最相关的?
- 问法 2 · 层层追问
RAG的检索阶段,你一般会做哪些优化来提升效果?……比如向量检索本身,索引层面有什么策略?……那召回之后呢,你怎么从一堆结果里挑出最相关的几条?……如果用户query表述不清晰,比如只说“那个文档”,你怎么处理?
- 问法 3 · 直球架构
请从向量检索、重排序、查询扩展三个方面,系统性地阐述RAG检索阶段的优化策略。你如何平衡检索效率和准确性?具体讲讲每种策略的核心思路和适用场景。