การประเมินผล C# LLM Eventparser ด้วย Promptfoo

การทดสอบโค้ดทั่วไปนั้นง่ายมาก คุณแค่เรียกใช้ฟังก์ชัน รับผลลัพธ์ และตรวจสอบว่าตรงกับที่คุณคาดหวังไว้หรือไม่

แต่การทดสอบ LLM นั้นแตกต่างออกไป LLM อาจคืนค่าเป็น "3 PM" ในการรันครั้งหนึ่ง และเป็น "15:00" ในอีกครั้งหนึ่ง ซึ่งทั้งคู่ล้วนถูกต้อง แต่การทดสอบแบบจับคู่คำต่อคำ (exact match) จะล้มเหลว คุณจำเป็นต้องตรวจสอบว่าคำตอบนั้น "ดี" หรือไม่ ไม่ใช่แค่ว่ามัน "เหมือนกันทุกประการ" หรือไม่

ผมได้สร้างแอปขนาดเล็กที่ชื่อว่า EventParser ขึ้นมาเพื่อทดสอบเรื่องนี้ โดยมันจะรับข้อความทั่วไปอย่างเช่น "Team sync on Friday at 3 PM" แล้วเปลี่ยนให้เป็นข้อมูลที่มีโครงสร้าง (structured data)

นี่คือวิธีการที่คุณสามารถทดสอบมันได้โดยใช้ Promptfoo และเวิร์กโฟลว์แบบ LLM-as-a-judge

การตั้งค่า

แอปนี้ใช้ไฟล์ prompt เพียงไฟล์เดียวคือ extract_event.txt โดยโค้ด C# จะอ่านไฟล์นี้ในขณะรัน (runtime) และ Promptfoo ก็จะอ่านไฟล์เดียวกันนี้เพื่อใช้ในการทดสอบ ซึ่งช่วยให้มั่นใจได้ว่าคุณกำลังทดสอบ prompt จริงๆ ที่ผู้ใช้จะเห็น

เวิร์กโฟลว์

แทนที่จะใช้คนมานั่งตรวจสอบทุกผลลัพธ์ เราจะใช้โมเดลผู้ตัดสิน (judge model) แทน กระบวนการนี้ประกอบด้วยสองบทบาท:

• โมเดลที่ถูกทดสอบ (The model under test): โมเดลที่ทำหน้าที่ให้คำตอบ • โมเดลผู้ตัดสิน (The judge model): โมเดลที่ทำงานเร็วกว่าและราคาถูกกว่า ทำหน้าที่ให้คะแนนคำตอบ

วิธีที่โมเดลผู้ตัดสินตัดสินใจ

โมเดลผู้ตัดสินจะใช้ rubric (เกณฑ์การให้คะแนน) ซึ่ง rubric ก็คือเกณฑ์ที่เป็นภาษาอังกฤษแบบเข้าใจง่าย แทนที่จะตรวจสอบหาข้อความ JSON ที่เฉพาะเจาะจง คุณเพียงแค่บอกโมเดลผู้ตัดสินว่าคำตอบควรจะมีเนื้อหาอะไรบ้าง

ตัวอย่าง Rubric: "คำตอบควรจะดึงข้อมูลชื่อกิจกรรม, วัน, เวลา และสถานที่ออกมา และต้องไม่เพิ่มรายละเอียดที่ไม่ได้ระบุไว้ในข้อความ"

การทดสอบหาข้อผิดพลาด

ผมลองจงใจทำให้ prompt เสียโดยการเพิ่มคำสั่งที่ผิดพลาดลงไปว่า: "If the message mentions coffee, set the location to Starbucks."

เมื่อผมรันการประเมินผล โมเดลผู้ตัดสินก็ตรวจพบข้อผิดพลาดทันที เนื่องจากข้อความต้นฉบับไม่ได้มีการพูดถึง Starbucks เลย แต่โมเดลกลับเกิดอาการหลอน (hallucinate) สถานที่ขึ้นมาเอง การทดสอบแบบจับคู่คำต่อคำอาจจะตรวจไม่พบสิ่งนี้ แต่โมเดลผู้ตัดสินสามารถตรวจจับข้อผิดพลาดทางความหมาย (semantic errors) ได้

ทำไมวิธีนี้ถึงได้ผล:

• สอดคล้องกับความเป็นจริง: สามารถยอมรับรูปแบบที่ถูกต้องได้หลากหลาย เช่น "3 PM" หรือ "15:00" • ใช้กฎที่อ่านง่าย: Rubric ที่เป็นภาษาอังกฤษแบบธรรมดานั้นเข้าใจได้ง่าย • ตรวจจับบั๊กทางความหมาย: สามารถตรวจพบอาการหลอน (hallucinations) และข้อผิดพลาดทางตรรกะได้ • คุ้มค่าใช้จ่าย: คุณสามารถใช้โมเดลราคาถูกเพื่อมาให้คะแนนโมเดลที่มีราคาแพงกว่าได้

แนวทางนี้ทำให้การทดสอบ LLM ให้ความรู้สึกเหมือนกับการทดสอบซอฟต์แวร์จริงๆ

Source: https://dev.to/bigboybamo/evaluating-a-c-llm-eventparser-with-promptfoo-4b87

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