檢索才是瓶頸
這是 RAG 一個不太中聽的事實:如果正確的段落根本沒被檢索進來,再聰明的提示也救不了那個答案。生成器只能依據你遞給它的東西來接地。所以檢索品質是整個系統最大的那根槓桿——要先在這裡下功夫,其他都還在其次。
上一篇的語意搜尋是主力:把查詢向量化,向向量倉儲要它的最近鄰(nearest neighbours)。但純粹比對語意有盲點,補上這些盲點正是本篇的重點。
稠密 vs 稀疏
檢索器有兩大流派,搞懂它們的取捨是 RAG 的基本素養。稠密(dense)檢索就是嵌入那套:比對的是語意,所以能找到改寫和同義詞——但它可能對沒學過的精確字串卡關,例如料號 `RX-7G` 或罕見的姓氏。
两个向量的点积等于它们模长之积乘以夹角余弦。
稀疏(sparse)檢索是經典的關鍵字搜尋(想想 BM25):比對的是字詞,並獎勵精確重疊。它能準確命中那個料號和任何字面詞彙——但若問題用了和文件完全不同的詞彙,它就會漏掉。稠密強在稀疏弱的地方,反之亦然。正是這種互補,構成了把兩者結合的全部動機。
混合檢索
混合檢索(hybrid retrieval)同時跑稠密和稀疏兩種搜尋,再把結果合併。常見的合併法是倒數排名融合(reciprocal rank fusion):每個候選依它在各清單裡的名次計分,於是兩種方法都看好的塊會浮到最上面,而只有單一方法僥倖命中的就被打折。實務上混合是個可靠的預設選擇——它把稠密搜尋漏掉的精確相符救回來,又不犧牲語意相符的那些。
倒数排名融合:每个候选按其在各列表中的排名计分,因此在任一检索器中排名靠前的段落都会在合并后上升。
重排
第一階段的檢索是為速度而生,所以稍嫌粗糙——它把查詢和每一塊分開計分,再比對向量。重排(reranking)加上一道精準的第二關:先撈出寬鬆的一批(例如前 30 名),再跑一個比較慢的交叉編碼器(cross-encoder),把查詢和每個候選放在一起閱讀,評出真正的相關度。留下最好的那幾塊。如此一來,你既有快速檢索的召回率,又有細讀的精確度。
- 廣撈——用混合搜尋拉出 20–50 個候選,先求召回。
- 重排——用交叉編碼器把每個候選對著查詢評分,再依分數排序。
- 砍到前 k 名——只把最好的 3–8 塊傳給生成器,讓提示保持聚焦。
調整前先量測。挑幾個真實問題,仔細看回傳了哪些塊,然後自問:答案在裡面嗎?如果檢索一直漏,後面的招數都救不了——回頭調切塊、調嵌入、或加上重排,直到正確段落能穩定出現為止。
相关文档与检索文档的文氏图,说明精确率与召回率。