同样的查询语句、同样的文档集、同样的模型,RAG评估却可能返回截然不同的Recall@8指标。问题不出在模型波动,而是一个不起眼的ORDER BY子句。我在实现“Ask this Book”功能时,先写评估后写特性,复查检索管道时发现检索层并非确定性:语义搜索与词汇搜索对平局记录排序随意,导致RRF融合分数漂移。修复只需在ORDER BY末尾追加id字段,就能终结这种静默漂移。
本文RAG实现基于PostgreSQL和.NET,检索层包含两条路径:基于pgvector的语义搜索,和基于全文检索的词汇搜索。两者结果通过倒排秩融合(RRF)合并。关键在于,RRF只在乎排名,不关心原始得分。如果一条检索返回顺序是A、B、C,另一条却是B、A、C,即使内容完全相同,RRF也会计算出不同的融合分数,从而影响Top-K选择,最终导致Recall@K指标跳动。
![]()
词汇搜索查询原本以ORDER BY score DESC结尾,这看似合理,但ts_rank_cd函数极易产生相同分值,多条记录得分相等。SQL标准只保证显式要求的排序,若多行比较相等,PostgreSQL可自由决定返回顺序。语义搜索也存在类似问题,虽然距离相等的情况更罕见,但对评估管道仍不可接受。修复极简:将排序改为ORDER BY score DESC, id,通过确定性的平局裁决器消除随机性。这个小改动启示我们,排序不只关乎展示,更是数据逻辑的一部分,尤其对依赖排名的融合算法来说,确定性排序是保证结果可复现的基石。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.