向量检索怎么保准又保真?
Embedding 质量、检索算法、重排序等维度提升准确性与相关性
原题:在向量检索系统中,有哪些技术和方法可以保证检索结果的准确性和相关性?
模型微调 · 美团真题
30 秒回答
- Embedding模型选型与微调
- 多路召回与混合检索策略
- 重排序(Rerank)机制
- 查询理解与改写
回答与解析
答案要点
- Embedding模型选型与微调
- 多路召回与混合检索策略
- 重排序(Rerank)机制
- 查询理解与改写
- 检索结果评估与迭代优化
1. Embedding层优化
- 模型选型:根据领域特点选择模型(通用场景用BGE/M3E,垂直领域用微调模型)
- 领域适配:用业务数据对Embedding模型做对比学习微调,缩小语义鸿沟
- 动态更新:商品/内容Embedding随属性变化及时刷新,避免语义漂移
2. 多路召回策略
| 召回方式 | 适用场景 |
|---|---|
| 向量召回 | 语义相似,理解用户意图 |
| 关键词/BM25 | 精确匹配,保证核心词命中 |
| 倒排索引 | 结构化属性过滤(价格、距离等) |
| 图召回 | 用户行为相似推荐 |
- 各路召回结果融合时,用加权或机器学习模型做初选
3. 重排序(Rerank)精排
- 粗排:向量相似度Top-K快速筛选
- 精排:Cross-Encoder交互式模型(如BGE-Reranker)计算查询-文档相关性分数
- 业务规则:结合点击率、转化率、时效性等业务特征最终排序
4. 查询侧优化
- 查询改写:扩写同义词、纠错、补全意图("火锅"→"重庆火锅/老北京涮肉")
- 查询理解:识别地理位置、价格区间等约束条件,做前置过滤
5. 评估与迭代
- 离线:Recall@K、MRR、NDCG指标监控
- 在线:AB实验看点击率、转化率、满意度
- Badcase分析:建立标注平台,持续回流数据优化模型
口语版讲法(约4分钟)
- 本质是平衡语义理解与精确匹配
- 混合检索:向量+关键词,各有适用场景
- 重排序:从粗到精,用交互模型修正
- 查询改写:让用户输入更匹配索引
- 落地风险:数据分布、延迟、评估闭环
这道题问的是怎么让向量检索系统既准又相关,其实本质是在解决一个矛盾:用户想要的到底是语义上的相似,还是字面上的精确匹配。这两个东西有时候是冲突的,你要做的是在不同场景下找到平衡点,而不是追求单一指标的最优。
具体来说,我一般从几个层面去考虑。先说最基础的 Embedding 层。模型选型很重要,通用场景用 BGE 或者 M3E 这类通用模型就够了,但如果是垂直领域,比如电商客服场景里用户问‘退款多久到账’,通用模型可能把‘退款’和‘退货’混在一起,这时候就得用业务数据做对比学习微调,缩小语义鸿沟。不过这里有个前提:你的标注数据质量得过关,不然微调反而会带偏。
再一个就是召回策略。我倾向于走 混合检索,就是向量召回和 BM25 关键词召回一起上。向量召回擅长理解意图,比如用户说‘想找个便宜点的火锅店’,它能找到语义相似的店;但用户如果明确说‘海底捞’,关键词召回就能保证精确命中。这两条路各有适用场景,落地上我一般会加权融合,权重根据业务数据调。比如在订单检索场景里,用户输入‘2024年3月15号的订单’,关键词匹配订单号或者日期就比语义相似重要得多,我会把关键词召回权重调高。
有了候选集之后,下一步是重排序。粗排阶段用向量相似度快速筛出 Top-K,精排阶段再用 Cross-Encoder 这种交互式模型去算 query 和每个文档的相关性分数。这个步骤很关键,因为 Bi-Encoder 的向量相似度有时候会漏掉一些细微的匹配,比如‘苹果手机’和‘iPhone’在向量空间里可能很近,但‘苹果’和‘水果’也可能很近,Cross-Encoder 能更好地做区分。不过它的计算成本高,所以只能用在精排阶段,对候选集大小有限制,一般几百条以内。
还有一个容易被忽略的点是查询侧优化。用户输入的 query 往往很随意,比如‘火锅’可能想找‘重庆火锅’或者‘老北京涮肉’,这时候做查询改写,扩写同义词、纠错、补全意图,就能显著提升召回率。另外,如果 query 里带有结构化约束,比如‘附近’、‘100块以内’,我会在查询理解阶段把它抽出来做前置过滤,而不是全扔给向量检索。
说到查询改写,这里面其实有个坑:如果改写太激进,比如把‘手机’扩写成‘智能手机、移动电话、手持设备’,反而可能引入噪声,拉低精度。所以我会先做意图分类,对模糊 query 才做改写,对精确 query 尽量保持原样。这个度怎么把握,其实是挺值得细聊的。
最后,整个系统上线后一定要有评估和迭代的闭环。离线指标我会看 Recall@K 和 NDCG,在线通过 AB 实验看点击率和转化率。更重要的是建立 Badcase 分析机制,比如用户搜‘充电宝’返回了‘充电器’,这种案例回流回来,可能发现是 Embedding 模型没区分好,或者重排序模型没学到这个模式,然后针对性优化。
所以整体上,我更倾向于把向量检索系统看作一个组合工程,而不是单个模型的比拼。混合检索搭骨架,重排序做精调,查询改写做入口优化,再加上持续的评估迭代,这样才能在真实业务里跑得稳。
关键一句:查询改写时激进扩写会引入噪声,需要先做意图分类,对模糊query改写,精确query保持原样。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做电商搜索,用户搜“红色连衣裙”,向量召回出来一堆语义相关的,但有些根本不是红色,有些是短裙。你怎么保证返回的结果既准确又相关?
- 问法 2 · 层层追问
向量检索怎么让结果更准?……除了调模型,还有什么办法?……召回后怎么保证排序符合用户意图?
- 问法 3 · 直球架构
在一个向量检索系统中,有哪些关键技术和策略能提升检索结果的准确性和相关性?从模型、召回、排序到查询优化,你整体怎么设计?