
ทดสอบ RAG ด้วย Ragas: แยกปัญหา retrieval ก่อนโทษคำตอบของโมเดล

การทดสอบระบบ RAG ด้วย Ragas เริ่มจากชุดคำถามที่ตรึงไว้และผลลัพธ์รายข้อ แล้วแยกดูว่าระบบค้นคืนส่งหลักฐานที่จำเป็นมาหรือไม่ ก่อนตัดสินคุณภาพคำตอบที่โมเดลสร้างขึ้น บทสอน Ragas ใช้คำถามกับ grading notes เพื่อให้คะแนนแบบผ่านหรือไม่ผ่าน และบันทึกผลการทดลองเป็น CSV; หากต้องการวินิจฉัยการค้นคืน ให้เพิ่มการเก็บข้อความที่ค้นคืนและลำดับของแต่ละชิ้นในผลรายข้อด้วย
เมื่อหลักฐานที่ต้องใช้หายจากผลค้นคืน การแก้พรอมป์ต์อาจทำให้คำตอบฟังดีขึ้น แต่ยังไม่มีข้อมูลให้ตอบครบ ส่วนเมื่อหลักฐานครบแล้วคำตอบกลับละเลยข้อยกเว้น ปัญหาจะอยู่ที่การสร้างคำตอบมากกว่า งานวิจัย RAGAS แยกการประเมินคุณภาพบริบทที่ค้นคืน ความยึดโยงของคำตอบกับบริบท และความตรงประเด็นของคำตอบ กรอบนี้ช่วยระบุชั้นที่ควรตรวจต่อได้ชัดกว่าคะแนนรวมตัวเดียว
สร้างชุดคำถามภาษาไทยที่ผูกกับหลักฐานจริง

ชุดเริ่มต้น 20 คำถามด้านล่างเป็นแม่แบบสมมติสำหรับคลังนโยบายบริการ ไม่ใช่ข้อมูลของบริการใดที่มีอยู่จริง ก่อนรันให้แทนข้อความในวงเล็บด้วยคำจากคลังเอกสารของทีม และตรวจว่าคำถามที่ตั้งใจให้ตอบได้นั้นมีข้อความรองรับอยู่จริง ควรเลือกรายการที่สะท้อนภาษาแบบที่ผู้ใช้ถาม รวมทั้งชื่อบริการ คำพ้อง คำย่อ และข้อยกเว้นที่มีผลต่อคำตอบ
หนึ่งแถวของชุดทดสอบควรมี id, query, reference_answer, grading_notes, gold_source_id, gold_span และ case_type ช่อง reference_answer เก็บสาระคำตอบที่ยอมรับได้ ส่วน grading_notes ระบุสิ่งที่ต้องมี สิ่งที่ห้ามอ้าง และเงื่อนไขผ่านหรือไม่ผ่าน แยกกันเพื่อไม่ให้การตรวจคำตอบกลายเป็นการเทียบความคล้ายของประโยค gold_source_id บอกเอกสารฉบับที่ใช้เป็นฐาน ส่วน gold_span ระบุช่วงข้อความที่จำเป็นจริง เพราะการพบไฟล์ถูกชื่อยังไม่แปลว่าได้เงื่อนไขที่ต้องใช้
- บริการ [ชื่อบริการ] รับคำขอผ่านช่องทางใดบ้าง? เกณฑ์ตรวจ: ตอบเฉพาะช่องทางที่ระบุในนโยบายฉบับที่ตรึงไว้
- ผู้ใช้ต้องส่งหลักฐานอะไรเพื่อเริ่ม [ประเภทคำขอ]? เกณฑ์ตรวจ: แยกเอกสารบังคับออกจากเอกสารที่ขอเพิ่มเฉพาะกรณี
- ระยะเวลาดำเนินการของ [ประเภทคำขอ] เริ่มนับเมื่อใด? เกณฑ์ตรวจ: บอกเหตุการณ์เริ่มนับตามถ้อยคำของเอกสาร
- ใครมีสิทธิใช้ [สิทธิประโยชน์]? เกณฑ์ตรวจ: ระบุทั้งกลุ่มที่เข้าเงื่อนไขและข้อจำกัดที่ทำให้ใช้สิทธิไม่ได้
- [แผน A] กับ [แผน B] ต่างกันอย่างไรในเรื่อง [เงื่อนไข]? เกณฑ์ตรวจ: เทียบเงื่อนไขเดียวกันของทั้งสองแผน
- การยื่นผ่าน [ช่องทาง A] กับ [ช่องทาง B] ใช้หลักฐานต่างกันหรือไม่? เกณฑ์ตรวจ: อ้างข้อความของแต่ละช่องทาง
- นโยบาย [ฉบับปัจจุบัน] เปลี่ยนอะไรจาก [ฉบับก่อน]? เกณฑ์ตรวจ: ระบุเฉพาะความต่างที่มีเอกสารทั้งสองฉบับรองรับ
- [กลุ่มผู้ใช้ A] และ [กลุ่มผู้ใช้ B] ได้รับสิทธิเดียวกันหรือไม่? เกณฑ์ตรวจ: ชี้เงื่อนไขที่ทำให้คำตอบเท่ากันหรือต่างกัน
- หากส่งเอกสารไม่ครบ ผู้ใช้ต้องทำอะไรต่อ? เกณฑ์ตรวจ: บอกขั้นตอนที่ระบุจริงและไม่สมมติกำหนดเวลา
- หากเปลี่ยนแผนระหว่างรอบบริการ สิทธิเดิมกับค่าบริการคิดอย่างไร? เกณฑ์ตรวจ: ครอบคลุมทั้งสองประเด็น หรือระบุว่าประเด็นใดไม่มีข้อมูล
- หากยกเลิกหลังชำระเงิน กรณีใดขอคืนเงินได้? เกณฑ์ตรวจ: รวมข้อยกเว้นและเงื่อนไขที่เปลี่ยนสิทธิในการคืนเงิน
- เมื่อคำขอถูกปฏิเสธ ผู้ใช้ขอทบทวนได้ทางใด? เกณฑ์ตรวจ: ไม่สร้างช่องทางอุทธรณ์ที่เอกสารไม่ได้ให้ไว้
- ข้อยกเว้นใดทำให้ [สิทธิประโยชน์] ใช้ไม่ได้? เกณฑ์ตรวจ: ไม่ตอบด้วยกฎทั่วไปเพียงข้อเดียวเมื่อมีข้อยกเว้นหลายข้อ
- คำขอที่ส่งหลัง [กำหนดเวลา] ยังเข้าเงื่อนไขใด? เกณฑ์ตรวจ: แยกกำหนดเวลาหลักออกจากทางเลือกหลังพ้นกำหนด
- เมื่อเอกสารสองฉบับให้เงื่อนไขต่างกัน ควรยึดฉบับใด? เกณฑ์ตรวจ: ใช้กฎลำดับเอกสารของคลัง หากไม่มีให้ตอบว่าไม่ระบุ
- กรณีใดต้องให้เจ้าหน้าที่ตรวจเพิ่มเติมก่อนตอบ? เกณฑ์ตรวจ: ยกเฉพาะกรณีที่เอกสารกำหนด ไม่เพิ่มเหตุผลจากการคาดเดา
- เอกสารระบุวันเปิดตัว [บริการที่ยังไม่ประกาศ] หรือไม่? เกณฑ์ตรวจ: ยอมรับว่าไม่มีข้อมูลเมื่อค้นทั้งคลังแล้วไม่พบ
- มีนโยบายเฉพาะสำหรับ [พื้นที่ที่ไม่ปรากฏในเอกสาร] หรือไม่? เกณฑ์ตรวจ: ไม่อนุมานจากนโยบายพื้นที่ใกล้เคียง
- เอกสารยืนยันค่าธรรมเนียม [รายการที่ไม่อยู่ในคลัง] หรือไม่? เกณฑ์ตรวจ: ไม่แต่งจำนวนเงินจากรายการประเภทอื่น
- เงื่อนไขจะเปลี่ยนใน [ช่วงอนาคต] หรือไม่? เกณฑ์ตรวจ: แยกประกาศที่มีอยู่จากการคาดการณ์
คำถามที่ตั้งใจให้ไม่มีคำตอบต้องตรวจทั้งคลัง ไม่ใช่ดูเพียงเอกสารหนึ่งฉบับ มิฉะนั้นทีมอาจให้คะแนนการปฏิเสธตอบว่าถูก ทั้งที่ระบบควรค้นพบหลักฐานจากที่อื่น สำหรับคำถามที่ตอบได้ ให้เก็บข้อความอ้างอิงสั้นพอจะระบุข้อเท็จจริง แต่ครบทั้งเงื่อนไขและข้อยกเว้น หากนโยบายมีหลายฉบับ ให้บันทึกเวอร์ชันที่มีผลกับแต่ละคำถามในชุดข้อมูลด้วย
การแยก reference_answer ออกจาก grading_notes มีประโยชน์ชัดในคำถามเปรียบเทียบ ตัวอย่างสมมติ: คำตอบอ้างอิงอาจบอกว่าแผน A รับคำขอออนไลน์ ส่วนแผน B รับที่สาขา แต่ grading_notes ต้องกำหนดเพิ่มเติมว่าคำตอบผ่านต่อเมื่อแยกสองแผนถูก และไม่สรุปว่าค่าธรรมเนียมเท่ากันโดยไม่มีหลักฐาน โครงสร้างนี้รองรับคำตอบที่ใช้ถ้อยคำต่างกันโดยยังตรวจสาระเดียวกันได้
บันทึกผลค้นคืนก่อนวัดคุณภาพคำตอบ
ก่อนรันให้ตรึงสำเนาคลังเอกสาร วิธีแบ่งข้อความ ดัชนี วิธีค้น ค่า top-k โมเดล และพรอมป์ต์ที่ส่งให้โมเดล รวมถึงตัวกรองสิทธิ์เข้าถึงเอกสาร การเทียบรอบก่อนกับรอบหลังจะมีความหมายก็ต่อเมื่อรู้ว่าตัวแปรใดเปลี่ยน หากเอกสารเปลี่ยนระหว่างทาง ข้ออ้างอิงเดิมอาจไม่ใช่คำตอบที่ถูกอีกต่อไป
ในผลแต่ละแถว ให้เก็บ id และ query เดิม พร้อม retrieved_contexts ตามลำดับจริง รหัสชิ้นข้อความ รหัสเอกสาร ตำแหน่งต้นฉบับ response และผลผ่านตาม grading_notes การบันทึกชิ้นข้อความแบบที่ใช้วินิจฉัยนี้เป็นส่วนที่ทีมต้องเพิ่มจากระบบของตนเอง ไม่ควรแทนด้วยรายชื่อไฟล์อย่างเดียว เพราะไฟล์เดียวอาจให้เพียงหัวข้อ ขณะที่ประโยคซึ่งเปลี่ยนคำตอบอยู่ในชิ้นถัดไป
อ่านผลค้นคืนก่อนเปิดคำตอบ แล้วตอบคำถามสองข้อแยกกัน: หลักฐานที่จำเป็นอยู่ในกลุ่มที่ส่งให้โมเดลหรือไม่ และชิ้นที่ส่งมามีรายละเอียดพอให้ตอบครบหรือไม่ การพบ gold_source_id ใน top-k เป็นสัญญาณระดับเอกสาร แต่ยังต้องเทียบ gold_span กับข้อความที่ส่งจริง เมื่อเอกสารฉบับถูกอยู่ในผลแต่ส่วนที่ใช้ตัดสินหายไป ให้จัดเป็นปัญหาขอบเขตชิ้นข้อความหรือการเลือกชิ้น ไม่ใช่ถือว่าการค้นคืนผ่านทันที
ลำดับชิ้นข้อความก็สำคัญ หากชิ้นที่ใช้ตอบปรากฏท้ายรายการหลังข้อความใกล้เคียงจำนวนมาก ระบบอาจให้คะแนนการพบหลักฐานว่าผ่าน แต่ยังส่งสัญญาณรบกวนให้ขั้นสร้างคำตอบ ควรบันทึกลำดับและจำนวนชิ้นที่ส่งต่อจริง ไม่ใช่จำนวนที่ retriever หาได้ก่อนถูกตัดออกด้วยข้อจำกัดบริบท การจัดเก็บเช่นนี้ทำให้เห็นว่าการแก้ดัชนีเปลี่ยนตำแหน่งหลักฐานหรือเพียงเพิ่มข้อความที่ไม่เกี่ยวข้อง
เลือกเมตริกให้ตอบคนละคำถาม

รายการเมตริกของ Ragas แยก Context Precision และ Context Recall ซึ่งใช้ตรวจบริบทที่ค้นคืน ออกจาก Faithfulness และ Response Relevancy ซึ่งใช้ตรวจคำตอบ ควรเก็บทั้งคะแนนรายข้อและการตัดสินตาม grading_notes เพราะตัวเลขต่างชนิดตอบคำถามต่างกัน และค่าเฉลี่ยอาจกลบความล้มเหลวของข้อยกเว้นที่ทีมให้ความสำคัญ
Context Precision ช่วยดูว่าชิ้นข้อความที่มีประโยชน์ถูกจัดไว้สูงกว่าชิ้นที่ไม่ช่วยตอบเพียงใด เมื่อข้อเดียวกันได้หลักฐานอยู่ในรายการแต่ถูกดันลงท้าย การเปลี่ยนตัวจัดอันดับมีเหตุผลมากกว่าการแก้คำสั่งให้โมเดลตอบยาวขึ้น Context Recall ตรวจว่าข้อกล่าวอ้างใน reference_answer มีหลักฐานรองรับใน retrieved_contexts ครบเพียงใด จึงเหมาะกับคำถามที่มีคำตอบอ้างอิงชัดและมีหลายเงื่อนไขที่ต้องค้นให้ครบ
Faithfulness ตรวจว่าข้อกล่าวอ้างใน response มีหลักฐานใน retrieved_contexts หรือไม่ คะแนนนี้อาจสูงแม้คำตอบละเลยประเด็นสำคัญ เพราะโมเดลพูดเฉพาะสิ่งที่พบแล้วและไม่กล่าวถึงส่วนที่หายไป ส่วน Response Relevancy ดูว่าคำตอบสัมพันธ์กับคำถามเพียงใด แต่ไม่ได้ใช้แทนการตรวจความถูกต้องของข้อเท็จจริง หากต้องตัดสินว่าคำตอบครบตามเงื่อนไขของทีม ให้ใช้ grading_notes เพิ่มเติม ไม่ควรตั้งเกณฑ์ผ่านด้วยความลื่นไหลของภาษา
กรณีไม่มีคำตอบในคลังควรประเมินแยกจาก Context Recall ที่อาศัย reference_answer เป็นข้อเท็จจริงให้ตรวจ ให้บันทึกว่าไม่มี gold_span ที่ใช้ตอบ แล้วตรวจว่าคำตอบยอมรับขอบเขตข้อมูลและไม่แต่งวัน ราคา หรือเงื่อนไขขึ้นเอง หากระบบอ้างเอกสารทั่วไปแล้วสรุปเป็นรายละเอียดเฉพาะกรณี ให้จัดเป็นคำตอบไร้หลักฐาน แม้ข้อความที่ค้นคืนจะมีคำคล้ายคำถาม
เมตริกที่ใช้โมเดลช่วยตัดสินอาจตีความภาษาไทยหรือคำปฏิเสธคลาดเคลื่อน โดยเฉพาะประโยคที่มี “เว้นแต่” “เฉพาะ” หรือกำหนดเวลา ให้เปิดตรวจข้อที่อยู่ใกล้เกณฑ์ผ่าน และสุ่มดูข้อที่ได้คะแนนสูงด้วย หากผู้ตรวจอัตโนมัติให้ผ่านทั้งที่ขาดข้อยกเว้น ให้แก้ grading_notes ให้ระบุเงื่อนไขนั้นอย่างตรงไปตรงมา แล้วประเมินผลรอบเดิมใหม่ก่อนเปรียบเทียบกับการเปลี่ยนระบบ
แปลงความผิดพลาดเป็นการแก้ที่ตรงชั้น
ตารางวินิจฉัยรายข้อควรมี id, evidence_in_corpus, evidence_in_top_k, context_complete, answer_pass, unsupported_claim และ next_change ให้ใส่สถานะตามหลักฐานที่ตรวจได้ก่อนเสนอการแก้ เมื่อกรณีเดียวมีหลายอาการ ให้ระบุสาเหตุแรกในลำดับจากคลังเอกสารไปยังคำตอบ มิฉะนั้นการปรับพรอมป์ต์อาจบดบังว่าข้อมูลต้นทางขาดอยู่
- ไม่มีหลักฐานในคลัง: reference_answer หรือ gold_span ชี้ข้อความที่ไม่มีอยู่ในคลังเวอร์ชันทดสอบ ตรวจความถูกต้องของชุดทดสอบและเอกสารก่อน การปรับ retriever ไม่ทำให้ค้นพบข้อมูลที่ยังไม่ถูกจัดเก็บ
- เอกสารถูก แต่ชิ้นข้อความไม่ครบ: ผลคืนมามีหัวข้อหลักแต่เงื่อนไขหรือข้อยกเว้นอยู่พ้นขอบ chunk ทดลองแบ่งข้อความใหม่ให้ความสัมพันธ์นั้นอยู่ร่วมกัน หรือเก็บหัวข้อที่จำเป็นไว้กับชิ้นย่อย แล้วดูว่าข้อเดิมค้นได้ครบขึ้นหรือไม่
- หลักฐานครบในดัชนี แต่ไม่ติดผลที่ส่งต่อ: ตรวจคำพ้องภาษาไทย ชื่อสินค้า คำย่อ ตัวกรอง และตัวจัดอันดับ retriever หากคำค้นตรงกับข้อความต้นฉบับแต่ยังไม่ขึ้น ให้ตรวจการจัดทำดัชนีด้วย การเพิ่ม top-k อาจช่วยบางข้อแต่ทำให้บริบทที่โมเดลได้รับมีข้อความรบกวนมากขึ้น
- หลักฐานครบ แต่ตอบผิดเงื่อนไข: ตรึง retrieved_contexts ชุดเดิม แล้วทดลองพรอมป์ต์หรือโมเดลสร้างคำตอบ ตรวจว่าคำตอบใหม่รักษาคำปฏิเสธ ลำดับเวลา และข้อยกเว้นได้จริงหรือไม่ หากเปลี่ยน retrieval พร้อมกันจะบอกไม่ได้ว่าชั้นใดทำให้ผลดีขึ้น
- ตอบตรงคำถาม แต่เติมรายละเอียดเอง: เปิดข้อกล่าวอ้างที่ไม่มีหลักฐานรองรับจากบริบท และดูว่ามาจากการอนุมานเกินเอกสารหรือจากตัวอย่างในพรอมป์ต์ จากนั้นปรับคำสั่งให้จำกัดขอบเขตคำตอบและรันข้อที่ไม่มีคำตอบอีกครั้ง
- ไม่ตอบทั้งที่หลักฐานครบ: ตรวจว่าพรอมป์ต์กำหนดการปฏิเสธตอบเข้มเกินไปหรือไม่ แล้วดูข้อความที่ส่งให้โมเดลจริง โดยเฉพาะตำแหน่งข้อยกเว้นและบริบทที่ถูกตัดก่อนส่ง สาเหตุนี้แยกจากการค้นไม่พบ เพราะข้อมูลเข้าถึงขั้นสร้างคำตอบแล้ว
ตัวอย่างสมมติ: คำถามถามทั้งช่องทางสมัครและข้อยกเว้นของผู้ใช้บางกลุ่ม ผล top-k มีหน้าสมัครแต่ไม่มีหน้าข้อยกเว้น โมเดลตอบเฉพาะช่องทางสมัครโดยยึดข้อความที่ได้รับทุกประโยค กรณีนี้ Faithfulness อาจดูดี ขณะที่ Context Recall และผลผ่านตาม grading_notes ยังต่ำ การแบ่งชั้นเช่นนี้สัมพันธ์กับ การแยกคะแนนความซื่อสัตย์กับความครบของเอกสาร ซึ่งช่วยไม่ให้ทีมสรุปว่าคำตอบถูกเพียงเพราะไม่มีข้อกล่าวอ้างที่แต่งขึ้น
กำหนดเกณฑ์ก่อนและหลังโดยดูข้อที่เปลี่ยนจริง
บันทึก baseline ของชุดคำถามเดิมก่อนแก้: เวอร์ชันคลังและดัชนี วิธีแบ่งข้อความ ค่า top-k โมเดลและพรอมป์ต์ ผลพบ gold_span ผลผ่านตาม grading_notes และคะแนนเมตริกรายข้อ จากนั้นระบุสมมติฐานที่ตรวจได้ เช่น การแบ่งใหม่ควรทำให้ข้อที่ขาดข้อยกเว้นได้รับข้อความครบ หรือการปรับอันดับควรย้ายหลักฐานที่ถูกต้องขึ้นมาในกลุ่มที่ส่งให้โมเดล ข้อที่ตั้งใจแก้ต้องระบุด้วย id ก่อนรัน ไม่ใช่เลือกหลังเห็นผลแล้ว
ใช้เกณฑ์รับการแก้ที่สัมพันธ์กับสาเหตุ: งานแก้ chunking ต้องทำให้ช่วงหลักฐานที่เคยแยกขาดปรากฏในบริบทที่ส่งจริง งานแก้ retriever ต้องทำให้ข้อที่ค้นไม่เจอพบ gold_span โดยไม่ทำให้ข้อที่เคยพบหาย และงานแก้พรอมป์ต์ต้องทำให้คำตอบผ่าน grading_notes เมื่อใช้บริบทเดิม หากหลักฐานไม่เปลี่ยนแต่คะแนนคำตอบดีขึ้น นั่นเป็นผลของชั้นสร้างคำตอบ ไม่ใช่หลักฐานว่าระบบค้นคืนดีขึ้น
แยกข้อสำคัญที่เคยผ่านไว้ดูการถดถอยด้วย โดยเฉพาะข้อยกเว้น คำปฏิเสธ และคำถามที่คลังไม่มีคำตอบ ค่าเฉลี่ยดีขึ้นอาจเกิดจากข้อทั่วไปหลายข้อ ขณะที่ข้อเดียวซึ่งตอบเรื่องสิทธิผิดกลับแย่ลง จึงควรดูทั้งรายการที่ผ่านเพิ่ม รายการที่ตกเพิ่ม และเหตุผลรายข้อ ก่อนยอมรับการเปลี่ยนแปลง
เมื่อเปลี่ยนข้อมูลต้นทางจริง ให้เก็บชุดทดสอบเดิมเป็นประวัติ แล้วสร้างเวอร์ชันคำตอบอ้างอิงใหม่สำหรับเอกสารใหม่ การเทียบผลข้ามเวอร์ชันโดยไม่บอกว่านโยบายเปลี่ยนจะทำให้คำตอบที่ถูกตามเอกสารใหม่ถูกตัดสินผิดตามเอกสารเก่า รอบถัดไปจึงควรมีทั้งข้อคงที่สำหรับเทียบการถดถอย และข้อใหม่ที่สะท้อนคำถามจริงของผู้ใช้
อ่านเพิ่มเติม:
บทความที่เกี่ยวข้อง


Promptfoo หรือ DeepEval: ตารางทดสอบกับ metric เชิงความหมายแก้คนละปัญหา

LangChain หรือ LlamaIndex: งาน RAG ซับซ้อนกับงานค้นคืนเลือกคนละตัว

RAG หรือ Fine-tuning: ข้อมูลเปลี่ยนบ่อยกับพฤติกรรมผิด ต้องแก้คนละจุด

Typeform หรือ Jotform: 2,500 คำตอบทำให้ราคาห่าง 52 ดอลลาร์

ตามรอย AI agent ด้วย OpenTelemetry: อย่าเก็บพรอมป์ลับลง trace ทั้งก้อน
สมัครรับจดหมายข่าวของเรา
รับข่าวสารล่าสุดเกี่ยวกับ Web3, AI และคริปโตส่งตรงถึงกล่องจดหมายของคุณ