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

The Loop — ร้อย​ทุก​อย่าง​เป็น​วง observe → decide → act

ห้า​บท​ที่​ผ่าน​มา​คุณ​สะสม​ชิ้น​ส่วน​ครบ​แล้ว — การ​เรียก​ดิบ (บท​ที่ 2), prompt ที่​ตั้ง​บทบาท (บท​ที่ 3), รอบ tool_usetool_result (บท​ที่ 4) และ IChatClient ที่​ทำให้​ทุก​อย่าง​เป็น​สำนวน .NET (บท​ที่ 5) แต่​ทั้งหมด​นั้น​ยัง​เป็นการ​เรียก model ที​ละ​ก้าว ผู้​ใช้​ถาม model ขอ tool คุณ​รัน แล้ว​ป้อน​ผลกลับ — จบ​หนึ่ง​รอบ บท​นี้​คือ​ชิ้น​สุดท้าย​ที่​บท​ที่ 1 สัญญา​ไว้​ว่า​จะ​จ่าย​คืน: เอา​ก้าว​เดี่ยวๆ พวก​นั้น​มา วน จน​กลาย​เป็น agent ที่​เดิน​งาน​หลาย​ก้าว​ได้​เอง คำ​นิยาม​ของ Anthropic ตรง​เป๊ะ — agent “are typically just LLMs using tools based on environmental feedback in a loop.” หัวใจ​อยู่​ที่​คำ​สุดท้าย: in a loop

📦 code ตัวอย่าง

บท​นี้​ประกอบ loop บน domain Order ของบริการฟู้ด​เดลิ​เวอรี จาก repo kaen-food-ordering (กำลัง​จัด​ทำ) — ตัวอย่าง​เดิน​เรื่อง​คือ​คำขอ​เดียว “ออเดอร์​ส่ง​ช้า​มาก ขอ​เช็ค​สถานะ​แล้ว​คืน​เงิน​ให้​ด้วย” ที่ agent ต้อง​เดิน​สาม​ก้าว getOrdergetDeliveryStatusissueRefund กว่า​จะ​จบ code ที่​เห็น​อิง​รูป API จริง​จาก​บท​ที่ 4–5 ทุก​จุด แต่​เดิน​เรื่อง​เพื่อ​สอน​กลไก loop เป็น​หลัก

Agent LoopAgent Loopวงจร observe → decide → act → repeat ที่​ทำซ้ำ​จนถึง​เงื่อนไข​หยุด — model สังเกต​ผล​จาก​สภาพ​แวดล้อม (ผล​ของ tool) แล้ว​ตัดสิน​ใจ​ก้าว​ถัด​ไป วน​ไป​จนกว่า​จะ​ได้​คำ​ตอบ​สุดท้าย (ไม่มี `tool_use` แล้ว), ชน​เพดาน​จำนวน​รอบ, ต้อง​ขอ​อนุมัติ​จาก​คน หรือ​เกิน​งบ token/ต้นทุน — ต้อง​รักษา​ให้​มี​เงื่อนไข​หยุด​เสมอ​เพื่อ​คุม​ไม่​ให้​วน​ไม่​จบ ใน Microsoft.Extensions.AI ตัว `.UseFunctionInvocation()` ทำ​วง​นี้​ให้​อัตโนมัติArchitecture คือ​วง​เดียว​สี่​จังหวะ​ที่​วน​จนกว่า​จะ​ถึง​เงื่อนไข​หยุด:

  • decide — model ดู​บริบท​ทั้งหมด​ที่​มี​ใน​ตอน​นี้ แล้ว​ตัดสิน​ก้าว​ถัด​ไป: จะ​เรียก tool ตัว​ไหน หรือ​ได้​คำ​ตอบ​สุดท้าย​แล้ว
  • act — code C# ของ​คุณ​รัน tool ที่ model ขอจริงๆ (getOrder, issueRefund, …)
  • observe — เอา​ผล​ของ tool ป้อน​กลับ​เข้า model เป็น “สิ่ง​ที่​เห็น​จาก​สภาพ​แวดล้อม” Anthropic ย้ำ​ว่า​จังหวะ​นี้​สำคัญ: “it’s crucial for the agents to gain ‘ground truth’ from the environment at each step (such as tool call results or code execution) to assess its progress.” — model ไม่​ได้​เดา​ว่า​ออเดอร์​สถานะ​อะไร มัน​ได้ ground truth จาก​ผล tool จริง
  • repeat — วน​กลับ​ไป decide ด้วย​บริบท​ที่​เพิ่ง​โต​ขึ้น

สิ่ง​ที่​คุณ​สร้าง​ใน​บท​ที่ 4 คือ หนึ่ง​รอบ ของวง​นี้​ที่​หมุน​ด้วย​มือ บท​นี้​แค่​เอา​มัน​มา​ใส่ while — และ​เพิ่ม​สมอง​ส่วน​ที่​คอย​ดู​ว่า​เมื่อไร​ควร​หยุด​หมุน

ก่อน​จะ​ดู loop วน​จริง ต้อง​เห็น​ว่า​มัน​วน​อยู่​บน อะไร Anthropic เรียก​หน่วย​ตั้งต้น​ของ​ระบบ agent ว่า Augmented LLMAugmented LLMหน่วย​ประกอบ​พื้นฐาน​ที่สุด​ของ​ระบบ agentic ตาม​นิยาม​ของ Anthropic — LLM หนึ่ง​ตัว​ที่​ถูก​เสริม (augment) ด้วย retrieval, tools และ memory เช่น `getOrder`/`getDeliveryStatus`/`issueRefund` คือ tools ที่​เสริม​ให้ model ลงมือ​กับ domain Order ได้​จริง เป็น​ก้อน​ที่ Agent Loop เอา​มา​วน​ซ้ำArchitecture“The basic building block of agentic systems is an LLM enhanced with augmentations such as retrieval, tools, and memory.” แกะ​เป็น​ภาษา​ของ​คอร์ส​นี้:

  • toolsgetOrder / getDeliveryStatus / issueRefund คือ “มือ” ที่​ให้ model ไป​แตะ domain Order จริง (นี่​คือ tools จาก​บท​ที่ 4 ตรงๆ)
  • memorymessages list ที่​โต​ขึ้น​ทุกรอบ เก็บ​ทั้ง​คำถาม คำขอ tool และ​ผล tool ไว้​ให้ model อ้างอิง​ได้​ใน​ก้าว​ถัด​ไป (ใน​บท​ที่ 5 คือ history ที่​คุณ AddMessages(response) เข้าไป)

Augmented LLM คือ กล่อง ที่ loop หมุน​รอบ​มัน — LLM ตัว​เดิม ที่​มี​มือ (tools) และ​ความ​จำ (memory) ต่อ​พ่วง ไม่ใช่ model พันธุ์​ใหม่

คำขอ​เดียว “ออเดอร์ ORD-1042 ส่ง​ช้า​มาก ขอ​เช็ค​สถานะ​แล้ว​คืน​เงิน​ให้​ด้วย” ไม่มี​ทาง​จบ​ใน​ก้าว​เดียว model ต้อง​รู้​ก่อน​ว่า​ออเดอร์​มี​จริง​ไหม (getOrder) แล้ว​ส่ง​ถึง​ไหน​แล้ว (getDeliveryStatus) ถึง​จะ​ตัดสิน​ได้​ว่า​ควร​คืน​เงิน​เท่าไร (issueRefund) แต่ละ​ก้าว​คือ​หนึ่ง​รอบ​ของ loop และ ผล​ของ​ก้าว​ก่อน​คือ input ของ decide ก้าว​ถัด​ไป

flowchart TB
  START["คำขอลูกค้า"] --> DECIDE["model ตัดสินใจ (decide)"]
  DECIDE -->|ขอเรียก tool| ACT["รัน tool ใน C# (act)<br/>getOrder / getDeliveryStatus / issueRefund"]
  ACT --> OBSERVE["ป้อนผลกลับเป็น tool_result (observe)"]
  OBSERVE --> CHECK{"ถึงเงื่อนไขหยุดหรือยัง"}
  CHECK -->|ยัง วนต่อ| DECIDE
  CHECK -->|เกินเพดานรอบ หรือ เกินงบ หรือ รออนุมัติ| STOPCTRL["หยุดโดยตัวคุม"]
  DECIDE -->|ได้คำตอบสุดท้าย ไม่เรียก tool| DONE["ตอบลูกค้า จบ loop"]
  classDef loop fill:#ea580c,stroke:#7c2d12,color:#f8fafc;
  classDef stop fill:#dc2626,stroke:#7f1d1d,color:#f8fafc;
  class DECIDE loop;
  class STOPCTRL stop;

คำ​บรรยาย​ภาพ: วง observe → decide → act → repeat ที่​มี​ด่าน​ตรวจ (สี​ส้ม​คือ​หัวใจ​ที่​วน — model ตัดสิน​ใจ) ทุกรอบ model ตัดสิน​ใจ ถ้า​ยัง​ขอ tool ก็​ไป​รัน​ใน C# แล้ว​ป้อน​ผลกลับ​เป็น tool_result จาก​นั้น​เข้า​ด่าน​เช็ก​เงื่อนไข​หยุด — ยัง​ไม่​ถึง​ก็​วน​กลับ​ไป decide ถ้า​ถึง (เกิน​เพดาน​รอบ เกิน​งบ หรือ tool ต้อง​รอ​อนุมัติ) ตัว​คุม​สั่ง​หยุด (สี​แดง) ส่วน​ทาง​ลัด​ขวา​คือ done signal: รอบ​ไหน model ตอบ​โดย​ไม่​ขอ tool เลย แปล​ว่า​งาน​จบ ออก​จาก loop ตาม​ธรรมชาติ

ก่อน​จะ​ปล่อย​ให้ framework หมุน​ให้ ดู​ให้​เห็น​ก่อน​ว่า​มัน​หมุน​ยังไง นี่​คือ​รอบ​เดียว​จาก​บท​ที่ 4 ที่​เอา​มา​ใส่ while — ทุก​บรรทัด​รักษา invariant เดิม (x-api-key, anthropic-version: 2023-06-01, ไม่มี temperature, อ่าน​คำ​ตอบ​จาก content[] ไม่มี .text ระดับ​บน​สุด):

var messages = new List<object> {
new { role = "user", content = "ออเดอร์ ORD-1042 ส่งช้ามาก ขอเช็คสถานะแล้วคืนเงินให้ด้วย" }
};
var tools = new[] { /* getOrder, getDeliveryStatus, issueRefund — schema เดิมจากบทที่ 4 */ };
const int maxIterations = 8; // (b) เพดานจำนวนรอบ — กันวนไม่รู้จบ
for (int step = 0; step < maxIterations; step++)
{
var body = new {
model = "claude-opus-4-8", // ตัวอย่าง ณ 2026-07 — id เลื่อนไหวตามเวลา
max_tokens = 1024,
tools,
messages
}; // ไม่มี temperature — 400 บน model รุ่นล่าสุด
using var resp = await http.PostAsJsonAsync("v1/messages", body);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var root = doc.RootElement;
string? stopReason = root.GetProperty("stop_reason").GetString();
// (a) done signal: stop_reason ไม่ใช่ "tool_use" แล้ว = model ได้คำตอบสุดท้าย
// ระวัง: มีแต่ end_turn ที่แปลว่างานสำเร็จ — ค่าอื่นที่ไม่ใช่ tool_use เช่น
// max_tokens หรือ refusal แปลว่าเทิร์นหยุดด้วยเหตุอื่น ไม่ใช่ว่างานสำเร็จ
if (stopReason != "tool_use")
{
PrintFinalText(root); // อ่านจาก content[] เหมือนบทที่ 2
break;
}
// จำคำตอบของ assistant ทั้งก้อน verbatim (memory โตขึ้นหนึ่งเทิร์น)
messages.Add(new { role = "assistant", content = CloneContent(root) });
// act + observe: รัน tool ที่ model ขอ แล้วสร้าง tool_result ป้อนกลับ
var results = new List<object>();
foreach (var block in root.GetProperty("content").EnumerateArray())
{
if (block.GetProperty("type").GetString() != "tool_use") continue;
string name = block.GetProperty("name").GetString()!;
string id = block.GetProperty("id").GetString()!; // tool_use_id ต้องตรงกับ id นี้
var input = block.GetProperty("input");
// (c) human checkpoint: issueRefund ย้ายเงินจริง — หยุดขออนุมัติก่อนลงมือ
if (name == "issueRefund" && !ApprovedByHuman(input))
{
results.Add(new { type = "tool_result", tool_use_id = id,
content = "ยังไม่คืนเงิน — รอเจ้าหน้าที่อนุมัติก่อน", is_error = true });
continue;
}
string toolOutput = name switch {
"getOrder" => GetOrder(input),
"getDeliveryStatus" => GetDeliveryStatus(input),
"issueRefund" => IssueRefund(input),
_ => "{\"error\":\"unknown tool\"}"
};
results.Add(new { type = "tool_result", tool_use_id = id, content = toolOutput });
}
// tool_result ต้องมาก่อนใน content ของ user message เสมอ (ไม่งั้น 400)
messages.Add(new { role = "user", content = results });
}

สังเกต​ว่า​ไม่มี​เวทมนตร์​ใน​นี้​เลย — มี​แต่ for ครอบ​การ​เรียก​เดิม บวก​ด่าน​เช็ก stop_reason Stop ReasonStop Reasonfield `stop_reason` ใน​ทุก​คำ​ตอบ​ที่​บอกว่า model หยุด​เพราะ​อะไร — `end_turn` = ตอบ​จบ​เอง​ตาม​ธรรมชาติ, `tool_use` = model ขอ​เรียก tool (สัญญาณ​ให้​แตก​กิ่ง​ไป​รัน tool), `max_tokens` = ชน​เพดาน​ที่​ตั้ง​ไว้ (คำ​ตอบ​อาจ​ถูก​ตัด) — เป็น​สัญญาณ​ควบคุม​หลัก​ของ Agent Loop ว่า​จะ​วน​ต่อ​หรือ​หยุดArchitecture เพื่อ​รู้​ว่า​เมื่อไร​หยุด นี่​คือ​ทั้งหมด​ที่​ทำให้การ​เรียก​ครั้ง​เดียว​กลาย​เป็น agent

พอ​เข้าใจ​ว่า while ข้าง​บน​ทำ​อะไร ก็​จะ​เห็น​ว่า IChatClientIChatClientinterface กลาง​ใน Microsoft.Extensions.AI สำหรับ​คุย​กับ model แบบ provider-agnostic — method หลัก​ที่​มือใหม่​ใช้​คือ `GetResponseAsync(messages, options)` (และ version streaming) รับ `ChatMessage`/`ChatRole` คืน `ChatResponse` ต่อ middleware เพิ่ม​ได้​ผ่าน `.AsBuilder()` เช่น `.UseFunctionInvocation()` — เป็นการ​เรียก​แบบ​เดียว​กับ API ดิบ​ใน​บท​ก่อน แต่​เขียน​ด้วย​สำนวน .NET ⚠️ อย่า​ตั้ง `ChatOptions.Temperature` กับ Claude รุ่น​ล่าสุด (400)Architecture ใน​บท​ที่ 5 ซ่อน​มัน​ไว้​ให้​ทั้ง​วง — .UseFunctionInvocation() ไม่ใช่​แค่ “เรียก tool ให้” แต่​มัน​คือ loop ทั้ง​อัน: มัน​วน decide → act → observe ให้​เอง จน model ไม่​ขอ tool อีก แล้ว​ค่อย​คืน ChatResponse ให้​คุณ คุณ await ครั้ง​เดียว ได้​คำ​ตอบ​สุดท้าย​ที่​ผ่าน​สาม​ก้าว​มา​แล้ว:

IChatClient chatClient = client.AsIChatClient("claude-opus-4-8") // ตัวอย่าง ณ 2026-07 (beta)
.AsBuilder()
.UseFunctionInvocation() // ← บรรทัดนี้คือ loop ทั้งวง
.Build();
var options = new ChatOptions {
Tools = [
AIFunctionFactory.Create(GetOrder, "getOrder", "ดึงออเดอร์ตาม id"),
AIFunctionFactory.Create(GetDeliveryStatus, "getDeliveryStatus", "ดูสถานะการจัดส่งของออเดอร์"),
AIFunctionFactory.Create(IssueRefund, "issueRefund", "คืนเงินออเดอร์ตามจำนวนที่ระบุ"),
]
// ⚠️ ห้ามตั้ง options.Temperature — 400 บน model Claude รุ่นล่าสุด
};
List<ChatMessage> history = [
new(ChatRole.System, "You are a customer-support agent for a food-delivery service."),
new(ChatRole.User, "ออเดอร์ ORD-1042 ส่งช้ามาก ขอเช็คสถานะแล้วคืนเงินให้ด้วย")
];
ChatResponse response = await chatClient.GetResponseAsync(history, options);
Console.WriteLine(response.Text); // getOrder → getDeliveryStatus → issueRefund วนครบแล้ว

ใน​สำนวน MEAI สัญญาณ done ก็​เปลี่ยน​หน้าตา​ไป​ด้วย: แทน​ที่​จะ​เช็ก stop_reason == "tool_use" เอง middleware เช็ก​ให้ — มัน​วน​ต่อ​ตราบ​ใด​ที่ model ยัง​ขอ tool (FinishReason เป็น ToolCalls) และ​หยุด​เมื่อ​ได้​คำ​ตอบ​สุดท้าย (FinishReason เป็น Stop) รูป​สอง​ก้อน​นี้ — ผล tool_result ป้อน​กลับ​เป็น Tool ResultTool Resultblock `tool_result` ที่​เรา​ส่ง​กลับ​หลัง​รัน tool เสร็จ ต้อง​อ้าง `tool_use_id` ให้​ตรง​กับ id ของ block `tool_use` ที่ model ส่ง​มา — กติกา​ที่​ผิด​แล้ว 400: ต้อง​วาง​เป็น block แรก​ใน content ของ​ข้อความ role `user`, ค่า​จะ​เป็น string หรือ list ก็ได้ และ​ถ้า tool พัง​ให้​ใส่ `is_error: true` แทน​การ​โยน exception เพื่อ​ให้ loop เห็น​ความ​ล้มเหลว​แล้ว​กู้​ต่อ​ได้Architecture ใน​ราว HTTP กับ ChatResponse.FinishReason ใน MEAI — คือ​หน้า​เดียวกัน​ของ​เหรียญ อย่า​สับสน​สอง​สำนวน​เข้าหา​กัน

loop ที่​ไม่มี​เงื่อนไข​หยุด​คือ while(true) ที่​เผา​เงิน Anthropic เขียนไว้ตรงๆ ว่า “The task often terminates upon completion, but it’s also common to include stopping conditions (such as a maximum number of iterations) to maintain control.” — คำ​ว่า maintain control คือ​ประเด็น loop ต้อง​หยุด​ได้​ด้วย​เงื่อนไข​ที่ คุณ กำหนด ไม่ใช่​รอ​ให้ model ตัดสิน​ใจ​หยุด​เอง มี​สี่​แบบ​ที่​ต้อง​รักษา​ไว้​เสมอ:

  • (a) done signal — งาน​เสร็จ รอบ​ไหน model ตอบ​โดย​ไม่​ขอ tool (stop_reason ไม่ใช่ tool_use / FinishReason เป็น Stop) แปล​ว่า​จบ ออก​จาก loop นี่​คือ​ทางออก​ปกติ
  • (b) เพดาน​จำนวน​รอบ (max iterations) for (step < maxIterations) — ด่าน​นิรภัย​เผื่อ model วน​ไม่​จบ เช่น เรียก tool เดิม​ซ้ำ​เพราะ​เข้าใจ​ผล tool ผิด ถ้า​ไม่มี​เพดาน​นี้ bug หนึ่ง​ตัว​กลาย​เป็น​บิล​ค่า API ที่​บานปลาย
  • (c) human checkpoint — รอ​อนุมัติ issueRefund ย้าย​เงิน​จริง​ใน domain Order มัน​คือ​จุด​ที่​ควร พัก loop ให้​คน​ตรวจ​ก่อน​ลงมือ Anthropic แนะ​ตรง​นี้​ว่า “Agents can then pause for human feedback at checkpoints or when encountering blockers.” — action ที่​ผล​ย้อน​กลับ​ไม่​ได้ ควร​มี​ด่าน​คน​เสมอ (บท​ที่ 8 จะ​ทำ​ด่าน​นี้​ให้​แน่น​ใน code C# ไม่ใช่​ฝาก​ไว้​กับ prompt)
  • (d) เพดาน​งบ (cost ceiling) ทุกรอบ​คือ​การ​ยิง Messages หนึ่ง​ครั้ง​ที่​คิด​เงิน และ​เพราะ API ไม่มี state คุณ​ต้อง​ส่ง messages ทั้ง​ก้อน + tools ซ้ำ​ทุกรอบ — Token CostToken Costต้นทุน​ที่​คิด​ตาม​จำนวน token — ทุก​คำ​ตอบ​รายงานการ​ใช้งาน​ใน field `usage` (ขนาด prompt จริง = `input_tokens + cache_creation_input_tokens + cache_read_input_tokens` ส่วน `input_tokens` เดี่ยว ๆ เป็น​แค่​ส่วน​ที่​ไม่​ถูก cache) — ใน Agent Loop แต่ละ​รอบ​ต้อง​ส่ง​ประวัติ​ทั้ง​ชุด + tools กลับ​ไป​ใหม่ token จึง​พอก​ขึ้น​ทุกรอบ งบ​ต้นทุน/เวลา​จึง​เป็น​เงื่อนไข​หยุด​วงจร​อย่าง​หนึ่งProcess จึง โต​ขึ้น​ทุก​เทิร์น Anthropic ยอมรับ trade-off นี้ตรงๆ ว่า “Agentic systems often trade latency and cost for better task performance.” งบ token หรือ​จำนวน​เงิน​ต่อ​คำขอ จึง​เป็น​เงื่อนไข​หยุด​ใน​ตัว​มัน​เอง

เช็ก list ทางออก​ที่​ควร​พก: (a) ได้​คำ​ตอบ​สุดท้าย ไม่มี tool call → หยุด; (b) ชน​เพดาน​รอบ → หยุด; (c) tool ต้อง​ขอ​อนุมัติ → พัก; (d) เกิน​งบ → หยุด สี่​ข้อ​นี้​คือ​สิ่ง​ที่​แยก “agent ที่​คุม​ได้” ออก​จาก “loop ที่​หลุด​มือ”

คำถาม​ที่​มัก​โผล่​มา​ตรง​นี้​คือ “แล้ว​นี่​มัน workflow หรือ agent” Anthropic ลาก​เส้น​ไว้​ชัด: “Workflows are systems where LLMs and tools are orchestrated through predefined code paths. Agents… are systems where LLMs dynamically direct their own processes and tool usage.” — ต่าง​กัน​ที่ ใคร​เป็น​คน​กำหนด​ลำดับ​ก้าว ถ้า​คุณ​เขียน code ตายตัว​ว่า “เรียก getOrder ก่อน แล้ว getDeliveryStatus แล้ว​ค่อย issueRefund” นั่น​คือ workflow แต่​ใน code ข้าง​บน model เป็น​คน​เลือก​เอง​ว่า​จะ​เรียก tool ไหน เมื่อไร ตาม​ผล​ที่​มัน​สังเกต​ได้ — agents “dynamically direct their own processes and tool usage” — นั่น​ทำให้​มัน​เป็น agent

พอ​แค่​นี้​ก่อน เส้น​แบ่ง​นี้​ลึก​กว่า​ที่​เห็น และ​คำถาม​ที่​ตาม​มา — เมื่อไร​ควร​เป็น agent เต็ม​ตัว เมื่อไร​พอ​แค่ workflow และ​ขอบเขต​ของ agent ควร​อยู่​ตรง​ไหน — เป็น​คำถาม​เรื่อง ขอบเขต ที่​คอร์ส #12 (agent-as-bounded-context) เจาะ​เต็มๆ บท​นี้​จบ​ที่​กลไก: คุณ​สร้าง loop ที่ ง่าย​ที่สุด​เท่า​ที่​ควร ได้​แล้ว — 1 agent 1 loop ตาม​ที่​บท​ที่ 1 ปัก​ธง​ไว้ ส่วน​คำถาม​ว่า​เมื่อไร​มัน​ควร​กลาย​เป็น1 bounded context และ​เมื่อไร (ซึ่ง​น้อย​ครั้ง) ควร​มี agent ตัว​ที่​สอง ยก​ไป​ให้​คอร์ส​ถัด​ไป

บท​หน้า​เรา​จะ​ทำให้ loop นี้ เชื่อถือ​ได้ — จัดการ error ของ tool คุม​ต้นทุน และ​วาง guardrail รอบๆ ธรรมชาติ​ที่​ไม่ deterministic ของ​มัน


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​สังเคราะห์​จาก​สอง​แหล่ง​หลัก อ่าน​ต่อ​ได้ที่​ต้นทาง​โดยตรง:

  • Anthropic, “Building Effective Agents” (2024-12-19) — นิยาม agent ว่า​คือ LLM ใช้ tools ตาม feedback วน​เป็น loop, building block ที่​เป็น augmented LLM (tools + memory), จังหวะ observe ที่​ต้อง​ได้ ground truth จาก​สภาพ​แวดล้อม, เส้น​แบ่ง workflow vs agent, เงื่อนไข​หยุด (เพดาน​รอบ + human checkpoint) และ trade-off ด้าน latency/cost
  • Anthropic, Tool use — handle tool calls — รอบ tool_usetool_result ที่​เอา​มา​วน: API ไม่มี state ต้อง​ส่ง messages + tools ทั้ง​ก้อน​ซ้ำ​ทุกรอบ, tool_result มา​ก่อน​ใน content, และ tool_use_id ต้อง​ตรง​กับ id ของ tool_use เข้าถึง 2026-07-19

เช็กความเข้าใจ — บทที่ 6

ข้อ 1 / 3

ในวง observe → decide → act → repeat จังหวะ 'observe' หมายถึงอะไร?