การแก้ไขข้อผิดพลาดด้านการเข้ารหัส (Encoding Errors) ในการทำ Benchmark สำหรับ Local LLM
ผมต้องการสร้างเครื่องมือสำหรับสลับและทำ Benchmark โมเดล Local LLM นอกจากนี้ผมยังได้เพิ่มคำถามสำหรับ Benchmark ภาษาเกาหลีจำนวนมากเพื่อให้ทดสอบโมเดลได้ดียิ่งขึ้น
ทุกอย่างทำงานได้ปกติจนกระทั่งผมเริ่มรัน Benchmark แล้วผมก็เจอข้อผิดพลาดนี้ซ้ำๆ:
UnicodeEncodeError: 'cp949' codec can't encode characters.
ผมคิดว่าปัญหาอยู่ที่โค้ด Python ของผม ผมพยายามเปลี่ยนการตั้งค่า encoding เป็น utf-8 และพยายามถอดรหัส (decode) สตริงด้วยตัวเอง แต่ก็ไม่มีอะไรได้ผลเลยเป็นเวลาหลายชั่วโมง
ปัญหาที่แท้จริงไม่ได้อยู่ที่สคริปต์ของผม แต่เป็นเพราะตัว Local LLM worker พยายามบันทึกคำตอบของโมเดลโดยใช้การเข้ารหัสเริ่มต้นของระบบ (system default encoding) ซึ่งใน Windows มักจะเป็น CP949 เมื่อ worker พยายามบันทึกตัวอักษรเกาหลีโดยใช้ CP949 มันจึงล้มเหลว
วิธีแก้ไขนั้นง่ายมาก ผมแค่เปลี่ยนให้ worker ใช้ utf-8 อย่างชัดเจน (explicitly) เมื่อทำการบันทึกไฟล์
นอกจากนี้ผมยังได้สร้างระบบอัตโนมัติเพื่อจัดการกระบวนการนี้ โดยมีขั้นตอนดังนี้:
- ดาวน์โหลดโมเดลที่เข้าข่าย (candidate models)
- รัน Benchmark กับโมเดลที่ดีที่สุดในปัจจุบัน
- ทดสอบโมเดลใหม่ๆ ทั้งหมดที่เข้าข่าย
- เลือกและแนะนำโมเดลที่ดีที่สุดตามคะแนนที่ได้
จากการใช้ระบบอัตโนมัตินี้ ผมพบว่า Gemma2:2b ทำงานได้ดีกว่าโมเดล EXAONE มากสำหรับงานภาษาเกาหลี โดยให้คำตอบที่เป็นธรรมชาติกว่าและให้ผลลัพธ์เชิงสร้างสรรค์ที่ดีกว่าในความเร็วที่ใกล้เคียงกัน
บทเรียนที่ได้รับ:
- อย่าเชื่อใจการเข้ารหัสเริ่มต้นของระบบ ให้ใช้ utf-8 สำหรับการอ่าน/เขียนไฟล์ (file I/O) เสมอ
- เมื่อใช้
json.dumpกับข้อความภาษาเกาหลี ให้ใช้ensure_ascii=Falseและระบุ utf-8 - หากคุณพบข้อผิดพลาดด้านการเข้ารหัส ให้ตรวจสอบระบบทั้งหมดและตรรกะการบันทึกไฟล์ ไม่ใช่แค่ตรวจสอบโค้ดส่วนที่คุณเขียนโดยตรง
- ใช้ระบบอัตโนมัติเพื่อค้นหาโมเดลที่ดีที่สุดสำหรับความต้องการเฉพาะของคุณ
ชุมชนการเรียนรู้เพิ่มเติม (Optional): https://t.me/GyaanSetuAi