ข้ามไปยังเนื้อหา
KoishiAI
EN
← สารบัญ

บทที่ 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 120k118,898 แถว สร้างด้วย Qwen2-72B-InstructMIT แต่ไลเซนส์ของ Qwen2-72B-Instruct ห้ามใช้ output ไปปรับปรุงโมเดลภาษาตัวอื่น ตรวจก่อนใช้เชิงพาณิชย์
Typhoon-S instruct post-trainingข้อมูลที่ใช้เทรน Typhoon-SODC-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 และการเลือกโมเดลฐานภาษาไทย

แหล่งอ้างอิง