[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-ai-ep172-function-calling-all--*":3,"academy-blog-translations-f50hc0gm73i8673":82},{"data":4,"page":68,"perPage":68,"totalItems":68,"totalPages":68},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"cover_image_s_url":12,"created":13,"created_by":14,"expand":15,"id":76,"keywords":77,"locale":47,"published_at":78,"scheduled_at":63,"school_blog":72,"short_description":79,"status":70,"title":80,"updated":81,"updated_by":14,"slug":73,"views":75},"ภาพหน้าปกบทความ Golang The Series EP.172 หัวข้อ Function Calling สอน AI ให้เรียกใช้ Function ใน Go","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับเข้าสู่ EP.172 ครับ! ในตอนที่แล้ว เราได้ทำความเข้าใจปูพื้นฐานแนวคิดของ AI Agent และวงลูป ReAct กันไปแล้ว ในตอนนี้เราจะมาลงมือปฏิบัติตามรากฐานที่สำคัญที่สุดของการสร้าง Agent นั่นคือ \u003Cstrong>\"Function Calling\"\u003C\u002Fstrong> (หรือ Tool Calling)\u003C\u002Fp>\u003Cp>Function Calling คือกลไกที่ช่วยให้โมเดล AI (LLM) สามารถโต้ตอบและลงมือทำแอ็กชันกับโลกภายนอกได้ โดยแทนที่ AI จะตอบกลับมาเป็นข้อความแชตธรรมดา AI จะทำการวิเคราะห์บริบทคำถาม แล้วคายโครงสร้างข้อมูล JSON ที่ระบุ \u003Cem>\"ชื่อฟังก์ชัน\"\u003C\u002Fem> และ \u003Cem>\"อาร์กิวเมนต์ (Arguments)\"\u003C\u002Fem> ออกมาอย่างแม่นยำ เพื่อสั่งให้ระบบ Go Backend ของเรานำค่าเหล่านั้นไปรันฟังก์ชันจริงครับ!\u003C\u002Fp>\u003Ch2>ลำดับขั้นตอนการทำงานของ Function Calling\u003C\u002Fh2>\u003Cp>Plaintext\u003C\u002Fp>\u003Cpre>\u003Ccode>[1. User Request] ──&gt; \"เช็กยอดสต็อกของสินค้า SKU-1024 ให้หน่อย\"\n        │\n        ▼\n[2. Go App Call LLM]  &lt;--- แนบโครงสร้าง Tool Definition (JSON Schema) ไปด้วย\n        │\n        ▼\n[3. LLM Processing]   &lt;--- AI เลือกฟังก์ชัน 'GetStockQuantity' และแกะ SKU\n        │\n        ▼\n[4. LLM Response]     &lt;--- คาย Tool Calls (Name: \"GetStockQuantity\", Args: {\"sku\": \"SKU-1024\"})\n        │\n        ▼\n[5. Go App Execution] &lt;--- Go อ่านชื่อ Tool -&gt; รันฟังก์ชัน GetStockQuantity(\"SKU-1024\") จริง\n        │\n        ▼\n[6. Return Tool Result to LLM] &lt;--- ส่งผลลัพธ์ (เช่น \"150 ชิ้น\") กลับไปให้ LLM\n        │\n        ▼\n[7. Final AI Answer]  ──&gt; \"ขณะนี้สินค้า SKU-1024 มีสต็อกคงเหลืออยู่ในระบบทั้งหมด 150 ชิ้นครับ\"\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>การลงทะเบียน Tool Schema ในภาษา Go\u003C\u002Fh2>\u003Cp>ในการแจ้งให้ AI รู้จักฟังก์ชันใน Go ของเรา เราต้องนิยามโครงสร้าง JSON Schema ของฟังก์ชันนั้นๆ เพื่อบอก AI ว่า:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Name:\u003C\u002Fstrong> ฟังก์ชันนี้ชื่ออะไร (ต้องสอดคล้องกับ Identifier ใน Go)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Description:\u003C\u002Fstrong> ฟังก์ชันนี้มีหน้าที่ทำอะไร (สำคัญมากเพราะ AI ใช้ข้อความนี้ประเมินว่าจะเลือกใช้ Tool ตัวไหน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Parameters:\u003C\u002Fstrong> พารามิเตอร์ที่ต้องรับคืออะไร ชนิดข้อมูลเป็น Type ไหน และ Field ไหนที่จำเป็นต้องมี (\u003Ccode>Required\u003C\u002Fcode>)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>ลงมือเขียนโค้ด Go เพื่อทำ Function Calling\u003C\u002Fh2>\u003Cp>เพื่อให้เห็นภาพและอ่านง่าย เราจะแบ่งโค้ดออกเป็น 4 ส่วนหลักๆ ตามสเต็ปการทำงานจริงครับ\u003C\u002Fp>\u003Ch3>ส่วนที่ 1: เตรียมฟังก์ชันของจริงใน Go (Native Function)\u003C\u002Fh3>\u003Cp>เริ่มจากการเขียน Business Logic ปกติของเราก่อน สมมติว่าเป็นฟังก์ชันเช็กสต็อกสินค้าในคลัง\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>package main\n\nimport (\n\t\"context\"\n\t\"encoding\u002Fjson\"\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com\u002Fsashabaranov\u002Fgo-openai\"\n\t\"github.com\u002Fsashabaranov\u002Fgo-openai\u002Fjsonschema\"\n)\n\n\u002F\u002F --- 1. นิยามฟังก์ชันจริงในภาษา Go (Native Functions) ---\n\n\u002F\u002F GetStockQuantity ฟังก์ชันดึงสต็อกสินค้าจาก Database\nfunc GetStockQuantity(sku string) (int, error) {\n\t\u002F\u002F ในระบบจริง: อาจจะเป็นการยิง SQL Query ไปที่ Database\n\tstocks := map[string]int{\n\t\t\"SKU-1024\": 150,\n\t\t\"SKU-2048\": 0,\n\t\t\"SKU-9999\": 42,\n\t}\n\tqty, exists := stocks[sku]\n\tif !exists {\n\t\treturn 0, fmt.Errorf(\"ไม่พบรหัสสินค้า %s ในระบบ\", sku)\n\t}\n\treturn qty, nil\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>ส่วนที่ 2: นิยาม Schema และยิง Request ไปหา AI\u003C\u002Fh3>\u003Cp>ต่อมาเราจะสร้าง \u003Ccode>openai.Tool\u003C\u002Fcode> เพื่ออธิบายให้ AI ฟังว่าฟังก์ชันเราหน้าตาเป็นอย่างไร แล้วแนบไปพร้อมกับคำถามของ User\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>func main() {\n\tclient := openai.NewClient(\"YOUR_OPENAI_API_KEY\")\n\n\t\u002F\u002F --- 2. สร้าง Tool Definition เพื่อลงทะเบียนแจ้ง AI ---\n\tstockTool := openai.Tool{\n\t\tType: openai.ToolTypeFunction,\n\t\tFunction: &amp;openai.FunctionDefinition{\n\t\t\tName:        \"GetStockQuantity\",\n\t\t\tDescription: \"ดึงจำนวนสินค้าคงเหลือในคลังจากรหัส SKU\",\n\t\t\tParameters: jsonschema.Definition{\n\t\t\t\tType: jsonschema.Object,\n\t\t\t\tProperties: map[string]jsonschema.Definition{\n\t\t\t\t\t\"sku\": {\n\t\t\t\t\t\tType:        jsonschema.String,\n\t\t\t\t\t\tDescription: \"รหัส SKU ของสินค้า เช่น SKU-1024\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tRequired: []string{\"sku\"}, \u002F\u002F บังคับว่า AI ต้องแกะค่านี้มาให้ได้\n\t\t\t},\n\t\t},\n\t}\n\n\tuserQuery := \"อยากรู้ว่าตอนนี้สินค้า SKU-1024 เหลืออยู่กี่ชิ้นครับ?\"\n\tfmt.Printf(\"👤 User: %s\\n\\n\", userQuery)\n\n\tmessages := []openai.ChatCompletionMessage{\n\t\t{Role: openai.ChatMessageRoleUser, Content: userQuery},\n\t}\n\n\t\u002F\u002F --- 3. ยิง Request ครั้งแรกพร้อมแนบ Tools ไปด้วย ---\n\tresp, err := client.CreateChatCompletion(\n\t\tcontext.Background(),\n\t\topenai.ChatCompletionRequest{\n\t\t\tModel:    openai.GPT4oMini,\n\t\t\tMessages: messages,\n\t\t\tTools:    []openai.Tool{stockTool},\n\t\t},\n\t)\n\tif err != nil {\n\t\tlog.Fatalf(\"API Error: %v\", err)\n\t}\n\n\tmsg := resp.Choices[0].Message\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>ส่วนที่ 3: รับการตัดสินใจจาก AI และนำมารัน Go Function\u003C\u002Fh3>\u003Cp>เมื่อ AI ตอบกลับมา เราต้องเช็กว่า AI เลือกใช้ Tool หรือไม่ ถ้าใช้ เราก็เอา Arguments ที่ AI คายออกมาไปแปลงเป็น Struct แล้วรันฟังก์ชันของเรา\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>\t\u002F\u002F --- 4. ตรวจสอบว่า AI ต้องการเรียกใช้ Tool หรือไม่ ---\n\tif len(msg.ToolCalls) &gt; 0 {\n\t\ttoolCall := msg.ToolCalls[0]\n\t\tfmt.Printf(\"🤖 AI ตัดสินใจเรียกใช้ Tool: %s\\n\", toolCall.Function.Name)\n\t\tfmt.Printf(\"📦 Arguments ที่ AI แกะมาได้: %s\\n\", toolCall.Function.Arguments)\n\n\t\t\u002F\u002F ปาร์ส Arguments จาก JSON string ที่ AI คายออกมา\n\t\tvar args struct {\n\t\t\tSKU string `json:\"sku\"`\n\t\t}\n\t\tif err := json.Unmarshal([]byte(toolCall.Function.Arguments), &amp;args); err != nil {\n\t\t\tlog.Fatalf(\"Failed to parse tool arguments: %v\", err)\n\t\t}\n\n\t\t\u002F\u002F --- 5. รันฟังก์ชันใน Go จริง ---\n\t\tvar toolResult string\n\t\tif toolCall.Function.Name == \"GetStockQuantity\" {\n\t\t\tqty, err := GetStockQuantity(args.SKU)\n\t\t\tif err != nil {\n\t\t\t\ttoolResult = fmt.Sprintf(`{\"error\": \"%s\"}`, err.Error())\n\t\t\t} else {\n\t\t\t\t\u002F\u002F ห่อผลลัพธ์เป็น JSON เตรียมส่งกลับ\n\t\t\t\ttoolResult = fmt.Sprintf(`{\"sku\": \"%s\", \"quantity\": %d}`, args.SKU, qty)\n\t\t\t}\n\t\t}\n\n\t\tfmt.Printf(\"⚙️ ผลลัพธ์จากการรัน Go Function: %s\\n\\n\", toolResult)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>ส่วนที่ 4: ส่งผลลัพธ์กลับไปให้ AI สรุปคำตอบสุดท้าย\u003C\u002Fh3>\u003Cp>นี่คือสเต็ปสุดท้ายที่ขาดไม่ได้! เราต้องส่ง History ที่ AI คิด (Assistant Message) ตามด้วยผลลัพธ์จาก Go (Tool Message) กลับไปให้ AI เรียบเรียงเป็นภาษามนุษย์\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>\t\t\u002F\u002F --- 6. ส่งผลลัพธ์ของ Tool กลับไปให้ AI ประมวลผล ---\n\t\tmessages = append(messages, msg) \u002F\u002F เก็บ History ความคิดของ AI ไว้ใน Context\n\t\tmessages = append(messages, openai.ChatCompletionMessage{\n\t\t\tRole:       openai.ChatMessageRoleTool, \u002F\u002F ระบุว่าเป็น Role แบบ Tool\n\t\t\tContent:    toolResult,\n\t\t\tToolCallID: toolCall.ID, \u002F\u002F ต้องตรงกับ ID ที่ AI ส่งมาตอนแรก\n\t\t})\n\n\t\tfinalResp, err := client.CreateChatCompletion(\n\t\t\tcontext.Background(),\n\t\t\topenai.ChatCompletionRequest{\n\t\t\t\tModel:    openai.GPT4oMini,\n\t\t\t\tMessages: messages,\n\t\t\t},\n\t\t)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"API Error on Final Response: %v\", err)\n\t\t}\n\n\t\t\u002F\u002F 7. ได้คำตอบสุดท้ายที่สรุปจากข้อมูลในระบบเรา!\n\t\tfmt.Printf(\"🤖 AI คำตอบสุดท้าย: %s\\n\", finalResp.Choices[0].Message.Content)\n\n\t} else {\n\t\t\u002F\u002F กรณี AI ตอบได้ทันทีโดยไม่ต้องใช้ Tool\n\t\tfmt.Printf(\"🤖 AI คำตอบทั่วไป: %s\\n\", msg.Content)\n\t}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>ข้อควรระวังและการทำ Guardrails ในการรัน Function\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Never Trust AI Arguments Blindly:\u003C\u002Fstrong> ข้อมูลพารามิเตอร์ที่ AI คายออกมา (เช่น \u003Ccode>args.SKU\u003C\u002Fcode>) จำเป็นต้องผ่านการ Validate ใน Go เสมอก่อนนำไปทำ Database Query หรือยิงสั่งการระบบอื่นๆ เพื่อป้องกันปัญหา SQL Injection หรือการสั่งการที่ผิดพลาด\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Type Safety Handling:\u003C\u002Fstrong> บางครั้ง AI อาจจะคายตัวเลขมาในรูปแบบ String (เช่น \u003Ccode>\"1024\"\u003C\u002Fcode>) การใช้วิธี \u003Ccode>json.Unmarshal\u003C\u002Fcode> เข้า Struct ใน Go ช่วยรับประกันได้ว่าชนิดข้อมูลจะถูกแปลงกลับเป็น Type ที่ถูกต้องเสมอก่อนนำเข้า Business Logic\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>🎯 ท้าให้ลอง (Daily Mission)\u003C\u002Fh2>\u003Cp>ลองนำโค้ดด้านบนไปรันในโปรเจกต์ของคุณแล้วสังเกตการทำงานของ Tool Calls ใน Console\u003C\u002Fp>\u003Cp>\u003Cstrong>การบ้านชวนคิด:\u003C\u002Fstrong> หากในระบบของคุณมีฟังก์ชัน \u003Ccode>CalculateDiscount(customerTier string, totalAmount float64)\u003C\u002Fcode> เพิ่มเข้ามาเป็น Tool ที่สอง คุณจะเขียนส่วนคัดแยก Routing ของชื่อฟังก์ชัน (\u003Ccode>switch \u003C\u002Fcode>\u003Ca rel=\"noopener noreferrer\" href=\"http:\u002F\u002FtoolCall.Function.Name\">\u003Ccode>toolCall.Function.Name\u003C\u002Fcode>\u003C\u002Fa> หรือใช้ Map pattern \u003Ccode>map[string]func(...)\u003C\u002Fcode>) ในภาษา Go อย่างไร ให้สามารถรองรับการเพิ่ม Tools ใหม่ๆ นับสิบตัวได้อย่างสะอาด ยืดหยุ่น และอ่านง่ายโดยไม่ต้องใช้ \u003Ccode>if-else\u003C\u002Fcode> ต่อกันยาวๆ? ลองออกแบบโครงสร้างกันดูนะครับ!\u003C\u002Fp>\u003Ch2>❓ คำถามที่พบบ่อย (FAQ)\u003C\u002Fh2>\u003Ch3>เราสามารถแนบ Tool ไปพร้อมกันหลายๆ ตัวได้ไหม?\u003C\u002Fh3>\u003Cp>ได้แน่นอนครับ! คุณสามารถใส่ Schema หลายๆ ตัวลงไปใน Slice \u003Ccode>[]openai.Tool{}\u003C\u002Fcode> ได้เลย AI จะวิเคราะห์จากบริบทคำถามเองว่าควรหยิบ Tool ตัวไหนมาใช้ (หรืออาจจะใช้หลายตัวพร้อมกันในคราวเดียวแบบ Parallel Tool Calling ก็ได้)\u003C\u002Fp>\u003Ch3>ถ้า AI ให้ Argument มาผิดรูปแบบจะทำอย่างไร?\u003C\u002Fh3>\u003Cp>ในภาษา Go เมื่อ \u003Ccode>json.Unmarshal\u003C\u002Fcode> แล้วพัง ให้จับ Error นั้นจับยัดใส่ \u003Ccode>toolResult\u003C\u002Fcode> แล้วส่งกลับไปให้ AI รับรู้ (เช่น คืนค่ากลับไปว่า \u003Cem>\"Invalid parameter format, please provide numbers only\"\u003C\u002Fem>) AI จะรับรู้ความผิดพลาดและพยายามคายค่าที่ถูกต้องกลับมาให้ใหม่ในลูปถัดไปครับ\u003C\u002Fp>\u003Ch3>ทำไมต้องส่ง \u003Ccode>messages = append(messages, msg)\u003C\u002Fcode> (ข้อความของ Assistant) กลับไปด้วย?\u003C\u002Fh3>\u003Cp>เป็นข้อบังคับของ OpenAI API ครับ หากมีการเรียกใช้ Tool เราต้องส่งประวัติ \"ความคิด\u002Fการตัดสินใจ\" ของ AI ควบคู่ไปกับ \"ผลลัพธ์ของ Tool\" เสมอ เพื่อให้ AI จำ Context ได้ว่าตัวเองเพิ่งสั่งให้ทำอะไรไป\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>ในตอนนี้เราได้เรียนรู้เรื่อง \u003Cstrong>กลไกการทำงานของ Function Calling แบบ Step-by-step\u003C\u002Fstrong> ตั้งแต่การนิยาม JSON Schema ให้ AI เข้าใจ, การรับ Tool Call, ไปจนถึงการยัดผลลัพธ์กลับไปให้ AI สรุปความ ซึ่งนี่คือหัวใจสำคัญในการสร้าง Agent ให้สามารถเชื่อมต่อกับโลกภายนอกได้จริง\u003C\u002Fp>\u003Cp>\u003Cstrong>ในตอนต่อไป (EP.173): \u003C\u002Fstrong>เมื่อเราเข้าใจกลไก Function Calling ในภาษา Go เรียบร้อยแล้ว ในตอนหน้าเราจะขยับขึ้นไปสร้าง AI Agent ที่ทรงพลังและใช้งานจริงในองค์กรมากที่สุดตัวหนึ่ง นั่นคือ \u003Cstrong>\"Database Agent: สร้าง AI ที่เขียน SQL ไปดึงข้อมูลมาตอบเองได้\"\u003C\u002Fstrong> เราจะมาดูวิธีสอน AI ให้เข้าใจ Schema ของฐานข้อมูล แล้วแปลงคำถามภาษาธรรมชาติไปเป็น SQL Query เพื่อนำผลลัพธ์มาสรุปให้ผู้ใช้โดยปลอดภัย ห้ามพลาดครับ Gophers!\u003C\u002Fp>\u003Cp>\u003Cstrong>Follow Superdev Academy on all platforms:\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>\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>\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>\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>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","63iywg3qzysj_gch0xjfd8x_afwycoic3t.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F3aetvsf1yhyn807\u002F63iywg3qzysj_gch0xjfd8x_afwycoic3t.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F3aetvsf1yhyn807\u002Fs\u002F63iywg3qzysj_gch0xjfd8x_afwycoic3t.webp","2026-08-21 01:36:40.312Z","76qprkevbgfdps8",{"keywords":16,"locale":41,"school_blog":51},[17,24,28,32,36],{"collectionId":18,"collectionName":19,"created":20,"created_by":14,"id":21,"name":22,"updated":23,"updated_by":14},"sclkey987654321","school_keywords","2026-05-11 04:12:12.008Z","bficy78v6muc3cs","Golang AI","2026-06-07 06:49:11.153Z",{"collectionId":18,"collectionName":19,"created":25,"created_by":14,"id":26,"name":27,"updated":25,"updated_by":14},"2026-08-21 01:41:25.146Z","p69rz9y2xg4vcfy","Function Calling Go",{"collectionId":18,"collectionName":19,"created":29,"created_by":14,"id":30,"name":31,"updated":29,"updated_by":14},"2026-08-21 01:41:27.963Z","c0yy6kh8niv0wyk","Go OpenAI API",{"collectionId":18,"collectionName":19,"created":33,"created_by":14,"id":34,"name":35,"updated":33,"updated_by":14},"2026-08-21 01:41:31.648Z","bat0enkfqbi1jci","สอนเขียน AI Agent",{"collectionId":18,"collectionName":19,"created":37,"created_by":14,"id":38,"name":39,"updated":40,"updated_by":14},"2026-05-13 04:25:50.416Z","czsyl2b7o6m4b5x","SuperDev Academy","2026-06-07 06:49:15.072Z",{"code":42,"collectionId":43,"collectionName":44,"created":45,"flag":46,"id":47,"is_default":48,"label":49,"updated":50},"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":52,"collectionId":53,"collectionName":54,"created":55,"expand":56,"id":72,"slug":73,"updated":74,"views":75},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs","2026-08-21 01:36:40.044Z",{"category":57},{"blogIds":58,"collectionId":59,"collectionName":60,"created":61,"created_by":14,"id":52,"image":62,"image_alt":63,"image_path":64,"image_s_url":65,"label":66,"name":67,"priority":68,"publish_at":69,"scheduled_at":63,"status":70,"updated":71,"updated_by":14},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw_bj2o4tjgh4.webp","","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw_bj2o4tjgh4.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002Fs\u002F59ty92ns80w_15oc1implw_bj2o4tjgh4.webp",{"en":67,"th":67},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-08-18 14:48:36.739Z","f50hc0gm73i8673","golang-ai-ep172-function-calling","2026-08-25 05:14:14.493Z",111,"3aetvsf1yhyn807",[21,26,30,34,38],"2026-08-26 03:00:00.000Z","เรียนรู้วิธีทำ Function Calling ในภาษา Go เพื่อสอนให้ AI (LLM) สามารถเรียกใช้ฟังก์ชันและเชื่อมต่อกับโลกภายนอก (Database, API) ได้จริงแบบ Step-by-step","Golang The Series EP.172: Function Calling สอน AI เรียกใช้ Go Function","2026-08-26 03:00:00.070Z",{"th":73,"en":73}]