Как наиболее эффективно поставить в очередь вызовы API к службе Azure OpenAI (с ограничением скорости токена в минуту)?
Как мы можем реализовать эффективную очередь с использованием бессерверных технологий Azure (например, Azure Servicebus) для одновременного вызова службы Azure OpenAI, но гарантировать, что более ранние сообщения обрабатываются в первую очередь?
Сложность заключается в том, что ограничение скорости не основано на X запросах в минуту на основе «скользящего окна». Но вместо этого речь идет о токенах в минуту, и Azure реализует таймер на 1 минуту (который мы не знаем, когда он сбрасывается). Вот объяснение политики ограничения скорости:https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/quota#understanding-rate-limits .
Предполагая следующую «очередь» и ограничение скорости в 10000 TPM:
- Запрос 1) Ожидается 2000 токенов
- Запрос 2) Ожидается 5000 токенов
- Запрос 3) 5000 ожидаемых токенов
- Запрос 4) Ожидается 2000 токенов
- Запрос 5) Ожидается 7000 токенов
Нам бы хотелось, чтобы «очередь» одновременно обрабатывала запросы 1 и 2. «Поймите», что запрос 3 превысит лимит токена, и «запланирует» одну минуту ожидания, затем одновременно примет запросы 3 и 4, запланирует одну минуту ожидания и обработать запрос 5.
Теоретически нам не нужно «запланировать» и мы можем просто достичь предела скорости с помощью политики повторных попыток (возможно, лучше, чем планирование, поскольку мы не знаем момент сброса таймера и точных токенов, которые, по оценкам Azure, будут стоить запрос). Но как в этом случае мы можем быть уверены, что не попадем в состояние гонки, когда все запросы 3,4,5 завершаются неудачно и повторяются, а 5 выполняется раньше 3?
Теоретически еще более разумное решение могло бы обрабатывать 1,2,4 параллельно. Подождите минуту, а затем обработайте 3, подождите минуту и затем обработайте 5. Где 4 разрешено идти раньше 3 только потому, что оно укладывается в минутный лимит, который в противном случае был бы «потраченным впустую».