Semantic Caching
Семантическое кэширование возвращает сохранённый ответ LLM на новый запрос, если он означает то же, что и предыдущий: сравнивает эмбеддинги, пропускает вызовы модели и снижает расходы.
Семантическое кэширование сохраняет ответы большой языковой модели (LLM) или другой генеративной модели и повторно использует их для новых запросов с тем же смыслом, даже если формулировки различаются. Кэш преобразует каждый промпт в эмбеддинг, находит наиболее похожий сохранённый промпт и возвращает соответствующий ответ, если сходство превышает порог. При попадании в кэш вызов модели полностью пропускается, поэтому задержка сокращается до миллисекунд и запрос не расходует токены. Поскольку сопоставление учитывает смысл, запросы «Я забыл пароль» и «Как сбросить пароль?» используют один сохранённый ответ; кэшу точных совпадений, индексируемому по тексту промпта, пришлось бы хранить оба ответа отдельно. В 2023 году Zilliz выпустила библиотеку с открытым исходным кодом GPTCache для такого подхода; теперь эту функцию также предлагают векторные базы данных и шлюзы API.
Как работает семантический кэш#
Модель эмбеддингов предложений кодирует входящий промпт, а векторный поиск сравнивает его с эмбеддингами промптов, на которые уже были даны ответы, обычно с помощью косинусного сходства. Небольшие кэши помещаются в память, а большие хранятся в векторной базе данных с индексом приближённого поиска ближайших соседей. Если совпадения нет, модель генерирует новый ответ, а эмбеддинг нового промпта и ответ сохраняются вместе, обычно с указанием срока действия.
Ключ кэша должен учитывать все остальные параметры, от которых зависит правильный ответ. Ответы, созданные с разными системными промптами, версиями модели, уровнями разрешений пользователя или наборами извлечённых документов, сохраняются в отдельных областях, чтобы ответ из кэша одного клиента никогда не выдавался другому. Не менее важно следить за актуальностью: когда меняются цена, политика или исходный документ, записи, созданные на основе старой версии, продолжают соответствовать новым промптам. Поэтому для каждой записи задают срок жизни, а область, затронутую изменением исходных данных, очищают.
Выбор порога сходства#
Порог определяет, насколько могут отличаться два промпта, чтобы им всё ещё соответствовал один ответ. В этом примере модель all-MiniLM-L6-v2 из Sentence Transformers используется для кодирования записей кэша из трёх элементов:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")Перефразированный запрос о пароле получает оценку 0,89 и правильно находит ответ. Перефразированный запрос о часах работы получает всего 0,61 и не находит совпадения. Запрос «Как отменить заказ?» получает оценку 0,71 по отношению к запросу «Как отменить подписку?» и выдаст неверную инструкцию. Сходство эмбеддингов отражает общность формулировок и темы, поэтому единого порога, разделяющего эти три случая, нет. В производственных кэшах эту проблему решают, дообучая кодировщик на парах перефразировок из собственного трафика, задавая пороги для отдельных категорий или передавая каждое потенциальное совпадение переранжировщику, который сравнивает два промпта перед выдачей ответа из кэша.
Где применяют семантическое кэширование#
Семантическое кэширование полезно там, где многие пользователи задают одни и те же вопросы, а ответы меняются редко: в службе поддержки, чат-ботах, внутренних справочных службах и ассистентах генерации с дополненной извлечением (RAG), работающих со стабильной документацией. Персонализированные, актуальные по времени или творческие запросы почти ничего не выигрывают от кэширования: повторно использованный ответ окажется неверным или шаблонным.
При обслуживании LLM работают ещё два типа кэша, но на других уровнях:
- Кэширование промпта: Сервер модели сохраняет вычисленные состояния точного повторяющегося префикса промпта, сокращая этап предварительной обработки; при этом модель всё равно генерирует новый ответ.
- KV-кэш: Ключи и значения предыдущих токенов хранятся в рамках одной генерации, поэтому для каждого нового токена не нужно вычислять их заново.
Семантический поиск использует такой же поиск по эмбеддингам для извлечения документов по запросу, а семантический кэш — для извлечения готовых ответов. Часто он работает внутри шлюза ИИ, который связывает приложения с поставщиками моделей.
Изображения можно использовать для индексирования кэша таким же образом. embed() в Ultralytics YOLO возвращает вектор признаков для каждого изображения, поэтому модель YOLO26, обученная для классификации изображений, может создавать ключи поиска, позволяющие повторно использовать предыдущее описание мультимодальной модели для почти идентичных кадров с камеры.










