[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-the-series-ep147-structured-output-ai-json-all--*":3,"academy-blog-translations-ebouzt297etn6ns":93},{"data":4,"page":79,"perPage":79,"totalItems":79,"totalPages":79},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":87,"keywords":88,"locale":61,"published_at":89,"scheduled_at":13,"school_blog":83,"short_description":90,"status":81,"title":91,"updated":92,"updated_by":13,"slug":84,"views":86},"วิธีการตั้งค่า JSON Mode ใน Go และการใช้ json.Unmarshal เพื่อจัดการข้อมูลจาก AI","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับสู่ EP.147 ครับ! ในตอนที่แล้วเราได้เรียนรู้ศิลปะการเขียน Prompt เพื่อคุยกับ AI ไปแล้ว แต่ปัญหาที่ยังกวนใจ Gophers มากที่สุดคือความ \"ช่างพูด\" ของ AI ที่มักจะแถมคำทักทายอย่าง \"แน่นอนครับ นี่คือ JSON ที่คุณต้องการ...\" หรือปิดท้ายด้วย \"หวังว่าข้อมูลนี้จะเป็นประโยชน์นะคะ\"\u003C\u002Fp>\u003Cp>ซึ่งไอ้ประโยคแถมพวกนี้แหละครับที่เป็นตัวการทำให้ฟังก์ชัน \u003Ccode>json.Unmarshal\u003C\u002Fcode> ใน Go ของเราพ่น Error กระจาย เพราะมันไม่ใช่ JSON ที่บริสุทธิ์ (Pure JSON) วันนี้เราจะมาจบปัญหานี้ด้วยเทคนิคการทำ \u003Cstrong>Structured Output\u003C\u002Fstrong> เพื่อบีบให้ AI ตอบกลับมาเป็น Data ตามโครงสร้าง Struct ที่เรากำหนดไว้แบบเป๊ะๆ 100% ครับ\u003C\u002Fp>\u003Ch2>การออกแบบ Struct ใน Go ให้รองรับ AI Output\u003C\u002Fh2>\u003Cp>หัวใจสำคัญไม่ใช่แค่การสร้าง Struct ขึ้นมาเฉยๆ แต่คือการทำให้ Struct นั้นทำหน้าที่เป็น \u003Cstrong>Contract (สัญญา)\u003C\u002Fstrong> ระหว่างโค้ด Go ของเรากับ AI ครับ สิ่งที่ต้องโฟกัสมี 3 จุดหลัก:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>JSON Tags คือกฎเหล็ก:\u003C\u002Fstrong> ชื่อที่อยู่ใน \u003Ccode>json:\"...\"\u003C\u002Fcode> คือชื่อฟิลด์ที่ AI จะต้องพ่นออกมาให้ตรงกันเป๊ะ (Case-sensitive)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Data Type ที่เหมาะสม:\u003C\u002Fstrong> หากต้องการคะแนนที่เป็นตัวเลข ต้องใช้ \u003Ccode>int\u003C\u002Fcode> หรือ \u003Ccode>float64\u003C\u002Fcode> เพื่อให้ Go ช่วยตรวจสอบประเภทข้อมูลให้เราตั้งแต่ตอน Unmarshal\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>ความเป็นไปได้ของข้อมูล:\u003C\u002Fstrong> หากฟิลด์ไหนมีโอกาสที่ AI จะหาค่าไม่ได้ ให้พิจารณาใช้ Pointer (เช่น \u003Ccode>*string\u003C\u002Fcode>) เพื่อรองรับค่า \u003Ccode>null\u003C\u002Fcode> ครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>ตัวอย่างการวางโครงสร้าง:\u003C\u002Fh3>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>type AnalysisResult struct {\r\n    \u002F\u002F ใช้ชื่อฟิลด์ที่เป็นมาตรฐานและสื่อความหมายชัดเจน\r\n    Sentiment string   `json:\"sentiment\"` \r\n    Score     int      `json:\"score\"`\r\n    Keywords  []string `json:\"keywords\"`\r\n    Summary   string   `json:\"summary\"`\r\n}\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>💡 Pro-Tip สำหรับ Gopher:\u003C\u002Fh3>\u003Cp>การตั้งชื่อฟิลด์ใน JSON Tags ให้เป็นภาษาอังกฤษที่สื่อความหมายชัดเจน (เช่น \u003Ccode>sentiment\u003C\u002Fcode> แทนที่จะเป็น \u003Ccode>s\u003C\u002Fcode>) จะช่วยให้ AI เข้าใจบริบทของข้อมูลที่มันต้องเติมลงไปได้แม่นยำขึ้นโดยแทบไม่ต้องอธิบายเพิ่มใน Prompt เลยครับ เพราะ AI ถูกเทรนมาให้เข้าใจความหมายของชื่อตัวแปรอยู่แล้ว\u003C\u002Fp>\u003Ch2>เทคนิค JSON Mode และ System Prompt\u003C\u002Fh2>\u003Cp>ถ้าเป็นเมื่อก่อน เราต้องภาวนาให้ AI เชื่อฟังคำสั่ง \"Please respond in JSON\" ของเรา แต่ปัจจุบัน API รุ่นใหม่ๆ อย่าง \u003Cstrong>GPT-4o\u003C\u002Fstrong> หรือแม้แต่โมเดลที่รันในเครื่องผ่าน \u003Cstrong>Ollama\u003C\u002Fstrong> มีฟีเจอร์ที่เรียกว่า \u003Cstrong>JSON Mode\u003C\u002Fstrong> ซึ่งเป็นการบังคับที่ระดับเอนจินเลยว่า \"แกห้ามตอบอย่างอื่นนอกจาก JSON ที่ Valid เท่านั้นนะ\"\u003C\u002Fp>\u003Ch3>เงื่อนไขที่ห้ามลืม!\u003C\u002Fh3>\u003Cp>ถึงแม้จะเปิดโหมดนี้แล้ว แต่ OpenAI มีกฎเหล็กว่า \u003Cstrong>คุณต้องระบุคำว่า \"JSON\" ลงใน Message (แนะนำให้ใส่ใน System Prompt)\u003C\u002Fstrong> ไว้ด้วยเสมอ หากลืมใส่ API จะตีกลับเป็น Error ทันทีครับ\u003C\u002Fp>\u003Ch3>ตัวอย่างการตั้งค่าใน Go:\u003C\u002Fh3>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>req := openai.ChatCompletionRequest{\r\n    Model: openai.GPT4o,\r\n    \u002F\u002F จุดสำคัญ: บังคับระดับ Structure ให้เป็น JSON Object\r\n    ResponseFormat: &amp;openai.ChatCompletionResponseFormat{\r\n        Type: openai.ChatCompletionResponseFormatTypeJSONObject,\r\n    },\r\n    Messages: []openai.ChatCompletionMessage{\r\n        {\r\n            Role:    openai.ChatMessageRoleSystem,\r\n            \u002F\u002F ต้องมีคำว่า JSON อยู่ในนี้เสมอ!\r\n            Content: \"You are a helpful assistant designed to output JSON.\",\r\n        },\r\n        {\r\n            Role:    openai.ChatMessageRoleUser,\r\n            Content: \"Analyze this feedback: 'I love this gopher tool!'\",\r\n        },\r\n    },\r\n}\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>🛡️ ทำไมต้องใช้ JSON Mode?\u003C\u002Fh3>\u003Cp>การใช้โหมดนี้จะการันตีว่า Output ที่ได้จะไม่มีประโยคทักทายอย่าง \"Here is your data:\" โผล่มาแน่นอน และ JSON ที่ได้จะเป็นรูปแบบที่ \u003Cstrong>Well-formed\u003C\u002Fstrong> (ปีกกาเปิด-ปิดครบถ้วน) เสมอ ช่วยลดภาระในการทำ Error Handling ในโค้ด Go ของเราไปได้มหาศาลครับ\u003C\u002Fp>\u003Ch2>การ Parsing และ Handling Error\u003C\u002Fh2>\u003Cp>เมื่อ AI ตอบกลับมาในรูปแบบ JSON String หน้าที่ของนักพัฒนา Go คือการแปลงข้อมูลนั้นให้กลับมาเป็น \u003Cstrong>Typed Struct\u003C\u002Fstrong> เพื่อให้เราเรียกใช้งาน Field ต่างๆ ได้อย่างปลอดภัย (Type Safety) โดยใช้ฟังก์ชัน \u003Ccode>json.Unmarshal\u003C\u002Fcode>\u003C\u002Fp>\u003Ch3>ตัวอย่างการเขียนโค้ด:\u003C\u002Fh3>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>var result AnalysisResult\r\n\r\n\u002F\u002F ดึงเนื้อหาจาก AI Response\r\ncontent := resp.Choices[0].Message.Content\r\n\r\n\u002F\u002F แปลงจาก String\u002FByte Slice เข้าสู่ Struct\r\nerr := json.Unmarshal([]byte(content), &amp;result)\r\nif err != nil {\r\n    \u002F\u002F ในโปรดักชันจริง แนะนำให้ Log และแจ้งเตือน หรือทำ Retry Logic\r\n    log.Printf(\"Error: AI returned invalid JSON: %v\", err)\r\n    return\r\n}\r\n\r\n\u002F\u002F ใช้งานข้อมูลได้ทันทีแบบ Strong Type!\r\nfmt.Printf(\"Sentiment: %s (Score: %d)\\n\", result.Sentiment, result.Score)\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>⚠️ ข้อควรระวัง: อย่าเพิ่งไว้ใจ AI 100%\u003C\u002Fh3>\u003Cp>แม้ว่าเราจะเปิด \u003Cstrong>JSON Mode\u003C\u002Fstrong> แล้ว แต่ในฐานะ Developer เราควรทำระบบให้ \u003Cstrong>Robust (อึด)\u003C\u002Fstrong> ต่อความผิดพลาดด้วยเทคนิคเหล่านี้ครับ:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>\u003Cstrong>Validation:\u003C\u002Fstrong> หลังจาก Unmarshal เสร็จ ควรตรวจสอบค่าที่ได้ด้วย (เช่น \u003Ccode>Score\u003C\u002Fcode> ควรอยู่ระหว่าง 0-100 หรือไม่?) เพราะ AI อาจจะตอบ JSON ที่มีโครงสร้างถูก แต่ \"เนื้อหา\" ยังผิดเพี้ยนได้\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Graceful Recovery:\u003C\u002Fstrong> แทนที่จะใช้ \u003Ccode>log.Fatalf\u003C\u002Fcode> ซึ่งจะทำให้โปรแกรมหยุดทำงานทันที เราควรจัดการ Error ให้เหมาะสม เช่น การส่งค่า Default กลับไป หรือการส่ง Prompt กลับไปให้ AI แก้ไขใหม่อีกรอบ (Self-Correction)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>The Markdown Trap:\u003C\u002Fstrong> สำหรับโมเดลบางตัว (เช่น Local LLM) ต่อให้สั่งเป็น JSON มันอาจจะแถม \u003Ccode>json ... \u003C\u002Fcode>มาให้ แนะนำให้เขียนฟังก์ชันสั้นๆ เพื่อ Trim หรือลบเครื่องหมายเหล่านี้ออกก่อนจะส่งให้ \u003Ccode>json.Unmarshal\u003C\u002Fcode> ครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Ch2>ทำไมต้องทำ Structured Output?\u003C\u002Fh2>\u003Cp>สำหรับ Gopher อย่างเรา การที่ AI คุยเป็น JSON ไม่ใช่แค่เรื่องของความสะดวก แต่มันคือการทำให้ AI ทำงานได้เหมือนกับ Microservice ตัวหนึ่งในระบบเลยครับ\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Reliability (ความน่าเชื่อถือ):\u003C\u002Fstrong> ระบบมีความเสถียรสูงขึ้น เพราะเรารู้ล่วงหน้าว่า Data Type ที่ได้จะเป็นอย่างไร ไม่ต้องมาลุ้นว่าวันนี้ AI จะตอบเป็นร้อยแก้วหรือร้อยกรอง ทำให้โอกาสที่โปรแกรมจะ Panic หรือ Error ลดลงอย่างมาก\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Automation (ระบบอัตโนมัติ):\u003C\u002Fstrong> เมื่อข้อมูลเป็น JSON เราสามารถเชื่อมต่อ Workflow ได้ทันที เช่น นำผลลัพธ์ไป Insert ลง Database, ส่ง Webhook ไปหาทีม Support หรือส่งต่อให้ Service อื่นๆ ในระบบประมวลผลต่อได้ทันทีโดยไม่ต้องใช้มนุษย์มานั่งคัดกรอง\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Type Safety (ความปลอดภัยของข้อมูล):\u003C\u002Fstrong> เราได้ดึงจุดแข็งของภาษา Go มาใช้อย่างเต็มที่ ทั้งการทำ Validation, การตรวจสอบข้อมูลที่ขาดหาย (Missing fields) และการจัดการโครงสร้างข้อมูลที่ซับซ้อน (Nested Structs) ได้อย่างมั่นใจ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>🎯 ท้าให้ลอง (Daily Mission)\u003C\u002Fh2>\u003Cp>เพื่อให้เห็นภาพการใช้งานจริง ผมอยากให้ทุกคนลองสร้างโปรแกรม Go สั้นๆ ที่รับประโยครีวิวสินค้าจาก User แล้วสั่งให้ AI สกัดข้อมูล (Extract) ออกมาเป็น JSON โดยใช้ Struct ดังนี้ครับ:\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>type ReviewAnalysis struct {\r\n    IsPositive  bool   `json:\"is_positive\"`\r\n    ProductName string `json:\"product_name\"`\r\n    DefectFound string `json:\"defect_found\"`\r\n}\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>โจทย์การบ้าน:\u003C\u002Fh3>\u003Cp>ลองส่งประโยคที่ \u003Cstrong>\"ไม่มีชื่อสินค้า\"\u003C\u002Fstrong> หรือ \u003Cstrong>\"ไม่มีการแจ้งตำหนิ\"\u003C\u002Fstrong> เข้าไปดูครับ แล้วสังเกตว่า AI จะจัดการอย่างไร? มันจะใส่ค่าว่าง \u003Ccode>\"\"\u003C\u002Fcode>, ใส่ \u003Ccode>null\u003C\u002Fcode> หรือข้ามฟิลด์นั้นไปเลย?\u003C\u002Fp>\u003Cblockquote>\u003Cp>\u003Cstrong>Hint:\u003C\u002Fstrong> ลองปรับ Struct ของคุณให้ใช้ Pointer เช่น \u003Ccode>*string\u003C\u002Fcode> แล้วดูความแตกต่างตอน Unmarshal ว่ามันช่วยให้คุณจัดการกับข้อมูลที่ \"ไม่ได้ส่งมา\" ได้ดีขึ้นขนาดไหน!\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>บทสรุป\u003C\u002Fh2>\u003Cp>การทำ Structured Output คือการเปลี่ยน AI จากแชทบอทช่างคุยให้กลายเป็น Data Processor ที่คุยภาษาเดียวกับ Backend ของเราครับ เมื่อคุณคุม Output ได้ 100% ขีดจำกัดในการสร้างแอปพลิเคชันของคุณก็จะขยายไปได้กว้างกว่าเดิมมาก\u003C\u002Fp>\u003Ch3>ในตอนต่อไป (EP.148):\u003C\u002Fh3>\u003Cp>เมื่อเราจัดการข้อมูลได้แม่นยำแล้ว ต่อไปคือการทำให้ User ประทับใจด้วยความเร็ว! เราจะมาทำระบบ \u003Cstrong>\"Handling Streams: การทำระบบ Chat แบบ Real-time Stream ด้วย Go Channels\"\u003C\u002Fstrong> เพื่อให้ข้อความค่อยๆ ไหลออกมาเหมือน ChatGPT ของจริง... เตรียมตัวรับมือกับ Concurrency ใน Go ให้ดี แล้วเจอกันครับ!\u003C\u002Fp>\u003Cp>\u003Cstrong>ฝากกดติดตามพวกเราได้ที่ Superdev Academy\u003C\u002Fstrong> ในทุกช่องทางนะครับ!\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 YouTube: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">\u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"http:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","13xlh755ndjx_n1oagktg21.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fyvqqvzf976694gp\u002F13xlh755ndjx_n1oagktg21.png","2026-05-19 08:32:51.658Z","",{"keywords":15,"locale":55,"school_blog":65},[16,23,28,33,37,42,46,50],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:44:51.471Z","hlato0hav8vo8wm","Golang The Series","2026-04-10 16:12:50.850Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":34,"updated_by":13},"2026-05-19 08:32:18.052Z","66k5o80r7j94uwg","JSON Mode",{"collectionId":17,"collectionName":18,"created":38,"created_by":13,"id":39,"name":40,"updated":41,"updated_by":13},"2026-03-04 08:46:24.109Z","o8xfgwdh6k03hxd","JSON","2026-04-10 16:13:13.679Z",{"collectionId":17,"collectionName":18,"created":43,"created_by":13,"id":44,"name":45,"updated":43,"updated_by":13},"2026-05-19 08:32:29.838Z","mif39xe74sr3dat","Structured Output",{"collectionId":17,"collectionName":18,"created":47,"created_by":13,"id":48,"name":49,"updated":47,"updated_by":13},"2026-05-19 08:32:40.909Z","y6cwydp81xsem1f","AI API",{"collectionId":17,"collectionName":18,"created":51,"created_by":13,"id":52,"name":53,"updated":54,"updated_by":13},"2026-04-03 10:57:34.421Z","azixuoag5jisout","Backend Development","2026-04-10 16:14:47.389Z",{"code":56,"collectionId":57,"collectionName":58,"created":59,"flag":60,"id":61,"is_default":62,"label":63,"updated":64},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":66,"collectionId":67,"collectionName":68,"created":69,"expand":70,"id":83,"slug":84,"updated":85,"views":86},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs","2026-05-19 08:32:51.300Z",{"category":71},{"blogIds":72,"collectionId":73,"collectionName":74,"created":75,"created_by":13,"id":66,"image":76,"image_alt":13,"image_path":77,"label":78,"name":21,"priority":79,"publish_at":80,"scheduled_at":13,"status":81,"updated":82,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":21,"th":21},1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","ebouzt297etn6ns","golang-the-series-ep147-structured-output-ai-json","2026-06-01 06:30:38.161Z",128,"yvqqvzf976694gp",[20,25,30,35,39,44,48,52],"2026-06-01 04:41:54.293Z","สอนเทคนิคบีบให้ AI ตอบกลับมาเป็น JSON ตาม Struct ของ Go แบบ 100% ด้วย JSON Mode และการจัดการ Error อย่างมืออาชีพ เพื่อสร้างระบบ Backend ที่เสถียรและแม่นยำ","Golang The Series EP.147: Structured Output บังคับ AI ตอบเป็น JSON","2026-06-01 04:41:54.294Z",{"th":84,"en":84}]