Semantic cache ускоряет ответ ценой нового класса ошибок
Обычный exact cache возвращает значение только для одинакового ключа. Semantic cache строит embedding запроса и ищет похожие записи. Это полезно для повторяющихся FAQ и справочных вопросов, но близость векторных представлений не доказывает одинаковый правильный ответ.
Cache miss вызывает новый LLM-call и стоит денег. False hit мгновенно возвращает чужой, устаревший или контекстно неверный ответ. Поэтому оптимизация начинается с качества reuse decision.
Не путайте четыре вида кэширования
| Вид | Что переиспользует | Главный риск |
|---|---|---|
| Prompt cache | Вычисление общего input prefix | Не кэширует готовый смысловой ответ |
| Exact response cache | Ответ по идентичному canonical key | Неполный key |
| Semantic response cache | Ответ похожего запроса | False semantic hit |
| Retrieval cache | Результаты поиска chunks | Устаревший corpus |
Эти слои имеют разные TTL, invalidation и метрики. Не называйте их одним cache hit в dashboard.
Когда semantic reuse действительно уместен
| Хороший кандидат | Почему | Плохой кандидат |
|---|---|---|
| Стабильный FAQ | Один проверенный ответ | Баланс счёта пользователя |
| Инструкция по продукту | Версионируемый corpus | Текущая цена или наличие |
| Объяснение политики | Ответ привязан к версии | Юридическое решение по кейсу |
| Классификация ограниченного набора | Валидируемый label | Свободный творческий текст |
| Повторяющийся helpdesk | Высокая частота paraphrase | Agent tool plan с side effects |
Сначала exact cache, затем semantic
Exact cache дешевле, объяснимее и имеет меньшую вероятность неверного reuse. Постройте canonical request key, измерьте повторяемость и только затем добавляйте embeddings для оставшихся запросов. Это создаёт baseline и показывает верхнюю границу дополнительной пользы.
Normalize
Только безопасные различия.
Exact lookup
Canonical key и version scope.
Semantic lookup
Только после exact miss.
Определите cache eligibility до lookup
Не каждый запрос должен попасть в cache. Детерминированный policy слой проверяет intent, data class, наличие персональных параметров, time sensitivity, side effects и требование свежего retrieval. Модель может помочь классифицировать, но окончательное решение принимает runtime.
Allow response caching only when: use_case is allowlisted AND no secrets or sensitive personal data AND no live transaction state AND no tool side effects AND answer is reusable across the selected scope AND source and policy versions are known AND response passed validation Otherwise bypass cache and record the reason.
Cache key обязан включать весь контекст ответа
Одинаковый вопрос может иметь разные ответы для tenant, языка, тарифа, региона, версии продукта и policy. Если эти dimensions не входят в scope, hit становится утечкой или логической ошибкой.
scope_hash = SHA256( tenant_id + workspace_or_public_scope + actor_policy_hash + locale + region + product_version + model_version + prompt_version + tool_schema_version + retrieval_corpus_version + safety_policy_version + output_schema_version ) Vector search is executed only inside scope_hash.
Нормализация не должна удалять смысл
Можно унифицировать Unicode, пробелы и безопасные представления регистра. Нельзя бездумно удалять числа, отрицания, даты, product IDs, единицы измерения и порядок, если он влияет на запрос.
| Операция | Обычно безопасно | Риск |
|---|---|---|
| Unicode normalization | Да, после тестов | Редкие символы |
| Whitespace folding | Для обычного текста | Код и таблицы |
| Lowercase | Зависит от языка | IDs и case-sensitive values |
| Удаление punctuation | Осторожно | Формулы и отрицания |
| Удаление чисел | Нет | Меняет вопрос |
Embedding model является частью версии cache
Смена embedding model, dimensions или preprocessing меняет геометрию similarity. Не смешивайте vectors разных версий в одном поисковом пространстве. Создавайте новый namespace и прогревайте его отдельно.
- Храните provider, model ID и dimensions.
- Версионируйте normalization pipeline.
- Проверяйте supported distance metric.
- Не сравнивайте scores между разными индексами.
- Миграция проходит shadow dual lookup.
Threshold выбирается на размеченных парах
Число similarity из примера документации не является универсальным порогом. Соберите пары запросов: safe reuse, unsafe reuse и hard negatives, различающиеся одним числом, отрицанием, tenant или временем. Постройте precision/recall по threshold.
For each query pair label: SAFE_REUSE - same correct answer under the same scope UNSAFE_REUSE - similarity exists, but answer differs For every candidate threshold calculate: accepted-hit precision accepted-hit recall false-hit severity-weighted loss expected saved inference cost embedding + storage + review cost Choose threshold under a minimum precision gate.
Один global threshold почти всегда слаб
Разные intents и языки имеют разные score distributions. FAQ о настройке может терпеть paraphrase, а вопрос со сроком или версией требует exact constraints. Применяйте threshold по use case, locale и risk tier, но не создавайте сотни необслуживаемых правил без данных.
Candidate проходит не только similarity
После vector search проверьте scope, eligibility, source versions, TTL, locale, response schema, safety flags и статус validation. Можно дополнительно использовать дешёвый reranker или rule-check по критичным сущностям.
- Точный scope hash.
- Similarity выше calibrated threshold.
- Совпадают критичные entities.
- Entry не истёк.
- Source versions актуальны.
- Prompt/model/schema совместимы.
- Response прошёл quality gate.
- Safety policy разрешает reuse.
- Entry не revoked.
Cache entry хранит доказательства происхождения
Недостаточно сохранить query, vector и answer. Добавьте scope, versions, timestamps, sources, validation, safety, usage и invalidation tags. Raw sensitive prompt хранится только при необходимости и по retention policy.
entry_id, scope_hash canonical_query_hash, embedding_ref, embedding_version response, response_schema_version model_version, prompt_version, policy_version source_ids_and_versions, generated_at validated_at, validator_version, quality_status expires_at, invalidation_tags, revoked_at hit_count, last_hit_at data_class, encryption_key_ref
Freshness определяется данными, а не только TTL
Фиксированный TTL удобен, но изменение документа должно инвалидировать ответ сразу. Назначьте dependency tags: product version, policy ID, catalog snapshot, source document. Событие обновления помечает связанные entries revoked либо переключает versioned namespace.
| Стратегия | Плюс | Минус |
|---|---|---|
| TTL | Просто | Окно устаревания |
| Event invalidation | Быстро после change | Нужна надёжная доставка |
| Versioned namespace | Atomic cutover | Нужно прогревать |
| Read-time version check | Сильная свежесть | Дополнительная latency |
| Manual revoke | Incident response | Не основной механизм |
Stampede возникает и у semantic cache
После массовой invalidation много одинаковых miss одновременно идут в LLM. Используйте single-flight по canonical cluster, короткий lease на regeneration, jittered TTL и bounded refresh queue. Не заставляйте user request ждать бесконечный rebuild.
- Один leader генерирует candidate.
- Followers ждут ограниченное время или обходят cache.
- Failed generation не записывается как valid.
- Negative cache для terminal invalid requests имеет короткий TTL.
- Refresh не вытесняет interactive quota.
Tenant isolation проверяется до vector search
Запрос к общему vector index без tenant filter уже нарушает boundary, даже если результат отфильтровали позже. Используйте namespace или mandatory pre-filter и повторную ownership-проверку. Public cache - отдельный явный scope, а не запись без tenant ID.
Scope
Trusted tenant и policy context.
Search
Только внутри разрешённого partition.
Verify
Ownership и versions после retrieval.
Cache poisoning начинается с плохой записи
Если атакующий добился сохранения вредоносного или неверного ответа, semantic cache масштабирует его на похожие запросы. Кэшируйте только outputs из allowlisted workflow, прошедшие schema, safety и quality validation. Разделяйте запись и чтение правами.
- Write path аутентифицирован.
- Только eligible use cases.
- Output schema валидна.
- Tool errors не кэшируются.
- Prompt injection не попадает в answer.
- Sources и versions сохранены.
- Quality status обязателен.
- Mass insert и unusual hits вызывают alert.
- Есть revoke и purge по тегу.
Персонализация резко сужает reuse
Ответ, использующий историю, тариф, регион или права пользователя, нельзя отдавать другому actor только потому, что вопрос похож. Либо включайте эти dimensions в scope, что снижает hit rate, либо кэшируйте общий reusable skeleton и подставляйте проверенные персональные данные после.
| Подход | Безопасность | Hit rate |
|---|---|---|
| Global answer | Только публичный static content | Высокий |
| Tenant scope | Организационные данные | Средний |
| User scope | Персональный контекст | Низкий |
| Cached skeleton | Данные подставляет backend | Высокий для шаблона |
Не кэшируйте agent plans как готовое действие
План, tool arguments и approval зависят от текущего state. Можно кэшировать read-only справочную часть или шаблон декомпозиции, но runtime заново проверяет preconditions и строит proposal. Cached output никогда не является разрешением на side effect.
- Approval не переносится между requests.
- Idempotency key не хранится как reusable response.
- Tool catalog/version входит в scope.
- Живые данные перечитываются.
- Policy decision выполняется заново.
Метрики должны отличать полезный hit от любого hit
| Метрика | Смысл |
|---|---|
| Exact hit rate | Повтор идентичного canonical request |
| Semantic candidate rate | Найдено выше raw threshold |
| Accepted hit rate | Прошли все reuse gates |
| Accepted-hit precision | Доля действительно корректного reuse |
| False-hit severity | Взвешенный ущерб ошибок |
| Cost per accepted answer | LLM + embeddings + cache + review |
| Freshness rejection | Сколько candidates устарели |
| Cross-scope rejection | Проверка isolation policy |
ROI считается после учёта embeddings и ошибок
Экономия inference уменьшается на embedding calls, vector search, storage, replication, invalidation, engineering и manual review. False hit может стоить больше десятков правильных hits. Считайте ожидаемую ценность по сегментам.
net_value = avoided_LLM_cost + avoided_latency_value - embedding_cost - cache_storage_and_search - invalidation_and_operations - review_cost - severity_weighted_false_hit_loss cost_per_accepted_answer = total_system_cost / accepted_answers
Shadow rollout отделяет поиск от выдачи
- Соберите baseline запросов, качества, latency и cost.
- Включите exact cache.
- Запустите semantic lookup в shadow без выдачи.
- Разметьте candidates и откалибруйте thresholds.
- Разрешите low-risk FAQ небольшой cohort.
- Показывайте provenance и feedback control.
- Следите за false hits и freshness.
- Расширяйте intents по одному.
- Держите мгновенный bypass и purge.
Production-чек-лист semantic cache
- Use case разрешает одинаковый reusable answer.
- Exact cache работает отдельно.
- Eligibility policy детерминирована.
- Scope включает tenant, policy и все versions.
- Нормализация не удаляет смысл.
- Embedding pipeline версионируется.
- Threshold откалиброван на hard negatives.
- Metadata и freshness gates обязательны.
- Entries имеют provenance и validation.
- Event invalidation и manual revoke работают.
- Vector search изолирован до retrieval.
- Poisoning и mass insert отслеживаются.
- Side effects никогда не разрешаются cache hit.
- Метрики считают precision и severity.
- Shadow, canary, bypass и purge протестированы.
Что такое semantic cache для LLM?
Чем semantic cache отличается от prompt caching?
Как выбрать similarity threshold?
Можно ли использовать один cache для всех клиентов?
Как обновлять устаревшие ответы?
Какие ответы нельзя кэшировать?
Как защититься от cache poisoning?
Как понять, что semantic cache окупается?
- Microsoft Azure API Management - AI gateway capabilities and semantic caching
- Microsoft Learn - Enable semantic caching for LLM APIs
- Amazon ElastiCache - Overview of semantic caching
- AWS Guidance - Semantic caching with ElastiCache for Valkey
- AWS Well-Architected Agentic AI Lens - Intelligent caching
- Redis Docs - Semantic cache
- OWASP - LLM Prompt Injection Prevention Cheat Sheet
- NIST - AI Risk Management Framework