Содержание
- Семантическое кеширование — как это работает
- Инструменты семантического кеширования: GPTCache, Redis, Qdrant
- KV Cache и Prompt Cache на уровне инференса
- Сравнительная таблица инструментов кеширования
- Экономика кеширования: сколько денег экономит cache hit
- Как настроить порог схожести и политики вытеснения
- Коротко
- Что ещё важно знать
LLM-кеширование — набор техник, которые перехватывают повторяющиеся запросы к языковым моделям и возвращают сохранённые ответы, не обращаясь к модели. Три слоя кеширования работают на разных уровнях: семантический кеш (GPTCache, Redis) на уровне приложения, KV-кеш внутри GPU (vLLM) и Prompt Cache (SGLang) на уровне инференс-фреймворка. Hit rate 30-70% в зависимости от нагрузки, экономия до 60% затрат на GPU — по данным Spheron и TokenMix, апрель 2026.
Architecture of three-level LLM caching: semantic cache (GPTCache/Redis/Qdrant), KV cache (vLLM) and prompt cache (SGLang RadixAttention)
Семантическое кеширование — как это работает
Каждый запрос к LLM стоит денег. На H100 SXM5 — $2,54/час за GPU, на Claude Sonnet — $3/$15 за миллион токенов ввода/вывода. Проблема в том, что в production нагрузка постоянно повторяется: агентские фреймворки шлют одни и те же описания инструментов на каждый вызов, FAQ-боты получают «Как сбросить пароль?» в сотый раз, RAG-пайплайны индексируют запросы, различающиеся на пару слов.
Семантическое кеширование решает это просто: запрос превращается в вектор через embedding-модель (BGE-M3, text-embedding-3-small), вектор ищется среди сохранённых через ANN-индекс (FAISS, Qdrant, Redis), и если косинусная близость выше порога (обычно 0,90-0,95) — возвращается сохранённый ответ. LLM не трогается. Всё — за 3-8 миллисекунд вместо 500-2000.
Четыре шага семантического кеширования:
Шаг 1 — Embedding. Запрос пользователя превращается в вектор размерностью 512-1536. BGE-M3 (512 dim) на GPU — 2 ms, на CPU — 12 ms. Стоимость: меньше $1 на миллион запросов.
Шаг 2 — Vector Search. Вектор сравнивается со всеми сохранёнными через косинусную близость. FAISS с HNSW-индексом на миллионе записей — меньше 10 ms.
Шаг 3 — Решение по порогу. Если совпадение выше 0,92 — возвращаем кеш. Если ниже — пропускаем к LLM.
Шаг 4 — Сохранение. Новый ответ LLM сохраняется в кеш вместе с эмбеддингом запроса для будущих совпадений.
Когда стоит: FAQ-боты (hit rate 50-70%), вызовы агентов с фиксированными схемами (40-65%), RAG по статическому корпусу (30-50%). Когда не стоит: креативная генерация (0-5%), персонализированные рекомендации, мульти-тур диалоги с растущим контекстом (5-15%).
BGE-M3, 2 ms → Vector Search
Qdrant / FAISS → HIT ≥ 0.92 → Кеш 3-8 ms
Инструменты семантического кеширования: GPTCache, Redis, Qdrant
На рынке open-source 2026 года выделяются три основных подхода к семантическому кешированию: специализированная библиотека GPTCache, встроенный векторный поиск Redis Stack и кастомные решения на Qdrant.
GPTCache
GPTCache (8 092 звёзд GitHub, MIT) — библиотека от Zilliz (создателей Milvus), заточенная именно под LLM-кеширование. Две строки кода оборачивают OpenAI-клиент: from gptcache import cache и cache.init(). Внутри — plug-and-play архитектура: embedding-модуль подменяется на любой (OpenAI, HuggingFace, ONNX), векторное хранилище — FAISS, Qdrant, Milvus, Redis. Ответы сохраняются с TTL, поддерживается семантическое сравнение с настраиваемым порогом.
GPTCache автоматически сериализует ответы LLM, поддерживает cache.init(pre_embedding_func=...) для кастомной предобработки запросов и умеет фильтровать по модели (разные кеши для GPT-4 и Claude). Главный минус — Python-only и однопоточная архитектура: при 1000+ RPS становится узким местом.
GPTCache (8 092 звёзд) — библиотека семантического кеширования от создателей Milvus
Redis Vector Cache
Redis Stack (75K звёзд) с модулем RediSearch поддерживает векторный поиск прямо в оперативной памяти. Латенность — 2-5 ms, что быстрее GPTCache за счёт C-реализации. Redis-кеш разделяем между несколькими pod'ами инференса — подходит для мультиязычных и распределённых деплоев.
RedisVL (библиотека Redis для векторного поиска) предоставляет LLMCache как готовый класс для семантического кеширования. Поддерживаются фильтры по метаданным (кеш для конкретного user tier или tenant), что важно для SaaS-мультитенантности. Минус — RSAL-лицензия (ограничения для конкурентов Redis).
Qdrant-backed Custom Cache
Qdrant (33K звёзд) — выбор команд, которым нужен полный контроль над HNSW-индексом, payload-фильтрацией и REST API для управления кешем. Латенность — 3-8 ms, лицензия Apache 2.0. На одном Qdrant-сервере держат до 10M кеш-записей с фильтрацией по модели, версии промпта, user tenant. Минус — нужно самому писать cache proxy (пример — FastAPI-прослойка из гайда Spheron).
KV Cache и Prompt Cache на уровне инференса
Семантическое кеширование — верхний уровень. Есть ещё два слоя, которые работают до него — внутри инференс-фреймворка.
KV Cache — это слои внимания (key-value tensors) для каждого обработанного токена, которые хранятся в GPU-памяти. Вместо того чтобы пересчитывать attention для всей истории диалога при каждом новом токене, vLLM (85K звёзд) и SGLang (30K звёзд) кешируют уже вычисленные KV-тензоры. Это даёт 20-40% ускорения на длинных диалогах с общим префиксом (один system prompt на тысячу запросов).
Prompt Cache / Prefix Cache — более умная версия KV-кеша. SGLang использует RadixAttention: он идентифицирует одинаковые префиксы в промптах между разными запросами и переиспользует их вычисленные тензоры. Если ваш system prompt одинаков для 90% запросов, RadixAttention срезает 20-40% compute без потери качества. У vLLM есть автоматическое prefix caching через блоковое хеширование.
Важно: эти два слоя не заменяют семантический кеш, а дополняют его. KV-кеш экономит compute внутри модели на повторяющихся токенах. Семантический кеш вообще не даёт запросу дойти до модели. В production stack используются все три слоя одновременно.
Сравнительная таблица инструментов кеширования
| Инструмент | Уровень | звёзд GitHub | Латентность | Тип совпадения | Лицензия |
|---|---|---|---|---|---|
| GPTCache | Семантический | 8 092 | 3-10 ms | Косинус близость | MIT |
| Redis Stack + RediSearch | Семантический | 75 343 | 2-5 ms | Cosine/IP/L2 | RSAL |
| Qdrant (кастомный proxy) | Семантический | 33 071 | 3-8 ms | Cosine (HNSW) | Apache 2.0 |
| vLLM KV Cache | Инференс | 85 765 | <1 ms | Точное (токен-уровень) | Apache 2.0 |
| SGLang RadixAttention | Инференс | 30 087 | <1 ms | Префиксное совпадение | Apache 2.0 |
| LangChain InMemoryCache | Семантический | 141 342 | <1 ms | Точное совпадение | MIT |
| LangChain RedisCache | Семантический | — | 2-7 ms | Точное совпадение | MIT |
По данным TokenMix (апрель 2026), семантическое кеширование даёт hit rate в 3-5 раз выше, чем exact-match (25-50% против 5-15%). Spheron (апрель 2026) приводит цифры для production FAQ-бота на Llama 3.1 8B: при 40% cache hit экономия $466/мес, при 70% — $983/мес. По данным Braintrust, 68% AI-команд в 2026 используют минимум два инструмента: один для тестирования промптов (Promptfoo) и один для observability + деплоя (Langfuse/Helicone).
Экономика кеширования: сколько денег экономит cache hit
Посчитаем на реальных цифрах. Берём production FAQ-бот на Llama 3.1 8B, 1 млн запросов в день, средний промпт + ответ = 800 токенов, vLLM на H100 — ~12 000 токен/сек в batch.
Без кеша: 1M × 800 / 12 000 = 66 667 секунд = 18,5 GPU-часов в день. H100 SXM5 по $2,54/час = $46,99/день = $1 410/мес.
С семантическим кешем при 40% hit rate: 11,1 GPU-часов = $846/мес (экономия $564/мес). При 70%: 5,6 GPU-часов = $427/мес (экономия $983/мес). Цифры — из расчёта Spheron на апрель 2026.
Формула прикидки:
gpu_hours_saved = total_requests × hit_rate × avg_tokens / tokens_per_second / 3600
monthly_savings = gpu_hours_saved × 30 × gpu_hourly_rate
На Claude Sonnet через API экономика другая: 100K запросов/мес × 500 ввод + 300 вывод токенов при $3/$15 за миллион — базовый счёт $600/мес. При 35% hit rate — $395/мес (экономия 34%). Сам кеш добавляет меньше $0,10/час — embedding + Qdrant на одном GPU используют меньше 5 GB VRAM.
Как настроить порог схожести и политики вытеснения
Порог косинусной близости — самая важная ручка в семантическом кеше. Слишком низкий — возвращаете неправильные ответы (ложные hit). Слишком высокий — hit rate падает к нулю.
Рекомендуемые пороги по типу нагрузки:
| Тип нагрузки | Порог | Риск при занижении |
|---|---|---|
| FAQ-бот | 0,90-0,93 | Неверные ответы на пограничные вопросы |
| RAG pipeline | 0,92-0,95 | Галлюцинации от неверного контекста |
| Вызовы агентов (tool schemas) | 0,88-0,92 | Незначительный дрейф в выводе |
| Генерация кода | 0,94-0,97 | Код для другой задачи |
Политики вытеснения:
TTL-вытеснение — правильный старт по умолчанию. Новости/актуальные события — 24 часа, документация/спеки — 72 часа, FAQ — 7 дней. LRU — когда память ограничена, но без TTL рискуете раздавать устаревшие ответы вечно. Capacity-based — установите максимум записей (например, 500K) и вытесняйте LRU при превышении. Лучшая комбинация: TTL + LRU.
Cache poisoning: валидируйте запросы перед эмбеддингом. Злоумышленник может подобрать запрос, коллизирующий по эмбеддингу с другим запросом, и получить чужой ответ. Namespace кеш по user tier + hash system prompt + model version.
Что ещё важно знать
Чем семантическое кеширование отличается от prompt caching провайдера?
Prompt caching у OpenAI/Anthropic — это кеширование токенов на стороне провайдера: одинаковый system prompt не тарифицируется повторно. Семантическое кеширование — на уровне приложения: одинаковые ответы на семантически похожие вопросы возвращаются без вызова LLM вообще. Они дополняют друг друга — используйте оба.
Какой embedding-моделью пользоваться для кеша?
BGE-M3 в 512-мерном варианте (MRL-усечение) — стандартная рекомендация: 2 ms на GPU, recall@10 на MTEB 0,78, работает и на CPU за 12 ms. Если запросы сложные (длинные технические вопросы) — Qwen3-Embedding (2048 dim, 25-30 ms) даёт recall 0,87. OpenAI text-embedding-3-small — хорош, но добавляет network round-trip.
Сколько памяти нужно для кеша на миллион записей?
512-мерный float32 = 2 KB на эмбеддинг. 1 млн записей в FAISS или Qdrant — ~2 GB RAM. На 10M — 20 GB. Используйте float16 или product quantization для двукратной экономии. Не забывайте, что ответы LLM (как строки) весят дополнительные ~1-3 KB каждый — ещё 1-3 GB на миллион.
GPTCache всё ещё актуален в 2026?
Да, как готовая библиотека для Python-стеков. Он поддерживает pluggable backend (FAISS, Qdrant, Milvus, Redis), горячую замену embedding-моделей, TTL и пороговый поиск из коробки. Но при 1000+ RPS упирается в GIL — для высоких нагрузок лучше Redis Stack или кастомный Rust/Go proxy.
Стоит ли кешировать ответы при temperature > 0?
Нет — если вам нужна креативность. Кешировать стоит только deterministic запросы с temperature = 0 (или ниже 0,1). Ответы с высокой температурой — уникальные, hit rate будет 0-5%, а overhead эмбеддинга на каждый запрос останется. Хорошая практика: кеш-прокси проверяет temperature в запросе и пропускает креативные вызовы.