Langkau ke kandungan

Konteks alat dan caching prompt

Dua perkara benar bagi setiap permintaan yang dibuat oleh harness terbina: takrifan alat ialah kos tetap terbesar di dalamnya, dan hampir kesemuanya tidak akan digunakan. Halaman ini menerangkan apa yang dilakukan oleh Control Center tentang perkara itu, dan mengapa jawapannya bukan sekadar “hantar lebih sedikit alat”.

Control Center mendaftarkan kira-kira 126 alat. Jika dihantar sepenuhnya, takrifannya menelan kos kira-kira 23,000 token pada setiap permintaan — kos yang tidak dapat disentuh oleh sebarang pemampatan, kerana takrifan alat bergerak dalam bahagian permintaan yang berasingan daripada perbualan.

Bil token ialah aduan yang jelas, dan dengan caching prompt ia juga yang lebih kecil. Kos sebenar ialah ketepatan pemilihan. Penilaian awam tentang pemanggilan alat bersetuju bahawa model memilih alat yang betul dengan andal sehingga sekitar 30–50 alat dalam konteks, dan semakin merosot selepas itu. Punca yang dinamakan bukanlah bilangan token tetapi pertindihan semantik: sebaik sahaja sesuatu katalog mengandungi beberapa alat yang huraiannya serupa, model memilih antara yang kelihatan seiras dan bukan mengingati semula sesuatu keupayaan.

Pada 126 alat, ejen sudah jauh melepasi julat itu pada setiap pusingan — termasuk banyak pusingan yang hanya memerlukan pembacaan satu fail.

Oleh itu, satu larian diperlihatkan dua perkara:

  • satu set residen — kira-kira dua dozen alat, dihantar dengan skema penuh pada setiap permintaan;
  • satu indeks nama bagi semua yang lain, dikelompokkan di bawah tajuk seperti “Tickets and projects” atau “Memory and knowledge”, dengan kos beberapa ratus token untuk keseluruhan katalog.

Apabila diukur pada katalog semasa, ini menjadikan blok alat berubah daripada ~23.1k token kepada ~5.0k, kira-kira 78% lebih kecil, dan meletakkan set yang sentiasa kelihatan dalam julat yang pemilihannya andal.

Set residen ialah alat yang digunakan oleh sesuatu larian dalam kebanyakan larian: perbendaharaan kata fail dan shell (read, write, edit, search, bash, …), alat penemuan, senarai semak tugas, carian memori, dan apa-apa kata kerja yang mesti dipanggil oleh modus semasa untuk menghasilkan outputnya. Kata kerja output sesebuah modus sentiasa residen — sesuatu larian tidak boleh sekali-kali terpaksa mencari satu-satunya panggilan yang menghasilkan hasil kerjanya.

Inilah bahagian yang menjadikan reka bentuk ini selamat dan bukan sekadar murah. Alat yang tertunda boleh dipanggil bermula dari pusingan pertama. Hanya skemanya yang ditahan.

Ejen melihat nama itu dalam promptnya. Jika ia memanggil nama tersebut secara terus, harness memuatkan skema dan menjalankan alat itu dalam langkah yang sama — tiada ralat, tiada perjalanan pergi-balik. Model tidak perlu tahu bahawa alat itu pernah “dinyahmuat”.

Apabila ejen tahu tugasnya tetapi tidak tahu namanya, search_tools menerima huraian dalam bahasa biasa (“tetapkan tiket kepada seseorang”), menyusun kedudukan seluruh permukaan larian itu, dan mengembalikan padanan dengan skemanya yang sudah dimuatkan, supaya pusingan seterusnya boleh memanggil salah satunya. Jika sesuatu carian tidak menemui apa-apa, ia menyatakannya secara terus terang dan mencadangkan pilihan kata lain atau carian yang lebih luas — secara sengaja, kerana ejen yang membaca carian kosong sebagai “keupayaan ini tidak wujud” akan mencipta pengganti dan bukan mencari semula.

search_tools hanya wujud dalam harness terbina. Klien MCP luaran sebaliknya mempunyai search_tool_bm25, yang menyusun kedudukan indeks yang sama tetapi hanya menghuraikan padanan — klien tersebut sudah menerima setiap skema daripada tools/list, jadi tiada apa yang perlu dimuatkan.

Penundaan dilaksanakan selepas penapis alat modus, tidak sekali-kali sebagai gantinya. Ia menyembunyikan sesuatu skema; ia tidak boleh mendedahkan alat yang ditolak oleh modus. Alat yang diaktifkan masih melalui gesaan kelulusan dan guardrail tindakan sama seperti alat residen, dan sesuatu alat tidak boleh memuatkan nama yang tidak berada pada permukaan larian itu pada mulanya.

Permukaan MCP yang dilihat oleh klien luaran tidak terjejas. tools/list masih mengembalikan katalog yang lengkap. Satu percubaan lebih awal untuk memangkasnya telah merosakkan ejen secara langsung: klien MCP mengesahkan nama alat terhadap senarai cache mereka sendiri dan menolak apa-apa yang tidak tersenarai tanpa pernah bertanya kepada pelayan, jadi alat yang “tersembunyi tetapi boleh dipanggil” sememangnya tidak dapat dicapai. Penundaan tinggal dalam harness, di mana memuatkan alat semasa larian ialah sesuatu yang benar-benar boleh dilakukan oleh harness.

--tool-deferral=off (atau CC_SERVER_TOOL_DEFERRAL=off) menjadikan setiap alat yang diterima residen semula, menghasilkan permintaan yang tepat seperti yang dibuat oleh pelayan sebelum penundaan wujud. Lihat rujukan CLI cc_server.

Beban kerja ejen tidak seimbang: ia menghantar prompt yang besar dan menerima jawapan yang kecil, pusingan demi pusingan, dengan awalan yang sama setiap kali. Pembekal men-cache awalan itu, dan satu bacaan cache berharga kira-kira satu persepuluh daripada bacaan baharu. Kadar hit cache justeru menjadi sifat kelas pertama bagi harness dan bukan sekadar pengoptimuman — dan pada Anthropic ia juga memberi daya pemprosesan, kerana token yang di-cache tidak dikira terhadap had input seminit.

Caching berfungsi berdasarkan padanan awalan yang tepat, yang menghasilkan satu peraturan utama.

Jangan sekali-kali menulis semula apa yang sudah dihantar

Bahagian bertajuk “Jangan sekali-kali menulis semula apa yang sudah dihantar”

Sebarang bait yang berubah akan membatalkan cache dari titik itu seterusnya. Jadi harness hanya menambah di penghujung: mesej baharu di hujung, dan skema alat yang baru diaktifkan selepas blok alat yang di-cache dan bukan digabungkan ke dalamnya. Susunan itulah sebabnya pengaktifan menjadi murah — awalan yang di-cache kekal sama dan larian hanya membayar untuk skema yang baru dimuatkannya.

Gelung itu juga memangkas output alat yang sudah lapuk daripada pusingan lama untuk menuntut semula konteks. Ia menunggu sehingga ada cukup untuk dituntut semula bagi menjadikan penulisan semula itu berbaloi, jadi pemangkasan merupakan penulisan semula mendalam yang jarang berlaku dan bukan kegagalan cache yang berterusan.

Pembekal membenarkan bilangan penanda cache yang terhad, dan Control Center menggunakannya dengan sengaja:

Penanda Merangkumi Jangka hayat
Alat residen terakhir Blok alat 1 jam
Blok sistem terakhir Alat + prompt sistem 1 jam
Ekor pusingan sebelumnya Sejarah sehingga permintaan terakhir 5 min
Ekor pusingan semasa Sejarah penuh 5 min

Dua yang terakhir ialah pasangan bergolek, dan sebab pasangan itu halus: carian cache menelusur ke belakang sebilangan blok yang terbatas untuk mencari sesuatu yang disimpan oleh permintaan lebih awal. Satu pusingan tunggal yang menjalankan banyak alat secara selari boleh mengeluarkan lebih banyak blok daripada tetingkap itu, dan pada ketika itu salah satu penanda ekor terlepas secara senyap lalu permintaan itu membayar harga penuh tanpa apa-apa dalam respons yang menyatakannya. Menandakan tempat sebenar permintaan sebelumnya berhenti menjadikan hit itu bersifat struktur dan bukan perlumbaan.

Awalan alat-dan-sistem mengambil jangka hayat yang panjang kerana ia tetap sepanjang larian, dikongsi oleh setiap larian dan subejen dengan bentuk yang sama, dan kerana jam bermula apabila sesuatu permintaan bermula — satu pusingan yang menstrim selama beberapa minit sudah menghabiskan sebahagian besar tetingkap yang pendek sebelum permintaan seterusnya terbentuk.

Subejen daripada jenis yang sama menghasilkan awalan prompt yang serupa bait demi bait, jadi mereka sepatutnya membaca satu entri cache dan bukannya masing-masing menulis entri sendiri. Tetapi sesuatu entri hanya menjadi boleh dibaca setelah permintaan yang menulisnya mula membalas, jadi pancaran keluar yang dilancarkan serentak menyebabkan setiap anak membayar premium untuk awalan yang dikongsi oleh mereka semua.

Harness membenarkan anak pertama bagi sesuatu bentuk bermula, kemudian melepaskan adik-beradiknya sebaik sahaja ia mula menstrim. Tungguannya terbatas: anak pertama yang lambat hanya menelan satu hit cache, tidak sekali-kali pancaran keluar itu sendiri. Atas sebab yang sama, setiap subejen menerima set alat residen yang sama tanpa mengira profilnya — mengubahnya mengikut profil akan memecahkan awalan yang dikongsi tanpa sebarang faedah, memandangkan profil itu sudah pun menentukan apa yang boleh dipanggil oleh anak tersebut.

Kedua-dua bahagian boleh diperhatikan dan bukan diandaikan:

  • Penjelajah konteks pada sesuatu perbualan melaporkan alat residen, indeks tertunda dan apa yang akan dikenakan oleh setiap skema yang ditahan, dibina daripada laluan kod yang sama seperti yang digunakan oleh larian sebenar.
  • Setiap larian merekodkan alat tertunda yang dimuatkannya dan apa yang mencetuskannya, jadi carian yang tidak menemui apa-apa kelihatan sebagai kegagalan pengambilan dan bukannya hilang ke dalam ejen yang secara senyap melakukan sesuatu yang berhampiran.
  • Kebolehcerapan melaporkan Kadar cache sebagai bacaan cache berbanding semua token prompt yang diproses, termasuk penulisan cache — larian yang sentiasa membina semula awalannya mendapat skor yang rendah, dan bukan diskor seperti larian yang tidak pernah memerlukan cache.