Semantic caching — не трюк экономии, а признание: многие «AI-фичи» прячут FAQ-логику

Семантический кэш для LLM не обязан быть трюком экономии — чаще это признание, что «умная» фича на деле снимает одни и те же вопросы. Соло-разработчик с агентом в IDE платит за API не за разнообразие, а за повтор однотипных запросов; в эссе @cyclopt_dimitrisk сопоставляет три режима кэширования и риск ответа по устаревшей политике.
Маркетинг AI-фич и строка в счёте за токены
За каждой новой AI-powered фичей стоит один и тот же pitch: она «понимает всё, что спросит пользователь» — открытая, гибкая, по-настоящему умная. На практике support-бот получает ограниченный набор вопросов: политика возврата, refund, как отправить товар обратно — по кругу, бесконечно.
That gap, between the imagined variety of user queries and the actual repetition underneath it, is where the token bill lives.
Разрыв между воображаемым разнообразием и фактическим повтором — не философия, а строка в infra-билле. Наивный путь выглядит рабочим: каждое сообщение пользователя уходит в frontier-модель (embed → retrieve → generate). Но одинаковый смысл запроса оплачивается заново при каждом обращении — «дорого в очень конкретном смысле», как формулирует автор.
Три режима кэширования LLM-вызовов
Архитектура расходится на три ветки — и каждая по-своему связана с честностью AI-фичи.
1. Без кэша. Каждый запрос — полный вызов модели. Просто и предсказуемо, пока трафик мал.
2. Exact-match cache. Хеш запроса → hit → модель не вызывается. Ломается на перефразах: «How do I reset my password» и «forgot my password, help» — один смысл, два ключа.
3. Semantic cache. Вместо хеша — вектор запроса; nearest-neighbor по уже отвеченным парам; при similarity выше порога — ответ из кэша, иначе вызов модели и добавление пары query/response. Это не «ИИ понял, что вопрос похож» — distance calculation в vector space с выбранным cutoff.
запрос → embed → поиск ближайшего соседа в кэше
↓ similarity ≥ порог? → ответ из кэша
↓ иначе → вызов модели → сохранить пару
Именно semantic cache автор называет признанием FAQ-под капотом: вы кэшируете повторяющиеся смыслы, а не демонстрируете open-ended понимание.
Когда кэш превращается в платящий за себя баг
Два failure mode бьют по доверию к AI-ассистенту сильнее, чем по кошельку.
Устаревание. Ответ закэширован в марте, политика возврата меняется в апреле — кэш продолжает матчить и отдавать старое. «Cache without expiration policy isn't a cost optimization, it's a bug that pays for itself to keep running.»
Порог similarity. Слишком свободный порог → ложные hit (мартовский ответ на апрельский refund). Слишком жёсткий → hit rate уходит в single-digit territory — без универсального процента, только число, измеренное на своём трафике.
Для агента в продукте параллель очевидна: при разработке Cyclopt Companion analyzers автор столкнулся с тем, что «one-line diff shouldn't necessarily trigger a full re-analysis from scratch» — а «что считать close enough to skip» оказалось инженерной задачей, не анализом как таковым.
Стоит ли собирать semantic cache
Критерии в тексте — не рецепт «настоящего понимания», а честная оценка домена.
| Ситуация | Вывод автора |
|---|---|
| Hit rate уже влияет на infra-билл; запросы стабильны (support, FAQ, internal tooling) | Свой semantic cache на pgvector или Redis — «weekend project» |
| Запросы genuinely open-ended: creative generation, one-off analysis | Слой кэширования — wasted engineering effort |
Заголовок отвергает framing «cost-saving hack»; в теле экономия — следствие повторяемости запросов, без количественных моделей. Конкретных цифр ($, %, токены) в материале нет — автор в финале спрашивает читателей, измеряли ли они hit rate на user-facing LLM calls или гадают.
Semantic caching isn't really an AI technique. It's ordinary distributed-systems caching (TTLs, invalidation, cache keys) with an embedding standing in for the key. The AI part was never the hard part.
Соло-разработчику с ассистентом в цикле вывод практичный: если ваша «AI-фича» живёт на повторяющихся вопросах — проектируйте TTL, invalidation и порог; если каждый запрос уникален — не маскируйте отсутствие кэша маркетингом «понимает всё».
Операционные паттерны из ветки обсуждения
В единственном комментарии к посту Max Quimby (@max_quimby) соглашается, что staleness — «тихий убийца» semantic-cache проектов, и предлагает паттерны из своего опыта — не позиция автора эссе:
- привязать eviction к источнику: при смене return-policy doc инвалидировать все entries, чей retrieval касался этого документа; cache key включает content hash источников, не только query vector;
- кэшировать отказы («we don't support that») — высокоповторяемый и дешёвый путь, который «people forget to cache»;
- для проверки порога — shadow call к модели на выборке cache hits: «the only honest way I've found» измерить false-positive rate.
Ответа автора поста на комментарий на момент сбора контекста не было.