LLM-кеширование — набор техник, которые перехватывают повторяющиеся запросы к языковым моделям и возвращают сохранённые ответы, не обращаясь к модели. Три слоя кеширования работают на разных уровнях: семантический кеш (GPTCache, Redis) на уровне приложения, KV-кеш внутри GPU (vLLM) и Prompt Cache (SGLang) на уровне инференс-фреймворка. Hit rate 30-70% в зависимости от нагрузки, экономия до 60% затрат на GPU — по данным Spheron и TokenMix, апрель 2026.

Architecture of LLM caching: semantic cache, KV cache and prompt cache

Architecture of three-level LLM caching: semantic cache (GPTCache/Redis/Qdrant), KV cache (vLLM) and prompt cache (SGLang RadixAttention)

30-70%Cache hit rate на FAQ и агентах
3-8 мсЛатентность cache hit vs 500-2000 мс LLM
$846/месЭкономия на 1M запросов при 60% hit rate
~8 000 звёздGPTCache на GitHub

Семантическое кеширование — как это работает

Каждый запрос к 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%).

Запрос Embedding
BGE-M3, 2 ms
Vector Search
Qdrant / FAISS
HIT ≥ 0.92 Кеш 3-8 ms
Запрос Embedding Vector Search MISS < 0.92 vLLM 500-2000 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 GitHub repository: 8 092 stars, MIT license

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 0923-10 msКосинус близостьMIT
Redis Stack + RediSearchСемантический75 3432-5 msCosine/IP/L2RSAL
Qdrant (кастомный proxy)Семантический33 0713-8 msCosine (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 pipeline0,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 в запросе и пропускает креативные вызовы.