Вызов языковой модели в Python давно выглядит рутиной: импорт клиента, промпт, ответ. Но Хабр обратил внимание на то, что такой запрос часто пишут как обращение к локальной функции — без таймаутов, повторов и оглядки на цену. С обычными ненадёжными зависимостями питонист аккуратен, а с моделью почему-то нет.

Последствия проявляются по очереди. asyncio.gather способен запустить десять тысяч корутин разом, провайдер отвечает лавиной отказов, и неудачные запросы всё равно расходуют лимит. Клиентский таймаут срабатывает, а модель дописывает ответ до конца — токены считают все, так что одна использованная генерация может обойтись как четыре. Отдельная ловушка — тест на равенство строк: он зелёный ровно до дня, когда один и тот же промпт с нулевой температурой вдруг отдаёт другой ответ.

В материале обещаны пять конкретных мест, где сетевой поход мстит за пренебрежение к своей природе. Общий вывод простой: к вызову модели стоит относиться как к платному, медленному и недетерминированному внешнему сервису, а не как к строчке, которая просто работает.

Источник: Telegram: Хабр

Понравился материал?
Подписывайтесь — так вы не пропустите новые.
RSS-лента

Комментарии 10

Будьте вежливы — это делает обсуждение лучше
NP
nina_programmer
Коротко: статья полезная, но хотелось бы больше примеров кода. А то описано хорошо, а как исправить — не всегда понятно.
Е
Екатерина
А как быть с повторными запросами, если модель вернула что-то не то? Ретраить или нет? В статье про это не сказано.
Р
РедакцияРедакция
Екатерина, хороший вопрос. Обычно ретраят только при ошибках сети или превышении лимита, а не при содержательной ошибке — иначе можно зациклиться. Но если ответ невалидный, иногда помогает повтор с другим промптом.
A
alex88
Согласен с автором, что LLM — это внешний сервис. Но хочу добавить: недетерминированность можно снизить, если использовать кэширование ответов для одинаковых запросов. Мы так сэкономили кучу денег и нервы.
PD
python_dev_42
Ещё одна ошибка — хранить API-ключ в коде. У нас был джуниор, который закоммитил ключ в репозиторий, и через час получили счёт на 200 долларов. Теперь используем переменные окружения и валидаторы. В статье про это ни слова.
О
Олег
Хабр как всегда разжёвывает очевидные вещи. Ну кто не знает про таймауты? Хотя, признаюсь, сам грешил gather'ом.
ИК
Ирина К.
Олег, а вот и нет. Многие просто не задумываются, потому что локально всё работает мгновенно. Пока не наткнёшься на реальную нагрузку.
Р
РедакцияРедакция
Ирина, спасибо за поддержку. В следующем материале разберём, как правильно логировать вызовы LLM, чтобы потом не гадать, откуда взялись лишние токены.
МС
Марина Соколова
А я как раз недавно наступила на грабли с тестом на равенство строк. Написала assert response == expected, и он был зелёным неделю, а потом упал на проде. Теперь сравниваю через эмбеддинги или хотя бы проверяю ключевые слова. Спасибо за статью, буду знать, что не одна такая.
DP
dmitry_p
Пункт про `asyncio.gather` прямо в точку. У нас был случай, когда на тесте запустили 5000 запросов, и провайдер нас заблокировал на сутки. Теперь всегда ставлю семафор и backoff. Но всё равно иногда забываю про таймаут — кажется, что если клиент вернул ошибку, то всё, ан нет, токены капают.