ผมเพิ่ม Reranker เข้าไปใน RAG Pipeline ของผม — แล้วมันก็ทำทุกอย่างพัง

ผมเพิ่ม reranker เข้าไปใน RAG pipeline ของผม และมันก็ทำให้การทดสอบของผมพังทันที

ในเวอร์ชัน 2 ผมใช้ hybrid retrieval ร่วมกับ FAISS และ BM25 ซึ่งมันผ่านคำถามทดสอบทั้ง 19 ข้อของผม จากนั้นผมจึงเพิ่ม cross-encoder reranker เข้าไปเพื่อเพิ่มความแม่นยำ (precision)

ทฤษฎีนั้นง่ายมาก:

  • Stage 1: ใช้การ retrieval ที่รวดเร็วเพื่อดึงกลุ่ม candidate ออกมาในวงกว้าง
  • Stage 2: ใช้ reranker ที่ชาญฉลาดเพื่อเลือกตัวเลือกที่ดีที่สุด

ผมใช้เวลา implement เพียง 20 นาที แต่มันก็ทำให้การทดสอบ 2 จาก 19 ข้อล้มเหลวทันที

ความล้มเหลวนี้เกิดขึ้นเพราะรูปแบบของข้อมูล ข้อมูลของผมประกอบด้วย chunk ที่เป็นตารางและมีความหนาแน่นสูง เช่น: "Company: Zentara Robotics | CEO: Iris Kallas | Employees: 287"

โมเดล cross-encoder ถูกฝึกมาด้วยย่อหน้าภาษาธรรมชาติ (natural language paragraphs) เมื่อมันเห็นแถวที่เป็นตาราง มันจึงให้คะแนนต่ำมาก โดยมันคิดว่า chunk นั้นไม่เกี่ยวข้อง

Hybrid retrieval หาคำตอบเจอ แต่ reranker กลับโยนมันทิ้งไป

ผมพยายามแก้ไขด้วย 7 วิธีที่แตกต่างกัน:

  • ใช้ candidate pool ที่ใหญ่ขึ้น
  • ผสมคะแนน (blending scores) จาก reranker และ retriever
  • ใช้ rank fusion

ไม่มีวิธีไหนได้ผลเลย คะแนนจาก reranker ติดลบมากจนมันกลบทุกอย่าง โมเดลไม่ได้แค่จัดลำดับให้ต่ำลงเท่านั้น แต่มันกำลังปฏิเสธรูปแบบตารางอย่างสิ้นเชิง

ผมเลิกพยายามแก้ที่ตัวเลขทางคณิตศาสตร์ แล้วเปลี่ยนมาแก้ที่โครงสร้างแทน

แทนที่จะปล่อยให้ reranker ตัดสินใจทุกอย่าง ผมเลือกที่จะ "ปกป้อง" ผลลัพธ์ที่ดีที่สุดของผม โดยใช้กลยุทธ์ "guaranteed slot" (ช่องที่การันตีผลลัพธ์):

  • หากคุณต้องการผลลัพธ์ 3 อันดับแรก ให้เก็บ 2 อันดับแรกจาก stage แรกเอาไว้
  • ใช้ reranker เพื่อเลือกเฉพาะอันดับที่ 3 เท่านั้น

วิธีนี้ช่วยให้มั่นใจได้ว่าผลลัพธ์จากการค้นหาแบบ hybrid จะยังคงอยู่ในรายการสุดท้าย โดย reranker จะทำหน้าที่ปรับปรุงเฉพาะอันดับที่เหลือเท่านั้น

ผลลัพธ์ที่ได้: ผ่านการทดสอบ 19/19 ข้อ

บทเรียนที่ได้รับ:

  • Reranker ไม่ใช่การอัปเกรดที่เห็นผลทันทีเสมอไป มันอาจทำให้ประสิทธิภาพลดลงเมื่อใช้กับข้อมูลที่มีโครงสร้างหรือข้อมูลแบบตาราง
  • ชุดข้อมูลสำหรับประเมินผล (evaluation set) คือตาข่ายนิรภัยของคุณ หากไม่มีการทดสอบทั้ง 19 ข้อนี้ ผมคงปล่อยระบบที่พังพินาศออกไปใช้งานแล้ว
  • ปกป้องสิ่งที่ใช้งานได้ดีอยู่แล้ว หากการ retrieval ใน stage แรกของคุณดีอยู่แล้ว อย่าปล่อยให้ reranker มาล้างผลลัพธ์นั้น

สร้าง retriever ที่แข็งแกร่งให้ได้ก่อนที่จะคิดจะใช้ reranker

Source: https://dev.to/santanu_mohanta_29/i-added-a-reranker-to-my-rag-pipeline-it-broke-everything-then-i-fixed-it-1c9i

Optional learning community: https://t.me/GyaanSetuAi