Lewati ke konten
24/30Bab 24 dari 30

Context Engineering: Mengapa Agent Kamu Makin Bodoh di Turn 40

Memindahkan satu fakta tiga baris ke bawah pada prompt yang hanya memakai 2,6% window menurunkan retrieval dari 84% ke 19%.

Di halaman ini

Berikut satu prompt yang dikirim 288 kali ke model yang sama dengan greedy decoding. Panjangnya 853 token. Isinya register dua puluh lima tiket dukungan — kota, antrean, prioritas, pemilik, ekstensi — dan satu pertanyaan: Marta Ferreira perlu ditelepon balik tentang tiketnya. Berapa ekstensi direct line untuk tiket itu?

Register-nya identik setiap kali. Model-nya identik setiap kali. Satu-satunya yang berubah adalah baris mana dari dua puluh lima baris yang memuat jawabannya.

slot jawabanhitretrieval rateinterval 95 %
1 dari 2527/3284 %68–93 %
4 dari 256/3219 %9–35 %
7 dari 256/3219 %9–35 %
10 dari 259/3228 %16–45 %
13 dari 258/3225 %13–42 %
16 dari 256/3219 %9–35 %
19 dari 256/3219 %9–35 %
22 dari 253/329 %3–24 %
25 dari 257/3222 %11–39 %

Tiga puluh dua trial per baris, tiket berbeda di setiap trial, interval Wilson dari Bab 4 karena tujuh belas dari dua puluh tidak membedakan apa pun dari apa pun.

Slot satu dijawab 84 % dari waktu. Semua posisi lain berada di antara 9 % dan 28 %, dan kedelapan interval itu saling tumpang tindih, jadi pembacaan yang jujur adalah pertama, lalu semua yang lain. Liu dkk. menemukan bentuk U — tinggi di kedua ujung, rendah di tengah — dan lengan recency tidak tampak jelas di sini: 22 % pada slot terakhir berada di dalam sebaran slot tengah. Yang tidak berada di dalam apa pun adalah jatuhnya dari slot 1 ke slot 4. Tiga baris.

context window model ini adalah 32.768 token. prompt memakai 853 di antaranya, 2,6 %. Tidak ada yang overflow, tidak ada yang terpotong, tidak ada limit yang tercapai, tidak ada peringatan yang muncul. Model berhenti menemukan baris yang sudah diberikan kepadanya, karena baris itu pindah tiga posisi ke bawah dalam daftar dua puluh lima.

Bab 16 menghitung harga context window dan berakhir dengan peringatan bahwa memiliki sejuta token tidak sama dengan menggunakannya, lalu menunjuk ke sini. Inilah yang dimaksud.

Tampilkan detail

Yang dibutuhkan bab ini dari bab-bab sebelumnya.

  • Bab 9 menurunkan self-attention dan biaya O(n2)O(n^2)-nya. Setiap token memberi attention ke setiap token lain, jadi jumlah relasi berpasangan tumbuh mengikuti kuadrat panjangnya. Fakta itu dipakai di bawah, tidak diturunkan ulang.
  • Bab 16 menghitung lima bucket token yang ditagih dan menunjukkan bahwa tagihan sebuah percakapan tumbuh secara kuadratik. Bab ini membahas apa yang kamu lakukan tentang itu tanpa merusak agent.
  • Bab 18 membangun katalog tool dan mengukur bahwa dua puluh tool tidak merusak seleksi tetapi melipatgandakan prompt enam kali. Di sini tagihannya.
  • Bab 19 membangun retrieval. Just-in-time retrieval di bawah adalah penerapan bab itu pada riwayat agent sendiri; chunking tidak dijelaskan ulang.
  • Bab 23 membangun harness. Semua di bab ini adalah policy yang berjalan di dalam loop-nya, itulah sebabnya ini TypeScript: artefaknya adalah layanan berumur panjang yang memegang state, bukan notebook yang memegang tensor.

Anthropic menarik garisnya pada September 2025 dan dua kalimat ini perlu diletakkan berdampingan. Prompt engineering adalah "metode untuk menulis dan mengorganisasi instruksi LLM demi hasil optimal". Context engineering adalah "serangkaian strategi untuk mengurasi dan mempertahankan set token (informasi) optimal selama inferensi LLM, termasuk semua informasi lain yang mungkin masuk ke sana di luar prompt".1

Perbedaan operasionalnya adalah kapan, dan oleh siapa. Sebuah prompt ditulis sekali, oleh seseorang, lalu ditinjau. Sebuah context disusun pada setiap call, oleh kode yang tidak sedang dilihat siapa pun, dari materi yang tidak ditulis manual oleh siapa pun: empat puluh turn riwayat, enam hasil tool, empat passage yang di-retrieve, profil pengguna, dua belas schema JSON. Bab 15 mengukur apa yang dibeli oleh instruksi yang lebih baik. Bab ini membahas sembilan puluh persen token lainnya, yang datang sendiri.

Dokumen yang sama menamai resource yang mereka semua habiskan: model "memiliki 'attention budget' yang mereka gunakan saat mengurai volume context besar. Setiap token baru yang diperkenalkan menguras sebagian budget ini". Dan dokumen itu menamai gejalanya: "ketika jumlah token dalam context window meningkat, kemampuan model untuk mengingat informasi secara akurat dari context tersebut menurun" — context rot.1

Kalimat terakhir itu adalah klaim tentang perilaku, yang berarti bisa diperiksa, dan tabel di bagian atas halaman ini adalah pemeriksaannya.

Empat puluh baris terhadap endpoint lokal dari Bab 22 — server Python kecil yang memegang Qwen2.5-0.5B-Instruct di CPU dan berbicara dalam bentuk chat-completions, sehingga loop tetap TypeScript dan tensor tetap berada di sisi jauh port.

position.tsTS
const DEPTHS = [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1];

for (const d of DEPTHS) {
  const slot = Math.round(d * (N - 1));
  let hits = 0, other = 0;
  for (let t = 0; t < TRIALS; t++) {
    const recs = buildRecords(N, 1000 + t);          // 25 unique tickets
    const gold = recs[Math.floor(rng(7 + t)() * N)]; // a different one each trial
    const rest = recs.filter((x) => x.ticket !== gold.ticket).slice(0, N - 1);
    const lines = [...rest.slice(0, slot).map((x) => x.line),   
                   gold.line,                                   
                   ...rest.slice(slot).map((x) => x.line)];     
    const r = await complete(prompt(lines, ask(gold.owner)), { maxTokens: 12 });
    const said = /\d{4}/.exec(r.text)?.[0];
    if (said === String(gold.ext)) hits++;
    else if (said && recs.some((x) => String(x.ext) === said)) other++;
  }
}

Counter other adalah yang mengubah hasil mengecewakan menjadi hasil berguna: ketika model salah, apakah ia tersesat atau percaya diri?

Jawabannya: percaya diri. Di delapan posisi selain pertama, 136 dari 205 jawaban salah adalah ekstensi tiket lain — angka empat digit nyata, formatnya benar, dibaca dari baris yang salah. Pada slot 1 hanya satu dari lima miss seperti itu; pada slot 7, dua puluh satu dari dua puluh enam.

Pembedaan itu yang penting di production. Model yang berkata Saya tidak bisa menemukannya adalah bug yang kamu sadari; model yang mengembalikan nomor baris tetangga adalah bug yang kamu ship, karena di layar keduanya tampak identik. Itu kegagalan yang Bab 19 lawan dengan sitasi yang dapat diverifikasi, kali ini datang dari dalam prompt alih-alih dari index.

Bukan hanya di mana. Tetapi seberapa banyak.

Tautan ke bagian: Bukan hanya di mana. Tetapi seberapa banyak.

Posisi adalah satu sumbu. Panjang adalah sumbu lainnya, dan lebih mudah diuji: taruh jawaban di tengah dan perbesar daftarnya.

recordtoken prompthitrateinterval 95 %baris salahbukan keduanya
19718/2090 %70–97 %02
315911/2055 %34–74 %90
83153/2015 %5–36 %170
206952/2010 %3–30 %162
401.3243/2015 %5–36 %152
802.5871/205 %1–24 %181
1404.4772/2010 %3–30 %180

Satu record dan 97 token: 90 %. Tiga record dan 159 token: 55 %. Delapan record dan 315 token: 15 %, lalu dari sana datar dan rendah sampai 140 record dan 4.477 token. Seluruh keruntuhan terjadi antara baris pertama dan kedelapan dari sebuah daftar.

Kolom terakhir adalah semua yang bukan ekstensi benar maupun ekstensi record lain, yang ketika hanya ada satu record di halaman adalah satu-satunya tempat jawaban salah bisa mendarat. Dua miss pada satu record layak dilaporkan alih-alih dibulatkan hilang, karena keduanya bukan refusal: satu menjawab 5806 untuk register yang satu-satunya baris berkata 5805. Pada 97 token dengan satu kandidat, model ini masih salah menyalin satu digit dua kali dari dua puluh, dan itulah lantai yang dipakai untuk mengukur semua yang lain.

Dua hal mengikuti. context yang lebih besar membeli hak untuk mengirim lebih banyak, bukan kepastian bahwa itu akan dibaca: model ini punya window 32.768-token dan rentang kerja, pada tugas ini, beberapa ratus token. Dan tidak ada threshold, tidak ada jurang, tidak ada status "context penuh" — degradasi sudah berjalan pada record ketiga dan selesai pada record kedelapan, di satu persen dari window. Apa pun arti limit context, bukan itu yang mengatur ini.

Dua mekanisme biasanya diajukan. Yang pertama adalah aritmetika dari Bab 9, yang Anthropic nyatakan dengan istilah yang sama seperti kursus ini: model "berbasis arsitektur transformer, yang memungkinkan setiap token memberi attention ke setiap token lain di seluruh context. Ini menghasilkan relasi berpasangan n² untuk n token".1 Attention pada sekuens yang lebih panjang bukan operasi yang sama diterapkan ke lebih banyak materi; itu satu budget massa probabilitas tetap yang disebar ke lebih banyak pesaing. Yang kedua adalah training: model melihat jauh lebih banyak sekuens pendek daripada sekuens panjang, sehingga pola posisi jarak jauh adalah bagian jaringan yang paling jarang dilatih. Itu argumen, bukan pengukuran, dan bab ini tidak bisa menuntaskannya.

Yang sudah jelas adalah bentuknya, dan sudah begitu sejak 2023. Liu dkk. menguji question answering multi-dokumen dan key-value retrieval lintas keluarga serta ukuran model dan menemukan bahwa "performance sering paling tinggi ketika informasi relevan muncul di awal atau akhir input context, dan menurun signifikan ketika model harus mengakses informasi relevan di tengah context panjang, bahkan untuk model long-context eksplisit".2 Bab 15 mengambil aturan posisinya dari paper itu; Bab 19 mengambil dari sana alasan mengapa dua puluh chunk hasil retrieval bisa mendapat skor lebih buruk daripada empat. Bentuk praktis dari fakta ini adalah satu-satunya kalimat di sini yang sebaiknya kamu tindak lanjuti: ini butuh lima menit untuk diukur pada model kamu sendiri dengan data kamu sendiri, dan tidak ada kurva terbitan yang menggantikan kurvamu.

Tidak ada yang tahu apa isi window mereka

Tautan ke bagian: Tidak ada yang tahu apa isi window mereka

Tanyakan ke sebuah tim apa yang mengisi context agent mereka dan kamu mendapat estimasi, karena tidak ada API yang mengembalikan jawabannya: response memberimu prompt_tokens, satu angka untuk semuanya.

Kamu bisa memulihkan breakdown dengan empat hitungan dan tiga pengurangan — seluruh prompt yang dirender, yang sama tanpa definisi tool, system message saja dengan dan tanpa definisi itu, dan semuanya dengan hasil tool dihapus:

buckets.tsTS
async function buckets(messages: Msg[]) {
  const sys = messages.slice(0, 1);
  const withoutResults = messages.filter((m) => m.role !== "tool");
  const [total, sysWithTools, sysNoTools, noResults] = await Promise.all([
    countPrompt(messages, CATALOGUE),        // everything
    countPrompt(sys, CATALOGUE),             // system + scaffolding + schemas
    countPrompt(sys),                        // system + scaffolding
    countPrompt(withoutResults, CATALOGUE),  // everything but tool output
  ]);
  return {
    system: sysNoTools,
    tools: sysWithTools - sysNoTools,                                  
    toolResults: total - noResults,                                    
    conversation: total - sysWithTools - (total - noResults),          
    total,
  };
}

countPrompt menerapkan chat template milik model sebelum tokenisasi, yang lebih penting daripada kedengarannya: teks kamu bukan yang dihitung. Marker role, preamble tool-calling, dan rendering schema semuanya adalah token yang kamu bayar dan tidak pernah kamu ketik. Bab 7 membangun tokenizer dan Bab 16 menghitung dengan js-tiktoken; di sini hitungan datang dari model yang sama yang akan membaca prompt, yang merupakan satu-satunya hitungan yang tepat persis.

Sekarang jalankan agent nyata melewatinya: empat puluh turn investigasi insiden, dua belas tool, lingkungan operasi palsu yang mengembalikan dump log dan deret metrik realistis.

turnsystemdefinisi toolpercakapanhasil tooltotal promptinput ditagih turn ini
1851.8171554902.5474.370
2851.8172825292.7135.275
5851.8176471.8704.4198.093
10851.8179462.1414.9894.951
20851.8171.5002.9436.3456.316
30851.8172.1874.0008.0898.059
40851.8173.0535.67710.63221.090

Baca baris pertama dibandingkan baris terakhir.

Pada turn 1 prompt berisi 2.547 token dan 71 % darinya adalah definisi tool. system prompt adalah 3 %. Yang diketik pengguna adalah 6 %. Agent belum melakukan apa-apa dan sudah membawa 1.817 token schema JSON.

Pada turn 40 prompt berisi 10.632 token dan proporsinya berbalik: definisi 17 %, percakapan 29 %, hasil tool 53 %. Output tool menyalip definisi pada turn 5; percakapan baru menyalipnya pada turn 25, jadi selama enam puluh persen pertama sesi katalog tool lebih besar daripada semua yang sudah dikatakan.

Lalu totalnya. Di 57 model call, run menagih 370.291 input token untuk context akhir 10.632 — prompt terakhir dibayar sekitar tiga puluh lima kali lipat, yaitu kuadratik Bab 16 dengan pengali agent di atasnya. Dari 370.291 itu, 103.569, atau 28 % dari semua yang ditagih, adalah dua belas definisi tool, dikirim ulang byte-identical pada setiap call.

Katalog tool adalah biaya tetap terbesar dalam agent dan tidak terlihat, karena kamu tidak pernah melihatnya: kamu mengoper array object dan provider merendernya ke prompt untukmu. Diukur, pada dua belas tool yang sama:

tooldefs.ts outputTEXT
system prompt + chat scaffolding, no tools:        85 tokens
all twelve definitions:                          1,817 tokens
  of which fixed tool-calling scaffolding:         126 tokens
three tools instead of twelve:                     605 tokens
same twelve, one-sentence descriptions,
  no parameter prose:                            1,291 tokens  (-29 %)

Per tool, biaya marginal berjalan dari 80 token untuk get_current_time, yang menerima satu string, hingga 263 untuk search_tickets, yang menerima empat parameter dengan enum dan satu kalimat panduan masing-masing. Itulah nilai tukar di balik nasihat utama Bab 18 bahwa deskripsi adalah API: deskripsi yang baik berbiaya sekitar seratus token pada setiap request selama sisa hidup agent. Tiga konsekuensi.

Tool yang tidak kamu pakai tetap ditagih. Agent memanggil tujuh dari dua belas. Lima lainnya berbiaya 697 token pada masing-masing dari 57 request — total 39.729, lebih dari sepersepuluh semua yang ditagih untuk run itu, untuk capability yang tidak pernah disentuh. Salah satu dari lima itu membawa detail paling tajam dalam trace: model mencoba tiga kali memanggil read_log, yang tidak ada. Tool yang diinginkannya adalah search_logs, definisi termahal kedua dalam katalog pada 237 token. Ia membayar definisi itu 57 kali, tidak pernah memakainya, dan tidak pernah menemukan namanya.

Memangkas prosa adalah optimasi termurah yang tersedia, dan itu trade-off. Memotong deskripsi menjadi satu kalimat dan menghapus dokumentasi parameter menghemat 526 token per call, 29 persen, tanpa menyentuh satu baris logika — dan membuat model memanggil tool dengan lebih buruk, seperti yang diukur Bab 18. Intinya, kedua sisi trade-off itu sekarang berada dalam satu unit yang sama.

Pada skala tertentu, mengirim definisi sama sekali berhenti masuk akal. Anthropic memberi angkanya pada November 2025: sekumpulan besar server terhubung berarti memproses "ratusan ribu token" definisi sebelum request dibaca, dan menggantinya dengan eksekusi kode — agent menemukan dan memuat hanya definisi yang dibutuhkan — "mengurangi penggunaan token dari 150.000 token menjadi 2.000 token, penghematan waktu dan biaya 98,7%".3 Ide yang sama dengan sisa bab ini, diterapkan ke schema alih-alih riwayat: simpan index, resolve entry sesuai kebutuhan.

Dua hal ditanam di transkrip empat puluh turn itu. Pada turn 2, sebelum kerja nyata apa pun, pengguna menyatakan aturan tetap: tiket apa pun yang kamu buka harus diajukan dengan nomor karyawan saya, 4417. Pada turn 19, di tengah insiden, sebuah fakta: shard yang terdampak adalah pay-shard-7, dikonfirmasi oleh tim pembayaran. Pada turn 40 pengguna meminta agent membuka tiket insiden, yang membutuhkan keduanya. Setiap probe ditanyakan dalam enam phrasing berbeda dan diberi skor dari enam — greedy decoding deterministik, jadi satu call memberi ya atau tidak yang tidak dapat diulang, dan enam memberi rate.

Transkrip lalu diputar ulang di bawah tujuh policy context. Diputar ulang, bukan dijalankan ulang, dengan sengaja: message, tool call, dan hasil tool byte-identical di ketujuhnya, jadi satu-satunya variabel adalah apa yang dipilih setiap policy untuk disimpan. Bab 16 menunjukkan mengapa sliding window adalah langkah ekonomi yang buruk, karena menghancurkan prefix yang bisa di-cache. Inilah yang dilakukannya terhadap perilaku:

policy contextinput token selama 40 turnprompt turn-40aturan turn-2fakta turn-19
riwayat penuh370.29110.6326/65/6
sliding window, 12 message terakhir157.5782.9225/60/6
hapus hasil tool yang lebih tua dari 4 turn243.4456.3116/63/6
compaction setiap 6 turn195.5153.2206/60/6
compaction plus catatan yang ditulis model200.8493.2866/60/6
pin turn milik pengguna sendiri, di depan168.5503.5596/65/6
pin turn milik pengguna sendiri, di belakang168.8353.5646/66/6
kontrol: dua turn itu saja dan tidak ada yang lain1.9816/66/6

Baris compaction menyertakan biaya compacting: 18.581 input token untuk tujuh ringkasan dan 3.392 lagi untuk note-taker. Baris kontrol ada agar nol dapat dibaca sebagai nol — dengan hanya dua message itu dalam prompt 1.981-token, model ini menjawab kedua probe sempurna, jadi tidak ada baris yang berarti tugasnya terlalu sulit.

Riwayat penuh mengingat, dan merupakan hal termahal di tabel: 370.291 input token untuk sesi yang konten tahan lamanya hanya dua kalimat.

Itu menjawab pertanyaan yang dibiarkan terbuka oleh pembukaan. Mengapa transkrip 10.632-token memegang fakta yang hilang dari register 853-token? Karena panjang adalah variabel yang salah. Register memegang dua puluh lima ekstensi empat digit dalam dua puluh lima kalimat identik — dua puluh empat decoy hampir sempurna untuk satu yang kamu inginkan. Transkrip memegang tepat satu nomor karyawan dan satu nama shard. Context rot adalah interferensi sebelum ia menjadi volume, itulah sebabnya 136 dari 205 jawaban salah di atas adalah nilai tetangga. Pertanyaan berguna tentang sebuah window bukan seberapa panjangnya; melainkan berapa banyak hal di dalamnya yang terlihat seperti jawaban.

Sliding window 57 % lebih murah dan telah kehilangan insiden. Nomor karyawan bertahan hanya karena agent mengulangnya ke turn terbaru. Shard, yang dinyatakan sekali pada turn 19, tidak ada di dua belas message terakhir — dan model tidak mengatakan begitu. Ditanya enam kali, ia menjawab "shard pembayaran yang terdampak adalah shard 4417", meraih nomor karyawan, satu-satunya identifier lain yang tersisa di window-nya, dan dua kali "pool", diangkat dari string pool_exhausted di sebuah baris log.

Compaction murah dan kehilangan fakta yang sama. Tujuh ringkasan, ditulis oleh model dengan instruksi eksplisit untuk menyimpan identifier, angka, instruksi tetap, dan pertanyaan terbuka, dan pay-shard-7 tidak ada di ringkasan yang penting; enam tebakannya adalah shard 1, pay_shard_1, dan pool. Compaction tidak gagal dengan keras. Ia menghasilkan sesi yang fasih, masuk akal, jauh lebih pendek, yang diam-diam menjatuhkan satu baris.

Tiga baris mendapat skor 0/6 pada fakta turn-19 — sliding window, compaction, dan compaction dengan catatan. Delapan belas jawaban salah di antara ketiganya, dan tidak satu pun adalah "Saya tidak tahu."

Lalu baris yang seharusnya memalukan. Menyimpan empat puluh message milik pengguna secara verbatim, plus empat turn terakhir lengkap dan tidak ada yang lain, berbiaya 168.550 token — 54 % lebih rendah daripada riwayat penuh — dan menjawab kedua probe sama baiknya dengan riwayat penuh atau lebih baik. Tanpa summariser, tanpa note-taker, tanpa model kedua: filter pada role === "user". Kata-kata pengguna adalah token bernilai tinggi paling murah di window agent, dan sebagian besar desain membuangnya bersama semua yang lain.

Dua baris terakhir adalah tabel pembuka lagi, di dalam agent. Blok pin yang sama, dipindahkan dari system message ke akhir prompt: 5/6 menjadi 6/6. Pada enam trial, itu bukan perbedaan signifikan dan tidak ditawarkan sebagai itu — ia ditawarkan sebagai pengingat bahwa di mana adalah parameter yang sedang kamu set, sadar atau tidak.

Empat cara menghabiskan lebih sedikit window

Tautan ke bagian: Empat cara menghabiskan lebih sedikit window

Empat strategi di bawah adalah milik Anthropic, dalam urutannya, meski hanya tiga terakhir yang merupakan daftar long-horizon mereka.1 Keempatnya adalah variasi dari satu instruksi: jangan bawa apa yang bisa kamu fetch, dan jangan bawa raw apa yang bisa kamu bawa dalam bentuk terkompresi.

Jangan pre-load konten. Simpan identifier — path file, query, nomor tiket, nama tool dan argumennya — lalu resolve saat dibutuhkan. Bucket terbesar pada agent di atas adalah output tool yang dibaca sekali, dipakai sekali, lalu dibawa tiga puluh turn lagi. Mengganti setiap hasil yang lebih tua dari empat turn dengan stub yang menyatakan apa itu dan cara mengambilnya kembali adalah enam baris:

policies.tsTS
const elide: Policy = (h) => [SYSTEM, ...h.flatMap((turn, ti) =>
  turn.map((m) => (ti < h.length - 4 && m.role === "tool"
    ? { role: "tool", name: m.name,
        content: `[${m.name} result from turn ${ti + 1}, ${m.content.length} chars, ` +
                 `elided; call ${m.name} again with the same arguments to re-read it]` }
    : m)))];

Ini adalah Bab 19 dengan corpus diganti oleh masa lalu agent sendiri. Mesin retrieval-nya sudah ada — yaitu katalog tool.

Ketika transkrip melewati threshold, ganti bagian tertuanya dengan ringkasan yang ditulis model dan lanjutkan. prompt yang menulis ringkasan adalah seluruh desainnya, dan di situlah compaction menang atau kalah: simpan identifier, angka, instruksi tetap, dan pertanyaan terbuka; buang basa-basi dan output tool yang bisa kamu fetch ulang.

Compaction secara desain bersifat lossy, apa yang hilang dipilih oleh model atas namamu, dan tidak ada error ketika ia salah memilih. Itu juga tidak gratis: setiap compaction adalah call ekstra yang input-nya adalah hal yang sedang di-compact.

Pertahankan store kecil di luar context dan injeksikan ulang seluruhnya setiap turn. Tidak seperti ringkasan, ia append-only dan addressable: aturan yang ditulis pada turn 2 masih ada verbatim pada turn 400. Versi yang diukur di sini meminta model, setelah setiap message pengguna, apakah message itu berisi sesuatu yang tahan lama:

notes.tsTS
const r = await complete([
  { role: "system", content:
      "You keep a durable note file for a support session. Given one user message, " +
      "output one short note ONLY if it states a standing rule, an identifier or a fact " +
      "that must survive the rest of the session. Otherwise output exactly NONE." },
  { role: "user", content: `Turn ${i + 1}: ${user}` },
], { maxTokens: 40 });
if (!/^none\b/i.test(r.text.trim())) notes.push(`turn ${i + 1}: ${r.text.trim()}`);

Ini strategi dengan ceiling tertinggi di sini, dan inilah yang gagal dalam pengukuran. Selama empat puluh message pengguna, note-taker menyimpan tiga catatan dan tidak satu pun dari dua yang penting: sebaris saran runbook, pengumuman bahwa sesi berakhir, dan Europe/Madrid saat ini 13:45 — waktu yang ia karang, karena tool yang diparafrasekan mengembalikan 09:52 UTC. Note-taker adalah model, dan semua dalam bab ini berlaku juga untuknya.

Berikan tugas terfokus window-nya sendiri — system prompt-nya sendiri, katalog kecilnya sendiri, tanpa riwayat parent — dan kembalikan jawaban pendek alih-alih transkrip. Bab 23 menaruh satu di balik schema tool dan meninggalkan tagihannya di sini; tagihannya adalah bahwa jawaban child adalah satu-satunya bagian dari window child yang pernah dibayar parent.

Sub-agent tidak ada dalam tabel di atas karena tidak berjalan empat puluh turn: ia berjalan sekali, dalam window yang sudah diberi scope oleh seseorang. Diberi system prompt, turn 17 sampai 19, dan tidak ada yang lain — 2.737 token — ia menjawab probe shard 6/6, lebih baik daripada setiap policy dalam tabel, dan probe karyawan 0/6, karena nomor itu tidak ada dalam tiga turn yang diberikan kepadanya.

Itulah sub-agents dalam dua angka: window yang bersih bukan intelligence, melainkan scope, dan scoping dilakukan di muka oleh kode yang sudah harus tahu turn mana yang penting. Satu hal lagi dalam jawaban itu layak disimpan. Ini satu-satunya policy yang menjawab "Tidak tersedia" alih-alih mengarang sesuatu. Model dengan context kecil dan koheren tahu apa yang tidak dimilikinya; model dengan context besar dan berisik tidak.

Hampir setiap percakapan membingungkan tentang memory agent adalah tiga mekanisme yang memakai satu kata. Mereka punya masa hidup, owner, dan failure mode berbeda, dan sistem yang menyimpan semuanya di tempat yang sama punya masalah yang belum ia sadari.

riwayat percakapanretrievalmemory pengguna persisten
memegangapa yang dikatakan di sesi inidokumen yang kamu milikifakta tentang seseorang
hidupsatu sesisampai di-re-indexlintas semua sesi, selamanya
ditulis olehloop, otomatisingestion pipelinemodel, sengaja
masuk ke promptpenuh, setiap callempat passage, saat query cocokpenuh, setiap call
gagal dengantumbuh sampai membusukmengambil chunk yang salahmengingat sesuatu yang salah tentang kamu
dibangun diBab 23Bab 19bab ini

Framing akademiknya adalah CoALA, yang mengorganisasi language agent di sekitar "komponen memory modular" dan memisahkan working memory dari store episodic, semantic, dan procedural.4 MemGPT mengambil ide yang sama secara literal, meminjam virtual memory dari operating system: tier cepat di dalam window, tier lambat di luarnya, dan model itu sendiri memindahkan data di antara keduanya dengan function calls.5 Keduanya memaksa pertanyaan yang memang harus dijawab produk — bukan seberapa banyak yang bisa saya simpan, melainkan fakta ini masuk store mana, dan kapan kedaluwarsa.

Tes praktisnya adalah satu pertanyaan per fakta: apa yang seharusnya masih benar besok? Hasil tool dari turn 12, tidak ada. Ringkasan sesi, sampai sesi berakhir. Bahwa nomor karyawan pengguna adalah 4417, sampai mereka pindah kerja. Tiga jawaban, tiga store.

Sekarang kamu bisa mengukur apa yang ada di dalam window, memutuskan apa yang tetap berada di dalamnya, dan membedakan agent yang melupakan sesuatu dari agent yang membawanya tetapi tidak melihat.

Strategi terakhir dari empat itu adalah yang tidak muat di sini. Sub-agent bukan policy context, melainkan agent kedua, dan begitu ada dua, kamu harus memutuskan apa yang lewat di antara mereka dan siapa yang memegang kendali. Bab 25 membahas itu: lima pola orkestrasi dan dari mana sebenarnya masing-masing nama berasal, dua topologi yang sering tercampur — meminta sub-agent dan mendapat jawaban kembali, dibandingkan menyerahkan percakapan kepadanya dan tidak mendapatkannya kembali — dan temuan terukur bahwa pada tugas yang dihitung biayanya, susunan yang lebih sederhana menang — diikuti tes untuk kapan ia berhenti menang.

Ia juga mewarisi persis apa yang baru diukur bab ini. Sub-agent mengembalikan ringkasan. Ringkasan adalah compaction yang tidak kamu tulis, diproduksi oleh model yang window-nya tidak bisa kamu lihat, dan parent tidak punya cara untuk membedakan ringkasan bagus dari ringkasan salah yang percaya diri — pembedaan yang sama yang memisahkan 84 % dari 19 % di bagian atas halaman ini, dan yang mengubah delapan belas fakta hilang menjadi delapan belas karangan. Jadi: ketika sub-agent salah, apa tepatnya yang boleh dilihat parent?


Setiap angka di sini dihasilkan di mesin ini dan tidak ada yang diestimasi. Model-nya adalah Qwen2.5-0.5B-Instruct dalam float32 di CPU dengan greedy decoding, disajikan melalui loopback oleh endpoint Python kecil yang berbicara dalam bentuk chat-completions dan mengekspos route hitung-token — seam dari Bab 14 lagi, tensor di sisi Python dan loop di sisi TypeScript — sehingga setiap hitungan adalah tokenizer milik model itu sendiri yang diterapkan ke chat template-nya sendiri. Tabel posisi adalah 288 call, sembilan posisi kali tiga puluh dua trial dengan tiket berbeda di setiap trial; tabel panjang adalah 140 call; agent run adalah 57 model call selama 43 menit wall clock; tabel policy adalah satu transkrip itu diputar ulang di bawah tujuh policy. Intervalnya Wilson, dari Bab 4. Tidak ada API berbayar yang dipanggil, yang juga menjadi alasan tidak ada satu pun harga di bab ini: hitungan token-nya tepat dan rate yang akan kamu kalikan dengannya adalah milik Bab 16.

  1. Anthropic, Effective context engineering for AI agents, 29 September 2025, anthropic.com/engineering/effective-context-engineering-for-ai-agents, dibaca 7 September 2026. Sumber dua definisi yang dikutip di bagian atas, "attention budget" dan pernyataan bahwa setiap token baru mengurasnya, deskripsi context rot, framing relasi berpasangan n², dan strategi yang dipakai sebagai tulang punggung bab ini. Tiga di antaranya adalah daftar long-horizon mereka — compaction, structured note-taking, dan arsitektur multi-agent; just-in-time retrieval muncul lebih awal dalam artikel yang sama, di bawah context retrieval dan agentic search, dan dikelompokkan bersama mereka di sini. 2 3 4

  2. Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. dan Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (v1 Juli 2023, v3 November 2023). Dikutip di Bab 15, 16, dan 19 serta diukur di sini. Kalimat yang dikutip berasal dari abstrak; dua tugas paper itu adalah question answering multi-dokumen dan key-value retrieval, dan temuannya bahwa efek tersebut bertahan pada model long-context eksplisit adalah bagian yang penting untuk keputusan produk.

  3. Anthropic, Code execution with MCP: building more efficient agents, 4 November 2025, anthropic.com/engineering/code-execution-with-mcp, dibaca 7 September 2026. Sumber pengurangan dari 150.000 ke 2.000-token dan angka 98,7 %, serta observasi bahwa definisi tool yang dimuat di depan menempati context sebelum request dibaca.

  4. Sumers, T. R., Yao, S., Narasimhan, K. dan Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Mengorganisasi language agents di sekitar "komponen memory modular, ruang aksi terstruktur untuk berinteraksi dengan memory internal dan environment eksternal, serta proses pengambilan keputusan tergeneralisasi untuk memilih aksi", dan membagi memory menjadi working, episodic, semantic, dan procedural. Bab 22 memakai taksonominya untuk learning agent; tabel tiga-store di atas adalah bayangan praktisnya.

  5. Packer, C., Wooders, S., Lin, K., Fang, V., Patil, S. G., Stoica, I. dan Gonzalez, J. E. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560 (Oktober 2023). Mengusulkan "virtual context management, teknik yang mengambil inspirasi dari sistem memory hierarkis dalam operating system tradisional", dengan model itu sendiri memindahkan data antara tier cepat di dalam window dan tier lambat di luarnya. Pernyataan paling jelas di mana pun tentang mengapa window adalah cache dan bukan memory.


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.