Lewati ke konten
22/30Bab 22 dari 30

Apa Itu AI Agent: Lima Tipe Klasik, Dua Definisi yang Bersaing

Dunia vacuum dirusak empat kali, tiap kerusakan menghasilkan satu dari lima tipe agent klasik. Lalu satu tool mengubah 39 token jadi 420.

Di halaman ini

Ini pertanyaan yang sama, diajukan dua kali ke model yang sama, dengan weights yang sama dan greedy decoding. Satu-satunya perbedaan adalah kali kedua ada satu tool dalam katalog.

TEXT
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

Satu call menjadi dua. Tiga puluh sembilan input token menjadi 420, faktor 10,8. Kurang dari satu detik menjadi hampir tujuh. Dan jawabannya mendapat fakta yang tidak diminta siapa pun, dari tool yang model pilih untuk dipanggil atas pertanyaan yang tidak pernah menyebut cuaca.

Sistem kedua adalah apa yang sebagian besar industri pada 2026 sebut sebagai agent. Atau bukan, tergantung mana dari dua definisi yang paling banyak dibaca yang kamu buka — dan keduanya tidak mengatakan hal yang sama. Salah satunya bahkan tidak konsisten dengan dirinya sendiri.

Ketidaksepakatan itu adalah bab ini. Ini bukan pertengkaran kosakata: dua definisi itu menarik batas pada sumbu yang berbeda, dan sumbu yang kamu pilih menentukan apa yang kamu bangun dan berapa tagihanmu. Keduanya berdiri di atas taksonomi yang lebih tua, dan cara termurah untuk memahaminya adalah membangun agent terburuk di dunia.

Tampilkan detail

Yang dibutuhkan bab ini dari bab-bab sebelumnya.

  • Bab 13 mengukur biaya satu call dalam waktu; bab ini mengalikannya dengan jumlah giliran.
  • Bab 15: prompt adalah state lengkap model, karena tidak ada yang bertahan setelah call.
  • Bab 16: input token tumbuh mengikuti kuadrat percakapan.
  • Bab 18: katalog tool, dan round trip ketika model meminta lalu kodemu mengeksekusi.

Tidak ada tensor di sini. Bab ini memakai TypeScript, sesuai aturan bahasa dari Bab 14, dan loop-nya adalah leluhur langsung dari loop di Bab 23.

Contoh tertua di bidang ini adalah vacuum cleaner dalam dunia dua kotak, A dan B, masing-masing bisa bersih atau kotor.1 Ia bertahan di setiap buku teks karena ini adalah dunia terkecil tempat sebuah agent bisa benar atau salah.

Percept-nya adalah sepasang nilai — di mana saya berada, dan apakah tempat ini kotor — dan aksinya adalah SUCK, LEFT, dan RIGHT. Seluruh programnya satu baris.

reflex.tsTS
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";   

Jalankan terhadap setiap konfigurasi awal dunia dua kotak:

TEXT
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

Itu adalah simple reflex agent: ia bertindak hanya berdasarkan percept saat ini, tanpa memori apa pun sebelumnya. Bukan kategori mainan — termostat termasuk di dalamnya, begitu juga satu call ke language model tanpa percakapan yang menyertainya.

Sekarang rusak seperti cara realitas merusaknya. Robot vacuum sungguhan punya sensor kotoran dan bumper, bukan kotak berlabel A di bawah karpet. Hapus lokasi dari percept dan jangan ubah apa pun:

reflex.tsTS
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");
TEXT
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

Program yang sama, dua kotak. Dari satu state awal ia selesai dalam tiga langkah; dari yang lain ia menabrak dinding kanan lima ratus kali dan akan terus begitu sampai baterainya habis. Ia tidak bisa mempersepsikan perbedaan antara dua situasi itu, jadi ia tidak bisa bertindak berbeda di dalamnya. Russell dan Norvig menyatakan hasil umumnya dalam satu baris: loop tak berujung sering kali tidak dapat dihindari bagi simple reflex agent di lingkungan yang hanya dapat diamati sebagian.1

Ada perbaikan yang memakan satu baris dan tanpa memori, layak diukur sebelum kita meraih sesuatu yang lebih pintar.

reflex.tsTS
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);

const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT");  

Dua ribu run koridor yang semuanya kotor pada tiga ukuran, dengan satu generator seeded sepanjang jalan:

ruanganlangkah rata-ratamedianterburuk dari 2.000tidak pernah selesai
24,04130
416,614810
868,7523060

Randomisasi menghapus loop sepenuhnya. Ia juga mahal: delapan ruangan butuh lima belas gerakan jika kamu tahu apa yang kamu lakukan, dan agent ini rata-rata 68,7 dan pernah sampai 306. Itulah seluruh bab ini dalam bentuk mini. Setiap kemampuan yang kita tambahkan membeli kebenaran dalam kasus yang tidak bisa ditangani agent sebelumnya, dan menagihnya dalam mata uang yang harus kamu beri nama dulu.

Menamai bagian-bagiannya, sekarang ketika diperlukan

Tautan ke bagian: Menamai bagian-bagiannya, sekarang ketika diperlukan

Sebuah agent mempersepsikan lingkungannya melalui sensor dan bertindak melalui actuator. Agent program adalah fungsi dari percept ke aksi — setiap listing di atas adalah salah satunya. Percept sequence adalah semua yang telah dipersepsikan sejauh ini, dan simple reflex agent mengabaikan semuanya kecuali item terakhir.

Rasionalitas adalah kata yang paling sering disalahpahami artikel, dan memahaminya dengan benar membuat sisa bab ini berguna. Sebuah agent tidak rasional atau irasional pada dirinya sendiri. Russell dan Norvig mendefinisikan rational agent sebagai agent yang, untuk setiap kemungkinan percept sequence, memilih aksi yang diharapkan memaksimalkan performance measure-nya, berdasarkan bukti dari sequence itu dan pengetahuan bawaan apa pun yang dimilikinya.1 Performance measure tidak berada di dalam agent: ia milik desainer, dan rasionalitas hanya didefinisikan relatif terhadapnya.

Spesifikasi ini secara konvensional ditulis sebagai empat hal, PEAS: performance measure, environment, actuators, sensors.

robot vacuumsupport agent di produksi
Performance measurekotak bersih, per unit bateraitiket terselesaikan, per dolar, tanpa eskalasi
Environmentlantai, kotoran, furnitur, karpetantrean tiket, database kamu, pelanggan
Actuatorsroda, isaptool calls
Sensorssensor kotoran, bumperpesan pengguna, hasil tool

Perhatikan baris mana yang paling janggal. Hampir setiap tim yang membangun agent pada 2026 menuliskan E, A, dan S — skema tool, integrasi, format pesan — karena kode tidak akan berjalan tanpa itu. Hampir tidak ada yang menuliskan P. Tanpanya, "agent kita bekerja dengan baik" tidak punya makna yang bisa diperiksa siapa pun, dan "rasional" tidak bisa diterapkan ke sistem sama sekali, hanya ke demonstrasi. Bab 29 membahas cara mengubah P menjadi angka, dan inilah alasan bab itu ada.

TEXT
    ┌───────────────────────── 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 it

Task environment selanjutnya diklasifikasikan sepanjang tujuh sumbu, lima di antaranya menentukan sebagian besar kesulitan di sini: dapat diamati penuh atau sebagian, deterministik atau tidak, episodik atau sekuensial, statis atau dinamis, diketahui atau tidak diketahui.1 Agent yang berbicara dengan tool nyata lewat jaringan nyata berada di sudut sulit dari kelimanya — non-deterministik bahkan pada temperature nol (Bab 17), dan yang sering diremehkan, tidak diketahui, karena kamu tidak punya model andal tentang apa yang tool milikmu sendiri lakukan pada dunia. Itulah sebabnya loop Bab 23 lebih membutuhkan error handling daripada planning.

Menambahkan memori, dan menemukan dinding berikutnya

Tautan ke bagian: Menambahkan memori, dan menemukan dinding berikutnya

Lantai sungguhan tidak satu dimensi, jadi naikkan dunia menjadi denah. Tanda pagar adalah dinding, asterisk adalah kotoran, dan robot mulai di ruang tengah:

TEXT
        col  0 1 2 3 4 5 6
      row 0  * . . # . . *
      row 1  . # . # . # .
      row 2  . # . S . # .        S = the robot starts here
      row 3  . # . # . # .
      row 4  * . . # . . *

Upgrade yang jelas adalah memori. Agent menyimpan peta: setiap kotak yang pernah ia pijak dan setiap kotak tempat bumper aktif. Aturannya adalah berjalan ke kotak bersebelahan yang belum ia kunjungi — kanan, lalu bawah, lalu kiri, lalu atas — dan mundur ketika semua di sekelilingnya sudah diketahui. Ini adalah model-based reflex agent: ia mempertahankan state internal dari riwayat percept, sehingga ia bisa bertindak berdasarkan apa yang tidak sedang ia lihat.

Ini peningkatan nyata, dan tetap belum cukup:

TEXT
5,000 steps allowed -> steps=5,000  distinct squares visited=13/25  still dirty=2/4

Lima ribu gerakan, setengah lantai tidak pernah terlihat. Petanya benar dan aturannya benar. Yang tidak bisa dilakukan agent adalah memakai peta untuk pergi ke suatu tempat: aturannya hanya pernah menjawab "dari empat tetangga saya, mana yang harus saya langkahi", jadi setelah tidak ada lagi kotak belum dikunjungi di sebelahnya, ia tidak punya cara untuk mengekspresikan pikiran ada kotak belum dikunjungi delapan langkah jauhnya dan saya ingin berdiri di sana. Ia tahu di mana ia berada. Ia tidak tahu ke mana ia ingin berada.

Sebuah tujuan, lalu alasan untuk memilih satu rute dibanding yang lain

Tautan ke bagian: Sebuah tujuan, lalu alasan untuk memilih satu rute dibanding yang lain

Goal-based agent memiliki, di atas model dunianya, deskripsi situasi yang ingin ia wujudkan, dan memilih aksi dengan mencari di antara sequence aksi sampai menemukan yang berakhir di sana. Goal mengubah pemilihan aksi dari lookup menjadi search.

Goal-nya adalah "tidak ada kotak kotor tersisa". Search-nya adalah breadth-first walk ke kotak kotor terdekat, dan jalur yang dikembalikannya adalah plan.

TEXT
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

Dua puluh tujuh gerakan, lantai bersih. Tapi lihat kolom baterai dan leg terakhir dari plan. Kolom 0 berkarpet: melintasi kotak berkarpet memakan enam unit baterai, kotak ubin satu. Agent pulang melalui kolom 0 karena itu empat gerakan, bukan delapan, dan empat gerakan berkarpet itu memakan 24 sementara jalan memutar delapan gerakan hanya memakan 13.

Ia tidak bisa melakukan selain itu. Goal adalah pengujian biner: lantai bersih atau tidak. Setiap plan yang berakhir dengan lantai bersih memenuhinya secara setara, jadi ketika beberapa berhasil, agent tidak punya dasar untuk memilih di antaranya. Memilih satu keberhasilan dibanding yang lain membutuhkan angka atas outcome, dan angka itu adalah utility function. Agent yang memaksimalkannya adalah utility-based agent.

Perubahan pada kode adalah satu term di dalam search. Breadth-first search menghitung gerakan; buat ia menghitung biaya, dan kamu punya algoritma Dijkstra serta agent yang berbeda:

search.tsTS
const nd = dist.get(k)! + (byCost ? cell.cost : 1);   // <- the entire difference
TEXT
goal-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

Empat gerakan ekstra, sebelas unit baterai lebih sedikit: dua puluh satu persen lebih murah. Goal yang sama, peta yang sama, kode yang sama kecuali satu term. Kedua agent hanya berbeda dalam apa yang mereka coba kuasai, dan mereka mengambil rute pulang yang berbeda.

Ini juga titik pertama ketika agent membutuhkan sesuatu yang tidak bisa ia hasilkan. Seseorang harus memutuskan nilai satu unit baterai relatif terhadap satu gerakan. Utility adalah performance measure yang ditulis dalam bentuk yang bisa dihitung agent, dan menuliskannya adalah tugas desainer. Ketika orang berkata agent "mengoptimalkan hal yang salah", mereka hampir tidak pernah bermaksud bug. Maksud mereka baris ini ditulis sembarangan.

Sekarang biarkan kotoran datang kembali. Empat ruangan kembali kotor pada empat tingkat yang berbeda, dan agent tidak pernah diberi tahu tingkat itu. Ia mengunjungi satu ruangan per tick dan hanya melihat ruangan itu. Performance measure-nya adalah room-tick yang dihabiskan dalam keadaan kotor selama 4.000 tick — lebih rendah lebih baik.

Learning agent, dalam dekomposisi buku teks, adalah salah satu dari yang di atas ditambah tiga bagian: learning element yang mengubah agent, critic yang memberi tahu bagaimana performa agent terhadap standar performa tetap, dan problem generator yang mengusulkan aksi yang layak dicoba demi apa yang akan diajarkannya.1 Tiga policy dalam lingkungan yang sama. Yang pertama tidak belajar; yang kedua dan ketiga mempelajari hal yang sama dan menggunakannya secara berbeda.

policydirty-room-ticks selama 4.000dibanding patrol
patrol round-robin tetap, tanpa learning2.290
learner A: estimasi tingkat kotor tiap ruangan, lalu pergi ke tempat yang paling mungkin kotor11.8205,2× lebih buruk
learner B: estimasi yang sama, dibobot berdasarkan berapa lama sejak kunjungan terakhir1.57631 % lebih baik

Tingkat tersembunyi adalah 0,35 untuk dapur, 0,05 untuk lorong, 0,02 untuk ruang kerja, dan 0,01 untuk loteng — dan learner A menemukannya. Ia dengan benar mengidentifikasi dapur sebagai ruangan terkotor di rumah, lalu pergi ke dapur setiap tick selama sisa simulasi sementara tiga ruangan lain kotor selamanya. Ia lima kali lebih buruk daripada tidak belajar sama sekali, dan ia tidak rusak.

Pelajarannya sama dengan bagian utility. Learner A memaksimalkan "probabilitas bahwa ruangan yang akan saya kunjungi kotor". Performance measure-nya adalah "room-tick yang dihabiskan dalam keadaan kotor". Angka yang berbeda; yang kedua adalah yang dinilai critic, dan tidak ada yang memberi tahu agent. Learner B mengalikan tingkat yang sama yang dipelajari dengan waktu sejak kunjungan terakhir — kotoran yang ia harapkan akan ditemukan, bukan peluang menemukan kotoran apa pun — dan mengalahkan patrol yang menjadi titik awalnya.

Satu detail implementasi menentukan hasilnya. Pada versi pertama learner B, ruangan yang tidak menunjukkan kotoran dalam tiga kunjungan mendapat tingkat tepat nol — dan nol kali apa pun adalah nol, jadi ruangan itu tidak pernah dikunjungi lagi dan estimasinya tidak pernah bisa dikoreksi. Smoothing fraksi, keberhasilan plus satu dibagi percobaan plus dua, mengubah 11.895 menjadi 1.576. "Belum diamati" dan "diukur dan hasilnya nol" adalah klaim yang berbeda, dan sistem yang menyimpannya di field yang sama membuat keputusan yang tidak bisa ia batalkan.

TEXT
  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

Kelima-limanya ada di produksi hari ini dengan nama lain.

tipe klasikyang dibawa di antara perceptwujudnya pada 2026yang tidak bisa ia lakukan
simple reflextidak adasatu model call tanpa riwayat: classifier, endpoint ekstraksi, single-turn completionapa pun yang bergantung pada turn sebelumnya
model-based reflexstate internal yang dibangun dari riwayat perceptchat: transcript, dikirim ulang seluruhnya pada setiap callmemilih ke mana percakapan harus berakhir
goal-basedstate plus deskripsi situasi yang diinginkanloop reason-and-act dengan stopping condition2memilih satu plan sukses dibanding yang lain
utility-basedstate, goal, dan angka atas outcomeloop evaluator–optimiser, dan ranking kandidat jawaban berdasarkan kriteria tertulis (Bab 25)menciptakan kriterianya
learningsemua itu, plus critic dan problem generatorReflexion, yang menulis pelajarannya sendiri ke episodic buffer alih-alih memperbarui weights;3 persistent user memory (Bab 24)memilih standar yang dinilai critic

Dua baris lebih dekat daripada analogi, dengan cara yang memakan biaya.

Chat adalah model-based reflex agent yang modelnya tidak internal. Dalam buku teks, state adalah variabel di dalam agent program. Dalam chat, state adalah transcript: ia hidup di sisi kamu, dikirim ulang penuh pada setiap call, dan dibangun ulang dari nol di dalam model setiap kali. Itulah tagihan kuadratik Bab 16, dan itu objek yang sama yang buku teks gambar sebagai kotak berlabel "state". Inilah perbedaannya, diukur pada satu pertanyaan lanjutan dengan dan tanpa dua pesan sebelumnya:

TEXT
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 yang sama, tiga kata input pengguna yang sama, dan yang kedua adalah robot koridor yang menabrak dinding. Tidak ada tool dalam run itu, jadi angka 15 dikarang — tetapi state-lah yang membuat follow-up bermakna sama sekali. Kamu membangunnya ulang setiap kali dan membayar 2,3× input token untuknya pada percakapan dua turn. Bab 16 mengukur sejauh mana pengali itu sampai pada turn keempat puluh.

Reflexion adalah learning agent yang mengubah input-nya, bukan programnya. Dalam dekomposisi buku teks, learning element memodifikasi performance element. Reflexion membiarkan weights tetap dan menulis teks reflektif ke episodic buffer yang dibaca percobaan berikutnya.3 Learning element adalah prompt, memorinya baris database, performance element-nya model beku — dan diagramnya tetap diagram buku teks, tanpa perubahan.

Dan inilah batas jujur dari pemetaan itu. Lima tipe mengklasifikasikan agent program. Pada 2026, program itu terbelah dua: sebagian adalah kodemu, sebagian berada di dalam weights yang tidak kamu latih. Ketika model memutuskan sendiri untuk memanggil tool, apakah goal test ada di programmu atau di model? Taksonomi tidak punya jawaban, karena ketika ia ditulis tidak ada tempat lain untuk itu berada — dan pertanyaan itu persis tempat dua definisi modern berpisah.

Menjawab, memanggil, dan berhenti, dalam satu trace

Tautan ke bagian: Menjawab, memanggil, dan berhenti, dalam satu trace

Definisi adalah argumen tentang perilaku, dan jauh lebih mudah dinilai dengan trace di depanmu.

Loop di bawah mengirim percakapan ke model; jika balasan berisi tool call, ia mengeksekusi tool, menambahkan hasilnya, dan mengirim semuanya lagi. Ia berjalan terhadap Qwen2.5-0.5B-Instruct lokal di balik endpoint berbentuk OpenAI pada mesin ini — seam dari Bab 14, jadi loop tidak tahu dan tidak peduli apa yang ada di balik port.

loop.tsTS
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");                       
}

Dua baris memuat seluruh gagasan, dan keduanya ditandai; sisanya bookkeeping. Ketiga perilaku terlihat dalam satu run. Ditanya sesuatu yang bisa ia lakukan sendiri, model menjawab. Ditanya sesuatu yang tidak bisa, ia memanggil:

TEXT
=== 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

Dan ia berhenti — perilaku ketiga, dan yang paling mudah terlewat, karena tampak seperti tidak ada yang terjadi. Loop berakhir karena turn 2 kembali tanpa tool call. Tidak ada yang memutuskan itu; model yang memutuskan, dengan memancarkan prosa. Termination condition program ini adalah tanda dari sebuah ketiadaan.

Dua run lagi layak mendapat ruang. Diminta membandingkan dua kota, model mengeluarkan kedua tool call dalam satu turn, mendapat kedua reading kembali, dan salah membandingkan:

TEXT
  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."

Tool berfungsi. Parallel call berfungsi. Loop berfungsi. Jawabannya salah, dengan kedua angka benar duduk di transcript. Membungkus model dalam loop tidak membuatnya bernalar; itu memberi model yang salah kemampuan untuk bertindak berdasarkan kesalahannya — yang merupakan Bab 30 lebih awal, dan setengah dari Bab 29.

Sekarang hapus return yang ditandai dan biarkan loop berjalan sampai cap-nya. Pertanyaan yang sama, model yang sama:

TEXT
  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 cap

Empat kali input token, empat kali wall clock, dan ending tempat agent sudah lupa apa yang ditanyakan dan menginterogasi pengguna tentang pertanyaan yang sudah mereka jawab pada turn satu. Jawaban yang benar sudah ada di layar pada turn 2, dan setiap turn setelahnya membuat transcript lebih buruk.

Jadi agent bukan loop. Ia adalah loop plus aturan untuk keluar darinya, dan yang ini punya tepat satu aturan seperti itu. Bab 23 menemukan lima, dan menunjukkan apa yang rusak ketika masing-masing hilang.

Keduanya dikutip, bukan diparafrasekan, karena parafrase adalah tempat kebingungan diproduksi.

Definisi pertama meletakkan batas pada siapa yang mengendalikan alur. Building effective agents dari Anthropic menamai ambiguitas itu dan memberi keputusan:

"Di Anthropic, kami mengategorikan semua variasi ini sebagai agentic systems, tetapi menarik perbedaan arsitektural penting antara workflows dan agents: Workflows adalah sistem tempat LLM dan tools diorkestrasi melalui jalur kode yang telah didefinisikan sebelumnya. Agents, di sisi lain, adalah sistem tempat LLM secara dinamis mengarahkan proses dan penggunaan tool mereka sendiri, sambil mempertahankan kendali atas cara mereka menyelesaikan tugas."4

Ujiannya adalah pertanyaan tentang source code kamu: siapa yang memilih langkah berikutnya? Sebuah switch dalam programmu: workflow. Model: agent. Dokumen yang sama mengatakan agents "biasanya hanyalah LLM yang menggunakan tools berdasarkan feedback lingkungan dalam loop" — yang persis listing di atas.

Definisi kedua meletakkan batas pada independensi dari pengguna. A practical guide to building agents dari OpenAI membuka halaman definisinya seperti ini:

"Sementara software konvensional memungkinkan pengguna merampingkan dan mengotomatisasi workflows, agents mampu menjalankan workflows yang sama atas nama pengguna dengan tingkat independensi yang tinggi. Agents adalah sistem yang secara independen menyelesaikan tugas atas namamu."5

Dua kalimat kemudian, di halaman yang sama, ia mengecualikan:

"Aplikasi yang mengintegrasikan LLM tetapi tidak menggunakannya untuk mengendalikan eksekusi workflow—bayangkan chatbot sederhana, single-turn LLMs, atau sentiment classifiers—bukan agents."5

Baca kutipan itu berurutan. Kalimat pembuka menarik garis pada independensi: apakah benda ini pergi dan menyelesaikan pekerjaan tanpa saya? Kalimat keempat menariknya pada kendali eksekusi, yang persis garis Anthropic. Uji yang berbeda, halaman yang sama, dan ada sistem nyata tempat keduanya tidak sepakat.

Ada tabrakan kosakata di bawahnya, dan itu menyebabkan perdebatan dalam rapat sungguhan. Dalam dokumen pertama, workflow adalah arsitektur, dan itu hal yang bukan agent. Dalam yang kedua, workflow adalah "sequence of steps that must be executed to meet the user's goal" — pekerjaannya sendiri, yang dimiliki setiap agent. "Kami mengganti workflow dengan agent" koheren menurut definisi pertama dan nyaris tidak bermakna menurut definisi kedua.

Tiga sistem, diklasifikasikan dua kali

Tautan ke bagian: Tiga sistem, diklasifikasikan dua kali

Tiga sistem yang ada pada 2026, menurut kedua definisi.

Kamu mendeskripsikan tugas; ia membaca file, menjalankan test suite, mengedit, menjalankannya lagi, dan berhenti ketika lulus atau ketika menyerah. Tidak ada dalam kodemu yang memutuskan bahwa langkah berikutnya adalah "jalankan test" — model yang memutuskan, dari apa yang dikembalikan tool terakhir.

Definisi pertama: agent, karena model mengarahkan prosesnya sendiri. Definisi kedua: agent, karena ia secara independen menyelesaikan tugas, mengenali penyelesaian, dan menyerahkan kendali kembali. Kedua dokumen menyebut bentuk ini sebagai contoh sentral.

Untuk setiap tiket support baru, tiga model call dalam urutan tetap — klasifikasikan, ekstrak field, draf balasan — lalu kirim. Tidak ada model yang pernah memilih apa yang terjadi berikutnya; loop for yang melakukannya. Ia berjalan pukul 03.00 dan tidak ada yang mengawasi.

Definisi pertama: bukan agent. Ini prompt chaining, disebut dengan nama sebagai workflow. Definisi kedua: kedua jawaban. Menurut kalimat pembuka, ia secara independen menyelesaikan tugas atas namamu; menurut kalimat keempat, ia tidak menggunakan model untuk mengendalikan eksekusi workflow, dan dikecualikan. Sistem inilah alasan kamu membaca seluruh halaman, bukan hanya pull quote.

Satu turn pengguna. Model memutuskan sendiri apakah akan mencari sebelum menjawab, lalu menjawab dan menunggu kamu.

Definisi pertama: agent, karena model secara dinamis mengarahkan penggunaan tool-nya sendiri berdasarkan hasil dari lingkungan, yang merupakan uji yang dinyatakan. Definisi kedua: bukan agent, karena tidak ada independensi — satu turn, lalu ia mengembalikan kendali — dan "simple chatbots" ada dalam daftar pengecualian dengan nama.

Dua dari tiga berpindah sisi. Itu bukan kegagalan salah satu dokumen. Itu peringatan tentang jenis rapat ketika dua orang yang sepenuhnya sepakat tentang apa yang dilakukan sebuah sistem menghabiskan satu jam tidak sepakat tentang harus menyebutnya apa.

Jalan keluarnya adalah dua sumbu, bukan satu

Tautan ke bagian: Jalan keluarnya adalah dua sumbu, bukan satu

Definisi bertabrakan karena masing-masing memadatkan dua pertanyaan independen menjadi satu kata. Pisahkan keduanya dan ketidaksepakatan menjadi tabel, yang lebih berguna daripada vonis.

kodemu memilih langkah berikutnyamodel memilih langkah berikutnya
seseorang mengawasi setiap turnform dengan model di dalamnya: classifier, ekstraksi, single-turn completionchat dengan tools — definisi pertama bilang agent, definisi kedua bilang bukan
tidak ada yang mengawasi sampai selesaipipeline — kalimat pembuka definisi kedua bilang agent, kalimat keempatnya bilang bukansemua sepakat: agent

Setiap definisi memperdebatkan sel yang berbeda, dan dua lainnya sama sekali tidak diperdebatkan. Jadi ketika label penting — dalam kontrak, tinjauan risiko, postmortem — dua kalimat yang layak ditulis bukan "apakah ini agent" melainkan siapa yang memilih langkah berikutnya dan siapa yang mengawasi. Keduanya bisa dijawab dengan membaca kode, keduanya tidak membutuhkan definisi siapa pun, dan bersama-sama keduanya membawa setiap konsekuensi yang tadinya diwakili label itu.

Tidak ada yang baru dalam hal ini. Wooldridge dan Jennings mensurvei berbagai makna "agent" yang bersaing pada 1995;6 Franklin dan Graesser mengajukan pertanyaan bab ini pada 1996, mengumpulkan definisi yang beredar dan menemukan bahwa definisi itu tidak sepakat.7 Survei 2023 masih mendefinisikan agents dari prinsip pertama — "artificial entities that sense their environment, make decisions, and take actions"8 — karena belum ada definisi mapan untuk dikutip, dan CoALA mendeskripsikan bagian-bagian alih-alih menarik batas sama sekali.9 Tiga puluh tahun menolak sepakat menunjukkan kata itu melakukan lebih dari satu pekerjaan.

Sekarang konsekuensi yang datang sebelum filsafat, yaitu tagihan.

Setiap pengukuran di sini punya bentuk yang sama. Single call memakan 39 input token; pertanyaan yang sama dengan satu tool memakan 420 di dua call; loop dengan stopping rule-nya dihapus memakan 1.688 di enam call. Pertumbuhan lebih buruk daripada linear, karena turn n membawa setiap turn sebelumnya: kolom prompt dari run enam turn itu berbunyi 187, 238, 261, 302, 327, 373. Bab 16 menurunkan bahwa totalnya adalah Θ(n2)\Theta(n^2) dan memfitting kurvanya pada percakapan nyata. Agent mengubah setiap tugas menjadi percakapan itu, entah manusia pernah melihatnya atau tidak.

Jika hitungan token terukur itu dikirim ke endpoint komersial dengan tarif yang dibaca Bab 16 pada 6 September 2026 — $2,00 per sejuta input token dan $12,00 per sejuta output — empat run dihargai seperti ini:

runmodel callsinput tokensoutput tokensbiaya
pertanyaan, tanpa tools1398$0.000174
pertanyaan yang sama, satu tool dalam katalog242038$0.001296
pertanyaan yang membutuhkan tool242533$0.001246
yang sama, dengan stopping rule dihapus61.688124$0.004864

Baris dua terhadap baris satu adalah angka yang perlu diingat. Biaya tujuh setengah kali lipat, untuk jawaban yang lebih buruk atas pertanyaan yang sudah diketahui model. Tidak ada yang salah konfigurasi: sebuah tool ada, jadi model menggunakannya — dan temuan Bab 18, bahwa harga katalog dan bukan akurasinya yang menyakitkan, punya demonstrasi termurahnya di sini dengan katalog berisi satu.

Itulah sebabnya separuh berguna dari kedua dokumen adalah separuh tentang tidak membangun ini. Anthropic blak-blakan: temukan solusi sesederhana mungkin dan tambahkan kompleksitas hanya ketika diperlukan, yang "mungkin berarti tidak membangun agentic systems sama sekali", karena agentic systems "menukar latensi dan biaya demi performa tugas yang lebih baik" dan "untuk banyak aplikasi, mengoptimalkan single LLM calls dengan retrieval dan in-context examples biasanya cukup".4 Kasusnya untuk agent sempit: masalah open-ended ketika kamu tidak bisa memprediksi jumlah langkah dan tidak bisa hardcode jalur, di lingkungan yang kamu percayai, sambil menerima "biaya yang lebih tinggi, dan potensi error yang berlipat".4 Layar OpenAI adalah bayangan cerminnya — penilaian kompleks, rule set yang tidak dapat dipelihara, data tidak terstruktur — dan berakhir dengan cara yang sama: "otherwise, a deterministic solution may suffice".5

Jadi, dalam taksonomi bab ini: jumlah langkah tetap dalam urutan tetap adalah pipeline, dan menyebutnya agent tidak akan membuatnya lebih cepat. Jika jumlah langkah bergantung pada apa yang kamu temukan di jalan, kamu menginginkan loop — dan kamu membeli fleksibilitas itu dengan N call, transcript kuadratik, dan sistem yang bisa salah N kali alih-alih sekali.

Sekarang kamu punya taksonomi, kedua definisi modern, dua sumbu yang membuatnya kompatibel, dan loop pendek yang menjawab, memanggil, dan berhenti.

Loop itu punya satu cara untuk berakhir: model berhenti meminta tools. Bab 23 merusaknya dengan sengaja, tujuh kali, dan setiap kerusakan menambahkan satu bagian. Tugas mustahil, dan ia tidak pernah berakhir — turn cap. Semalam berjalan, dan tagihan datang — budget dalam dolar. Tool yang gagal — error yang bisa ditindaklanjuti model. Call yang sama dua kali — idempotency key. File yang seharusnya tidak disentuh — human approval. Restart di tengah jalan — session persistence. Tool yang memakan tiga menit dalam diam — progress dan cancellation. Hasilnya adalah harness, file yang dipakai sisa kursus ini.

Yang tersisa adalah pertanyaan yang sebenarnya dibahas diagonal sengketa bab ini. Loop yang menentukan langkah berikutnya sendiri harus menentukan kapan berhenti, dan kita baru saja melihat apa yang terjadi ketika ia tidak bisa: enam turn, empat kali tagihan, dan agent menginterogasi pengguna tentang pertanyaan yang sudah ia jawab. Stopping bukan satu condition. Ada berapa banyak, dan mana yang menyala dulu?


LLM Powered Autonomous Agents (2023) dari Lilian Weng adalah dekomposisi language agent paling terkenal menjadi planning, memory, dan penggunaan tool, dan merupakan bacaan berikutnya yang tepat bersama dua dokumen vendor; tiga komponennya adalah Bab 23, 24, dan 18 dari kursus ini dalam urutan itu.

Setiap angka dalam bab ini dihasilkan di mesin ini dan tidak ada yang diestimasi. Koridor, denah lantai, empat agent yang berjalan di atasnya, dan tiga policy patrol adalah TypeScript di atas, dijalankan di Node 22; angka agent yang diacak adalah mean atas 2.000 seeded run masing-masing dan angka patrol adalah single seeded run sepanjang 4.000 tick. Trace model berasal dari Qwen2.5-0.5B-Instruct dalam float32 di CPU dengan greedy decoding, disajikan lewat loopback oleh endpoint Python lokal kecil yang memuat weights dan berbicara dalam bentuk OpenAI chat-completions — seam lagi, dengan tensor di sisi Python dan loop di sisi TypeScript — jadi hitungan token adalah tokenizer model itu dan latensinya milik mesin itu. Satu-satunya angka yang diambil dari tempat lain adalah dua harga di tabel biaya, yaitu tarif yang dibaca Bab 16 dari halaman pricing OpenAI pada 6 September 2026, diterapkan di sini pada hitungan token terukur lokal sebagai ilustrasi dan bukan sebagai invoice yang diamati.

  1. Russell, S. dan Norvig, P. Artificial Intelligence: A Modern Approach, edisi ke-4, bab 2, Intelligent Agents. Sumber dunia vacuum, spesifikasi PEAS, definisi rasionalitas relatif terhadap performance measure, tujuh properti task environment, lima tipe agent yang digunakan di sini, dan observasi bahwa loop tak berujung sering kali tidak dapat dihindari bagi simple reflex agent di lingkungan yang hanya dapat diamati sebagian. Kode pendamping bukunya adalah aimacode/aima-python di GitHub (8.806 star, terakhir di-push 30 Juni 2026, dibaca 7 September 2026) — layak dinamai presisi sesuai apa adanya. Itu repository pendamping buku, bukan reference implementation yang menjadi fondasi proyek lain seperti karpathy/micrograd (17.412) dan karpathy/nanoGPT (62.852). Itulah mengapa bab ini mengutip dan menautkannya alih-alih menerjemahkannya, dan mengapa argumen ekosistem yang mempertahankan Bab 5 di Python tidak berlaku di sini: tidak ada dalam bab ini yang menyentuh tensor, dan loop yang ditulis di atas adalah leluhur langsung milik Bab 23. 2 3 4 5

  2. Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. dan Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Interleaving reasoning traces dan actions yang dirujuk baris goal-based pada tabel pemetaan.

  3. Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. dan Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Ringkasan mekanisme oleh paper itu sendiri adalah alasan ia memetakan ke learning agent: ia memperkuat agents "not by updating weights, but instead through linguistic feedback", dengan agents yang "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

  4. Anthropic, Building effective agents, 19 Desember 2024, anthropic.com/engineering/building-effective-agents, dibaca 7 September 2026. Sumber pembedaan workflow/agent yang dikutip di atas, istilah payung "agentic systems", deskripsi agents sebagai "typically just LLMs using tools based on environmental feedback in a loop", panduan untuk menemukan solusi sesederhana mungkin dan bahwa ini "might mean not building agentic systems at all", serta kasus pro dan kontra agents, termasuk "higher costs, and the potential for compounding errors" dan rekomendasi stopping conditions "such as a maximum number of iterations" untuk mempertahankan kendali. 2 3

  5. OpenAI, A practical guide to building agents, halaman 4 sampai 7, dibaca 7 September 2026. Sumber "Agents are systems that independently accomplish tasks on your behalf", pengecualian "simple chatbots, single-turn LLMs, or sentiment classifiers", definisi workflow sebagai "a sequence of steps that must be executed to meet the user's goal", dua karakteristik inti agent, tiga komponen — model, tools, instructions — dan kriteria screening kapan membangunnya, yang berakhir dengan "otherwise, a deterministic solution may suffice". 2 3

  6. Wooldridge, M. dan Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volume 10, issue 2 (1995). Survei yang membagi penggunaan bidang ini menjadi gagasan agency yang lemah — autonomy, social ability, reactivity, pro-activeness — dan gagasan yang lebih kuat yang meminjam kosakata mental. Dibaca hari ini, ia adalah catatan tentang argumen yang sama yang masih dimiliki dua dokumen bab ini.

  7. Franklin, S. dan 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). Dikutip di sini sesuai apa adanya, bukan untuk kutipan: survei yang mengumpulkan definisi "agent" yang beredar saat itu, menemukan bahwa definisi tersebut tidak sepakat, dan mengusulkan taksonomi untuk menggantikan argumen. Tiga puluh tahun kemudian, argumen itu ada dalam dokumentasi yang didesain lebih baik dan selain itu tidak berubah.

  8. Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Dikutip di atas untuk definisi pembukanya, "AI agents are artificial entities that sense their environment, make decisions, and take actions", yang merupakan definisi buku teks yang dinyatakan ulang pada 2023 karena tidak ada definisi modern yang disepakati untuk dikutip.

  9. Sumers, T. R., Yao, S., Narasimhan, K. dan Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Mengorganisasi language agents sebagai "modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process to choose actions", dan menempatkannya secara eksplisit dalam sejarah symbolic AI dan cognitive science. Taksonomi memori kembali di Bab 24, tempat tabel three-store menjadi bayangan praktisnya.


Dibuat oleh

David Vicente Campos

Pendiri NeuraLIA Labs & salah satu pendiri MyRealFood

Saya seorang insinyur komputer lulusan Universitas León. Saya ikut mendirikan MyRealFood, tempat saya sebagai CTO membangun aplikasi yang telah digunakan jutaan orang untuk makan lebih sehat, dan saya mendirikan NeuraLIA Labs, tempat saya membangun produk AI. Di sini saya menulis tentang hal-hal yang harus saya pahami sepanjang perjalanan, sebagaimana dulu saya berharap ada yang menjelaskannya kepada saya.

Selengkapnya tentang penulis

Diterbitkan oleh NeuraLIA Labs.

Dapatkan postingan baru di inbox kamu

Berita AI, panduan, dan update produk — email singkat saat kami menerbitkan sesuatu yang layak kamu baca.

Indeks kursus

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev11 menit baca

Model AI Jev dibuat untuk keputusan, bukan prosa

Jev dari TypeSafe AI menarik perhatian karena memperlakukan kecerdasan software sebagai persoalan probabilitas: pilih cabang yang tepat, sertakan keyakinan, dan hindari membayar LLM untuk menulis teks saat kode membutuhkan keputusan.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 menit baca

Rekayasa konteks untuk agen AI jangka panjang

Agen yang berjalan lama tidak gagal hanya karena window-nya kecil. Mereka gagal ketika file, output tool, dan riwayat lama menggeser tugas yang seharusnya diselesaikan agen.

Siap membiarkan LIA yang memilih?

Berkarya dengan semua model AI dalam satu tempat — mulai gratis hari ini.