บทที่ 7 · คิดเป็นขั้น ใช้เครื่องมือ เป็น agent หน้า 5/13 ~3 นาที

Tool calling: AI กดปุ่มเองได้ยังไง

โมเดลไม่เคยแตะระบบวันลาเลย ที่เกิดขึ้นจริงมี 4 ขั้น

  1. แอปแนะนำเครื่องมือ ชื่อ หน้าที่ และค่าที่ต้องใส่ของแต่ละเครื่องมือ ถูกเขียนใน context มักอยู่ใกล้ คำสั่งระบบ (system prompt)ข้อความต้นบทสนทนาที่กำหนดบทบาทและกติกาของผู้ช่วย มักตั้งโดยผู้ทำแอปและผู้ใช้อาจมองไม่เห็น โมเดลถูกฝึกให้ให้น้ำหนักกับมันมาก แต่มันก็ยังเป็นแค่ข้อความดูคำศัพท์ทั้งหมด (บทที่ 5) ในรูปแบบตาม แม่แบบบทสนทนา (chat template, special token)รูปแบบที่แปลงบทสนทนาเป็นข้อความยาวชิ้นเดียว โดยมีโทเคนพิเศษ (special token) เป็นป้ายบอกว่าใครพูดและคำตอบจบตรงไหน แต่ละตระกูลโมเดลใช้แม่แบบไม่เหมือนกันดูคำศัพท์ทั้งหมด ที่โมเดลคุ้น
  2. โมเดลเขียนคำขอ เมื่อ "ต้องการ" ข้อมูล มันเขียน token ในรูปแบบตายตัว มักเป็น JSON เช่น {"tool": "get_leave_balance", "arguments": {"team": "HR"}} ความสามารถนี้มาจาก การฝึกรอบหลัง (post-training)ขั้นฝึกเพิ่มหลัง pre-training ที่เปลี่ยนเครื่องต่อข้อความให้เป็นผู้ช่วย เช่น SFT และ RLHF ใช้ข้อมูลน้อยกว่ามากแต่เปลี่ยนพฤติกรรมได้เยอะดูคำศัพท์ทั้งหมด (บทที่ 5) แต่มันยังเขียนผิดรูปหรือใส่ค่าผิดได้ หลายแอปจึงบังคับรูปแบบตอนสุ่ม token และตรวจคำขอก่อนทำจริง
  3. โปรแกรมทำงานจริง แอปเห็นคำขอ หยุดการเขียน เรียกระบบจริง แล้วต่อผลท้าย หน้าต่างบริบท (context window)จำนวน token สูงสุดที่โมเดลมองเห็นได้ในครั้งเดียว นับรวมทั้งคำสั่งและคำตอบดูคำศัพท์ทั้งหมด
  4. โมเดลเดาต่อ จากผลที่ได้ ไม่ใช่จากความจำ คล้าย แร็ก (Retrieval-Augmented Generation, RAG)เทคนิคค้นเอกสารที่เกี่ยวข้องด้วย embedding แล้วแนบให้ AI อ่านก่อนตอบ เหมือนสอบแบบเปิดหนังสือดูคำศัพท์ทั้งหมด (บทที่ 2) แต่คราวนี้โมเดลเลือกเองว่าจะค้นเมื่อไหร่

กด "ขั้นถัดไป" แล้วดูว่าแต่ละกล่องใครเขียน

พี่แนนถามวันลาของทีม

กดขั้นถัดไปทีละขั้น แล้วดูว่าแต่ละกล่องใครเป็นคนเขียน

อ่านทุกขั้นแบบข้อความ
  1. ระบบ (system prompt)

    คุณคือผู้ช่วยฝ่าย HR ตอบจากข้อมูลจริงเท่านั้น เครื่องมือที่ใช้ได้: get_leave_balance(team) — ดูวันลาพักร้อนที่เหลือของทุกคนในทีม และยอดรวม

    แอปเขียนคู่มือเครื่องมือไว้ใน context โมเดลรู้จักเครื่องมือจากข้อความนี้เท่านั้น

  2. ผู้ใช้

    ทีม HR เหลือวันลาพักร้อนรวมกี่วัน ใครเหลือน้อยที่สุด

    คำถามของพี่แนนถูกต่อท้าย context

  3. โมเดลเขียน

    {
      "tool": "get_leave_balance",
      "arguments": {
        "team": "HR"
      }
    }

    โมเดลไม่ได้เปิดระบบเอง มันแค่เขียน token ชุดนี้ออกมา ในรูปแบบที่ถูกฝึกให้ใช้เมื่อต้องเรียกเครื่องมือ

  4. ผลจากเครื่องมือ

    {
      "quota": 10,
      "remaining": {
        "แนน": 7,
        "เฟิร์น": 5.5,
        "ต้า": 3,
        "ปุ้ย": 0
      },
      "total": 15.5
    }

    โปรแกรมของแอปเรียกระบบวันลาจริง ระบบคำนวณยอดรวมให้ แล้วแอปเอาผลมาต่อท้าย context เหมือนข้อความอีกชิ้น

  5. โมเดลเขียน

    ทีม HR เหลือวันลาพักร้อนรวม 15.5 วัน · น้องปุ้ยเหลือน้อยที่สุด (0 วัน คือใช้ครบแล้ว)

    โมเดลเขียนคำตอบต่อตามปกติ คราวนี้อ่านตัวเลขจากผลของระบบ ไม่ใช่จากความจำหรือการบวกเอง

  1. ระบบ (system prompt)

    คุณคือผู้ช่วยฝ่าย HR ตอบจากข้อมูลจริงเท่านั้น เครื่องมือที่ใช้ได้: get_leave_balance(team) — ดูวันลาพักร้อนที่เหลือของทุกคนในทีม และยอดรวม

แอปเขียนคู่มือเครื่องมือไว้ใน context โมเดลรู้จักเครื่องมือจากข้อความนี้เท่านั้น

ทุกกล่องด้านบนคือ context ก้อนเดียวที่โมเดลอ่านทุกครั้ง (ตอนนี้ 1 ชิ้น)

ขั้น 1 จาก 5: ระบบ (system prompt)

ดูจนจบทุกขั้น

ข้อความใน context ตอนนี้ สำหรับโปรแกรมอ่านหน้าจอ
ขั้นใครเขียนข้อความ
1⚙️ ระบบ (system prompt)คุณคือผู้ช่วยฝ่าย HR ตอบจากข้อมูลจริงเท่านั้น · เครื่องมือที่ใช้ได้: · get_leave_balance(team) — ดูวันลาพักร้อนที่เหลือของทุกคนในทีม และยอดรวม

ยอดรวม 15.5 วัน และ "ปุ้ย 0 วัน" มาจากระบบจริง ไม่ได้มาจากการเดา จึงลดอาการมั่ว (hallucination)เมื่อ AI ตอบข้อมูลที่ไม่จริงอย่างมั่นใจ เพราะมันถูกฝึกให้เขียนสิ่งที่ฟังดูน่าจะใช่ ไม่ใช่สิ่งที่จริงดูคำศัพท์ทั้งหมด (บทที่ 1)

งานคำนวณสำคัญก็ควรให้เครื่องมือทำ เพราะโมเดลบวกเลขเองยังพลาดได้

Tool calling = โมเดลเขียนใบสั่งงาน (มักเป็น JSON) แล้วโปรแกรมของแอปทำจริง ผลถูกต่อท้าย context ให้โมเดลตอบจากข้อมูลจริง

มังคุด มาสคอตมังคุด

มังคุด

แปลว่าถ้าแอปไม่เอา JSON นั้นไปทำ มันก็เป็นแค่ข้อความเฉยๆ เลยเหรอ!