ข้าม​ไป​ยัง​เนื้อหา

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 ส่ง​ข้อความ​เข้าไป มัน​ทำนาย​หน่วย​ข้อความ​ถัด​ไป​ที​ละ​หน่วย​จน​ได้​คำ​ตอบ​กลับ​มา — และ​การ​เรียก​แบบ​เดิม​เป๊ะๆ ก็​ให้​คำ​ตอบ​ต่าง​กัน​ได้ บท​นี้​ปรับ​กรอบ​ความคิด​ตรง​นี้​ให้​เข้า​ที่​ก่อน เพราะ​ทุก​บท​ที่​เหลือ​สร้าง​อยู่​บน​มัน

📦 code ตัวอย่าง

คอร์ส​นี้​ค่อยๆ ประกอบ agent สำหรับ support ลูกค้า​บน domain Order ของบริการฟู้ด​เดลิ​เวอรี จาก repo kaen-food-ordering (กำลัง​จัด​ทำ) เป็น​ตัวอย่าง​เดิน​เรื่อง​ตลอด​คอร์ส — บท​นี้​เป็น​บท​วาง​แนวคิด ยัง​ไม่มี code ให้​รัน (บท​ที่ 2 จะ​เริ่ม​ยิง Messages API ดิบ​ด้วย​มือ) แต่​วาง​กรอบ​ความคิด​ที่ code ทุก​บท​หลัง​จาก​นี้​ต้อง​พึ่ง

หน่วย​ที่ 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)

ทุก​ครั้ง​ที่​เรียก 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 ไป​กับ model รุ่น​ล่าสุด

การ​ส่ง 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 — เรา​จะ​พิสูจน์​ทุก​ข้อ​ด้วย​ต้นทาง​ที่​ลง​วัน​ที่​กำกับ ไม่​เดา

ทุก​อย่าง​ข้าง​บน​คือ​การ​เรียก 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 ที่​ทำงาน​ได้​จริง:

  1. การ​เรียก model ครั้ง​แรก (บท​ที่ 2) — ยิง Messages API ดิบ​ด้วย HttpClient เพื่อ​เห็น​ทุก byte ไม่มี SDK บัง
  2. prompt ที่​ใช้งาน​ได้​จริง (บท​ที่ 3) — ตั้ง​บทบาท​และ​กติกา​ให้ model ด้วย​โครงสร้าง ไม่ใช่​ความ​ฉลาด​ของ​ถ้อยคำ
  3. tool use (บท​ที่ 4) — ให้ model เรียก code C# ของ​คุณ เห็น​รอบ tool_usetool_result เต็มๆ
  4. Microsoft.Extensions.AI (บท​ที่ 5) — เขียน​การ​เรียก​เดิม​ด้วย​สำนวน .NET ผ่าน IChatClient
  5. the loop (บท​ที่ 6) — ร้อย​ทุก​อย่าง​เป็น​วง observe → decide → act → repeat พร้อม​เงื่อนไข​หยุด
  6. ทำให้​เชื่อถือ​ได้ (บท​ที่ 7) — วิศวกรรม​รอบๆ non-determinism ทั้ง​ต้นทุน error และ guardrail
  7. 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 คืออะไร?