Blog

Memastikan Giliran Ejen Panjang Kekal dalam Tetingkap Konteks

Model hanya boleh membaca sejumlah tertentu sekaligus — tetingkap konteksnya. Ejen Mythex melakukan kerja yang panjang: membaca banyak fail, menjalankan arahan, menyerahkan tugas terhad kepada sub-ejen. Kami menemui tiga cara kerja panjang menjadi rosak: sub-ejen berkembang sehingga model menolak setiap permintaan, sub-ejen berhenti awal kerana ia menyangka ruangnya sudah habis, dan kiraan token kami sangat silap untuk teks Rusia, Cina dan Jepun. Inilah yang kami ubah.

Beberapa istilah dahulu

  • Token ialah ketulan yang dibaca oleh model. Had dan kos dikira dalam token, bukan dalam aksara atau perkataan.
  • Tetingkap konteks ialah jumlah maksimum yang boleh dibaca oleh model dalam satu permintaan. Kami juga menetapkan bajet sendiri yang lebih rendah bagi setiap permintaan, supaya kos dan kelajuan kekal munasabah.
  • Hasil alat ialah apa yang diterima ejen daripada alatnya: kandungan fail yang dibacanya, output arahan yang dijalankannya. Dalam kerja panjang, ia merupakan sebahagian besar daripada apa yang dihantar.
  • Sub-ejen ialah pembantu yang dimulakan oleh ejen utama untuk tugas yang berdiri sendiri, seperti “semak bab-bab ini dengan nota”. Ia menerima satu arahan, kemudian bekerja melalui banyak panggilan alat dengan sendirinya.

Masalah 1: sub-ejen berkembang sehingga model menolaknya

Setiap langkah, ejen menghantar perbualan setakat ini kepada model. Apabila ia menjadi terlalu besar, kod kami memotongnya — tetapi hanya pada permulaan mesej pengguna, supaya panggilan alat dan hasilnya tidak pernah terpisah. Ia menyimpan mesej pertama, menambah nota yang menyatakan perbualan terdahulu telah dipotong, dan menyimpan giliran terkini yang lengkap yang muat.

Sub-ejen hanya mempunyai satu mesej pengguna: arahannya. Tiada tempat untuk memotong. Jadi ia menghantar seluruh sejarahnya pada setiap langkah, dan ia terus membesar, sehingga permintaan itu lebih besar daripada yang diterima model sama sekali — kira-kira satu juta token. Dalam satu ujian dengan 8 sub-ejen sebegini, kesemuanya 8 ditolak.

Pembetulan: kosongkan hasil alat yang lama dahulu

Permintaan kini muat dalam bajet melalui tiga langkah, dan setiap langkah hanya dicuba jika yang sebelumnya tidak mencukupi:

  1. Kosongkan hasil alat yang paling lama. Kandungannya digantikan dengan nota pendek: hasilnya dikosongkan untuk memastikan perbualan kekal dalam konteks model, dan ejen boleh menjalankan alat itu semula jika perlu. Fail yang dibaca sejam lalu biasanya perkara paling besar dan paling kurang berguna dalam permintaan itu, dan fail itu masih ada untuk dibaca semula. Hasil yang terbaru kekal lengkap.
  2. Simpan giliran pengguna yang lengkap. Seperti sebelum ini: mesej pertama, satu nota, dan giliran lengkap terbaru yang muat.
  3. Simpan pusingan alat yang lengkap. Dalam satu giliran panjang — satu-satunya jenis yang dimiliki sub-ejen — simpan mesej pertama, satu nota, dan pusingan terbaru “panggil alat, dapatkan hasilnya” yang lengkap.

Ini hanya membentuk apa yang dihantar. Sejarah tersimpan ejen menyimpan semuanya. Dalam ujian yang sama, 0 daripada 8 ditolak dan kesemuanya 8 selesai.

Pengosongan dalam kelompok, supaya cache terus berfungsi

Pembekal model boleh menggunakan semula kerja pada permulaan permintaan jika ia sama dengan permintaan terakhir — cache awalan. Jika kami mengosongkan satu lagi hasil pada setiap panggilan, permulaan permintaan akan berubah setiap kali dan cache tidak akan membantu.

Jadi hasil yang paling lama dikosongkan empat sekali gus, bukan satu. Bahagian yang dikosongkan kemudian kekal sama untuk beberapa panggilan. Hasil yang tidak jauh lebih besar daripada nota dibiarkan: mengosongkannya hanya menjimatkan hampir tiada apa dan tetap mengubah permulaan permintaan. Berapa banyak yang kekal lengkap ditentukan oleh saiz, bukan bilangan: hasil terbaru yang muat dalam satu perempat bajet kekal, dan sekurang-kurangnya satu sentiasa kekal. Versi awal menyimpan enam hasil lengkap secara tetap, yang sesuai untuk output arahan yang pendek, tetapi dengan bacaan fail yang panjang, meninggalkan kebanyakan bajet kepada hasil lama.

Penolakan kini dinyatakan

Permintaan yang ditolak oleh model sebagai tidak sah tidak lagi dicuba semula; menghantar permintaan yang sama akan menghasilkan jawapan yang sama. Jika perbualan terlalu panjang untuk model, pengguna melihat: “Perbualan ini terlalu panjang untuk model dibaca sekaligus. Mulakan chat baharu untuk langkah seterusnya — semua yang telah dibina setakat ini kekal.” Itu tindakan untuk pengguna, bukan gangguan perkhidmatan, jadi ia tidak memanggil kami.

Masalah 2: ejen berhenti untuk “menjimatkan ruang”

Satu sub-ejen yang diminta membaca 40 bab panjang berhenti selepas 2, sambil berkata ia mahu menjimatkan ruang. Ia telah menggunakan kira-kira 100,000 token daripada bajet 400,000 token.

Ia tidak tahu bahawa hasil lama kini akan dikosongkan untuknya. Jadi kami memberitahunya. Arahan ejen kini menyatakan bahawa apabila perbualan berkembang melebihi apa yang boleh diterima model, hasil alat yang paling lama dikosongkan dan yang terbaru kekal lengkap — jadi jangan hentikan tugas panjang untuk menjimatkan ruang; teruskan, dan baca semula fail jika anda perlukan apa yang telah dikosongkan.

Pembetulan yang tidak dapat dilihat oleh model bukanlah pembetulan dari sudut pandangannya. Mekanisme itu hanya membantu jika ejen mempercayainya.

Masalah 3: mengira token seolah-olah semuanya dalam bahasa Inggeris

Kami menganggar token tanpa menjalankan tokenizer, sebagai aksara dibahagi empat. Itu peraturan ibu jari yang munasabah untuk bahasa Inggeris. Ia tidak sesuai untuk tulisan lain: Rusia berjalan kira-kira 2.2 aksara setiap token, dan Cina atau Jepun kira-kira satu.

Jadi sub-ejen yang membaca bab Rusia menghantar permintaan kira-kira 640,000 token, sedangkan anggaran kami mengatakan ia di bawah bajet 400,000. Anggaran itu boleh sama mudahnya meletakkan permintaan melebihi had keras model.

Anggaran kini mengira mengikut tulisan: ASCII biasa pada empat aksara setiap token, Cina, Jepun dan Korea pada satu, dan segala yang lain — Sirilik, Yunani, Arab, huruf berdiakritik, emoji — pada dua. Ia direka untuk tersilap ke arah tinggi. Pada satu bab Rusia, ia kini menganggar 43,423 token berbanding kira-kira 44,600 yang diukur; sebelum ini ia menyebut 25,023. Oleh kerana mesej tidak pernah berubah selepas ditulis, anggarannya dikira sekali dan disimpan, bukannya pada setiap langkah.

Apa yang kami pelajari

  • Potong di tempat saiz sebenar berada. Dalam kerja ejen, itu ialah hasil alat, bukan mesej pengguna.
  • Beritahu ejen tentang jaringan keselamatannya sendiri. Jika tidak, ia merancang di sekeliling had yang tidak lagi terpakai.
  • “Aksara ÷ 4” ialah andaian bahasa Inggeris. Apa-apa yang mengira token untuk pengguna berbilang bahasa perlu mengira mengikut tulisan, atau menggunakan tokenizer sebenar.
  • Jaga cache. Permintaan yang berubah di bahagian depan pada setiap panggilan menelan kos lebih dan berjalan lebih perlahan.

Jika anda membina ciri AI ke dalam apl anda sendiri, panduan kami tentang apa itu LLM dan cara menggunakan API LLM meliputi tetingkap konteks dan token dari awal. Lebih lanjut tentang cara sub-ejen berfungsi dalam Mythex ada dalam dokumentasi sub-ejen.

Mythex · Pricing · Bina apa sahaja dengan AI · Templat laman web dan aplikasi · Mythex dibandingkan · Glosari pembinaan aplikasi AI · Alat percuma untuk membina aplikasi dengan AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)