CCA · Foundations

tool_use กับ JSON schema รับประกันโครงสร้าง แต่ไม่รับประกันความหมาย

แนวคิด

วิธีที่เชื่อถือได้ที่สุดในการบังคับให้ได้ structured output คือใช้ tool use ที่มี JSON schema เป็น input_schema แล้วดึงข้อมูลที่มีโครงสร้างออกมาจาก tool_use block ที่โมเดลส่งกลับ แทนที่จะขอให้โมเดลพ่น JSON เป็นข้อความแล้วมาลุ้นว่า parse ได้ไหม คุณนิยาม schema ของ tool ไว้ โมเดลจึงกรอกค่าตามช่องที่กำหนด

exam guide วางกรอบเรื่องนี้ว่า tool use กับ JSON schema คือแนวทางที่รับประกัน schema-compliant output และกำจัด JSON syntax error ได้ ซึ่งเอกสารปัจจุบันยืนยันและเสริมรายละเอียด คือมีกลไก strict tool use ให้ใส่ strict: true บนนิยาม tool เพื่อรับประกันว่า tool call ตรงกับ schema เป๊ะ โดย schema ต้องมี additionalProperties: false และระบุ required เอกสารยังมีอีกกลไกคู่กันคือ structured outputs ผ่าน output_config.format ที่ใช้ constrained decoding บังคับรูปแบบคำตอบทั้งก้อน จุดนี้คือส่วนที่เอกสารละเอียดกว่าถ้อยคำใน exam guide ผู้เรียนควรรู้ว่ากลไกที่ทำให้ tool use ตรง schema แน่นอนคือ strict: true ไม่ใช่แค่การมี schema เฉย ๆ

ทำไมสำคัญ

ประโยชน์ที่ชัดคือกำจัด syntax error เอกสารระบุว่า constrained decoding รับประกันว่า output valid เสมอ ไม่มี JSON.parse พัง type ตรงตามที่กำหนด และไม่ต้อง retry เพราะ schema ผิด นี่ตัดปัญหากวนใจที่สุดของการดึง output แบบ JSON ด้วยข้อความล้วนออกไปทั้งหมด

แต่หัวใจที่ต้องเข้าใจให้ลึกคือ schema ที่เข้มงวดกำจัดได้แค่ syntax error ไม่ได้กำจัด semantic error เอกสารพูดชัดว่า structured outputs รับประกันความถูกต้องเชิงโครงสร้างเท่านั้น ไม่ได้รับประกันว่าเนื้อหาถูก output อาจเป็น JSON ที่ valid ตรง schema ทุกประการ แต่ค่าข้างในผิดความหมายได้ เช่น line item ที่บวกกันแล้วไม่เท่ากับ total หรือค่าที่ถูกใส่ผิด field เอาราคาไปใส่ช่องจำนวน

นี่คือเส้นแบ่งที่พลาดกันบ่อย คนมักคิดว่าพอบังคับ schema ได้แล้วคือจบ แต่จริง ๆ แล้ว schema แก้ได้แค่ "รูปแบบถูก" ส่วน "ค่าถูก" ยังต้องอาศัยกลไกอื่น เช่น validation และ retry ที่จะกล่าวในบทถัดไป หรือการให้โมเดลดึงค่าคำนวณมาเทียบกับค่าที่ระบุ การรู้เส้นแบ่งนี้ทำให้คุณไม่วางใจ output เกินจริงเพียงเพราะมันผ่าน schema

ตัวอย่าง

// นิยาม extraction tool ด้วย strict JSON schema
{
  "name": "extract_invoice",
  "strict": true,
  "input_schema": {
    "type": "object",
    "properties": {
      "invoice_number": { "type": "string" },
      "total":          { "type": "number" },
      "line_items":     { "type": "array", "items": { "type": "number" } }
    },
    "required": ["invoice_number", "total", "line_items"],
    "additionalProperties": false
  }
}

// output ที่ผ่าน schema แต่ผิดความหมาย (semantic error):
// line_items = [100, 150] แต่ total = 200  → บวกกันได้ 250 ไม่ตรง
// schema ไม่จับข้อผิดพลาดนี้ เพราะโครงสร้างถูกต้องทุกช่อง

เช็คความเข้าใจ

กลไกใดในเอกสารที่รับประกันว่า tool call ตรงกับ JSON schema เป๊ะ และต้องกำหนดอะไรใน schema

tool use กับ strict JSON schema กำจัด error ประเภทใดได้ และประเภทใดไม่ได้

อ่านต่อ