𝗪𝗵𝘆 𝗠𝘆 𝗥𝗔𝗚 𝗔𝗽𝗽 𝗞𝗲𝗽𝘁 𝗛𝗮𝗹𝗹𝘂𝗰𝗶𝗻𝗮𝘁𝗶𝗻𝗴 𝗔𝗻𝗱 𝗛𝗼𝘄 𝗜 𝗙𝗶𝘅𝗲𝗱 𝗜𝘁
เมื่อไม่กี่เดือนก่อน ผมได้สาธิตการทำงานของ RAG support bot ของผม มันบอกเพื่อนร่วมงานว่านโยบายการคืนเงินของเราคือ 30 วัน แต่นโยบายจริงของเราคือ 14 วัน บอทไม่ได้ลังเลเลย มันไม่ได้บอกว่าไม่แน่ใจ แต่มันกลับสร้างคำตอบขึ้นมาเองด้วยความมั่นใจเต็มเปี่ยม
RAG ควรจะช่วยลด Hallucination แต่การตั้งค่าของผมกลับทำได้เพียงแค่ย้ายมันไปที่อื่นเท่านั้น ผมได้เรียนรู้ 5 บทเรียนในขณะที่กำลังดีบั๊ก (debugging) ระบบนี้
เลิกใช้การกำหนดจำนวนตัวอักษรที่ตายตัวในการทำ Chunk ผมเคยใช้ chunk ขนาด 1,000 ตัวอักษรโดยมีการซ้อนทับกัน (overlap) เล็กน้อย สิ่งนี้ทำให้เกิดปัญหา บ่อยครั้งที่ chunk หนึ่งจะรวมกฎการจัดส่งเข้ากับกฎการคืนสินค้า โมเดลจึงนำเนื้อหาที่ต่างกันเหล่านี้มาผสมกันจนกลายเป็นคำตอบที่ผิด วิธีแก้ไข: ผมเปลี่ยนมาใช้ semantic chunking โดยแบ่งข้อมูลตามหัวข้อและย่อหน้า ซึ่งช่วยให้ข้อมูลที่เกี่ยวข้องกันอยู่รวมกัน
ความคล้ายคลึง (Similarity) ไม่ได้หมายถึงความเกี่ยวข้อง (Relevance) ตัว retriever ของผมดึง 3 chunk แรกออกมาโดยอิงจาก cosine similarity chunk หนึ่งอาจจะดูคล้ายกับคำถาม แต่ไม่ได้มีคำตอบอยู่ในนั้น โมเดลจะทึกทักเอาเองว่าทุกอย่างที่อยู่ใน context นั้นเป็นความจริง วิธีแก้ไข: ผมเพิ่มขั้นตอนการ reranking โดยใช้ cross-encoder และเริ่มบันทึก (logging) คะแนนการดึงข้อมูล (retrieval scores) ซึ่งจะช่วยให้เห็นว่าเมื่อใดที่ระบบไม่มีคำตอบที่แท้จริง
บอกโมเดลว่าการตอบไม่ได้นั้นไม่ใช่เรื่องผิด Prompt เดิมของผมนั้นเรียบง่ายมาก: ใช้ context เพื่อตอบคำถาม มันไม่ได้ให้คำแนะนำแก่โมเดลเลยว่าควรทำอย่างไรหากไม่มีข้อมูลใน context โมเดลจึงเติมเต็มช่องว่างเหล่านั้นด้วยการเดา วิธีแก้ไข: ผมเพิ่มคำสั่งเฉพาะเจาะจงลงไปว่า หากคำตอบไม่ได้อยู่ใน context ให้ตอบว่าไม่ทราบ ซึ่งช่วยลด Hallucination ลงได้ทันที
กำหนดเกณฑ์คะแนนการดึงข้อมูล (Retrieval Threshold) โมเดลยังคงใช้ความรู้ทั่วไปเมื่อการดึงข้อมูลล้มเหลว ผมเคยหวังว่าแค่ prompt อย่างเดียวจะเอาอยู่ แต่ความหวังไม่ใช่กลยุทธ์ที่ดี วิธีแก้ไข: ผมกำหนดเกณฑ์คะแนนที่ชัดเจน (hard score threshold) หากคะแนนการดึงข้อมูลสูงสุดต่ำเกินไป ระบบจะหยุดทำงานและส่งข้อความสำรอง (fallback message) กลับไป แทนที่จะปล่อยให้โมเดลเดาคำตอบเอง
ทดสอบเพื่อหาข้อผิดพลาด ไม่ใช่แค่ทดสอบความสำเร็จ ผมเคยทดสอบแค่คำถามง่ายๆ ที่ผมรู้แน่ๆ ว่ามีอยู่ในเอกสาร ผมมองข้ามคำถามที่กำกวมและข้อมูลที่ขาดหายไป Hallucination มักจะเกิดขึ้นในช่องว่างเหล่านั้น วิธีแก้ไข: ผมสร้างชุดข้อมูลสำหรับประเมินผล (evaluation set) ที่ประกอบด้วย "คำถามดัก" (trap questions) ซึ่งเป็นกรณีที่คำตอบที่ถูกต้องไม่ได้อยู่ในระบบ และผมจะรันการทดสอบเหล่านี้ทุกครั้งที่มีการเปลี่ยนแปลงระบบ
RAG ไม่ได้ช่วยหยุด Hallucination ได้ทั้งหมด แต่มันช่วยให้เราควบคุมมันได้ บอทของผมยังคงไม่ได้รู้ไปเสียทุกเรื่อง แต่ตอนนี้ เมื่อมันไม่แน่ใจ มันจะบอกออกมาตรงๆ นั่นคือสิ่งที่ทำให้เครื่องมือนี้สามารถนำไปใช้งานจริงได้
Source: https://dev.to/pallavi_sharma_10c1a6f1da/why-my-rag-app-kept-hallucinating-and-how-i-fixed-it-3i10