Как снизить latency LLM в production в 25 раз
AI-стартап с 12 000 активных пользователей пришёл к нам с одной проблемой: их RAG-система отвечала за 28 секунд. Пользователи уходили. Мы снизили latency до 1.1 секунды за 5 дней — без смены модели и без переписывания приложения.
Почему 28 секунд — это катастрофа
Пользователь задаёт вопрос в чате. Через 5 секунд он начинает думать, что что-то сломалось. Через 10 — закрывает вкладку. Через 28 секунд — уходит к конкуренту.
Исследования показывают: конверсия падает на 7% при каждой дополнительной секунде задержки. При 28 секундах вы теряете большинство пользователей до получения ответа.
Диагностика: где теряется время
Первым делом мы профилировали запрос от начала до конца. Вот что нашли:
| Этап | Время (до) | Время (после) |
|---|---|---|
| Embedding запроса | 4.2s | 0.08s |
| Поиск в векторной БД | 8.1s | 0.12s |
| Загрузка контекста | 3.4s | 0.05s |
| LLM inference | 12.3s | 0.85s |
| Итого | 28.0s | 1.10s |
Что мы сделали: 5 конкретных изменений
Заменили embedding-модель на оптимизированную
Оригинальная модель запускалась через Hugging Face Transformers без оптимизаций. Мы перешли на ONNX Runtime с квантизацией INT8. Embedding одного запроса: 4.2s → 0.08s.
Развернули Qdrant вместо FAISS in-memory
FAISS перезагружал весь индекс при каждом рестарте (8 минут). Qdrant с персистентным хранилищем и HNSW-индексом: поиск 0.12s, мгновенный старт.
Перешли с Ollama на vLLM с PagedAttention
Ollama не поддерживает batching и continuous batching. vLLM с PagedAttention обрабатывает параллельные запросы эффективно. LLM inference: 12.3s → 0.85s при той же модели Mistral 7B.
Добавили семантическое кэширование
Похожие вопросы (cosine similarity > 0.92) возвращают кэшированный ответ мгновенно. 35% запросов обслуживаются из кэша за < 50ms.
Параллелизировали embedding и retrieval
Embedding запроса и retrieval из БД выполнялись последовательно. Мы запустили их параллельно через asyncio.gather(). Экономия: ~200ms на каждом запросе.
Итоговая архитектура
Выводы
- 1Большинство проблем с latency — не в модели, а в инфраструктуре вокруг неё
- 2ONNX Runtime + квантизация даёт 10-50x ускорение embedding без потери качества
- 3vLLM с PagedAttention — стандарт для production LLM serving
- 4Семантическое кэширование снижает нагрузку на GPU на 30-40%
- 5Профилируйте каждый этап отдельно — проблема может быть неочевидной
Есть похожая проблема?
Мы специализируемся на production LLM-инфраструктуре. Расскажите о вашем стеке — предложим конкретный план.