Halaman ini berlaku untuk Apigee, tetapi tidak untuk Apigee Hybrid.
Lihat dokumentasi
Apigee Edge.
Ringkasan
Kebijakan PromptTokenLimit melindungi backend Model Bahasa Besar (LLM) dari lonjakan traffic dengan membatasi jumlah token dalam perintah pengguna.
Kebijakan PromptTokenLimit mirip dengan kebijakan SpikeArrest; namun; kebijakan SpikeArrest membatasi jumlah permintaan, sedangkan kebijakan PromptTokenLimit membatasi jumlah token dalam permintaan tersebut. Kebijakan ini secara khusus disesuaikan untuk aplikasi LLM yang biaya dan performa terkait langsung dengan jumlah token yang diproses.
Kebijakan ini adalah Kebijakan yang dapat diperluas dan penggunaan kebijakan ini mungkin memiliki implikasi biaya atau penggunaan, bergantung pada lisensi Apigee Anda. Untuk mengetahui informasi tentang jenis kebijakan dan implikasi penggunaannya, lihat Jenis kebijakan.
Perbedaan antara PromptTokenLimit dan LLMTokenQuota
Kebijakan PromptTokenLimit digunakan untuk pengelolaan traffic operasional guna mencegah lonjakan penggunaan token secara tiba-tiba. Sebaliknya, kebijakan LLMTokenQuota digunakan untuk menerapkan batas penggunaan pada aplikasi klien selama jangka waktu yang lebih lama (seperti jam, hari, atau bulan) untuk mengelola biaya dan menerapkan perjanjian bisnis.
Elemen PromptTokenLimit
Menentukan kebijakan PromptTokenLimit.
| Nilai Default | Lihat tab Kebijakan Default di bawah |
| Wajib? | Opsional |
| Jenis | Objek kompleks |
| Elemen Induk | T/A |
| Elemen Turunan |
<Identifier><Rate> (Wajib)<UseEffectiveCount><UserPromptSource><IgnoreUnresolvedVariables> |
Sintaksis
Elemen PromptTokenLimit menggunakan sintaksis berikut:
<PromptTokenLimit continueOnError="false" enabled="true" name="POLICY_NAME">
<DisplayName></DisplayName>
<Properties/>
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
<Identifier ref=""/>
<Rate ref="">[pm|ps]</Rate>
<UseEffectiveCount>[false|true]</UseEffectiveCount>
<IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables>
</PromptTokenLimit>
Kebijakan Default
Contoh berikut menunjukkan setelan default saat Anda menambahkan kebijakan PromptTokenLimit ke alur di UI:
<PromptTokenLimit continueOnError="false" enabled="true" name="PTL-limitTokens-1">
<DisplayName></DisplayName>
<Properties/>
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
<Identifier ref=""/>
<Rate ref="">[pm|ps]</Rate>
<UseEffectiveCount>[false|true]</UseEffectiveCount>
<IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables>
</PromptTokenLimit>
Elemen ini memiliki atribut berikut yang umum untuk semua kebijakan:
| Atribut | Default | Wajib? | Deskripsi |
|---|---|---|---|
name |
T/A | Wajib |
Nama internal kebijakan. Nilai atribut Secara opsional, gunakan elemen |
continueOnError |
false | Opsional | Tetapkan ke false untuk menampilkan error saat kebijakan gagal. Perilaku ini wajar terjadi untuk
sebagian besar kebijakan. Tetapkan ke true agar eksekusi alur berlanjut meskipun setelah kebijakan gagal. Lihat juga:
|
enabled |
benar | Opsional | Tetapkan ke true untuk menerapkan kebijakan. Tetapkan ke false untuk menonaktifkan
kebijakan. Kebijakan tidak akan diterapkan meskipun tetap terlampir ke alur. |
async |
false | Tidak digunakan lagi | Atribut ini tidak digunakan lagi. |
Contoh
Contoh berikut menunjukkan beberapa cara Anda dapat menggunakan kebijakan PromptTokenLimit:
Contoh 1
Pembatasan Token Prompt dalam satu replika.
Dalam contoh ini, pembatasan token perintah terjadi dalam satu replika dan tidak didistribusikan di beberapa pemroses pesan dalam suatu region.
<PromptTokenLimit continueOnError="false" enabled="true" name="PTL-limitTokens-1">
<DisplayName></DisplayName>
<Properties/>
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
<Identifier ref="request.url"/>
<Rate>1pm</Rate>
<UseEffectiveCount>false</UseEffectiveCount>
</PromptTokenLimit>Contoh 2
Pembatasan Token yang didistribusikan.
Dalam contoh ini, pembatasan token perintah didistribusikan di beberapa replika dalam suatu region, dan algoritma pembatasan frekuensi "sliding window" diterapkan.
<PromptTokenLimit continueOnError="false" enabled="true" name="PTL-limitTokens-1">
<DisplayName></DisplayName>
<Properties/>
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
<Identifier ref="request.url"/>
<Rate>1pm</Rate>
<UseEffectiveCount>true</UseEffectiveCount>
</PromptTokenLimit>Contoh 3
Pembatasan token ukuran jendela konteks per permintaan.
Dalam contoh ini, pembatasan token perintah terjadi dalam satu replika dan tidak didistribusikan di beberapa pemroses pesan dalam satu region. Konfigurasi khusus ini digunakan untuk ukuran jendela konteks pembatasan token per permintaan.
<PromptTokenLimit continueOnError="false" enabled="true" name="PTL-limitTokens-1">
<DisplayName></DisplayName>
<Properties/>
<UserPromptSource>{jsonPath('$.messages',request.content,true)}</UserPromptSource>
<Identifier ref="messageid"/>
<Rate>1pm</Rate>
<UseEffectiveCount>false</UseEffectiveCount>
</PromptTokenLimit>Contoh 4
Pembatasan Token yang Didistribusikan dengan nilai default.
Dalam contoh ini, pembatasan token perintah terjadi dalam satu replika dan tidak didistribusikan di beberapa pemroses pesan dalam satu region. Nilai default sumber perintah pengguna digunakan:
{jsonPath('$.messages',request.content,true)}
<PromptTokenLimit continueOnError="false" enabled="true" name="PTL-limitTokens-1"> <DisplayName></DisplayName> <Properties/> <Identifier ref="messageid"/> <Rate>1pm</Rate> <UseEffectiveCount>false</UseEffectiveCount> </PromptTokenLimit>
Referensi elemen turunan
Bagian ini menjelaskan elemen turunan <PromptTokenLimit>.
<DisplayName>
Gunakan selain atribut name untuk memberi label pada kebijakan di editor proxy UI pengelolaan dengan nama yang berbeda dan lebih terdengar alami.
Elemen <DisplayName> umum untuk semua kebijakan.
| Nilai Default | T/A |
| Wajib? | Opsional. Jika Anda menghilangkan <DisplayName>, nilai atribut name kebijakan akan digunakan. |
| Jenis | String |
| Elemen Induk | <PolicyElement> |
| Elemen Turunan | Tidak ada |
Elemen <DisplayName> menggunakan sintaksis berikut:
Sintaks
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Contoh
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Elemen <DisplayName> tidak memiliki atribut atau elemen turunan.
<Identifier>
Memungkinkan Anda memilih cara mengelompokkan permintaan sehingga kebijakan PromptTokenLimit dapat diterapkan berdasarkan klien. Misalnya, Anda dapat mengelompokkan permintaan berdasarkan ID developer, yang dalam hal ini setiap permintaan developer akan dihitung dalam batas PromptTokenLimit mereka sendiri, bukan semua permintaan ke proxy.
Jika Anda mengosongkan elemen <Identifier>, satu batas frekuensi akan diterapkan untuk semua permintaan
ke proxy API tersebut.
| Nilai Default | T/A |
| Wajib? | Opsional |
| Jenis | String |
| Elemen Induk |
<PromptTokenLimit>
|
| Elemen Turunan | Tidak ada |
Sintaksis
<PromptTokenLimit continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Identifier ref="FLOW_VARIABLE"/> </PromptTokenLimit>
Contoh 1
Contoh berikut menerapkan kebijakan PromptTokenLimit per ID developer:
<PromptTokenLimit name="PTL-limitTokens-1">
<Identifier ref="developer.id"/>
<Rate>42pm</Rate/>
<UseEffectiveCount>true</UseEffectiveCount>
</PromptTokenLimit>
Tabel berikut menjelaskan atribut <Identifier>:
| Atribut | Deskripsi | Default | Kehadiran |
|---|---|---|---|
ref |
Mengidentifikasi variabel yang digunakan PromptTokenLimit untuk mengelompokkan permintaan masuk. Anda dapat menggunakan variabel alur apa pun untuk menunjukkan klien yang unik, seperti yang tersedia dengan kebijakan VerifyAPIKey. Anda juga dapat menetapkan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage. | T/A | Wajib |
<Rate>
Menentukan kecepatan untuk membatasi lonjakan (atau burst) token dengan menetapkan
jumlah token yang diizinkan dalam interval per menit atau per detik.
Anda dapat menggunakan elemen ini bersama dengan <Identifier> untuk
mengatur traffic secara lancar saat runtime dengan menerima nilai dari klien.
Gunakan elemen <UseEffectiveCount> untuk menetapkan algoritma
pembatasan kecepatan yang digunakan oleh kebijakan.
| Nilai Default | T/A |
| Wajib? | Wajib |
| Jenis | Bilangan bulat |
| Elemen Induk |
<PromptTokenLimit>
|
| Elemen Turunan | Tidak ada |
Sintaksis
Anda dapat menentukan tarif dengan salah satu cara berikut:
- Tarif statis yang Anda tentukan sebagai isi elemen
<Rate> - Nilai variabel, yang dapat diteruskan oleh klien; identifikasi
nama variabel alur menggunakan atribut
ref
<PromptTokenLimit
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME"
>
<Rate ref="FLOW_VARIABLE">RATE[pm|ps]</Rate>
</PromptTokenLimit>Nilai tarif yang valid (baik ditentukan sebagai nilai variabel atau di isi elemen) harus sesuai dengan format berikut:
intps(jumlah token per detik, dihaluskan menjadi interval milidetik)intpm(jumlah token per menit, dihaluskan ke dalam interval detik)
Nilai int harus berupa bilangan bulat positif bukan nol.
Contoh 1
Contoh berikut menetapkan kecepatan ke lima token per detik:
<PromptTokenLimit name="PTL-Static-5ps">
<Rate>5ps</Rate>
<UseEffectiveCount>false</UseEffectiveCount>
</PromptTokenLimit>
Kebijakan ini memperlancar laju ke satu token yang diizinkan setiap 200 milidetik (1000/5).
Contoh 2
Contoh berikut menetapkan kecepatan ke 12 token per menit:
<PromptTokenLimit name="PTL-Static-12pm"> <Rate>12pm</Rate> <UseEffectiveCount>false</UseEffectiveCount> </PromptTokenLimit>
Contoh kebijakan ini memperlancar laju ke satu token yang diizinkan setiap lima detik (60/12).
Tabel berikut menjelaskan atribut <Rate>:
| Atribut | Deskripsi | Kehadiran | Default |
|---|---|---|---|
ref |
Mengidentifikasi variabel alur yang menentukan tarif. Hal ini dapat berupa variabel
alur apa pun, seperti parameter kueri HTTP, header, atau konten isi pesan, atau nilai
seperti KVM. Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur.
Anda juga dapat menggunakan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage. Jika Anda menentukan Contoh: <Rate ref="request.header.custom_rate">1pm</Rate> Dalam contoh ini, jika klien tidak meneruskan header Anda dapat menggunakan Jika Anda menentukan nilai untuk |
Opsional | T/A |
Rate yang menentukan perilaku pembatasan traffic:
| Atribut | Deskripsi |
|---|---|
messagesPerPeriod |
Menentukan jumlah token yang diizinkan dalam periode yang ditentukan. Misalnya, jika kebijakan dikonfigurasi untuk '10ps' (10 token per detik), nilai
messagesPerPeriod adalah 10. |
periodInMicroseconds |
Menentukan jangka waktu, dalam mikrodetik, yang digunakan untuk menghitung
messagesPerPeriod. Untuk konfigurasi '10ps', nilai ini adalah 1.000.000, yang setara dengan satu detik. |
maxBurstMessageCount |
Mewakili jumlah maksimum token yang dapat diizinkan secara instan atau dalam burst singkat di awal interval baru. |
<UseEffectiveCount>
Elemen ini memungkinkan Anda memilih antara algoritma PromptTokenLimit yang berbeda
dengan menyetel nilai ke true atau false, seperti yang dijelaskan
di bawah:
true
Jika disetel ke true, PromptTokenLimit didistribusikan di suatu wilayah. Artinya,
jumlah permintaan disinkronkan di seluruh pemroses pesan (MP) dalam suatu region. Selain itu, algoritma pembatasan kapasitas "sliding window"
diterapkan. Algoritma
ini memberikan perilaku pembatasan kapasitas yang konsisten dan tidak "memperlancar" jumlah permintaan
masuk yang dapat dikirim ke backend. Jika serangkaian permintaan dikirim dalam interval waktu yang singkat,
permintaan tersebut diizinkan selama tidak melebihi batas frekuensi
yang dikonfigurasi, sebagaimana ditetapkan dalam elemen <Rate>. Contoh:
<PromptTokenLimit name="Prompt-Token-Limit-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <UseEffectiveCount>true</UseEffectiveCount> </PromptTokenLimit>
false (default)
Jika disetel ke false (default), kebijakan PromptTokenLimit
menggunakan algoritma
"token bucket"
yang memperlancar lonjakan token dengan membagi batas laju yang Anda
tentukan ke dalam interval yang lebih kecil. Kekurangan dari pendekatan ini adalah
beberapa token yang sah yang masuk dalam interval waktu singkat berpotensi ditolak.
Misalnya, Anda memasukkan kecepatan 30pm (30 token per menit). Dalam pengujian, Anda mungkin berpikir bahwa Anda dapat mengirim 30 token dalam 1 detik, selama token tersebut masuk dalam waktu satu menit. Namun, bukan begitu cara kebijakan menerapkan setelan. Jika dipikir-pikir, 30 token dalam jangka waktu 1 detik dapat dianggap sebagai lonjakan kecil di beberapa lingkungan.
-
Rasio per menit akan disesuaikan menjadi permintaan penuh yang diizinkan dalam interval detik.
Misalnya, 30pm di-smoothing seperti ini:
60 detik (1 menit) / 30pm = interval 2 detik, atau 1 token diizinkan setiap 2 detik. Token kedua dalam waktu 2 detik akan gagal. Selain itu, token ke-31 dalam satu menit akan gagal. -
Kecepatan per detik dihaluskan menjadi permintaan penuh yang diizinkan dalam interval milidetik.
Misalnya, 10ps di-smoothing seperti ini:
1.000 milidetik (1 detik) / 10ps = interval 100 milidetik, atau 1 token diizinkan setiap 100 milidetik. Token kedua dalam waktu 100 md akan gagal. Selain itu, token ke-11 dalam satu detik akan gagal.
| Nilai Default | Salah |
| Wajib? | Opsional |
| Jenis | Boolean |
| Elemen Induk |
<PromptTokenLimit>
|
| Elemen Turunan | Tidak ada |
Tabel berikut menjelaskan atribut elemen <UseEffectiveCount>:
| Atribut | Deskripsi | Default | Kehadiran |
|---|---|---|---|
ref |
Mengidentifikasi variabel yang berisi nilai <UseEffectiveCount>. Nilai ini dapat berupa variabel alur apa pun, seperti parameter kueri HTTP, header, atau konten isi pesan. Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur. Anda juga dapat menetapkan variabel kustom
menggunakan kebijakan JavaScript atau kebijakan AssignMessage. |
T/A | Opsional |
<UserPromptSource>
Menyediakan sumber untuk mengambil teks perintah pengguna. Gunakan template pesan.
Template pesan harus memberikan satu nilai teks perintah pengguna.
Misalnya, {jsonPath('$.contents[-1].parts[-1].text',request.content,true)}.
| Nilai Default | T/A |
| Wajib? | Opsional |
| Jenis | String |
| Elemen Induk |
<PromptTokenLimit>
|
| Elemen Turunan | Tidak ada |
Sintaksis
<PromptTokenLimit
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME">
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
</PromptTokenLimit>Contoh 1
<PromptTokenLimit name="Prompt-Token-Limit-1">
<UserPromptSource>{jsonPath('$.contents[-1].parts[-1].text',request.content,true)}</UserPromptSource>
</PromptTokenLimit><IgnoreUnresolvedVariables>
Menentukan apakah pemrosesan berhenti saat variabel yang belum diselesaikan ditemukan.
Setel ke true untuk mengabaikan variabel yang belum diselesaikan dan melanjutkan pemrosesan; jika tidak
false. Nilai defaultnya adalah false.
| Nilai Default | Salah |
| Wajib? | Opsional |
| Jenis | Boolean |
| Elemen Induk |
<PromptTokenLimit>
|
| Elemen Turunan | Tidak ada |
Sintaksis
<PromptTokenLimit
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME">
<IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</PromptTokenLimit>Contoh
<PromptTokenLimit name="Prompt-Token-Limit-1"> <Rate>10ps</Rate> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </PromptTokenLimit>
Variabel alur
Saat kebijakan PromptTokenLimit dijalankan, variabel alur berikut akan diisi:
| Variabel | Jenis | Izin | Deskripsi |
|---|---|---|---|
ratelimit.POLICY_NAME.failed |
Boolean | Hanya Baca | Menunjukkan apakah kebijakan gagal atau tidak (true atau
false). |
ratelimit.POLICY_NAME.resolvedUserPrompt |
String | Hanya Baca | Menampilkan perintah pengguna yang diekstrak. |
ratelimit.POLICY_NAME.userPromptSource |
String | Hanya Baca | Menampilkan template pesan untuk perintah pengguna yang ditentukan dalam kebijakan. |
ratelimit.POLICY_NAME.userPromptTokenCount |
String | Hanya Baca | Menampilkan jumlah token perintah pengguna yang diekstrak. |
Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur.
Referensi error
Bagian ini menjelaskan kode kesalahan dan pesan error yang ditampilkan serta variabel kesalahan yang ditetapkan oleh Apigee saat kebijakan ini memicu error. Anda juga dapat melihat Error kebijakan SpikeArrest. Informasi ini penting untuk diketahui jika Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Untuk mempelajari lebih lanjut, lihat Yang perlu Anda ketahui tentang error kebijakan dan Menangani kesalahan.
Error runtime
Error ini dapat terjadi saat kebijakan dijalankan.
| Kode kesalahan | Status HTTP | Kesalahan Apigee | Penyebab | Perbaiki |
|---|---|---|---|---|
policies.prompttokenlimit.FailedToExtractUserPrompt |
400 |
FALSE | Tidak dapat mengekstrak perintah pengguna dari permintaan API. | |
policies.prompttokenlimit.PromptTokenLimitViolation |
429 |
FALSE | Pelanggaran PromptTokenLimit. | |
policies.prompttokenlimit.FailedToCalculateUserPromptTokens |
500 |
TRUE | Token tidak dapat dihitung untuk perintah pengguna. |
Error saat deployment
Error ini dapat terjadi saat Anda men-deploy proxy yang berisi kebijakan ini.
| Kode kesalahan | Status HTTP | Kesalahan Apigee | Penyebab | Perbaiki |
|---|---|---|---|---|
policies.prompttokenlimit.MessageWeightNotSupported |
500 | FALSE | MessageWeight tidak didukung untuk kebijakan PromptTokenLimit. |
Variabel kesalahan
Variabel ini ditetapkan saat terjadi error runtime. Untuk mengetahui informasi selengkapnya, lihat Yang perlu Anda ketahui tentang error kebijakan.
| Variabel | Di mana | Contoh |
|---|---|---|
ratelimit.policy_name.fault.name |
fault_name adalah nama kesalahan, seperti yang tercantum dalam tabel Error runtime di atas. Nama kesalahan adalah bagian terakhir dari kode kesalahan. | fault.name Matches "PromptTokenLimitViolation" |
ratelimit.policy_name.failed |
policy_name adalah nama kebijakan yang ditentukan pengguna yang menyebabkan kesalahan. | ratelimit.PTL-PromptTokenLimitPolicy.failed = true |
Contoh respons error
Di bawah ini adalah contoh respons error:
{ "fault":{ "detail":{ "errorcode":"policies.prompttokenlimit.PromptTokenLimitViolation" }, "faultstring":"Prompt Token Limit Violation. Allowed rate : MessageRate{capacity=10, period=Minutes}" } }
Contoh aturan kesalahan
Di bawah ini adalah contoh aturan kesalahan untuk menangani kesalahan PromptTokenLimitViolation:
<FaultRules>
<FaultRule name="Prompt Token Limit Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "PromptTokenLimitViolation") </Condition>
</Step>
<Condition>ratelimit.PTL-1.failed=true</Condition>
</FaultRule>
</FaultRules>Kode status HTTP saat ini untuk melampaui batas laju yang ditetapkan oleh kebijakan LLMTokenQuota atau PromptTokenLimit adalah 429 (Terlalu Banyak Permintaan).
Skema
Setiap jenis kebijakan ditentukan oleh skema XML (.xsd). Sebagai referensi, skema kebijakan
tersedia di GitHub.
Topik terkait
- Kebijakan LLMTokenQuota: Kebijakan LLMTokenQuota, untuk membatasi penggunaan kuota token respons.
- Pembatasan kapasitas untuk ringkasan pembatasan kapasitas
- Membandingkan kebijakan pembatasan kapasitas