3 คะแนน โดย GN⁺ 2026-01-18 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โมเดลภาษาขนาดใหญ่ (LLM) มักมีความไม่เสถียรเมื่อสร้างผลลัพธ์ในรูปแบบที่มีโครงสร้าง เช่น JSON, XML และโค้ด โดยนี่คือ คู่มือเชิงปฏิบัติสำหรับนักพัฒนา เพื่อแก้ปัญหาดังกล่าว
  • ด้วยธรรมชาติแบบความน่าจะเป็น เอาต์พุตอาจเสียรูปแบบอย่างไม่เป็นเชิงกำหนดได้ จึงครอบคลุม เทคนิคการทำโครงสร้างแบบกำหนดได้ (deterministic) เพื่อชดเชยข้อจำกัดนี้
  • ครอบคลุมทั้งหลักการทำงานภายใน, การเลือกเครื่องมือและเทคโนโลยี, การดีพลอย·การขยายระบบ·การปรับต้นทุนให้เหมาะสม, และ การปรับปรุงคุณภาพเอาต์พุต ตลอดทั้งกระบวนการ
  • รวบรวมข้อมูลล่าสุดของวงการการสร้างผลลัพธ์แบบมีโครงสร้างที่เปลี่ยนแปลงรวดเร็วไว้ในรูปแบบ เอกสารที่อัปเดตอย่างต่อเนื่อง
  • เป็นแหล่งอ้างอิงสำคัญสำหรับนักพัฒนาที่นำ LLM ไปใช้งานเชิงโปรแกรม เช่น การดึงข้อมูล, การสร้างโค้ด, การเรียกใช้เครื่องมือ

ความจำเป็นของเอาต์พุต LLM แบบมีโครงสร้าง

  • LLM สามารถสร้าง เอาต์พุตที่ถูกต้องตามไวยากรณ์ เช่น JSON, XML และโค้ดได้เป็นส่วนใหญ่ แต่ด้วยธรรมชาติแบบความน่าจะเป็น จึงอาจเกิด ข้อผิดพลาดของรูปแบบหรือผลลัพธ์ที่ไม่สมบูรณ์ ได้
    • สิ่งนี้ก่อปัญหาใน กระบวนการอัตโนมัติ เช่น การดึงข้อมูล, การสร้างโค้ด, และการเรียกใช้เครื่องมือ
  • เพื่อแก้ปัญหาเหล่านี้ จึงจำเป็นต้องมี แนวทางเอาต์พุตแบบมีโครงสร้างที่กำหนดได้ (Deterministic)
  • คู่มือนี้ครอบคลุม ภาพรวมของเครื่องมือและเทคนิค เพื่อช่วยให้นักพัฒนาสามารถทำเอาต์พุตแบบมีโครงสร้างได้อย่างเสถียร

เนื้อหาหลักของคู่มือ

  • รวมประเด็นเชิงปฏิบัติ เช่น หลักการทำงานภายใน, เครื่องมือและเทคโนโลยีที่เหมาะสมที่สุด, เกณฑ์ในการเลือกเครื่องมือ, วิธีสร้าง·ดีพลอย·ขยายระบบ, การปรับเวลาแฝง·ต้นทุนให้เหมาะสม, และ การยกระดับคุณภาพเอาต์พุต
  • แต่ละหัวข้อจัดทำเป็น แนวทางแบบเป็นขั้นตอนที่นักพัฒนานำไปใช้ได้จริง
  • รวบรวมงานวิจัยล่าสุดและเครื่องมือโอเพนซอร์สเกี่ยวกับเอาต์พุตแบบมีโครงสร้าง ไว้ในเอกสารเดียว

ความทันสมัยและการอัปเดต

  • เทคโนโลยีการสร้างผลลัพธ์แบบมีโครงสร้าง พัฒนาอย่างรวดเร็วมาก ทำให้ข้อมูลเดิม ล้าสมัยได้อย่างรวดเร็ว
  • คู่มือนี้จึงถูกรักษาไว้ในรูปแบบ living document ที่อัปเดตเป็นประจำ
  • นักพัฒนาจึงเข้าถึงข้อมูลล่าสุดได้ จากที่เดียว โดยไม่ต้องไล่ค้นจากเอกสารวิชาการ บล็อก และคลัง GitHub หลายแห่ง

วิธีการใช้งาน

  • สามารถอ่านเรียงตั้งแต่ต้นจนจบ หรือใช้เป็น คู่มืออ้างอิงที่ค้นหัวข้อที่ต้องการได้ทันที
  • ออกแบบโดยเน้น นักพัฒนาภาคปฏิบัติ ทำให้ใช้อ้างอิงได้รวดเร็วเมื่อเจอปัญหาเฉพาะด้าน

ผู้จัดทำและชุมชน

  • คู่มือนี้จัดทำโดย ทีม Nanonets
  • พวกเขายังเผยแพร่ข้อมูลเชิงลึกล่าสุด ความก้าวหน้าสำคัญ ตลอดจนเครื่องมือและเทคโนโลยีที่มีประโยชน์ ผ่าน จดหมายข่าวชุมชนนักพัฒนา LLM แบบรายสองสัปดาห์

1 ความคิดเห็น

 
GN⁺ 2026-01-18
ความเห็นบน Hacker News
  • เป็นไกด์ที่สวยงามมาก โดยเฉพาะ แอนิเมชันสลับแท็บ หลายหน้าที่ชอบมาก
    ผมคิดว่าตัวเองเข้าใจ grammar-constrained generation ค่อนข้างดีแล้ว (เคยมีส่วนร่วมกับ implementation ของ grammar ใน llama.cpp อยู่บ้าง) แต่ก็ยังได้มุมมองใหม่จากไกด์นี้
    ผมคิดว่า structured output เป็นหนึ่งใน ความสามารถที่ถูกประเมินค่าต่ำที่สุด ของเอนจิน LLM ด้วยข้อจำกัดด้านไวยากรณ์ เราจึงสามารถใช้ LLM เป็นส่วนหนึ่งของ pipeline ที่ใหญ่กว่าได้อย่างเสถียร (เช่น tool-calling agent)
    แม้ผลลัพธ์อาจผิดในเชิงความหมาย แต่ในเชิงไวยากรณ์จะถูกต้องเสมอ ซึ่งสำคัญมากโดยเฉพาะเวลาใช้โมเดลแบบรันในเครื่อง
    ตัวอย่างเช่น ตัวอย่างตัวกรองสแปมบน Raspberry Pi ของ Jart ถ้าใช้ grammar บังคับให้โมเดล TinyLlama ตอบได้แค่ "yes" หรือ "no" ก็จะทำงานได้เสถียรแม้บนฮาร์ดแวร์ขนาดเล็ก

    • สงสัยว่าถ้าโมเดลอยากให้ผลลัพธ์อย่างอื่นจะเกิดอะไรขึ้น และควรจัดการภายใน llamafile หรือทำผ่าน wrapper ภายนอกจะดีกว่า อีกอย่างก็อยากรู้ว่าตั้งค่า retry หรือกำหนดขอบเขตของ JSON กันอย่างไร
  • เป็นไกด์ที่ยอดเยี่ยมมาก ผมเคยทำวิจัยเรื่อง structured generation ตอนเรียนปริญญาเอก เลยขอแชร์แหล่งข้อมูลบางอย่างสำหรับคนที่สนใจ
    ฝั่งไลบรารีมี Outlines, Guidance, XGrammar
    ฝั่งงานวิจัยแนะนำ Efficient Guided Generation for Large Language Models, Automata-based constraints for language model decoding, Pitfalls, Subtleties, and Techniques in Automata-Based Subword-Level Constrained Generation
    ส่วนบทความบล็อกมี LLM Decoding with Regex Constraints และ Coalescence: making LLM inference 5x faster

    • ผมยังไม่ค่อยเข้าใจว่า Outlines ทำหน้าที่อะไรในสแตกกันแน่ มันคล้ายกับ structured output API ที่ผู้ให้บริการโมเดลรายใหญ่มีให้หรือเปล่า หรือพอจะเทียบกับโปรเจกต์อย่าง BAML ได้ไหม
    • ใน งานวิจัย DFybOGeGDS ส่วน canonical filtering ดูเหมือนจะไม่ได้คำนึงถึง pretokenization อยากรู้ว่ามีงานวิจัยเรื่อง canonical generation ที่สะท้อน pretokenization regex จริง ๆ บ้างไหม
    • บอกว่าเป็น “แหล่งอ้างอิงอื่น ๆ” แต่ดูเหมือนแค่ลิสต์ไลบรารีที่มีอยู่ในไกด์อยู่แล้วซ้ำอีกที
    • เหมือนขุมทรัพย์เลย หัวข้อ ข้อจำกัดแบบอิง Automata น่าสนใจมาก
  • เป็นไกด์ที่เรียบเรียงมาดีมาก ถ้าอยากรู้เพิ่มเรื่อง การปรับแต่ง Guidance & llguidance แนะนำ บทความสั้น ที่พวกเราเขียน

    • ผมเป็นหนึ่งในผู้เขียนที่อ่านงานนั้นแล้ว โดยเฉพาะ implementation ของ slicing สำหรับ dense token mask ที่น่าประทับใจมาก
  • ไกด์นี้ครอบคลุมสองแนวทางหลักที่คนใช้กันดี แต่ constrained generation อาจทำให้ผลลัพธ์เบี่ยงจาก distribution เดิมของ LLM ได้
    ตัวอย่างเช่น เวลาที่ LLM สร้างอ็อบเจ็กต์เชิงโครงสร้างที่ยาว มันมักชอบแพตเทิร์นอย่าง ‘…’ แต่การสร้างแบบมีข้อจำกัดจะบังคับให้ปิดด้วยเครื่องหมายคำพูดหรือโทเคนอื่น ๆ แทน ซึ่งอาจทำให้ผลลัพธ์ผิดมากขึ้น
    ในทางกลับกัน resampling จะลองใหม่ไปเรื่อย ๆ จนกว่าจะได้ผลลัพธ์ที่ใช้ได้ จึงเสถียรกว่า
    อีกอย่างผมคิดว่าแทนที่จะยืด context ด้วยการแนบ schema error เพิ่มเข้าไปเรื่อย ๆ การ retry ตรง ๆ มักดีกว่าทั้งด้านคุณภาพและต้นทุน

    • ใช้วิธีแบบไฮบริดก็ได้ คือเริ่มจากการสร้างแบบไม่จำกัด (unconstrained) ก่อน แล้วค่อยใช้การสร้างแบบมีข้อจำกัด (constrained) เฉพาะตอนที่ล้มเหลว
  • สงสัยว่าโมเดลระดับ SoTA อย่าง Opus, Gemini ฯลฯ ยังจำเป็นต้องมี output schema enforcement อยู่ไหม
    เดี๋ยวนี้เวลาให้โมเดลสร้าง JSON หรือโค้ดก็มักแทบไม่มี syntax error แล้ว เลยอยากรู้ว่าเบื้องหลังยังมีการตรวจ schema อยู่หรือไม่
    ผมเข้าใจว่าการสร้างแบบมีโครงสร้างยังจำเป็นสำหรับโมเดลขนาดเล็ก

    • ยิ่ง schema ซับซ้อนก็ยิ่งยังมีประโยชน์ เพราะ LLM ยังอ่อนเรื่อง การนับ อยู่ ถึงโมเดลจะดีขึ้นแล้ว แต่ด้วยความเป็นเชิงความน่าจะเป็นก็ยังไม่สมบูรณ์แบบ
    • แม้แต่โมเดลรุ่นใหม่ก็ยังชอบแปะโทเคนเกินมาอย่าง json\n อยู่บ่อย ๆ ดังนั้นการระบุ JSON response schema ก็ยังปลอดภัยกว่า
  • การบังคับ structured output ทำให้เกิด ผลกระทบด้านประสิทธิภาพ ได้ บางกรณีอาจช้าลง 2–3 เท่า ต้องชั่งดูว่าเป็นต้นทุนที่ยอมรับได้ไหมในแต่ละงาน

  • เป็นไกด์ที่น่าทึ่งจริง ๆ ถ้ามีอะไรแบบนี้เมื่อ 1 ปีก่อนคงดีมาก ผมจะเอาไปแชร์ให้คนรอบตัวแน่นอน

  • เป็นไกด์ที่ดีมาก โดยเฉพาะ ไดอะแกรม masked decoding ที่ชอบมาก

    • ผมเป็นหนึ่งในผู้เขียน จะลองตรวจปัญหาของลิงก์ดู ตอนนี้ผู้ให้บริการโมเดลเชิงพาณิชย์ต่างก็ทยอยเพิ่ม ความสามารถด้าน structured output กันอยู่ เราเลยตั้งใจจะอัปเดตไกด์ต่อเนื่อง
  • สงสัยว่ามี รูปแบบผลลัพธ์ที่ parse ง่ายและเชื่อถือได้กว่า JSON ไหม YAML หรือ TOML ก็มีข้อเสียของตัวเอง แต่ในแง่จำนวนโทเคนหรือค่าใช้จ่ายอาจดีกว่าก็ได้

    • ผมใช้ ฟอร์แมต TOON เพื่อจุดประสงค์นั้น
    • เหมือนที่คนก็รู้สึกว่าเขียน JSON น่ารำคาญ สำหรับ LLM เอง การให้สร้างผลลัพธ์เป็น โค้ดลักษณะ TypeScript อาจดีกว่าด้วยซ้ำ แต่ก็ต้องมี sandbox และการจำกัดทรัพยากรเพื่อความปลอดภัย
    • พวกเรากำลังพัฒนา pipeline แปลงคอนเทนต์ที่ใช้ Markdown + YAML front matter เป็นฐาน แม้ tooling ของ JSON จะยังไม่ดีมาก แต่การตรวจสอบความถูกต้องไม่ได้ยาก
    • ผม บังคับ XML schema ด้วย regex แล้วค่อยถอดรหัสด้วย XML parser โดยเฉพาะส่วน code block จะครอบด้วย CDATA เพื่อให้มีอิสระมากขึ้น regex structured output ของ OpenAI API เหมาะกับโค้ดมากกว่า JSON
    • น่าจะลองทำ evaluation ด้วยตัวเอง จากการทดลองของผม XML ให้ผลดีกว่า JSON เสมอในงานแบบ out-of-distribution
  • อยากรู้ว่า เทคโนโลยีสแตก ของหน้าคู่มือ/คุกบุ๊กคืออะไร ดูไม่เหมือน MkDocs หรือ GitBook เลย ใช้อะไรกัน

    • ใช้ Docusaurus