AI Agent คืออะไร: 5 ประเภทคลาสสิก กับ 2 นิยามคู่แข่ง
โลกหุ่นดูดฝุ่นถูกทำให้พัง 4 ครั้ง จนได้ agent คลาสสิก 5 แบบ และ tool เดียวทำให้ call 39 token กลายเป็น 420
ในหน้านี้
นี่คือคำถามเดียวกัน ถามกับ model เดียวกันสองครั้ง ด้วย weights เดียวกันและ greedy decoding เหมือนกัน ความต่างอย่างเดียวคือครั้งที่สองมี tool หนึ่งรายการอยู่ในแคตตาล็อก
no tools in the catalogue
turn 1 prompt= 39 out= 8 finish=stop TEXT "The capital of France is Paris."
=> model calls=1 prompt tokens=39 output=8 wall=974 ms
one tool in the catalogue: get_temperature(city)
turn 1 prompt= 185 out= 20 finish=tool_calls CALL get_temperature({"city": "Paris"})
tool get_temperature -> {"city":"Paris","celsius":11}
turn 2 prompt= 235 out= 18 finish=stop TEXT "The capital of France is Paris. It is
currently at 11 degrees Celsius."
=> model calls=2 prompt tokens=420 output=38 wall=6,685 msหนึ่ง call กลายเป็นสอง input token 39 กลายเป็น 420 เพิ่มขึ้น 10.8 เท่า จากไม่ถึงหนึ่งวินาทีกลายเป็นเกือบเจ็ดวินาที และคำตอบยังได้ข้อเท็จจริงที่ไม่มีใครถามมาเพิ่ม จาก tool ที่ model เลือก call เอง ทั้งที่คำถามไม่เคยพูดถึงสภาพอากาศ
ระบบที่สองคือสิ่งที่คนส่วนใหญ่ในอุตสาหกรรมปี 2026 เรียกว่า agent หรืออาจไม่ใช่ก็ได้ ขึ้นกับว่าคุณเปิดอ่านนิยามใดในสองนิยามที่ถูกอ่านมากที่สุด — และสองนิยามนั้นไม่ได้พูดเหมือนกัน นิยามหนึ่งยังไม่เห็นพ้องกับตัวเองด้วยซ้ำ
ความไม่ลงรอยนี้คือบทนี้ มันไม่ใช่การทะเลาะเรื่องคำศัพท์: สองนิยามขีดเส้นแบ่งบนแกนคนละแกน และแกนที่คุณเลือกจะตัดสินว่าคุณสร้างอะไร และถูกคิดเงินค่าอะไร ทั้งสองตั้งอยู่บนอนุกรมวิธานเก่ากว่า และวิธีที่ถูกที่สุดในการเข้าใจมันคือสร้าง agent ที่แย่ที่สุดในโลก
แสดงรายละเอียด
สิ่งที่บทนี้ต้องใช้จากบทก่อนหน้า
- บทที่ 13 วัดว่า call เดียวมีต้นทุนด้านเวลาเท่าไร บทนี้คูณค่านั้นด้วยจำนวน turn
- บทที่ 15: prompt คือสถานะทั้งหมดของ model เพราะไม่มีอะไรคงอยู่หลัง call
- บทที่ 16: input token เติบโตตามกำลังสองของบทสนทนา
- บทที่ 18: แคตตาล็อก tool และ round trip ที่ model ร้องขอแล้ว code ของคุณเป็นผู้ execute
ไม่มี tensor ในบทนี้ บทนี้เป็น TypeScript ตามกฎเรื่องภาษาของ บทที่ 14 และ loop ของมันคือบรรพบุรุษโดยตรงของ loop ใน บทที่ 23
หุ่นยนต์กับสองห้อง
ลิงก์ไปยังส่วน: หุ่นยนต์กับสองห้องตัวอย่างที่เก่าแก่ที่สุดในสาขานี้คือเครื่องดูดฝุ่นในโลกที่มีช่องสี่เหลี่ยมสองช่อง A และ B ซึ่งแต่ละช่องอาจสะอาดหรือสกปรกก็ได้1 มันยังอยู่ในตำราทุกเล่ม เพราะนี่คือโลกที่เล็กที่สุดที่ agent สามารถทำถูกหรือผิดได้
percept เป็นคู่ — ฉันอยู่ที่ไหน และตรงนี้สกปรกหรือไม่ — และ actions คือ SUCK, LEFT และ RIGHT โปรแกรมทั้งหมดมีเพียงบรรทัดเดียว
type Percept = { dirty: boolean; where?: "A" | "B" };
type Action = "SUCK" | "LEFT" | "RIGHT";
const textbook = (p: Percept): Action =>
p.dirty ? "SUCK" : p.where === "A" ? "RIGHT" : "LEFT"; ลองรันมันกับทุก configuration เริ่มต้นของโลกสองช่อง:
A dirty, B dirty, start A -> steps=3 clean=true
A clean, B dirty, start A -> steps=2 clean=true
A dirty, B clean, start B -> steps=2 clean=trueนี่คือ simple reflex agent: มันลงมือตาม percept ปัจจุบันเท่านั้น โดยไม่มีความจำของสิ่งใดก่อนหน้านั้น นี่ไม่ใช่หมวดหมู่ของเล่น — เทอร์โมสตัทก็เป็นแบบนี้ และ call เดียวไปยัง language model โดยไม่มีบทสนทนาพ่วงมาด้วยก็เช่นกัน
ตอนนี้ทำให้มันพังในแบบที่โลกจริงทำ หุ่นดูดฝุ่นจริงมีเซ็นเซอร์ฝุ่นและกันชน ไม่ได้มีช่องที่ติดป้าย A อยู่ใต้พรม เอาตำแหน่งออกจาก percept แล้วไม่เปลี่ยนอย่างอื่น:
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");A dirty, B dirty, start A -> steps=3 clean=true still dirty=0
t=0 at=A percept={dirty:true} -> SUCK
t=1 at=A percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:true} -> SUCK
A dirty, B clean, start B -> steps=500 clean=false still dirty=1
t=0 at=B percept={dirty:false} -> RIGHT
t=1 at=B percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:false} -> RIGHT
t=3 at=B percept={dirty:false} -> RIGHTโปรแกรมเดิม สองช่อง จากสถานะเริ่มต้นหนึ่งมันจบในสาม step; จากอีกสถานะหนึ่งมันวิ่งชนกำแพงด้านขวา 500 ครั้ง และคงวิ่งต่อไปจนแบตหมด มันรับรู้ความต่างระหว่างสองสถานการณ์ไม่ได้ จึงทำ action ต่างกันไม่ได้ Russell และ Norvig สรุปผลทั่วไปไว้ในบรรทัดเดียว: infinite loop มักหลีกเลี่ยงไม่ได้สำหรับ simple reflex agent ใน environment ที่สังเกตเห็นได้เพียงบางส่วน1
มีทางแก้ที่เสียเพียงบรรทัดเดียวและไม่ต้องใช้ memory ควรวัดมันก่อนที่เราจะหยิบอะไรที่ฉลาดกว่านั้นมาใช้
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);
const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT"); รัน 2,000 ครั้งบนทางเดินที่สกปรกทั้งหมดในสามขนาด ใช้ตัวสร้างแบบ seeded ตัวเดียวตลอด:
| rooms | mean steps | median | worst of 2,000 | never finished |
|---|---|---|---|---|
| 2 | 4.0 | 4 | 13 | 0 |
| 4 | 16.6 | 14 | 81 | 0 |
| 8 | 68.7 | 52 | 306 | 0 |
Randomisation ลบ loop ออกไปได้ทั้งหมด แต่มันก็มีต้นทุน: ห้อง 8 ห้องต้องใช้ 15 moves ถ้าคุณรู้ว่ากำลังทำอะไรอยู่ แต่ agent นี้เฉลี่ย 68.7 และครั้งหนึ่งใช้ถึง 306 นี่คือทั้งบทในภาพย่อ ความสามารถทุกอย่างที่เราเพิ่มเข้ามาซื้อความถูกต้องในกรณีที่ agent ก่อนหน้ารับมือไม่ได้ และคิดราคาเป็นสกุลเงินที่คุณต้องตั้งชื่อให้ได้ก่อน
ตั้งชื่อชิ้นส่วน เมื่อจำเป็นต้องใช้แล้ว
ลิงก์ไปยังส่วน: ตั้งชื่อชิ้นส่วน เมื่อจำเป็นต้องใช้แล้วagent รับรู้ environment ผ่าน sensors และลงมือผ่าน actuators agent program คือฟังก์ชันจาก percepts ไปยัง actions — listing ทุกอันด้านบนคือสิ่งนั้น percept sequence คือทุกอย่างที่รับรู้มาจนถึงตอนนี้ และ simple reflex agent จะละเลยทั้งหมด ยกเว้นรายการล่าสุด
Rationality คือคำที่บทความส่วนใหญ่อธิบายผิด และเมื่อเข้าใจให้ถูก ส่วนที่เหลือของบทนี้จะใช้งานได้ agent ไม่ได้ rational หรือ irrational ในตัวเอง Russell และ Norvig นิยาม rational agent ว่าเป็น agent ที่สำหรับ percept sequence ที่เป็นไปได้แต่ละชุด เลือก action ที่คาดว่าจะ maximize performance measure ของมัน โดยอิงหลักฐานจาก sequence นั้นและความรู้ที่มีติดตัวมา1 performance measure ไม่ได้อยู่ข้างใน agent: มันเป็นของผู้ออกแบบ และ rationality ถูกนิยามได้เฉพาะเมื่อเทียบกับสิ่งนั้น
สเปกมักเขียนเป็นสี่อย่าง เรียกว่า PEAS: performance measure, environment, actuators, sensors
| หุ่นดูดฝุ่น | support agent ใน production | |
|---|---|---|
| Performance measure | ช่องสะอาด ต่อหน่วยแบตเตอรี่ | ticket ที่แก้ได้ ต่อดอลลาร์ โดยไม่ escalation |
| Environment | พื้น ฝุ่น เฟอร์นิเจอร์ พรม | คิว ticket, database ของคุณ, ลูกค้า |
| Actuators | ล้อ แรงดูด | tool calls |
| Sensors | เซ็นเซอร์ฝุ่น กันชน | ข้อความของผู้ใช้, ผลลัพธ์จาก tool |
สังเกตว่าแถวไหนแปลกกว่าเพื่อน ทีมแทบทั้งหมดที่สร้าง agents ในปี 2026 เขียน E, A และ S ลงไป — tool schemas, integrations, รูปแบบข้อความ — เพราะ code จะรันไม่ได้ถ้าไม่มีสิ่งเหล่านี้ แทบไม่มีใครเขียน P หากไม่มีมัน ประโยคว่า "agent ของเราทำงานได้ดี" ก็ไม่มีความหมายที่ใครตรวจสอบได้ และคำว่า "rational" ก็ใช้กับระบบนั้นไม่ได้เลย ใช้ได้แค่กับเดโม บทที่ 29 ว่าด้วยการเปลี่ยน P ให้เป็นตัวเลข และนี่คือเหตุผลที่บทนั้นมีอยู่
┌───────────────────────── the environment ─────────────────────────┐
│ │
│ ┌──────────────────────── the agent ─────────────────────┐ │
│ │ │ │
───┼──►│ sensors ──► the agent program ──► actuators ─────┼──────┼──►
percept │ │ action
│ └────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────────┘
▲
the performance measure lives out here, in the head of
whoever built the thing, and the agent cannot change itTask environments ยังถูกจัดหมวดตามแกนเจ็ดแกน โดยห้าแกนในนั้นกำหนดความยากส่วนใหญ่ตรงนี้: observable เต็มที่หรือบางส่วน, deterministic หรือไม่, episodic หรือ sequential, static หรือ dynamic, known หรือ unknown1 agent ที่คุยกับ tool จริงผ่าน network จริง อยู่ในมุมยากของทั้งห้า — non-deterministic แม้ที่ temperature zero (บทที่ 17) และข้อที่ถูกประเมินต่ำไปคือ unknown เพราะคุณไม่มี model ที่เชื่อถือได้ว่า tool ของคุณเองทำอะไรกับโลก นั่นคือเหตุผลที่ loop ในบทที่ 23 ต้องการ error handling มากกว่า planning
เพิ่ม memory แล้วเจอกำแพงถัดไป
ลิงก์ไปยังส่วน: เพิ่ม memory แล้วเจอกำแพงถัดไปพื้นจริงไม่ได้เป็นมิติเดียว ดังนั้นยกระดับโลกเป็นแผนผัง เครื่องหมาย hash คือกำแพง ดอกจันคือฝุ่น และหุ่นยนต์เริ่มในห้องตรงกลาง:
col 0 1 2 3 4 5 6
row 0 * . . # . . *
row 1 . # . # . # .
row 2 . # . S . # . S = the robot starts here
row 3 . # . # . # .
row 4 * . . # . . *การอัปเกรดที่ชัดเจนคือ memory agent เก็บแผนที่: ทุกช่องที่มันเคยยืน และทุกช่องที่กันชนทำงาน กฎของมันคือเดินเข้าไปในช่องติดกันที่ยังไม่เคยไป — ขวา แล้วลง แล้วซ้าย แล้วขึ้น — และถอยออกเมื่อทุกอย่างรอบตัวเป็นที่รู้แล้ว นี่คือ model-based reflex agent: มันรักษาสถานะภายในจากประวัติ percept จึงสามารถลงมือตามสิ่งที่ตอนนี้มองไม่เห็นได้
มันดีขึ้นจริง และยังไม่พอ:
5,000 steps allowed -> steps=5,000 distinct squares visited=13/25 still dirty=2/45,000 moves ยังไม่เคยเห็นพื้นครึ่งหนึ่ง แผนที่ถูกต้องและกฎก็ถูกต้อง สิ่งที่ agent ทำไม่ได้คือใช้แผนที่เพื่อไปสักที่: กฎของมันตอบได้แค่ว่า "ฉันควรก้าวไปยังเพื่อนบ้านสี่ช่องช่องไหน" ดังนั้นเมื่อไม่มีช่องที่ยังไม่เคยไปติดกับมันแล้ว มันไม่มีวิธีแสดงความคิดว่า มีช่องที่ยังไม่เคยไปอยู่ห่างออกไปแปด moves และฉันอยากไปยืนตรงนั้น มันรู้ว่าตัวเองอยู่ที่ไหน แต่มันไม่รู้ว่าอยากไปอยู่ที่ไหน
goal แล้วตามด้วยเหตุผลที่จะชอบเส้นทางหนึ่งมากกว่าอีกเส้นทาง
ลิงก์ไปยังส่วน: goal แล้วตามด้วยเหตุผลที่จะชอบเส้นทางหนึ่งมากกว่าอีกเส้นทางgoal-based agent มีคำอธิบายสถานการณ์ที่อยากทำให้เกิดขึ้นวางทับบน model ของโลก และเลือก actions ด้วยการค้นหา sequence ของ actions จนกว่าจะพบ sequence ที่จบตรงนั้น goals เปลี่ยนการเลือก action จาก lookup เป็น search
goal คือ "ไม่มีช่องสกปรกเหลืออยู่" search คือ breadth-first walk ไปยังช่องสกปรกที่ใกล้ที่สุด และ path ที่มันคืนมาคือ plan
goal-based (fewest moves) -> moves=27 battery=52 still dirty=0
from 2,3 -> 4,6 via 5 moves: 2,3 2,4 3,4 4,4 4,5 4,6
from 4,6 -> 0,6 via 4 moves: 4,6 3,6 2,6 1,6 0,6
from 0,6 -> 4,0 via 10 moves: 0,6 0,5 0,4 1,4 2,4 2,3 2,2 3,2 4,2 4,1 4,0
from 4,0 -> 0,0 via 4 moves: 4,0 3,0 2,0 1,0 0,0ยี่สิบเจ็ด moves พื้นสะอาด แต่ดูคอลัมน์แบตเตอรี่และช่วงสุดท้ายของ plan คอลัมน์ 0 ปูพรม: การข้ามช่องปูพรมใช้แบตเตอรี่ 6 หน่วย ช่องกระเบื้องใช้ 1 หน่วย agent กลับบ้านขึ้นคอลัมน์ 0 เพราะนั่นคือ 4 moves แทนที่จะเป็น 8 และ 4 moves บนพรมเหล่านั้นใช้ 24 หน่วย ในขณะที่ทางอ้อม 8 moves จะใช้ 13
มันทำอย่างอื่นไม่ได้ goal เป็นการทดสอบแบบ binary: พื้นสะอาดหรือไม่สะอาด ทุก plan ที่จบด้วยพื้นสะอาดตอบโจทย์เท่ากัน ดังนั้นเมื่อมีหลาย plan ที่สำเร็จ agent ไม่มีอะไรให้ใช้เลือก การชอบความสำเร็จหนึ่งมากกว่าอีกความสำเร็จต้องใช้ตัวเลขเหนือ outcomes และตัวเลขนั้นคือ utility function agent ที่ maximize มันคือ utility-based agent
การเปลี่ยนใน code คือ term เดียวใน search Breadth-first search นับ moves; ทำให้มันนับ cost แทน แล้วคุณก็ได้ Dijkstra's algorithm และ agent คนละตัว:
const nd = dist.get(k)! + (byCost ? cell.cost : 1); // <- the entire differencegoal-based (fewest moves) -> moves=27 battery=52 still dirty=0
utility-based (cheapest route) -> moves=31 battery=41 still dirty=0
from 4,0 -> 0,0 via 8 moves: 4,0 4,1 4,2 3,2 2,2 1,2 0,2 0,1 0,0เพิ่ม 4 moves แต่ใช้แบตเตอรี่น้อยลง 11 หน่วย: ถูกลง 21 เปอร์เซ็นต์ goal เดิม แผนที่เดิม code เดิมยกเว้น term เดียว agent สองตัวต่างกันเพียงสิ่งที่มันพยายามทำให้ดี และมันเลือกเส้นทางกลับบ้านต่างกัน
นี่เป็นจุดแรกด้วยที่ agent ต้องการบางอย่างที่มันผลิตเองไม่ได้ ต้องมีใครสักคนตัดสินว่าหน่วยแบตเตอรี่หนึ่งหน่วยมีค่าเท่าไรเมื่อเทียบกับ move หนึ่งครั้ง Utility คือ performance measure ที่เขียนในรูปแบบที่ agent คำนวณด้วยได้ และการเขียนมันคือหน้าที่ของผู้ออกแบบ เมื่อคนพูดว่า agent "optimized ผิดสิ่ง" แทบไม่เคยหมายถึง bug พวกเขาหมายถึงบรรทัดนี้ถูกเขียนอย่างไม่ระวัง
ประเภทที่ห้า และวิธีที่มันผิดพลาด
ลิงก์ไปยังส่วน: ประเภทที่ห้า และวิธีที่มันผิดพลาดตอนนี้ให้ฝุ่นกลับมา ห้องสี่ห้องสกปรกขึ้นใหม่ด้วยอัตราต่างกันสี่ค่า และ agent ไม่เคยถูกบอกค่าเหล่านั้น มันไปเยี่ยมได้หนึ่งห้องต่อ tick และเห็นเฉพาะห้องนั้น performance measure คือ room-ticks ที่ใช้ไปในสภาพสกปรกตลอด 4,000 ticks — ยิ่งต่ำยิ่งดี
learning agent ตามการแยกส่วนในตำรา คือแบบใดแบบหนึ่งข้างต้นบวกอีกสามส่วน: learning element ที่เปลี่ยน agent, critic ที่บอกว่า agent ทำได้ดีแค่ไหนเทียบกับ performance standard คงที่ และ problem generator ที่เสนอ actions ที่น่าลองเพราะสิ่งที่มันจะสอน1 สาม policy ใน environment เดียวกัน ตัวแรกไม่เรียนรู้; ตัวที่สองและสามเรียนรู้สิ่งเดียวกันแต่ใช้ต่างกัน
| policy | dirty-room-ticks over 4,000 | versus the patrol |
|---|---|---|
| fixed round-robin patrol, no learning | 2,290 | — |
| learner A: estimate each room's dirt rate, then go where dirt is likeliest | 11,820 | 5.2× worse |
| learner B: same estimates, weighted by how long since the last visit | 1,576 | 31 % better |
อัตราที่ซ่อนอยู่คือ 0.35 สำหรับครัว, 0.05 สำหรับโถง, 0.02 สำหรับห้องทำงาน และ 0.01 สำหรับห้องใต้หลังคา — และ learner A หาเจอ มันระบุได้ถูกต้องว่าครัวเป็นห้องที่สกปรกที่สุดในบ้าน จากนั้นก็ไปครัวทุก tick ตลอดส่วนที่เหลือของ simulation ขณะที่อีกสามห้องสกปรกค้างอยู่ตลอดไป มันแย่กว่าการไม่เรียนรู้เลยห้าเท่า และมันไม่ได้เสีย
บทเรียนคือบทของ utility learner A maximize "ความน่าจะเป็นที่ห้องที่ฉันกำลังจะไปเยี่ยมสกปรก" performance measure คือ "room-ticks ที่ใช้ไปในสภาพสกปรก" ตัวเลขคนละตัว; ตัวที่สองคือสิ่งที่ critic ให้คะแนน และไม่มีใครบอก agent learner B คูณอัตราที่เรียนรู้มาเดียวกันด้วยเวลานับตั้งแต่การเยี่ยมครั้งล่าสุด — ฝุ่นที่มันคาดว่าจะพบ ไม่ใช่โอกาสที่จะพบฝุ่นใด ๆ — และชนะ patrol ที่มันเริ่มต้นมา
รายละเอียด implementation หนึ่งอย่างตัดสินผลลัพธ์ ใน learner B เวอร์ชันแรก ห้องที่ไม่พบฝุ่นเลยในสามครั้งได้ rate เท่ากับศูนย์เป๊ะ — และศูนย์คูณอะไรก็เป็นศูนย์ ดังนั้นมันจึงไม่เคยถูกเยี่ยมอีก และ estimate ก็ไม่มีวันถูกแก้ การ smooth เศษส่วน successes บวกหนึ่ง หารด้วย trials บวกสอง เปลี่ยน 11,895 เป็น 1,576 "ยังไม่เคย observe" กับ "วัดแล้วออกมาเป็นศูนย์" เป็นคำกล่าวคนละแบบ และระบบที่เก็บสองอย่างนี้ไว้ใน field เดียวกันจะตัดสินใจในแบบที่ย้อนกลับไม่ได้
ห้าประเภท และสิ่งที่มันเป็นในปี 2026
ลิงก์ไปยังส่วน: ห้าประเภท และสิ่งที่มันเป็นในปี 2026 1 simple reflex percept ────────────────────────────────► rules ────► action
2 model-based percept ──► [state] ──────────────────► rules ────► action
3 goal-based percept ──► [state] ──► [goal] ──────► search ───► action
4 utility-based percept ──► [state] ──► [goal] ──► [U] ──► argmax ► action
5 learning all of the above, plus [critic] ──► changes the parts aboveทั้งห้าประเภทอยู่ใน production วันนี้ภายใต้ชื่ออื่น
| classic type | what it carries between percepts | its 2026 shape | what it cannot do |
|---|---|---|---|
| simple reflex | ไม่มีอะไร | model call หนึ่งครั้งที่ไม่มี history: classifier, extraction endpoint, single-turn completion | อะไรก็ตามที่ขึ้นกับ turn ก่อนหน้า |
| model-based reflex | สถานะภายในที่สร้างจากประวัติ percept | chat: transcript ที่ถูกส่งซ้ำทั้งหมดในทุก call | เลือกว่าบทสนทนาควรไปจบที่ไหน |
| goal-based | state บวกคำอธิบายสถานการณ์ที่ต้องการ | reason-and-act loop ที่มี stopping condition2 | ชอบ plan ที่สำเร็จหนึ่งมากกว่าอีก plan ที่สำเร็จ |
| utility-based | state, goal และตัวเลขเหนือ outcomes | evaluator–optimiser loops และการ rank candidate answers ตามเกณฑ์ที่เขียนไว้ (บทที่ 25) | คิดค้นเกณฑ์เอง |
| learning | ทั้งหมดนั้น บวก critic และ problem generator | Reflexion ซึ่งเขียนบทเรียนของตัวเองลงใน episodic buffer แทนการ update weights;3 persistent user memory (บทที่ 24) | เลือกมาตรฐานที่ critic ให้คะแนนเทียบกับมัน |
สองแถวใกล้กันยิ่งกว่าการเปรียบเทียบ และมันมีต้นทุนเป็นเงิน
chat คือ model-based reflex agent ที่ model ของมันไม่ได้อยู่ภายใน ในตำรา state เป็นตัวแปรภายใน agent program ใน chat มันคือ transcript: มันอยู่ฝั่งคุณ ถูกส่งซ้ำทั้งชุดในทุก call และถูกสร้างใหม่จากศูนย์ภายใน model ทุกครั้ง นั่นคือบิลกำลังสองจากบทที่ 16 และมันคือ object เดียวกับที่ตำราวาดเป็นกล่องติดป้าย "state" นี่คือความต่าง วัดจากคำถาม follow-up หนึ่งคำถาม โดยมีและไม่มีสองข้อความก่อนหน้า:
with the transcript prompt=67 "The current temperature in Lisbon, Portugal is 15°C."
without the transcript prompt=29 "Lisbon is the capital of Portugal, not a city in Portugal."model เดียวกัน user input สามคำเหมือนกัน และอันที่สองคือหุ่นทางเดินที่วิ่งชนกำแพง ไม่มี tools ในการรันนั้น ดังนั้นเลข 15 จึงถูกแต่งขึ้น — แต่ state คือสิ่งที่ทำให้ follow-up มีความหมาย คุณสร้างมันใหม่ทุกครั้งและจ่าย input token 2.3× เพื่อมันบนบทสนทนาสอง turn บทที่ 16 วัดแล้วว่า multiplier นั้นไปถึงเท่าไรเมื่อถึง turn ที่สี่สิบ
Reflexion คือ learning agent ที่เปลี่ยน input ของมันแทนที่จะเปลี่ยน program ในการแยกส่วนของตำรา learning element แก้ไข performance element Reflexion ปล่อย weights ไว้เหมือนเดิมและเขียนข้อความสะท้อนคิดลงใน episodic buffer ที่ความพยายามถัดไปจะอ่าน3 learning element คือ prompt, memory คือแถวใน database, performance element คือ model แช่แข็ง — และ diagram ก็คือของตำรา ไม่เปลี่ยน
และนี่คือขีดจำกัดที่ตรงไปตรงมาของการจับคู่ ห้าประเภทจัดหมวด agent program ในปี 2026 program นั้นถูกผ่ากลาง: บางส่วนเป็น code ของคุณ บางส่วนอยู่ใน weights ที่คุณไม่ได้ train เมื่อ model ตัดสินใจเองว่าจะ call tool goal test อยู่ใน program ของคุณหรืออยู่ใน model? อนุกรมวิธานไม่มีคำตอบ เพราะตอนมันถูกเขียน ไม่มีที่อื่นให้มันอยู่ — และคำถามนั้นคือจุดที่สองนิยามสมัยใหม่แยกทางกันพอดี
ตอบ, call และหยุด ใน trace เดียว
ลิงก์ไปยังส่วน: ตอบ, call และหยุด ใน trace เดียวนิยามทั้งหลายคือข้อถกเถียงเรื่องพฤติกรรม และตัดสินได้ง่ายกว่ามากเมื่อมี trace อยู่ตรงหน้า
loop ด้านล่างส่งบทสนทนาไปยัง model; ถ้าคำตอบมี tool call ก็ execute tool, append ผลลัพธ์ แล้วส่งทั้งหมดอีกครั้ง มันรันกับ Qwen2.5-0.5B-Instruct แบบ local หลัง endpoint รูปทรง OpenAI บนเครื่องนี้ — seam จากบทที่ 14 ดังนั้น loop ไม่รู้และไม่สนใจว่าอะไรอยู่หลัง port
const BASE = process.env.LLM_BASE_URL ?? "http://127.0.0.1:8799/v1";
async function loop(question: string, maxTurns = 6) {
const messages: Msg[] = [
{ role: "system", content: SYSTEM },
{ role: "user", content: question },
];
for (let turn = 1; turn <= maxTurns; turn++) {
const reply = await call(messages, TOOLS);
const calls = reply.choices[0].message.tool_calls ?? [];
messages.push(reply.choices[0].message);
if (!calls.length) return messages;
for (const c of calls) {
const out = runTool(c.function.name, JSON.parse(c.function.arguments));
messages.push({ role: "tool", name: c.function.name, content: out });
}
}
throw new Error("turn cap reached");
}สองบรรทัดแบกแนวคิดทั้งหมด และทั้งสองถูกทำเครื่องหมายไว้; ที่เหลือเป็น bookkeeping พฤติกรรมทั้งสามมองเห็นได้ในการรันเดียว เมื่อถามสิ่งที่มันทำเองได้ model ตอบ เมื่อถามสิ่งที่มันทำเองไม่ได้ มัน call:
=== a question the model cannot answer, one tool available
turn 1 prompt= 187 out= 21 finish=tool_calls CALL get_temperature({"city": "Oslo"})
tool get_temperature -> {"city":"Oslo","celsius":4}
turn 2 prompt= 238 out= 12 finish=stop TEXT "The current temperature in Oslo is 4
degrees Celsius."
=> model calls=2 prompt tokens=425 output=33 wall=6,257 ms
=> stopped by: the model produced text instead of a callและมัน หยุด — พฤติกรรมที่สาม และเป็นพฤติกรรมที่พลาดง่ายที่สุด เพราะดูเหมือนไม่มีอะไรเกิดขึ้น loop จบเพราะ turn 2 กลับมาโดยไม่มี tool call ไม่มีใครตัดสินใจเรื่องนั้น; model ตัดสินใจ โดย emit prose termination condition ของ program นี้คือสัญญาณของการไม่มีอยู่
อีกสองการรันคุ้มพื้นที่ เมื่อถูกขอให้เปรียบเทียบสองเมือง model ออก ทั้งสอง tool calls ใน turn เดียว ได้ค่าทั้งสองกลับมา แล้วเปรียบเทียบผิด:
turn 1 prompt= 188 out= 43 finish=tool_calls CALL get_temperature({"city": "Oslo"}),
get_temperature({"city": "Lisbon"})
tool get_temperature -> {"city":"Oslo","celsius":4}
tool get_temperature -> {"city":"Lisbon","celsius":19}
turn 2 prompt= 284 out= 13 finish=stop TEXT "Oslo is currently warmer than Lisbon
at 4°C."tools ทำงาน parallel call ทำงาน loop ทำงาน คำตอบเป็นเท็จ โดยมีตัวเลขที่ถูกต้องทั้งสองค่านั่งอยู่ใน transcript การห่อ model ด้วย loop ไม่ได้ทำให้มัน reason; มันให้ความสามารถแก่ model ที่ผิดในการลงมือตามความผิดนั้น — ซึ่งคือ บทที่ 30 ล่วงหน้า และครึ่งหนึ่งของบทที่ 29
ตอนนี้ลบ return ที่ทำเครื่องหมายไว้ แล้วปล่อยให้ loop รันจนถึง cap แทน คำถามเดิม model เดิม:
turn 1 prompt= 187 out= 21 CALL get_temperature({"city": "Oslo"})
turn 2 prompt= 238 out= 12 TEXT "The current temperature in Oslo is 4 degrees Celsius."
turn 3 prompt= 261 out= 30 TEXT "Could you please specify the exact location you're..."
turn 4 prompt= 302 out= 14 TEXT "Sure! Could you tell me which city you're interested in?"
turn 5 prompt= 327 out= 35 TEXT "I'm sorry, but I need more details to provide an..."
turn 6 prompt= 373 out= 12 TEXT "Which city would you like to know the temperature for?"
=> model calls=6 prompt tokens=1,688 output=124 wall=25,261 ms stopped by: turn capinput token สี่เท่า wall clock สี่เท่า และตอนจบที่ agent ลืมไปแล้วว่าถูกถามอะไร และกำลังซักผู้ใช้เกี่ยวกับคำถามที่พวกเขาตอบไปแล้วใน turn แรก คำตอบที่ถูกต้องอยู่บนหน้าจอตั้งแต่ turn 2 และทุก turn หลังจากนั้นทำให้ transcript แย่ลง
ดังนั้น agent ไม่ใช่ loop มันคือ loop บวกกฎสำหรับออกจากมัน และอันนี้มีกฎแบบนั้นอยู่หนึ่งข้อพอดี บทที่ 23 หาได้ห้าข้อ และแสดงว่าอะไรพังเมื่อแต่ละข้อหายไป
สองนิยาม วางข้างกัน
ลิงก์ไปยังส่วน: สองนิยาม วางข้างกันขอยกคำพูดแทนการ paraphrase เพราะ paraphrase คือที่ที่ความสับสนถูกผลิตขึ้น
นิยามที่หนึ่งวางเส้นแบ่งไว้ที่ใครควบคุม flow Building effective agents ของ Anthropic ตั้งชื่อความกำกวมและตัดสินมัน:
"ที่ Anthropic เราจัดหมวดความแปรผันทั้งหมดนี้เป็น agentic systems แต่ขีดเส้นแบ่งเชิงสถาปัตยกรรมที่สำคัญระหว่าง workflows กับ agents: Workflows คือระบบที่ LLMs และ tools ถูก orchestrate ผ่านเส้นทาง code ที่กำหนดไว้ล่วงหน้า ส่วน agents คือระบบที่ LLMs กำกับกระบวนการและการใช้ tool ของตัวเองแบบ dynamic โดยยังคงควบคุมวิธีที่พวกมันทำงานให้สำเร็จ"4
การทดสอบคือคำถามเกี่ยวกับ source code ของคุณ: ใครเลือก step ถัดไป? switch ใน program ของคุณ: workflow. model: agent. เอกสารเดียวกันบอกว่า agents "โดยทั่วไปก็แค่ LLMs ที่ใช้ tools ตาม environmental feedback ใน loop" — ซึ่งตรงกับ listing ด้านบนพอดี
นิยามที่สองวางเส้นแบ่งไว้ที่ความเป็นอิสระจากผู้ใช้ A practical guide to building agents ของ OpenAI เปิดหน้าคำนิยามแบบนี้:
"ในขณะที่ซอฟต์แวร์ทั่วไปช่วยให้ผู้ใช้ทำให้ workflows คล่องตัวและ automate ได้ agents สามารถทำ workflows เดียวกันในนามของผู้ใช้ด้วยระดับความเป็นอิสระสูง Agents คือระบบที่ทำงานให้สำเร็จอย่างเป็นอิสระในนามของคุณ"5
อีกสองประโยคถัดมา บนหน้าเดียวกัน มันยกเว้นว่า:
"Applications ที่ integrate LLMs แต่ไม่ใช้มันเพื่อควบคุม workflow execution — เช่น simple chatbots, single-turn LLMs หรือ sentiment classifiers — ไม่ใช่ agents"5
อ่าน quotation เหล่านั้นตามลำดับ ประโยคเปิดขีดเส้นที่ independence: สิ่งนี้ออกไปทำงานให้เสร็จโดยไม่มีฉันหรือไม่? ประโยคที่สี่ขีดเส้นที่ control of execution ซึ่งเป็นเส้นของ Anthropic พอดี การทดสอบคนละแบบ หน้าเดียวกัน และมีระบบจริงที่สองแบบนี้ให้คำตอบไม่ตรงกัน
ข้างใต้มีการชนกันของคำศัพท์ และมันทำให้เกิดข้อถกเถียงใน meeting จริง ในเอกสารแรก workflow คือสถาปัตยกรรม และเป็นสิ่งที่ ไม่ใช่ agent ในเอกสารที่สอง workflow คือ "sequence ของ steps ที่ต้อง execute เพื่อให้ถึง goal ของผู้ใช้" — คือตัวงานเอง ซึ่ง agent ทุกตัวมีอย่างหนึ่ง "เราแทน workflow ด้วย agent" ฟังรู้เรื่องตามนิยามแรก และแทบไม่มีความหมายตามนิยามที่สอง
สามระบบ จัดหมวดสองครั้ง
ลิงก์ไปยังส่วน: สามระบบ จัดหมวดสองครั้งสามระบบที่มีอยู่ในปี 2026 ภายใต้ทั้งสองนิยาม
coding agent ใน terminal
ลิงก์ไปยังส่วน: coding agent ใน terminalคุณอธิบายงาน; มันอ่านไฟล์ รัน test suite แก้ไข รันอีกครั้ง และหยุดเมื่อ tests ผ่านหรือเมื่อมันยอมแพ้ ไม่มีอะไรใน code ของคุณตัดสินว่า step ถัดไปคือ "รัน tests" — model เป็นคนทำ จากสิ่งที่ tool ล่าสุดคืนมา
นิยามที่หนึ่ง: agent เพราะ model กำกับกระบวนการของตัวเอง นิยามที่สอง: agent เพราะมันทำงานให้สำเร็จอย่างอิสระ จดจำความเสร็จสมบูรณ์ และส่งการควบคุมกลับมา เอกสารทั้งสองอ้างรูปทรงนี้เป็นตัวอย่างหลัก
pipeline คัดแยก ticket รายคืน
ลิงก์ไปยังส่วน: pipeline คัดแยก ticket รายคืนสำหรับ support ticket ใหม่แต่ละใบ มี model calls สามครั้งในลำดับคงที่ — classify, extract fields, draft reply — แล้วส่ง ไม่มี model ใดเลือกว่าอะไรเกิดขึ้นต่อไป; for loop เป็นผู้ทำ มันรันตอน 03:00 และไม่มีใครเฝ้าดู
นิยามที่หนึ่ง: ไม่ใช่ agent มันคือ prompt chaining ซึ่งถูกระบุชื่อไว้ว่าเป็น workflow นิยามที่สอง: ได้ทั้งสองคำตอบ ตามประโยคเปิด มันทำงานให้สำเร็จอย่างเป็นอิสระในนามของคุณ; ตามประโยคที่สี่ มันไม่ได้ใช้ model เพื่อควบคุม workflow execution และถูกยกเว้น ระบบนี้คือเหตุผลที่คุณควรอ่านทั้งหน้า ไม่ใช่แค่ pull quote
chat assistant ที่มี search tool
ลิงก์ไปยังส่วน: chat assistant ที่มี search toolหนึ่ง user turn model ตัดสินใจเองว่าจะ search ก่อนตอบหรือไม่ จากนั้นตอบและรอคุณ
นิยามที่หนึ่ง: agent เพราะ model กำกับการใช้ tool ของตัวเองแบบ dynamic ตามผลจาก environment ซึ่งเป็นการทดสอบที่ระบุไว้ นิยามที่สอง: ไม่ใช่ agent เพราะไม่มี independence — หนึ่ง turn แล้วส่งกลับ — และ "simple chatbots" อยู่ในรายการยกเว้นโดยระบุชื่อ
สองในสามเปลี่ยนฝั่ง นั่นไม่ใช่ความล้มเหลวของเอกสารใดเอกสารหนึ่ง มันเป็นคำเตือนเกี่ยวกับ meeting ประเภทหนึ่งที่คนสองคนเห็นด้วยกันหมดว่าระบบทำอะไร แต่ใช้เวลาหนึ่งชั่วโมงถกเถียงว่าจะเรียกมันว่าอะไร
ทางออกคือสองแกน ไม่ใช่แกนเดียว
ลิงก์ไปยังส่วน: ทางออกคือสองแกน ไม่ใช่แกนเดียวนิยามชนกันเพราะแต่ละนิยามยุบคำถามอิสระสองข้อให้เหลือคำเดียว แยกมันออก แล้วความไม่ลงรอยจะกลายเป็นตาราง ซึ่งมีประโยชน์กว่าคำตัดสิน
| code ของคุณเลือก step ถัดไป | model เลือก step ถัดไป | |
|---|---|---|
| มีคนเฝ้าดูทุก turn | form ที่มี model อยู่ข้างใน: classifiers, extraction, single-turn completion | chat ที่มี tools — นิยามที่หนึ่งบอกว่า agent, นิยามที่สองบอกว่าไม่ใช่ |
| ไม่มีใครเฝ้าดูจนกว่าจะเสร็จ | pipeline — ประโยคเปิดของนิยามที่สองบอกว่า agent, ประโยคที่สี่บอกว่าไม่ใช่ | ทุกคนเห็นตรงกัน: agent |
นิยามแต่ละแบบโต้แย้งคนละ cell และอีกสอง cell ไม่มีข้อพิพาทเลย ดังนั้นเมื่อ label สำคัญ — ในสัญญา, risk review, postmortem — สองประโยคที่ควรเขียนไม่ใช่ "มันเป็น agent หรือไม่" แต่เป็น ใครเลือก step ถัดไป และ ใครเฝ้าดูอยู่ ทั้งสองตอบได้ด้วยการอ่าน code ไม่ต้องใช้นิยามของใคร และเมื่อรวมกันก็ถือผลลัพธ์ทุกอย่างที่ label เคยยืนแทน
ทั้งหมดนี้ไม่ใช่เรื่องใหม่ Wooldridge และ Jennings สำรวจความหมายแข่งขันของคำว่า "agent" ในปี 1995;6 Franklin และ Graesser ถามคำถามเดียวกับบทนี้ในปี 1996 รวบรวมนิยามที่ใช้อยู่ แล้วพบว่ามันไม่เห็นพ้องกัน7 survey ปี 2023 ยังนิยาม agents จากหลักการพื้นฐาน — "entities ประดิษฐ์ที่ sense environment ของตน, make decisions, และ take actions"8 — เพราะไม่มีสิ่งที่ตกลงกันได้ให้ cite และ CoALA อธิบาย parts แทนที่จะขีดเส้นแบ่งใด ๆ9 สามสิบปีของการปฏิเสธที่จะเห็นพ้องบอกว่าคำนี้ทำงานมากกว่าหนึ่งหน้าที่
agent คือ N calls ไม่ใช่หนึ่ง
ลิงก์ไปยังส่วน: agent คือ N calls ไม่ใช่หนึ่งตอนนี้มาถึงผลที่มาถึงก่อนปรัชญา ซึ่งก็คือบิล
ทุกการวัดตรงนี้มีรูปทรงเดียวกัน single call ใช้ input token 39; คำถามเดียวกันกับ tool หนึ่งตัวใช้ 420 ในสอง calls; loop ที่ถูกถอด stopping rule ใช้ 1,688 ในหก calls การเติบโตแย่กว่า linear เพราะ turn n แบกทุก turn ก่อนหน้ามาด้วย: คอลัมน์ prompt ของการรันหก turn นั้นอ่านได้เป็น 187, 238, 261, 302, 327, 373 บทที่ 16 derive ว่ายอดรวมคือ และ fit curve บนบทสนทนาจริง agent เปลี่ยนทุกงานให้เป็นบทสนทนานั้น ไม่ว่ามนุษย์จะเคยเห็นมันหรือไม่
ถ้าจำนวน token ที่วัดได้เหล่านั้นถูกส่งไปยัง commercial endpoint ด้วยราคาที่บทที่ 16 อ่านเมื่อ 6 กันยายน 2026 — $2.00 ต่อ input token หนึ่งล้าน และ $12.00 ต่อ output หนึ่งล้าน — การรันทั้งสี่คิดราคาได้แบบนี้:
| run | model calls | input tokens | output tokens | cost |
|---|---|---|---|---|
| the question, no tools | 1 | 39 | 8 | $0.000174 |
| the same question, one tool in the catalogue | 2 | 420 | 38 | $0.001296 |
| a question that needs the tool | 2 | 425 | 33 | $0.001246 |
| the same, with the stopping rule removed | 6 | 1,688 | 124 | $0.004864 |
แถวสองเทียบกับแถวหนึ่งคือเลขที่ควรจำ ต้นทุนเจ็ดเท่าครึ่ง เพื่อคำตอบที่แย่ลงสำหรับคำถามที่ model รู้อยู่แล้ว ไม่มีอะไร misconfigured: มี tool อยู่ model จึงใช้มัน — และข้อค้นพบของบทที่ 18 ว่าราคาของแคตตาล็อก ไม่ใช่ความแม่นของมัน คือสิ่งที่ทำให้เจ็บ มีเดโมที่ถูกที่สุดตรงนี้ด้วยแคตตาล็อกที่มีรายการเดียว
นั่นคือเหตุผลที่ครึ่งที่มีประโยชน์ของเอกสารทั้งสองคือครึ่งที่พูดถึงการไม่สร้างสิ่งนี้ Anthropic พูดตรง: หาทางออกที่ง่ายที่สุดเท่าที่เป็นไปได้ แล้วเพิ่มความซับซ้อนเฉพาะเมื่อจำเป็น ซึ่ง "อาจหมายถึงการไม่สร้าง agentic systems เลย" เพราะ agentic systems "แลก latency และ cost กับ task performance ที่ดีขึ้น" และ "สำหรับ applications จำนวนมาก การ optimize single LLM calls ด้วย retrieval และ in-context examples มักเพียงพอแล้ว"4 กรณี ที่ควร ใช้ agent ของมันแคบ: ปัญหา open-ended ที่คุณคาดจำนวน steps ไม่ได้และ hardcode path ไม่ได้ ใน environment ที่คุณไว้ใจ พร้อมยอมรับ "cost ที่สูงขึ้น และโอกาสเกิด compounding errors"4 หน้าคัดกรองของ OpenAI เป็นภาพสะท้อนกลับด้าน — judgement ซับซ้อน, rule sets ที่ maintain ไม่ไหว, unstructured data — และจบแบบเดียวกัน: "มิฉะนั้น deterministic solution อาจเพียงพอ"5
ดังนั้น ในอนุกรมวิธานของบทนี้: จำนวน steps คงที่ในลำดับคงที่คือ pipeline และการเรียกมันว่า agent จะไม่ทำให้มันเร็วขึ้น ถ้าจำนวน steps ขึ้นกับสิ่งที่คุณพบระหว่างทาง คุณต้องการ loop — และคุณซื้อความยืดหยุ่นนั้นด้วย N calls, transcript กำลังสอง และระบบที่สามารถผิด N ครั้งแทนที่จะผิดครั้งเดียว
ต่อจากนี้ไปไหน
ลิงก์ไปยังส่วน: ต่อจากนี้ไปไหนตอนนี้คุณมีอนุกรมวิธาน, นิยามสมัยใหม่ทั้งสอง, สองแกนที่ทำให้มันเข้ากันได้ และ loop สั้น ๆ ที่ตอบ, call และหยุด
loop นั้นมีวิธีจบหนึ่งทาง: model หยุดขอ tools บทที่ 23 ทำให้มันพังโดยตั้งใจเจ็ดครั้ง และแต่ละครั้งเพิ่มชิ้นส่วนหนึ่งเข้าไป งานที่เป็นไปไม่ได้ แล้วมันไม่เคยจบ — turn cap หนึ่งคืนของการรัน แล้วบิลมาถึง — budget เป็นดอลลาร์ tool ที่ล้มเหลว — error ที่ model ลงมือตามได้ call เดิมสองครั้ง — idempotency key ไฟล์ที่มันไม่ควรแตะ — human approval รีสตาร์ตกลางทาง — session persistence tool ที่ใช้เวลาสามนาทีในความเงียบ — progress และ cancellation สิ่งที่ได้ออกมาคือ harness ไฟล์ที่ส่วนที่เหลือของคอร์สนี้รันอยู่บนมัน
ซึ่งทิ้งคำถามที่ diagonal ที่เป็นข้อพิพาทของบทนี้ถามจริง ๆ ไว้ loop ที่ตัดสิน step ถัดไปเองต้องตัดสินใจว่าจะหยุดเมื่อไร และเราเพิ่งเห็นแล้วว่าเกิดอะไรขึ้นเมื่อมันทำไม่ได้: หก turns, บิลสี่เท่า และ agent ที่ซักผู้ใช้เกี่ยวกับคำถามที่มันตอบไปแล้ว Stopping ไม่ใช่ condition เดียว มีกี่อย่าง และอะไร fire ก่อน?
แหล่งที่มาและวิธีการ
ลิงก์ไปยังส่วน: แหล่งที่มาและวิธีการLLM Powered Autonomous Agents (2023) ของ Lilian Weng คือการแยกส่วน language agent ออกเป็น planning, memory และ tool use ที่เป็นที่รู้จักที่สุด และเป็นสิ่งที่ควรอ่านต่อคู่กับเอกสาร vendor สองฉบับ; components สามอย่างของมันคือบทที่ 23, 24 และ 18 ของคอร์สนี้ ตามลำดับ
ตัวเลขทุกตัวในบทนี้ผลิตบนเครื่องนี้และไม่มีอะไรถูก estimate ทางเดิน, แผนผังพื้น, agents สี่ตัวที่เดินมัน และ patrol policies สามแบบ คือ TypeScript ด้านบน รันบน Node 22; ตัวเลขของ randomized agent เป็น means จาก seeded runs อย่างละ 2,000 ครั้ง และตัวเลข patrol เป็น seeded runs เดี่ยว 4,000 ticks model traces มาจาก Qwen2.5-0.5B-Instruct ใน float32 บน CPU ด้วย greedy decoding เสิร์ฟผ่าน loopback โดย local Python endpoint ขนาดเล็กที่โหลด weights และพูดรูปทรง OpenAI chat-completions — seam เดิมอีกครั้ง โดย tensors อยู่ฝั่ง Python และ loop อยู่ฝั่ง TypeScript — ดังนั้น token counts คือ tokenizer ของ model นั้น และ latencies คือของเครื่องนั้น ตัวเลขเดียวที่เอามาจากที่อื่นคือราคาสองค่าบน cost table ซึ่งเป็น rate ที่บทที่ 16 อ่านจากหน้า pricing ของ OpenAI เมื่อ 6 กันยายน 2026 นำมาใช้กับ token counts ที่วัดในเครื่องเพื่อเป็น illustration ไม่ใช่ observed invoice
รายการอ้างอิง
ลิงก์ไปยังส่วน: รายการอ้างอิง-
Russell, S. และ Norvig, P. Artificial Intelligence: A Modern Approach, ฉบับที่ 4, บทที่ 2, Intelligent Agents. แหล่งที่มาของโลกเครื่องดูดฝุ่น, สเปก PEAS, นิยาม rationality เมื่อเทียบกับ performance measure, คุณสมบัติเจ็ดข้อของ task environments, agent types ห้าประเภทที่ใช้ที่นี่ และข้อสังเกตว่า infinite loop มักหลีกเลี่ยงไม่ได้สำหรับ simple reflex agents ใน environments ที่สังเกตเห็นได้เพียงบางส่วน code ประกอบหนังสืออยู่ที่
aimacode/aima-pythonบน GitHub (8,806 stars, push ล่าสุด 30 มิถุนายน 2026, อ่าน 7 กันยายน 2026) — ควรระบุให้แม่นว่ามันคืออะไร มันคือ repository ประกอบหนังสือ ไม่ใช่ reference implementation ที่ project อื่น build ต่อแบบkarpathy/micrograd(17,412) และkarpathy/nanoGPT(62,852) นั่นคือเหตุผลที่บทนี้ cite และ link มันแทนการแปลมัน และเหตุผลที่ argument เรื่อง ecosystem ที่ทำให้ บทที่ 5 อยู่ใน Python ใช้กับที่นี่ไม่ได้: ไม่มีอะไรในบทนี้แตะ tensor และ loop ที่เขียนด้านบนคือบรรพบุรุษโดยตรงของบทที่ 23 ↩ ↩2 ↩3 ↩4 ↩5 -
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. และ Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). การสลับแทรก reasoning traces และ actions ที่แถว goal-based ของ mapping table กล่าวถึง ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. และ Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). summary ของ paper เองเกี่ยวกับกลไกนี้คือเหตุผลที่มัน map เข้ากับ learning agent: มัน reinforce agents "not by updating weights, but instead through linguistic feedback" โดย agents "verbally reflect on task feedback signals, then maintain their own reflective text in an episodic memory buffer to induce better decision-making in subsequent trials" ↩ ↩2
-
Anthropic, Building effective agents, 19 ธันวาคม 2024,
anthropic.com/engineering/building-effective-agents, อ่าน 7 กันยายน 2026 แหล่งที่มาของ distinction ระหว่าง workflow/agent ที่ quote ด้านบน, umbrella term "agentic systems", คำอธิบาย agents ว่า "โดยทั่วไปก็แค่ LLMs ที่ใช้ tools ตาม environmental feedback ใน loop", แนวทางให้หาทางออกที่ง่ายที่สุดเท่าที่เป็นไปได้ และว่าสิ่งนี้ "อาจหมายถึงการไม่สร้าง agentic systems เลย", และกรณี for และ against agents รวมถึง "higher costs, and the potential for compounding errors" และคำแนะนำเรื่อง stopping conditions "such as a maximum number of iterations" เพื่อรักษาการควบคุม ↩ ↩2 ↩3 -
OpenAI, A practical guide to building agents, หน้า 4 ถึง 7, อ่าน 7 กันยายน 2026 แหล่งที่มาของ "Agents are systems that independently accomplish tasks on your behalf", การยกเว้น "simple chatbots, single-turn LLMs, or sentiment classifiers", นิยาม workflow ว่า "a sequence of steps that must be executed to meet the user's goal", core characteristics สองข้อของ agent, components สามอย่าง — model, tools, instructions — และ screening criteria สำหรับเวลาที่ควรสร้าง agent โดยจบที่ "otherwise, a deterministic solution may suffice" ↩ ↩2 ↩3
-
Wooldridge, M. และ Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volume 10, issue 2 (1995). survey ที่แยกการใช้คำของสาขานี้ออกเป็น notion แบบ weak ของ agency — autonomy, social ability, reactivity, pro-activeness — และ notion ที่ stronger ซึ่งยืม vocabulary ทางจิตมา อ่านวันนี้แล้วมันคือบันทึกของ argument เดียวกับที่เอกสารสองฉบับในบทนี้ยังคงมีอยู่ ↩
-
Franklin, S. และ Graesser, A. Is It an Agent, or Just a Program? A Taxonomy for Autonomous Agents. Proceedings of the Third International Workshop on Agent Theories, Architectures, and Languages, Springer (1996). cite ที่นี่ตามสิ่งที่มันเป็นมากกว่าสำหรับ quotation: survey ที่รวบรวมนิยามของ "agent" ที่ใช้อยู่ในตอนนั้น พบว่ามันไม่เห็นพ้องกัน และเสนอ taxonomy เพื่อแทน argument สามสิบปีต่อมา argument นี้อยู่ใน documentation ที่ออกแบบดีกว่า และอย่างอื่นยังไม่เปลี่ยน ↩
-
Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). อ้างด้านบนสำหรับนิยามเปิดเรื่อง "AI agents are artificial entities that sense their environment, make decisions, and take actions" ซึ่งเป็นนิยามจากตำราที่ถูกกล่าวซ้ำในปี 2023 เพราะไม่มีนิยามสมัยใหม่ที่เห็นพ้องกันให้ cite ↩
-
Sumers, T. R., Yao, S., Narasimhan, K. และ Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). จัด language agents เป็น "modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process to choose actions" และวางมันอย่างชัดเจนในประวัติศาสตร์ของ symbolic AI และ cognitive science taxonomy ของ memory จะกลับมาในบทที่ 24 ซึ่งตารางสาม store เป็นเงาเชิงปฏิบัติของมัน ↩