RRF

RRF

RRF (Reciprocal Rank Fusion) คือวิธีการให้คะแนนเพื่อรวมผลลัพธ์การจัดอันดับจากหลายวิธีการค้นหาเข้าด้วยกัน โดยการนำค่าส่วนกลับของอันดับจากแต่ละวิธีมารวมกัน ทำให้สามารถผสานระบบคะแนนที่แตกต่างกันได้โดยไม่ต้องทำการ Normalization

ใน RAG pipeline นั้น การใช้งานร่วมกันระหว่างการค้นหาด้วยคีย์เวิร์ดแบบ BM25 และ vector search (semantic search) ในรูปแบบ hybrid เป็นเรื่องที่พบได้ทั่วไป อย่างไรก็ตาม เนื่องจาก score ของ BM25 และ cosine similarity มีทั้ง scale และการกระจายตัวที่แตกต่างกันโดยสิ้นเชิง การนำมาบวกรวมกันอย่างง่าย ๆ จึงไม่ก่อให้เกิดการรวมที่มีความหมายได้

RRF แก้ปัญหานี้ได้อย่างเรียบง่าย โดยใช้เพียง "อันดับ" ของเอกสารที่แต่ละวิธีการค้นหาส่งคืนมา แล้วนำ score 1 / (k + rank) มารวมกันจากทุกวิธีการ ค่าคงที่ k (โดยทั่วไปคือ 60) เป็น parameter สำหรับปรับน้ำหนักของอันดับ โดยยิ่งค่ามาก ความแตกต่างระหว่างอันดับต้น ๆ และอันดับท้าย ๆ ก็จะยิ่งลดลง

ตัวอย่างการคำนวณ

กรณีที่เอกสารหนึ่งปรากฏในอันดับที่ 3 จาก BM25 และอันดับที่ 7 จาก vector search:

RRF score = 1/(60+3) + 1/(60+7) = 0.0159 + 0.0149 = 0.0308

เอกสารที่ติดอันดับพอสมควรในการค้นหาทั้งสองวิธีมีแนวโน้มที่จะได้รับการจัดอันดับสูงกว่าเอกสารที่ปรากฏในการค้นหาเพียงวิธีเดียว ซึ่งนี่คือสิ่งที่นำไปสู่ความเสถียรของ hybrid search

ข้อควรระวังในการ implement

เนื่องจาก RRF ไม่ได้ใช้ค่าสัมบูรณ์ของ score ต้นฉบับ จึงมีข้อดีตรงที่ไม่จำเป็นต้องทำการ calibrate score ระหว่าง search engine ต่าง ๆ ในทางกลับกัน ต้องระมัดระวังในกรณีที่มีเอกสารที่มีอันดับเท่ากันจำนวนมาก หรือการจัดการกับเอกสารในกลุ่ม long-tail โดย vector DB หลัก ๆ อย่าง Elasticsearch 8.x ขึ้นไป, Weaviate และ Qdrant ต่างรองรับ RRF แบบ native แล้ว

บทความที่กล่าวถึงคำศัพท์นี้