这道题其实问的是[[RAG]]系统里,怎么在召回精度和响应效率之间做工程权衡。先以精确Flat检索建立对照;数据较小或吞吐允许时精确搜索也可用,是否需要近似方案由实测预算决定。我先说相似度计算,再说索引选型,最后聊落地中的平衡策略。
相似度这块,最常用的是 余弦相似度。它的核心思想是只看方向不管长度,语义相近的句子即使措辞不同,向量方向也通常一致,这就很适合语义匹配。工程上我们会提前把向量归一化,这样点积就等于余弦相似度,计算更快。当然,如果场景对向量长度敏感,比如推荐系统里用户活跃度本身就有信息量,那可以用内积或欧氏距离。但RAG里,余弦相似度是默认选择。
接下来是[[ANN]]算法选型。最主流的是[[HNSW]]和[[IVF]]。HNSW本质是多层导航图,搜索时从顶层快速往下跳,精度很高,但内存开销大,适合百万级以内、对延迟敏感的场景,比如客服机器人实时检索FAQ。IVF先定位几个簇再扫描桶内候选,桶内是精确向量还是量化编码取决于IVF-Flat或IVF-PQ等变体;IVF本身不保证更省内存,适合十亿级海量数据,比如企业文档库。但注意,真正落地常常是混合方案,例如Faiss IVF-HNSW中HNSW用于粗中心搜索,IVF-PQ另对桶内向量编码;候选重排可用精确距离或Cross-Encoder,应把不同阶段讲清楚。
举个例子,做电商退款政策的RAG,用户问‘退货超时怎么办’,可以把小规模Flat/HNSW与大规模IVF/PQ列为候选;nlist=4096、nprobe=20只是一组待测试配置,延迟还依维度、硬件、过滤和负载,不能承诺10或100毫秒。
平衡精度与效率,我主要看三个策略。先说 分层检索:先用IVF快速召回Top-100,再用精确计算[[重排]]Top-5,这样既保证效率又保证精度。再看量化压缩,比如把向量从FP32降到INT8,裸向量每维存储可从4字节减到1字节,总索引另计结构开销;掉点多少以及能否接受,要按固定评估集与长尾切片验证。还要看动态阈值:根据query的复杂度动态调整搜索深度,简单的query少搜几个邻居,复杂的多搜。
这里有个坑:前提是[[Embedding]]质量要过关。如果向量本身区分度差,余弦相似度再准也没用。上线前我会特别关注召回率Recall@K和延迟的P99,若P99超过业务SLO,先profile编码、索引、过滤、网络与排队;降维或降低nprobe可能伤害质量,不能一律作为处置。常见失败场景是数据分布变化后,旧索引的聚类中心失效,导致召回率骤降,这时候需要定期重建索引。
还有一个容易被忽略的点:量化压缩虽然省内存,但会损失精度。如果业务对召回精度要求极高,比如医疗或法律文档,可比较更高精度码长、扩大候选后用原始向量重算距离,或用Cross-Encoder重排。PQ常用非对称距离计算保留query高精度;对称距离还量化query,会增加量化误差,不能说成普遍补偿方案。蒸馏小模型也需要单独评测,不能预设恢复损失。
所以整体上,我更倾向于把向量匹配看作一套系统工程,不只是选个算法。具体选型要结合数据规模、延迟预算和精度要求,没有银弹。