ข้ามไปยังเนื้อหา
แก่น Kaen
ค้นหา
Ctrl
K
ยกเลิก
เลือกธีม
มืด
สว่าง
อัตโนมัติ
agent ตัวแรกด้วย C#/.NET — สร้าง AI Agent ตัวแรก
ถือ LLM ให้ถูกแล้วต่อยอดเป็น agent — 8 บทเรียน ตั้งแต่มอง model เป็น function text→text ที่ไม่ deterministic ไปจนถึง agent Order support ที่มี tools และ the loop ครบ
เริ่มบทที่ 1
ความคืบหน้า
0 / 8 บทเรียน
เส้นทางการเรียน
หัวข้อที่มีชื่อว่า “เส้นทางการเรียน”
●
01
LLM คืออะไรสำหรับวิศวกร
เริ่มตรงนี้
LLM
large language model — model ภาษาขนาดใหญ่ที่มองง่าย ๆ ได้ว่าเป็น function `text → token → text` ตัวหนึ่ง รับข้อความเข้าไปแล้วทำนาย token ถัดไปทีละตัวจากบริบทก่อนหน้า จนได้ข้อความออกมา — ต่างจาก function บริสุทธิ์ที่โปรแกรมเมอร์ C# คุ้นเคยตรงที่ input เดิมเป๊ะ ๆ อาจให้ output ต่างกันในแต่ละครั้ง (ดู Non-determinism) การถือมันให้ถูกคือจุดตั้งต้นของทั้งคอร์ส
Token
หน่วยย่อยที่สุดที่ model ประมวลผล อาจเทียบเท่าคำ ส่วนของคำ ตัวอักษร หรือ byte ก็ได้ — ข้อความทุกชิ้นถูกแปลงเป็นชุด token ก่อนเข้า model สำหรับ Claude 1 token ราว 3.5 ตัวอักษรอังกฤษ (แปรตามภาษาที่ใช้) จำนวน token คือทั้งหน่วยวัดขนาดและหน่วยคิดเงิน (ดู Token Cost) — อย่าเดา token ของ Claude ด้วย tiktoken ของ OpenAI เพราะนับต่ำกว่าจริง
Agent
ตามกรอบของ Anthropic: agent ก็คือ 'LLM ที่ใช้ tools ตาม feedback จากสภาพแวดล้อมวนเป็น loop' — พูดง่าย ๆ คือการเรียก model ธรรมดาบวก tools บวก Agent Loop ไม่มีอะไรวิเศษไปกว่านั้น หลักที่คอร์สนี้ยึดคือสร้างสิ่งที่ 'ง่ายที่สุดเท่าที่จำเป็น' แล้วค่อยเพิ่มความซับซ้อนเมื่อจำเป็นจริง ๆ — อย่าเอื้อมไปหา agent เป็นค่าเริ่มต้น
○
02
การเรียก model ครั้งแรก
Message
หน่วยหนึ่งเทิร์นของบทสนทนา ประกอบด้วย role (`user` หรือ `assistant`) กับ content — Messages API รับ `messages[]` ที่เรียงสลับกันไป และตัว API เป็นแบบ stateless คือต้องส่งประวัติทั้งชุดกลับไปใหม่ทุกครั้ง หมายเหตุ: ใน API ดิบไม่มี role ชื่อ `system` (มันเป็น field ระดับบนสุดแยกต่างหาก) และไม่มี role `tool` — ผลของ tool ถูกส่งกลับในข้อความ role `user`
Stop Reason
field `stop_reason` ในทุกคำตอบที่บอกว่า model หยุดเพราะอะไร — `end_turn` = ตอบจบเองตามธรรมชาติ, `tool_use` = model ขอเรียก tool (สัญญาณให้แตกกิ่งไปรัน tool), `max_tokens` = ชนเพดานที่ตั้งไว้ (คำตอบอาจถูกตัด) — เป็นสัญญาณควบคุมหลักของ Agent Loop ว่าจะวนต่อหรือหยุด
Token
หน่วยย่อยที่สุดที่ model ประมวลผล อาจเทียบเท่าคำ ส่วนของคำ ตัวอักษร หรือ byte ก็ได้ — ข้อความทุกชิ้นถูกแปลงเป็นชุด token ก่อนเข้า model สำหรับ Claude 1 token ราว 3.5 ตัวอักษรอังกฤษ (แปรตามภาษาที่ใช้) จำนวน token คือทั้งหน่วยวัดขนาดและหน่วยคิดเงิน (ดู Token Cost) — อย่าเดา token ของ Claude ด้วย tiktoken ของ OpenAI เพราะนับต่ำกว่าจริง
○
03
Prompt ที่ใช้งานได้จริง
Prompt Engineering
การออกแบบคำสั่งให้ model ทำงานได้เชื่อถือได้ ด้วยโครงสร้างมากกว่าความฉลาดของถ้อยคำ — บอกให้ชัดและตรง, ให้เหตุผลเบื้องหลังกติกา (ไม่ใช่แค่ตัวเลขเปล่า ๆ), ยกตัวอย่าง (ดู Few-shot), ห่อแต่ละส่วนด้วยแท็ก XML และตั้งบทบาทใน System Prompt — หลักคือ 'ถ้าเพื่อนร่วมงานที่ไม่รู้บริบทอ่านแล้วงง Claude ก็งงเหมือนกัน' และเลิกตะโกน CRITICAL/MUST กับ model รุ่นใหม่
System Prompt
คำสั่งระดับบนสุดที่กำหนดบทบาท น้ำเสียง และกติกาให้ model ก่อนบทสนทนาจะเริ่ม เช่นตั้งให้เป็น 'เจ้าหน้าที่ support ของบริการฟู้ดเดลิเวอรี' — ในการเรียก API ดิบมันคือ field `system` ระดับบนสุด (ไม่ใช่ message ที่ role เป็น system) แค่ประโยคเดียวก็เปลี่ยนพฤติกรรมได้ ส่วนใน Microsoft.Extensions.AI มันกลายเป็น ChatMessage ที่ ChatRole.System แทน
Few-shot
เทคนิคใส่ตัวอย่าง input-output ที่ถูกต้องลงใน prompt เพื่อกำกับรูปแบบ โทน และโครงสร้างของคำตอบ — เป็นหนึ่งในวิธีที่ได้ผลที่สุดในการบังคับทิศทาง output ของ Claude ตัวอย่างควรตรงประเด็น หลากหลาย และมีโครงสร้างชัด (ห่อใน `<example>`…`</example>`) แนะนำ 3–5 ตัวอย่างเพื่อผลดีที่สุด
○
04
Tool use — ให้ model เรียก code C# ของคุณ
Tool Use
ความสามารถที่ให้ model เรียก code ของเราได้ — เราส่งรายการ tool ไปพร้อมคำถาม model ตอบกลับด้วย block `tool_use` (พร้อม `stop_reason: tool_use`) เรารัน function จริงใน C# แล้วส่งผลกลับเป็น Tool Result model จึงทำงานต่อจนได้คำตอบ — ทั้งหมดวิ่งอยู่บนโครงสร้าง message ธรรมดา ไม่มี role พิเศษ นี่คือสิ่งที่ยกระดับการเรียก model ธรรมดาให้กลายเป็น Agent
Tool Schema
นิยามของ tool หนึ่งตัวที่ส่งให้ model ประกอบด้วย `name`, `description` และ `input_schema` (เป็น JSON Schema บอกรูป parameter) — `name` ต้องเข้าแพทเทิร์น `^[a-zA-Z0-9_-]{1,64}$` และ `description` ที่ดีคือ prompt ชั้นหนึ่งเลย ควรใส่ใจเท่ากับ prompt หลัก เพราะเป็นสิ่งที่ model ใช้ตัดสินว่าจะเรียก tool ตัวไหนและใส่ค่าอะไร
Tool Result
block `tool_result` ที่เราส่งกลับหลังรัน tool เสร็จ ต้องอ้าง `tool_use_id` ให้ตรงกับ id ของ block `tool_use` ที่ model ส่งมา — กติกาที่ผิดแล้ว 400: ต้องวางเป็น block แรกใน content ของข้อความ role `user`, ค่าจะเป็น string หรือ list ก็ได้ และถ้า tool พังให้ใส่ `is_error: true` แทนการโยน exception เพื่อให้ loop เห็นความล้มเหลวแล้วกู้ต่อได้
○
05
จาก raw ไป Microsoft.Extensions.AI
IChatClient
interface กลางใน Microsoft.Extensions.AI สำหรับคุยกับ model แบบ provider-agnostic — method หลักที่มือใหม่ใช้คือ `GetResponseAsync(messages, options)` (และ version streaming) รับ `ChatMessage`/`ChatRole` คืน `ChatResponse` ต่อ middleware เพิ่มได้ผ่าน `.AsBuilder()` เช่น `.UseFunctionInvocation()` — เป็นการเรียกแบบเดียวกับ API ดิบในบทก่อน แต่เขียนด้วยสำนวน .NET ⚠️ อย่าตั้ง `ChatOptions.Temperature` กับ Claude รุ่นล่าสุด (400)
Microsoft.Extensions.AI
library ทางการของ .NET (package `Microsoft.Extensions.AI` สาย 10.x GA) ที่ให้ abstraction กลางอย่าง IChatClient สำหรับต่อกับ model AI แบบไม่ผูกค่าย พร้อม automatic function invocation และเข้ากับ DI ได้ — ⚠️ ความจริงเรื่อง connector: Microsoft มี connector ทางการเฉพาะ OpenAI/Azure OpenAI สำหรับ Claude ยังไม่มี first-party ต้องใช้ package `Anthropic` ทางการ (v10+ สถานะ beta) ผ่าน `AsIChatClient(...)` และห้ามลากผ่าน connector ของ OpenAI
○
06
The Loop — ร้อยทุกอย่างเป็นวง observe → decide → act
Agent Loop
วงจร observe → decide → act → repeat ที่ทำซ้ำจนถึงเงื่อนไขหยุด — model สังเกตผลจากสภาพแวดล้อม (ผลของ tool) แล้วตัดสินใจก้าวถัดไป วนไปจนกว่าจะได้คำตอบสุดท้าย (ไม่มี `tool_use` แล้ว), ชนเพดานจำนวนรอบ, ต้องขออนุมัติจากคน หรือเกินงบ token/ต้นทุน — ต้องรักษาให้มีเงื่อนไขหยุดเสมอเพื่อคุมไม่ให้วนไม่จบ ใน Microsoft.Extensions.AI ตัว `.UseFunctionInvocation()` ทำวงนี้ให้อัตโนมัติ
Augmented LLM
หน่วยประกอบพื้นฐานที่สุดของระบบ agentic ตามนิยามของ Anthropic — LLM หนึ่งตัวที่ถูกเสริม (augment) ด้วย retrieval, tools และ memory เช่น `getOrder`/`getDeliveryStatus`/`issueRefund` คือ tools ที่เสริมให้ model ลงมือกับ domain Order ได้จริง เป็นก้อนที่ Agent Loop เอามาวนซ้ำ
○
07
ทำให้ agent เชื่อถือได้
Non-determinism
คุณสมบัติที่ input เดิมเป๊ะ ๆ อาจให้ output ต่างกันในแต่ละครั้ง แม้ตั้ง temperature = 0 ก็ตาม — นี่คือจุดที่ต่างจาก function บริสุทธิ์ที่โปรแกรมเมอร์คุ้นเคย และเป็นเหตุผลที่ต้องออกแบบ workflow รอบ ๆ ธรรมชาติเชิงความน่าจะเป็นนี้ ทั้งเรื่องการทดสอบ การจัดการ error และ guardrail ต้องคิดใหม่หมด
Token Cost
ต้นทุนที่คิดตามจำนวน token — ทุกคำตอบรายงานการใช้งานใน field `usage` (ขนาด prompt จริง = `input_tokens + cache_creation_input_tokens + cache_read_input_tokens` ส่วน `input_tokens` เดี่ยว ๆ เป็นแค่ส่วนที่ไม่ถูก cache) — ใน Agent Loop แต่ละรอบต้องส่งประวัติทั้งชุด + tools กลับไปใหม่ token จึงพอกขึ้นทุกรอบ งบต้นทุน/เวลาจึงเป็นเงื่อนไขหยุดวงจรอย่างหนึ่ง
Guardrail
มาตรการที่รักษาให้ agent ทำงานอยู่ในกรอบปลอดภัย — ตรวจ input ของ tool ก่อนลงมือ, ไม่เชื่อ output ของ model เกินตัว (zero-trust: ปฏิบัติต่อมันเหมือน user คนหนึ่ง), ตั้งด่านให้คนอนุมัติก่อนทำสิ่งที่ย้อนกลับไม่ได้อย่าง `issueRefund` และระวัง prompt injection เมื่อ tool ดึงข้อมูลจากภายนอก (OWASP LLM01/LLM05) — โยน error ของ tool กลับเป็น `tool_result` ที่ `is_error: true` เพื่อให้ loop กู้ต่อได้แทนการปล่อยพัง
○
08
capstone: agent Order support ตัวเต็ม
Agent
ตามกรอบของ Anthropic: agent ก็คือ 'LLM ที่ใช้ tools ตาม feedback จากสภาพแวดล้อมวนเป็น loop' — พูดง่าย ๆ คือการเรียก model ธรรมดาบวก tools บวก Agent Loop ไม่มีอะไรวิเศษไปกว่านั้น หลักที่คอร์สนี้ยึดคือสร้างสิ่งที่ 'ง่ายที่สุดเท่าที่จำเป็น' แล้วค่อยเพิ่มความซับซ้อนเมื่อจำเป็นจริง ๆ — อย่าเอื้อมไปหา agent เป็นค่าเริ่มต้น
Agent Loop
วงจร observe → decide → act → repeat ที่ทำซ้ำจนถึงเงื่อนไขหยุด — model สังเกตผลจากสภาพแวดล้อม (ผลของ tool) แล้วตัดสินใจก้าวถัดไป วนไปจนกว่าจะได้คำตอบสุดท้าย (ไม่มี `tool_use` แล้ว), ชนเพดานจำนวนรอบ, ต้องขออนุมัติจากคน หรือเกินงบ token/ต้นทุน — ต้องรักษาให้มีเงื่อนไขหยุดเสมอเพื่อคุมไม่ให้วนไม่จบ ใน Microsoft.Extensions.AI ตัว `.UseFunctionInvocation()` ทำวงนี้ให้อัตโนมัติ