LLM คืออะไรสำหรับวิศวกร
คุณเขียน C#/.NET คล่องและคิดเป็นภาษา DDD อยู่แล้ว คอร์สนี้จึงไม่ได้มาสอนคุณเขียนโปรแกรม แต่มาสอนสิ่งเดียวที่ยากกว่าสำหรับคนที่ชินกับ pure function — คือการ ถือ model ภาษาให้ถูก method Order.Place(...) ที่คุณคุ้นมือ ให้ input เดิมได้ผลเดิมเป๊ะทุกครั้ง แต่ LLMLLMlarge language model — model ภาษาขนาดใหญ่ที่มองง่าย ๆ ได้ว่าเป็น function `text → token → text` ตัวหนึ่ง รับข้อความเข้าไปแล้วทำนาย token ถัดไปทีละตัวจากบริบทก่อนหน้า จนได้ข้อความออกมา — ต่างจาก function บริสุทธิ์ที่โปรแกรมเมอร์ C# คุ้นเคยตรงที่ input เดิมเป๊ะ ๆ อาจให้ output ต่างกันในแต่ละครั้ง (ดู Non-determinism) การถือมันให้ถูกคือจุดตั้งต้นของทั้งคอร์สArchitecture (large language model) ไม่ใช่แบบนั้น มองให้ตรงที่สุด มันคือ function text → token → text ตัวหนึ่งที่คุณเรียกผ่าน HTTPS ส่งข้อความเข้าไป มันทำนายหน่วยข้อความถัดไปทีละหน่วยจนได้คำตอบกลับมา — และการเรียกแบบเดิมเป๊ะๆ ก็ให้คำตอบต่างกันได้ บทนี้ปรับกรอบความคิดตรงนี้ให้เข้าที่ก่อน เพราะทุกบทที่เหลือสร้างอยู่บนมัน
คอร์สนี้ค่อยๆ ประกอบ agent สำหรับ support ลูกค้าบน domain Order ของบริการฟู้ดเดลิเวอรี จาก repo kaen-food-ordering (กำลังจัดทำ) เป็นตัวอย่างเดินเรื่องตลอดคอร์ส — บทนี้เป็นบทวางแนวคิด ยังไม่มี code ให้รัน (บทที่ 2 จะเริ่มยิง Messages API ดิบด้วยมือ) แต่วางกรอบความคิดที่ code ทุกบทหลังจากนี้ต้องพึ่ง
model คือ function text → token → text
หัวข้อที่มีชื่อว่า “model คือ function text → token → text”หน่วยที่ model ประมวลผลจริงๆ ไม่ใช่ตัวอักษรและไม่ใช่คำ แต่เป็น TokenTokenหน่วยย่อยที่สุดที่ model ประมวลผล อาจเทียบเท่าคำ ส่วนของคำ ตัวอักษร หรือ byte ก็ได้ — ข้อความทุกชิ้นถูกแปลงเป็นชุด token ก่อนเข้า model สำหรับ Claude 1 token ราว 3.5 ตัวอักษรอังกฤษ (แปรตามภาษาที่ใช้) จำนวน token คือทั้งหน่วยวัดขนาดและหน่วยคิดเงิน (ดู Token Cost) — อย่าเดา token ของ Claude ด้วย tiktoken ของ OpenAI เพราะนับต่ำกว่าจริงArchitecture — Anthropic นิยามไว้ว่า “Tokens are the smallest individual units of a language model, and can correspond to words, subwords, characters, or even bytes.” ข้อความทุกชิ้นถูกแปลงเป็นชุด token ก่อนเข้า model และสำหรับ Claude 1 token ราว 3.5 ตัวอักษรอังกฤษ (แปรตามภาษา — ภาษาไทยกินสัดส่วนต่างออกไป) จำนวน token จึงเป็นทั้งหน่วยวัดขนาดและหน่วยคิดเงินไปพร้อมกัน จำไว้ข้อหนึ่ง: อย่าเดา token ของ Claude ด้วย tiktoken ของ OpenAI เพราะมันคนละ tokenizer และนับต่ำกว่าจริงราว 15–20%
ตัว model เองเป็น next-token predictor — ฝึกมาให้ “predict the next word, given the previous context of text in the document.” พูดอีกแบบคือมันทำนายหน่วยถัดไปจากบริบทก่อนหน้าไปเรื่อยๆ ทีละตัว นี่คือเหตุผลที่ผลลัพธ์ของมันเป็นเชิงความน่าจะเป็น ไม่ใช่ค่าตายตัว
จุดนี้แหละที่ทำโปรแกรมเมอร์สาย pure function สะดุด: model มี Non-determinismNon-determinismคุณสมบัติที่ input เดิมเป๊ะ ๆ อาจให้ output ต่างกันในแต่ละครั้ง แม้ตั้ง temperature = 0 ก็ตาม — นี่คือจุดที่ต่างจาก function บริสุทธิ์ที่โปรแกรมเมอร์คุ้นเคย และเป็นเหตุผลที่ต้องออกแบบ workflow รอบ ๆ ธรรมชาติเชิงความน่าจะเป็นนี้ ทั้งเรื่องการทดสอบ การจัดการ error และ guardrail ต้องคิดใหม่หมดProcess อยู่ในตัว input เดิมเป๊ะๆ อาจให้ output ต่างกันในแต่ละครั้ง Anthropic เขียนตรงๆ ว่า “Even with temperature set to 0, the results will not be fully deterministic and identical inputs may produce different outputs across API calls.” — แม้กดความสุ่มลงจนสุดก็ยังไม่นิ่ง 100% Chip Huyen สรุปวิธีรับมือไว้สั้นๆ ว่า “Working with AI models requires building your workflows around their probabilistic nature.” คือต้องออกแบบระบบรอบๆ ธรรมชาติเชิงความน่าจะเป็นนี้ ไม่ใช่ฝืนให้มันเป็น deterministic แบบ method ปกติ ทั้งการทดสอบ การจัดการ error และ guardrail จึงต้องคิดใหม่หมด (คอร์สนี้ไปถึงเรื่องนั้นในบทที่ 7)
context window คืองบความจำที่มีจำกัด
หัวข้อที่มีชื่อว่า “context window คืองบความจำที่มีจำกัด”ทุกครั้งที่เรียก model คุณกำลังเติมของลงในพื้นที่จำกัดก้อนหนึ่งชื่อ Context WindowContext Window'หน่วยความจำใช้งาน' ของ model — ข้อความทั้งหมดที่ model อ้างอิงได้ตอนสร้างคำตอบ นับรวมทั้ง prompt ที่ส่งไปและคำตอบที่กำลังสร้างเองด้วย เป็นงบประมาณจำกัดที่ต้องรักษาไว้ไม่ให้ล้น (model รุ่นปัจจุบันบางตัวราว 1M token บางตัว 200K — ค่านี้เลื่อนไหวเร็ว) ยิ่งบทสนทนายาวขึ้นเรื่อย ๆ งบก้อนนี้ก็ยิ่งถูกกินจนหมดได้Architecture — “หน่วยความจำใช้งาน” ที่รวมข้อความทั้งหมดที่ model อ้างอิงได้ตอนสร้างคำตอบ ทั้ง prompt ที่คุณส่งไป และคำตอบที่มันกำลังพิมพ์อยู่ด้วย มองแบบวิศวกรคือ budget ที่มีเพดาน ไม่ใช่ท่อไม่จำกัด model รุ่นปัจจุบันบางตัวราว 1M token บางตัว 200K (ค่านี้เลื่อนไหวเร็ว อย่าท่องจำเป็นสัจธรรม) ประเด็นที่ต้องติดหัวไว้คือ ยิ่งบทสนทนายาวขึ้น — โดยเฉพาะตอนที่ agent วนหลายรอบและสะสมประวัติ — งบก้อนนี้ยิ่งถูกกิน จนล้นได้ นี่จะกลายเป็นหนึ่งในเงื่อนไขหยุดของ loop ในบทที่ 6
temperature — แนวคิดที่ต้องเข้าใจ แต่ไม่ได้ส่งไปกับ model รุ่นล่าสุด
หัวข้อที่มีชื่อว่า “temperature — แนวคิดที่ต้องเข้าใจ แต่ไม่ได้ส่งไปกับ model รุ่นล่าสุด”คุณจะเจอคำว่า TemperatureTemperatureparameter ที่คุมความสุ่ม/ความหลากหลายในการเลือก token ถัดไป (ค่าสูง = หลากหลายกว่า) — เป็นแนวคิดที่ควรเข้าใจ แต่ ⚠️ ห้ามส่งค่านี้ (รวมถึง top_p/top_k) ไปกับ model Claude รุ่นล่าสุด เพราะจะได้ HTTP 400 กลับมา ให้กำกับพฤติกรรมผ่าน prompt แทน และพึงจำไว้ว่าแม้ตั้ง temperature = 0 ผลลัพธ์ก็ยังไม่นิ่งเป๊ะ 100% (ดู Non-determinism)Architecture ในเอกสารทั่วไป มันคือ parameter ที่คุมความสุ่ม/ความหลากหลายของการเลือก token ถัดไป ค่าสูง = คำตอบหลากหลายกว่า ค่าต่ำ = นิ่งกว่า เข้าใจแนวคิดไว้ก็พอ เพราะในทางปฏิบัติของคอร์สนี้มีกติกาข้อสำคัญ:
การส่ง temperature (รวมถึง top_p / top_k) ไปกับ model Claude รุ่นล่าสุดจะได้ HTTP 400 กลับมา เอกสารอ้างอิงทั่วไปยัง list field พวกนี้ไว้ก็จริง แต่กับ model ปัจจุบันมันจะ error — ดังนั้นให้ ละไว้ แล้วกำกับพฤติกรรมของ model ผ่าน prompt แทน ตลอดคอร์สนี้คุณจะไม่เห็น code ตัวอย่างไหนส่ง temperature เลย และนั่นตั้งใจ
ที่ยกเรื่องนี้มาตั้งแต่บทแรกเพราะมันคือตัวอย่างแรกของวินัยที่คอร์สนี้ยึด: รายละเอียด API ต้องถูกต้องจริง ไม่ใช่ถูกตามความจำเก่าๆ ที่อาจล้าสมัย บทต่อๆ ไปจะมีกติกาแบบนี้อีก เช่น header ที่ใช้จริงคือ x-api-key ไม่ใช่ Authorization: Bearer และ anthropic-version ที่ต้องส่งทุกครั้งคือ 2023-06-01 — เราจะพิสูจน์ทุกข้อด้วยต้นทางที่ลงวันที่กำกับ ไม่เดา
จากการเรียกครั้งเดียว สู่ agent
หัวข้อที่มีชื่อว่า “จากการเรียกครั้งเดียว สู่ agent”ทุกอย่างข้างบนคือการเรียก model ครั้งเดียว — ข้อความเข้า ข้อความออก จบ แล้วอะไรที่ยกมันขึ้นเป็น AgentAgentตามกรอบของ Anthropic: agent ก็คือ 'LLM ที่ใช้ tools ตาม feedback จากสภาพแวดล้อมวนเป็น loop' — พูดง่าย ๆ คือการเรียก model ธรรมดาบวก tools บวก Agent Loop ไม่มีอะไรวิเศษไปกว่านั้น หลักที่คอร์สนี้ยึดคือสร้างสิ่งที่ 'ง่ายที่สุดเท่าที่จำเป็น' แล้วค่อยเพิ่มความซับซ้อนเมื่อจำเป็นจริง ๆ — อย่าเอื้อมไปหา agent เป็นค่าเริ่มต้นArchitecture คำตอบอยู่ในประโยคเดียวจาก Anthropic ที่เป็นแกนของทั้งคอร์สนี้ — agent “are typically just LLMs using tools based on environmental feedback in a loop.”
แกะออกมาคือสองส่วนที่เติมทับการเรียกธรรมดา:
- tools — ให้ model เรียก code C# ของคุณได้ เช่น
getOrder(orderId)เพื่อไปดึงสถานะออเดอร์จริง แทนที่จะเดาเอาจากความจำ - loop — เอาผลที่ได้จาก tool ป้อนกลับเข้า model เป็น “สิ่งที่สังเกตเห็น” แล้ววนตัดสินใจก้าวถัดไป ทำซ้ำจนงานเสร็จ
ไม่มีอะไรวิเศษไปกว่านั้น — ไม่ใช่ model ที่ฉลาดขึ้น ไม่ใช่ context window ที่ยาวขึ้น แต่คือการเรียก model ตัวเดิมนั่นคือ ห่อด้วย tools กับ loop
flowchart TB
subgraph BARE["เรียกครั้งเดียว — LLM ล้วน"]
T1["ข้อความเข้า"] --> M1["LLM ทำนาย token"]
M1 --> O1["ข้อความออก จบ"]
end
subgraph AGENT["agent — LLM บวก tools บวก loop"]
T2["ข้อความเข้า"] --> M2["LLM ตัดสินใจ"]
M2 -->|ขอเรียก tool| TOOL["รัน tool ใน C#<br/>เช่น getOrder"]
TOOL -->|ป้อนผลกลับ| M2
M2 -->|ได้คำตอบแล้ว| O2["ข้อความออก"]
end
classDef loop fill:#ea580c,stroke:#7c2d12,color:#f8fafc;
class M2 loop;
คำบรรยายภาพ: ซ้าย — การเรียกครั้งเดียว ข้อความเข้าไป model ทำนาย token ข้อความออกมา จบในก้าวเดียว ขวา — agent เอา model ตัวเดิมมาต่อ tools (เช่น getOrder ที่รัน code C# จริง) แล้ววน loop โดยเอาผลของ tool ป้อนกลับเป็นสิ่งที่ model สังเกตเห็น จนกว่าจะได้คำตอบสุดท้าย จุดสีส้มคือหัวใจที่วน — model ตัวเดิม แต่ถูกห่อด้วย tools กับ loop
แต่มีวินัยข้อหนึ่งต้องปักไว้ตั้งแต่ตอนนี้ เพื่อไม่ให้ทั้งคอร์สอ่านเหมือนคำโฆษณา: อย่าเอื้อมไปหา agent เป็นค่าเริ่มต้น หลักของ Anthropic คือ “finding the simplest solution possible, and only increasing complexity when needed.” — หาทางที่ง่ายที่สุดก่อน แล้วค่อยเพิ่มความซับซ้อนเมื่อจำเป็น บ่อยครั้งการเรียก model ครั้งเดียว หรือ code deterministic ธรรมดา ก็เพียงพอและเชื่อถือได้กว่า คอร์สนี้จะพาสร้าง agent ก็จริง แต่สร้าง สิ่งที่ง่ายที่สุดเท่าที่ควรสร้าง — 1 agent 1 loop เท่านั้น
บันไดของคอร์สนี้
หัวข้อที่มีชื่อว่า “บันไดของคอร์สนี้”ที่เหลือคือการไต่บันไดทีละขั้น จาก function text → text ขึ้นไปจนถึง agent ที่ทำงานได้จริง:
- การเรียก model ครั้งแรก (บทที่ 2) — ยิง Messages API ดิบด้วย
HttpClientเพื่อเห็นทุก byte ไม่มี SDK บัง - prompt ที่ใช้งานได้จริง (บทที่ 3) — ตั้งบทบาทและกติกาให้ model ด้วยโครงสร้าง ไม่ใช่ความฉลาดของถ้อยคำ
- tool use (บทที่ 4) — ให้ model เรียก code C# ของคุณ เห็นรอบ
tool_use↔tool_resultเต็มๆ - Microsoft.Extensions.AI (บทที่ 5) — เขียนการเรียกเดิมด้วยสำนวน .NET ผ่าน
IChatClient - the loop (บทที่ 6) — ร้อยทุกอย่างเป็นวง observe → decide → act → repeat พร้อมเงื่อนไขหยุด
- ทำให้เชื่อถือได้ (บทที่ 7) — วิศวกรรมรอบๆ non-determinism ทั้งต้นทุน error และ guardrail
- capstone (บทที่ 8) — ประกอบ agent support Order ตัวเต็มจบในบทเดียว
model ตัวอย่างที่เราจะอ้างถึงตลอดคือ claude-opus-4-8 (ใช้เป็นตัวอย่าง ณ 2026-07 — id ของ model เลื่อนไหวตามเวลา) และปลายทางของคอร์สนี้คือ ประตู ของ pillar สาย AI-engineering ไม่ใช่ปลายทางสุดท้าย พอคุณสร้าง agent ตัวแรกเสร็จ คำถามที่ลึกกว่ารออยู่ในคอร์สถัดไป — ขอบเขตของ agent (คอร์ส #12 agent-as-bounded-context: เมื่อไร1 agent ควรเป็น1 bounded context และเมื่อไร — ซึ่งน้อยครั้ง — ที่ควรมี agent ตัวที่สอง), การวัดความเชื่อถือได้ (คอร์ส #13 evals) และ การทำ tool ให้เป็น server ใช้ซ้ำได้ (คอร์ส #14 MCP) บทนี้แค่วางกรอบ — บทหน้าเราเริ่มลงมือ
บทนี้สังเคราะห์จากสี่แหล่งหลัก อ่านต่อได้ที่ต้นทางโดยตรง:
- Anthropic, Glossary — นิยาม token, next-token prediction, context และ non-determinism (แม้ temperature = 0 ผลก็ยังไม่นิ่งเป๊ะ) เข้าถึง 2026-07-19
- Anthropic, Context windows — context window เป็นงบจำกัด และตัวเลขความจุ (เช่น 200K / 1M token) เข้าถึง 2026-07-19
- Anthropic, “Building Effective Agents” (2024-12-19) — นิยาม agent ว่าคือ LLM ที่ใช้ tools ตาม feedback วนเป็น loop และหลัก “หาทางที่ง่ายที่สุดก่อน”
- Chip Huyen, “AI Engineering” — chapter summaries (2025) — ต้องออกแบบ workflow รอบๆ ธรรมชาติเชิงความน่าจะเป็นของ model
เช็กความเข้าใจ — บทที่ 1
ข้อ 1 / 3สำหรับวิศวกร C# กรอบความคิดที่ 'ถูกที่สุด' ในการมอง LLM คืออะไร?