К содержанию
Новости

Ключевые концепции Python для разработки приложений на базе генеративного ИИ

Ключевые концепции Python для разработки приложений на базе генеративного ИИ
Фото: Towards AI

Материал о практическом использовании Python в проектах с генеративным ИИ разбирает, какие особенности языка напрямую влияют на производительность систем с LLM, RAG и AI‑агентами. Как пишет Towards AI, ключевая идея здесь в активном использовании асинхронного программирования. Значительную часть времени такие приложения просто ждут ответы внешних сервисов: LLM, embedding API или векторных баз данных. Конструкция async/await позволяет в этот момент не простаивать, а обрабатывать тысячи запросов одновременно в одном потоке. Синхронный код, наоборот, обслуживает пользователей по очереди.

Когда Python встречает выражение await, текущая корутина приостанавливается. Управление возвращается в event loop, который переключается на другие готовые задачи и позже возвращает выполнение к корутине, когда приходит результат. В итоге получается кооперативная многозадачность без потоков и без переключений контекста операционной системы. На практике это заметно ускоряет работу. Например, пять параллельных запросов к модели claude-opus-4-5 можно отправить сразу через asyncio.gather(). Общее время выполнения будет примерно равно самому медленному запросу, около 2 секунд. При последовательном запуске те же операции заняли бы примерно 10 секунд.

В более крупных сценариях разница становится еще заметнее. Допустим, нужно выполнить последовательные вызовы LLM для 100 документов, каждый обрабатывается около 3 секунд. В таком режиме весь процесс займет около 5 минут. Если же использовать asyncio.gather(), операции выполняются параллельно и завершаются примерно за 3–5 секунд. Ускорение достигает примерно 60× и при этом не требуется дополнительное оборудование. Для запуска параллельных операций применяют и asyncio.create_task(). Такой подход позволяет, например, одновременно получать результаты из vector database и web search внутри RAG‑pipeline.

Есть и другой полезный механизм, асинхронные генераторы для потоковой передачи ответов. Они отправляют пользователю токены по мере генерации, так работает и интерфейс ChatGPT. В примере с anthropic.AsyncAnthropic поток создается через client.messages.stream для модели claude-opus-4.5. Генератор передает текст по мере поступления, отдельные токены могут приходить примерно каждые ~50 ms. Благодаря этому создается ощущение ответа в реальном времени.

Ключевые факты

  • Пример с asyncio.gather() запускает 5 запросов к модели "claude-opus-4-5" одновременно, тогда как последовательное выполнение заняло бы около ~10 секунд, а параллельное, примерно время самого медленного вызова (~2s).

  • В сценарии обработки 100 документов при задержке 3 секунды на LLM‑вызов последовательная обработка занимает около 5 минут, тогда как параллельный запуск через asyncio.gather() завершает работу примерно за ~3–5 секунд.

  • Функция asyncio.create_task() используется для параллельного запуска операций в RAG‑пайплайне, например, одновременного поиска в vector database и web search перед финальным вызовом LLM.

  • Потоковая генерация ответа реализуется через async generator: токены из модели "claude-opus-4.5" передаются клиенту по мере появления, примерно каждые ~50 ms.