วิธีใช้งาน OpenAI Structured Outputs

เอาต์พุตที่มีโครงสร้างของ OpenAI รับประกัน JSON ที่ตรงตามสคีมาของคุณ ดู json_schema + strict เทียบกับ JSON mode, ตัวอย่างการใช้งาน, ข้อจำกัด และวิธีการทดสอบ

INEZA Felin-Michel

INEZA Felin-Michel

26 June 2026

วิธีใช้งาน OpenAI Structured Outputs

Apidog สำหรับองค์กร

การติดตั้งแบบ On-Premises

SSO & RBAC

รองรับมาตรฐาน SOC 2

สำรวจ Apidog Enterprise

เมื่อจบคู่มือนี้ คุณจะสามารถเรียกใช้ structured outputs ของ OpenAI จากโค้ดของคุณเองได้: เพียงแค่ส่ง JSON Schema ให้โมเดล, ตั้งค่า strict: true และรับผลตอบกลับที่รับประกันว่าจะตรงกับรูปแบบที่คุณต้องการ คุณจะได้ส่งคำขอครั้งแรก, อ่านผลตอบกลับ, จัดการกรณีพิเศษ, และ สร้างชุดการทดสอบ API ใน Apidog ที่ยืนยันว่า payload เป็นไปตามที่กำหนดจริง

ปุ่ม

สิ่งที่คุณต้องมีก่อนเริ่มต้น

Structured outputs กำหนดข้อจำกัดในการสร้างของโมเดลเพื่อให้ผลลัพธ์เป็นไปตาม JSON Schema ที่คุณระบุ เมื่อคุณส่ง schema โดยตั้งค่า strict: true โมเดลจะไม่สามารถสร้างฟิลด์ที่ละเมิดข้อกำหนดนั้นได้ คีย์ที่จำเป็นทุกตัวจะปรากฏ, ประเภททุกตัวจะตรงกัน, และค่า enum ทุกตัวจะเป็นหนึ่งในรายการที่คุณระบุ คุณจะหยุดเขียนโค้ดสำหรับป้องกันการ parsing และเริ่มเชื่อถือ payload ได้

นี่เป็นการอัปเกรดที่แท้จริงจากทางเลือกอื่น การสั่งงานแบบอิสระ เช่น "ตอบกลับด้วย JSON เท่านั้น" มักจะใช้ได้จนกว่าจะไม่ได้ผล เพียงแค่การเบี่ยงเบนเหตุผลเล็กน้อย คุณก็จะได้ข้อความเชิงอธิบายที่ห่อหุ้มออบเจกต์ของคุณ หรือวันที่ที่คุณคาดหวังจะเป็นจำนวนเต็ม Structured outputs เปลี่ยนข้อตกลงจากคำสั่งที่คาดหวังให้เป็นข้อจำกัดที่ถูกบังคับใช้ ณ เวลาถอดรหัส

ในการทำตาม คุณต้องมี:

เลือกโมเดลที่เหมาะสม

Structured outputs มีให้ใช้งานในโมเดลล่าสุดของ OpenAI โดยเริ่มต้นจากตระกูล GPT-4o และต่อเนื่องไปถึงซีรีส์ GPT-5 เอกสารของ OpenAI ปัจจุบันแนะนำให้เริ่มต้นโปรเจกต์ใหม่บนโมเดลเรือธงล่าสุด (gpt-5.5 ในขณะที่เขียน) โมเดลรุ่นเก่าและโมเดลยุค gpt-3.5 รองรับโหมด JSON แต่ไม่รองรับการบังคับใช้ schema แบบเข้มงวด หากคุณพึ่งพา strict: true โปรดยืนยันว่า ID โมเดลเฉพาะรองรับคุณสมบัตินี้ก่อนที่คุณจะนำไปใช้งาน เนื่องจากคุณสมบัตินี้เชื่อมโยงกับเวอร์ชันของโมเดล และ OpenAI จะอัปเดตเวอร์ชันเหล่านี้ไปข้างหน้า

เป็นประโยชน์ที่จะรู้ว่าคุณกำลังใช้คุณสมบัติใดอยู่จริง ๆ เพราะ OpenAI มีสองคุณสมบัติที่เกี่ยวข้องกันซึ่งอาจทำให้สับสนได้ง่าย

โหมด JSON (response_format: { "type": "json_object" }) รับประกันว่าผลลัพธ์เป็น JSON ที่ถูกต้องตามหลักไวยากรณ์ แค่นั้นเอง มันไม่รู้จักฟิลด์ของคุณ, ประเภทของคุณ หรือคีย์ที่คุณต้องการ คุณยังคงต้องตรวจสอบรูปแบบด้วยตัวเอง

Structured outputs (response_format ที่มี type: "json_schema" และ strict: true) รับประกันว่าผลลัพธ์เป็น JSON ที่ถูกต้อง และ ตรงกับ schema ของคุณ OpenAI อธิบาย structured outputs ว่าเป็นการพัฒนาของโหมด JSON: ทั้งสองสร้าง JSON ที่ถูกต้อง แต่มีเพียง structured outputs เท่านั้นที่บังคับใช้ตาม schema สำหรับงานใหม่ คุณควรเลือก structured outputs

โหมด JSON Structured outputs (เข้มงวด)
พารามิเตอร์ response_format: {"type":"json_object"} response_format ที่มี type: "json_schema", strict: true
JSON ที่ถูกต้อง ใช่ ใช่
ตรงกับ schema ของคุณ ไม่ ใช่
บังคับใช้ฟิลด์ที่จำเป็น ไม่ ใช่
บังคับใช้ประเภทและ enum ไม่ ใช่
คุณยังคงต้องตรวจสอบความถูกต้องในขั้นตอนถัดไป เสมอ แนะนำ (ดูด้านล่าง)

ข้อควรทราบเกี่ยวกับ API: ปลายทาง Chat Completions ใช้ response_format ดังที่แสดงด้านบน ส่วน Responses API รุ่นใหม่จะแสดงสิ่งเดียวกันภายใต้ text.format พร้อมด้วย type: "json_schema" กฎของ schema เหมือนกัน; แตกต่างกันแค่ส่วนห่อหุ้มเท่านั้น ตรวจสอบเอกสารปัจจุบันสำหรับเส้นทางฟิลด์ที่แน่นอนบนปลายทางที่คุณเรียกใช้

ทำการร้องขอครั้งแรกของคุณ

สมมติว่าคุณกำลังดึงข้อมูลตั๋วสนับสนุนออกมาเป็นบันทึกที่มีประเภท นี่คือคำขอ Chat Completions พร้อม schema แบบเข้มงวด

curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.5",
    "messages": [
      { "role": "system", "content": "Extract the ticket into the schema." },
      { "role": "user", "content": "My checkout 500s every time I use a saved card. Started today. Account: acct_8842." }
    ],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "support_ticket",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "summary":  { "type": "string" },
            "category": { "type": "string", "enum": ["billing", "bug", "account", "other"] },
            "severity": { "type": "integer" },
            "account_id": {
              "anyOf": [ { "type": "string" }, { "type": "null" } ]
            }
          },
          "required": ["summary", "category", "severity", "account_id"],
          "additionalProperties": false
        }
      }
    }
  }'

อ่านผลตอบกลับ

โมเดลจะส่งข้อความกลับมา ซึ่ง content เป็นสตริง JSON ที่ตรงกับ schema นั้น ตัวอย่างเช่น:

{
  "summary": "Checkout returns HTTP 500 when paying with a saved card",
  "category": "bug",
  "severity": 3,
  "account_id": "acct_8842"
}

สังเกตว่า account_id ใช้ anyOf กับ null นั่นคือวิธีที่คุณสร้างฟิลด์เสริม ซึ่งนำไปสู่กฎที่คุณต้องปฏิบัติตามเมื่อคุณเขียน schema ของคุณเอง

อยู่ภายในกลุ่มย่อยของ Schema

Structured outputs รองรับกลุ่มย่อยของ JSON Schema การมีกลุ่มย่อยนี้เพื่อให้ OpenAI สามารถบังคับใช้ข้อจำกัดได้อย่างน่าเชื่อถือและแคช schema ที่คอมไพล์แล้ว กฎที่ควรจดจำ:

เนื่องจากคีย์เวิร์ดการตรวจสอบความถูกต้องไม่ถูกบังคับใช้ คำว่า "JSON ที่รับประกัน" จึงไม่ได้หมายถึง "ธุรกิจที่รับประกันว่าถูกต้อง" โครงสร้างถูกล็อกแล้ว ค่าภายในยังคงควรได้รับการทดสอบ หากคุณเคยสร้างแบบจำลอง ฟิลด์เสริมหรือฟิลด์รวมด้วย oneOf/anyOf/allOf รูปแบบทางความคิดก็จะคุ้นเคย: schema จะจำกัดรูปร่าง แต่คุณยืนยันค่าจริงแยกต่างหาก

จัดการกับการปฏิเสธและการตัดทอน

มีกรณีหนึ่งที่ผลลัพธ์จะไม่ตรงกับ schema ของคุณโดยเจตนา หากโมเดลปฏิเสธคำขอที่ไม่ปลอดภัย มันจะคืนค่าฟิลด์ refusal ในข้อความแทนเนื้อหาที่เป็นไปตาม schema โค้ดของคุณควรแยกการทำงานตามเงื่อนไขนี้ก่อนที่จะ parsing:

msg = response.choices[0].message
if msg.refusal:
    handle_refusal(msg.refusal)
else:
    ticket = json.loads(msg.content)

ตอนนี้การปฏิเสธสามารถตรวจจับได้ด้วยโปรแกรม ซึ่งสะอาดกว่าการสแกนข้อความเพื่อหาคำขอโทษ มีอีกสองวิธีที่ผลตอบกลับอาจไม่เป็นไปตาม schema: การถึง max_tokens กลางออบเจกต์ (JSON จะถูกตัดทอน) หรือการใช้การเรียกใช้เครื่องมือแบบขนาน ซึ่ง structured outputs ไม่รองรับ ตั้งค่า parallel_tool_calls เป็น false เมื่อคุณรวมทั้งสองสิ่งนี้

วิธีทดสอบใน Apidog

โหมดเข้มงวดจะบังคับใช้ schema ณ เวลาสร้าง ไม่ได้ทำให้คุณไม่ต้องทดสอบ โมเดลอาจถูกสลับ, schemas อาจเปลี่ยนแปลง, เพื่อนร่วมทีมอาจแก้ไขอาร์เรย์ required หรือเส้นทางการปฏิเสธอาจเปลี่ยนไป คุณต้องการการทดสอบที่ส่งสัญญาณความล้มเหลวดังขึ้นเมื่อผลตอบกลับไม่ตรงตามสัญญา นั่นคือสิ่งที่ Apidog เข้ามามีบทบาท

เพื่อความแม่นยำในการแบ่งงาน: โหมดเข้มงวดของ OpenAI คือสิ่งที่สร้าง JSON ที่ถูกต้องตาม schema ส่วน Apidog ไม่ได้บังคับใช้ schema ที่โมเดล สิ่งที่ Apidog ทำคือตรวจสอบความถูกต้องของ ผลตอบกลับที่คุณได้รับ เทียบกับ schema ที่คุณคาดหวัง เพื่อให้คุณสามารถตรวจจับความเบี่ยงเบนได้ใน CI แทนที่จะเป็นในเวอร์ชันที่ใช้งานจริง

นี่คือขั้นตอนการทำงาน:

  1. ส่งคำขอ สร้างการเรียก Chat Completions ใน Apidog ด้วยบล็อก response_format ของคุณ บันทึกไว้ในคอลเล็กชันเพื่อให้สามารถทำซ้ำได้
  2. ยืนยันรูปแบบ เพิ่มการยืนยันผลตอบกลับใน Apidog ตรวจสอบว่า category เป็นหนึ่งในค่า enum ของคุณ, ว่า severity เป็นจำนวนเต็ม, ว่า account_id เป็นสตริงหรือ null Apidog สามารถ ตรวจสอบความถูกต้องของผลตอบกลับเทียบกับ JSON Schema ได้ เพื่อให้คุณแนบ schema ที่แน่นอนและทำให้การทำงานล้มเหลวเมื่อ payload เบี่ยงเบน
  3. รันใน CI ใส่คอลเล็กชันใน pipeline ของคุณ เพื่อให้ทุกการเปลี่ยนแปลงโมเดลหรือ prompt จะตรวจสอบความสอดคล้องอีกครั้ง การเปลี่ยนแปลง schema ที่เงียบหายไปจะกลายเป็นการสร้างที่ล้มเหลว
  4. จำลองสัญญา ก่อนที่การเรียกจริงจะถูกสร้างขึ้น หรือเพื่อทดสอบผู้บริโภคปลายทางโดยไม่ต้องใช้โทเค็น ให้ตั้งค่า mock API ที่คืนค่าผลตอบกลับตัวอย่างที่ถูกต้องตาม schema ส่วนหน้าและชุดทดสอบของคุณจะทำงานกับรูปแบบที่เสถียรในขณะที่การผสานรวมกำลังถูกทำให้แข็งแกร่งขึ้น

ประเด็นสุดท้ายคือสิ่งที่ถูกประเมินค่าต่ำไป คุณสามารถพัฒนาและทดสอบทุกสิ่งที่ ใช้ structured output กับ mock ที่เคารพ schema เดียวกัน จากนั้นจึงสลับใช้การเรียก OpenAI สดเมื่อคุณพร้อม ดาวน์โหลด Apidog แล้วคุณจะสามารถสร้างคำขอ, การยืนยัน และ mock ได้ในที่เดียว

คำถามที่พบบ่อย

สรุป

ตอนนี้คุณมีวงจรที่สมบูรณ์แล้ว: เลือกโมเดลที่รองรับโหมดเข้มงวด, ส่งคำขอ Chat Completions ด้วย json_schema และ strict: true, เก็บ schema ของคุณให้อยู่ในกลุ่มย่อยที่รองรับ, แยกการทำงานเมื่อเกิด refusal, และจำไว้ว่ากฎระดับค่า (value-level rules) ยังคงต้องได้รับการตรวจสอบ จากนั้นพิสูจน์ด้วยการทดสอบ: สร้างคำขอใน Apidog, ยืนยันผลตอบกลับเทียบกับ schema ของคุณ, และจำลอง (mock) เพื่อให้ส่วนที่เหลือของระบบของคุณสามารถดำเนินการต่อได้ในขณะที่การผสานรวมกำลังเข้าที่ โมเดลให้คำมั่นเรื่องรูปร่าง การทดสอบของคุณพิสูจน์ว่ามันคงอยู่เช่นนั้น

ปุ่ม

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API