บทที่ 2 จาก 5 · Fine-tune โมเดลภาษา — เมื่อไหร่ควรทำ ทำอย่างไร และรู้ได้อย่างไรว่าได้ผล
ข้อมูลสำหรับ fine-tune: รูปแบบไฟล์ chat template ภาษาไทย และเงื่อนไขการใช้
ข้อมูลกำหนดผลของ fine-tune มากกว่าเครื่องมือ บทนี้ว่าด้วยรูปแบบ messages ที่เครื่องมือต้องการ ทำไม chat template ต้องตรงกันตอนเทรนและตอนใช้ ข้อมูลภาษาไทยที่หาได้พร้อมไลเซนส์ และเงื่อนไขของผู้ให้บริการ AI ที่ห้ามเอาคำตอบไปเทรน
บทที่แล้วสรุปว่า fine-tune เหมาะกับการสอนรูปแบบหรือพฤติกรรม สิ่งที่โมเดลเรียนคือ ตัวอย่างที่เราให้ ตัวอย่างผิดหรือไม่คงเส้นคงวา โมเดลก็จะเรียนความผิดนั้นไปด้วย
2.1 รูปแบบข้อมูล: บทสนทนาแบบ messages
เครื่องมือหลักใช้รูปแบบเดียวกัน คือแต่ละตัวอย่างเป็นบทสนทนาที่มีบทบาท (role) กำกับ Hugging Face TRL ใช้แบบนี้
{"messages": [
{"role": "user", "content": "ของยังไม่ได้เลย สั่งไปตั้งแต่วันจันทร์"},
{"role": "assistant", "content": "ติดตามพัสดุ"}
]}
ส่วน OpenAI ใช้ไฟล์ JSONL คือหนึ่งบรรทัดต่อหนึ่งตัวอย่าง โครงสร้าง messages เหมือนกัน
ข้อที่ OpenAI เน้นคือ ตัวอย่างเทรนทุกตัวต้องอยู่ในรูปแบบเดียวกับที่จะใช้จริงตอนเรียกโมเดล ถ้าตอนใช้งานจริงคุณใส่คำสั่งระบบ (system) ไว้ข้างหน้า ตัวอย่างเทรนก็ต้องมีคำสั่งแบบเดียวกัน
2.2 Chat template: จุดที่พังเงียบ ๆ
โมเดลแชทแต่ละตัวมี chat template ของตัวเอง คือกติกาว่าจะแปลง messages เป็นข้อความก้อนเดียวอย่างไร พร้อมโทเคนพิเศษที่บอกว่าตรงไหนเป็นคำถาม ตรงไหนเป็นคำตอบ
เอกสารของ Hugging Face Transformers เตือนไว้สามข้อ
- ถ้าโทเคนควบคุมผิด โมเดล “จะทำงานแย่ลงอย่างมาก”
- template ต้อง ตรงกับรูปแบบที่โมเดลถูกเทรนมา เสมอ
- อย่าเติมโทเคนพิเศษซ้ำ เพราะมักทำให้ผลแย่ลง
TRL จะใส่ chat template ให้อัตโนมัติเมื่อข้อมูลเป็นแบบ messages และเอกสารของ TRL ย้ำว่า โทเคนจบข้อความ (EOS) ต้องตรงกับ template ไม่อย่างนั้นโมเดลที่เทรนแล้วอาจพูดไม่หยุด
ถ้าต้องการให้โมเดลเรียนเฉพาะส่วนคำตอบ ไม่เรียนส่วนคำถาม TRL มีตัวเลือก assistant_only_loss=True ซึ่งต้องใช้ template ที่มีเครื่องหมายบอกขอบเขตของคำตอบ
หลักง่าย ๆ คือ ใช้ template ของโมเดลฐานตัวนั้นทั้งตอนเทรนและตอนใช้งาน อย่าเขียนรูปแบบเอง ถ้าโมเดลฐานเป็น base model ที่ยังไม่มี chat template เช่น ThaiLLM-8B ให้ดูวิธีกำหนด template ในเอกสารของ TRL รุ่นที่ใช้ แล้วใช้ template นั้นตัวเดียวตลอด
2.3 คุณภาพสำคัญกว่าจำนวน
- ตัวอย่างต้องคงเส้นคงวา ถ้าข้อความแบบเดียวกันถูกติดป้ายต่างกัน โมเดลจะสับสนแบบเดียวกัน
- ตัวอย่างต้องเหมือนของจริง ถ้าลูกค้าพิมพ์ผิด พิมพ์ย่อ หรือปนภาษาอังกฤษ ตัวอย่างก็ต้องมีแบบนั้นด้วย
- เริ่มเล็กแล้ววัดผล OpenAI แนะนำให้เริ่มที่ 50 ตัวอย่าง และถ้าไม่ดีขึ้นให้คิดโจทย์ใหม่ก่อนเพิ่มข้อมูล
2.4 ข้อมูลภาษาไทย: ข้อควรรู้เฉพาะ
ข้อมูลภาษาไทยบนเว็บมีน้อยและปนขยะ งานวิจัยของ Typhoon รายงานว่าภาษาไทยมีไม่ถึง 0.5% ของข้อมูล Common Crawl และข้อความไทยที่เก็บจากเว็บจำนวนมากเป็นข้อความเขียนเพื่อ SEO หรือเนื้อหาซ้ำ
ข้อมูลแปลไม่เท่าข้อมูลที่เขียนเป็นภาษาไทย งานวิจัยของชุดข้อมูล WangchanThaiInstruct พบว่าโมเดลที่ fine-tune ด้วยข้อมูลชุดนี้ซึ่งคนไทยเขียน ทำได้ดีกว่าโมเดลที่ใช้ข้อมูลแปล ทั้งในและนอกโดเมนที่เทรน
ชุดข้อมูลภาษาไทยที่หาได้ อ่านไลเซนส์ก่อนใช้ทุกครั้ง
| ชุดข้อมูล | ลักษณะ | ไลเซนส์ตามหน้าชุดข้อมูล |
|---|---|---|
| WangchanThaiInstruct | คนเขียน 4 โดเมน 7 ประเภทงาน ชุด default มี 40,000 แถว | ต่างกันในแต่ละแถว มีทั้งแบบห้ามใช้เชิงพาณิชย์ (NC) และแบบต้องแบ่งปันต่อ (SA) |
| han-instruction-dataset (PyThaiNLP) | 15,821 แถว | CC-BY-SA 4.0 |
| WangchanX seed-free synthetic Thai 120k | 118,898 แถว สร้างด้วย Qwen2-72B-Instruct | MIT แต่ไลเซนส์ของ Qwen2-72B-Instruct ห้ามใช้ output ไปปรับปรุงโมเดลภาษาตัวอื่น ตรวจก่อนใช้เชิงพาณิชย์ |
| Typhoon-S instruct post-training | ข้อมูลที่ใช้เทรน Typhoon-S | ODC-By แต่หน้าชุดข้อมูลบอกว่าไลเซนส์ของแหล่งต้นทางอาจต่างกัน ให้ตรวจเอง |
ถ้าจะใช้ในงานเชิงพาณิชย์ ข้อมูลที่มีเงื่อนไข NC (ห้ามใช้เชิงพาณิชย์) ใช้ไม่ได้ ส่วนเงื่อนไข SA กำหนดให้งานที่ดัดแปลงแล้วเผยแพร่ต้องใช้ไลเซนส์เดียวกัน การที่โมเดลซึ่งเทรนจากข้อมูลนั้นนับเป็นงานดัดแปลงหรือไม่ยังไม่มีคำตอบชัด ถ้าเป็นงานสำคัญควรถามผู้เชี่ยวชาญด้านกฎหมาย
2.5 เงื่อนไขของผู้ให้บริการ: เอาคำตอบของ AI มาเทรนได้ไหม
วิธีที่หลายคนคิดคือ ให้โมเดลใหญ่เขียนตัวอย่างให้ แล้วเอามาเทรนโมเดลเล็ก ก่อนทำ ต้องอ่านเงื่อนไขของผู้ให้บริการ
| ผู้ให้บริการหรือโมเดล | เงื่อนไขที่ตรวจได้ |
|---|---|
| Anthropic | เงื่อนไขเชิงพาณิชย์ห้ามใช้บริการ “สร้างผลิตภัณฑ์หรือบริการที่แข่งขัน รวมถึงเทรนโมเดล AI ที่แข่งขัน” และนโยบายการใช้งานห้ามใช้ input และ output ไปเทรนโมเดล (“model distillation”) โดยไม่ได้รับอนุญาต |
| Google Gemini API | ห้ามใช้บริการ “พัฒนาโมเดลที่แข่งขันกับบริการ” |
| OpenAI | หน้าเงื่อนไขปฏิเสธการเข้าถึงอัตโนมัติ เราจึงตรวจถ้อยคำไม่ได้ ต้องอ่านเอง |
| Llama 4 (Meta) | ใช้ output ของ Llama สร้าง เทรน หรือ fine-tune โมเดลที่เผยแพร่ได้ แต่ชื่อโมเดลต้องขึ้นต้นด้วย “Llama” |
แต่ละรายเขียนต่างกัน นโยบายของ Anthropic ห้ามใช้ input และ output ไปเทรนโมเดลโดยไม่ได้รับอนุญาต ไม่ว่าโมเดลนั้นจะแข่งขันหรือไม่ ส่วนเงื่อนไขของ Gemini API ห้ามพัฒนาโมเดลที่ “แข่งขันกับบริการ” ซึ่งงานของคุณเข้าข่ายหรือไม่เป็นคำถามที่ต้องตีความ
โมเดลเปิดก็มีเงื่อนไขกับ output เช่นกัน ไลเซนส์ของ Qwen2 ห้ามใช้ output ไปปรับปรุงโมเดลภาษาตัวอื่น เงื่อนไขของ Gemma รุ่นก่อน Gemma 4 นับโมเดลที่เทรนจาก output ของ Gemma เป็นงานดัดแปลงของ Gemma และ Llama 4 บังคับเรื่องชื่อ
ทางที่ปลอดภัยที่สุดคือข้อมูลที่เราเขียนหรือเก็บเอง ถ้าจะใช้ output ของโมเดลใด ให้อ่านเงื่อนไขของโมเดลนั้นก่อน ข้อความในบทนี้ไม่ใช่คำแนะนำทางกฎหมาย งานเชิงพาณิชย์ที่สำคัญควรถามผู้เชี่ยวชาญ
2.6 ตัวอย่างสมมติ: ข้อมูลที่สอนผิด
ร้านในบทที่ 1 รวบรวมข้อความลูกค้าหลายร้อยข้อความมาติดป้ายหมวด โดยให้พนักงานสองคนแบ่งกันทำ คนหนึ่งจัด “ขอเปลี่ยนไซซ์” เป็น “ถามสินค้า” อีกคนจัดเป็น “ร้องเรียน”
ผลคือโมเดลที่เทรนออกมาจัดข้อความประเภทนี้แบบสุ่ม ปัญหาไม่ได้อยู่ที่โมเดลหรือเครื่องมือ แต่อยู่ที่กติกาการติดป้ายไม่ได้เขียนไว้ วิธีแก้คือเขียนคำนิยามของแต่ละหมวดพร้อมตัวอย่างก่อนเริ่มติดป้าย และให้ทั้งสองคนติดป้ายชุดเดียวกันสักส่วนหนึ่ง เพื่อดูว่าเห็นตรงกันแค่ไหน
2.7 ลงมือหลังอ่านบทนี้
- แปลงตัวอย่างที่เก็บไว้จากบทที่ 1 เป็นรูปแบบ messages แบบเดียวกับที่จะใช้จริง
- เขียนคำนิยามของทุกหมวดหรือทุกรูปแบบคำตอบก่อนติดป้าย
- ถ้าจะใช้ชุดข้อมูลสาธารณะ จดไลเซนส์ของแต่ละชุดไว้ข้างข้อมูล
- ถ้าคิดจะใช้คำตอบของโมเดลใหญ่มาเทรน อ่านเงื่อนไขของผู้ให้บริการนั้นก่อน
บทถัดไปว่าด้วยการเทรนจริงด้วย LoRA และ QLoRA และการเลือกโมเดลฐานภาษาไทย
แหล่งอ้างอิง
- Hugging Face TRL — SFT Trainer
- Hugging Face Transformers — Chat templates
- OpenAI — Supervised fine-tuning
- OpenAI — Fine-tuning best practices
- Typhoon: Thai Large Language Models (arXiv 2312.13951)
- WangchanThaiInstruct (arXiv 2508.15239)
- WangchanThaiInstruct dataset
- PyThaiNLP han-instruction-dataset
- WangchanX seed-free synthetic Thai 120k
- Typhoon-S instruct post-training dataset
- Anthropic — Commercial Terms of Service
- Anthropic — Usage Policy
- Google — Gemini API Additional Terms of Service
- Meta — Llama 4 Community License