Кеширование ответов AI — это техника сохранения результатов запросов к языковой модели для повторного использования без повторного вызова API. Для типичных приложений (FAQ-боты, генерация описаний, классификация) кеширование может сократить расходы на AI API на 30-60% и ускорить время ответа с секунд до миллисекунд.
Когда кеширование эффективно
Кеширование работает лучше всего, когда:
- Повторяющиеся запросы — пользователи часто задают одни и те же вопросы (FAQ, поддержка)
- Детерминированные ответы — при
temperature=0одинаковые промпты дают одинаковые ответы - Медленные запросы — кеш мгновенно возвращает результат вместо ожидания 3-10 секунд
- Высокие объёмы — экономия растёт пропорционально количеству повторных запросов
Exact Match кеш (точное совпадение)
Самый простой подход — кешировать по точному совпадению запроса. Используем Redis:
import hashlib
import json
import redis
from openai import OpenAI
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
cache = redis.Redis(host="localhost", port=6379, db=0)
CACHE_TTL = 3600 # 1 час
def make_cache_key(model: str, messages: list, temperature: float) -> str:
"""Создаёт уникальный ключ кеша из параметров запроса."""
payload = json.dumps({"model": model, "messages": messages, "temperature": temperature}, sort_keys=True)
return f"ai_cache:{hashlib.sha256(payload.encode()).hexdigest()}"
def cached_completion(model: str, messages: list, temperature: float = 0.0) -> str:
"""Запрос к AI с кешированием."""
key = make_cache_key(model, messages, temperature)
# Проверяем кеш
cached = cache.get(key)
if cached:
print("[CACHE HIT]")
return cached.decode("utf-8")
# Кеш-промах — запрос к API
print("[CACHE MISS]")
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature
)
result = response.choices[0].message.content
# Сохраняем в кеш
cache.setex(key, CACHE_TTL, result)
return result
# Первый вызов — кеш-промах, запрос к API
answer1 = cached_completion("gpt-4o", [{"role": "user", "content": "Что такое Docker?"}])
# Второй вызов — мгновенный ответ из кеша
answer2 = cached_completion("gpt-4o", [{"role": "user", "content": "Что такое Docker?"}])
Семантический кеш
Exact match не поймает перефразировки: «Что такое Docker?» и «Объясни Docker» — разные строки. Семантический кеш использует эмбеддинги для поиска похожих запросов:
import numpy as np
class SemanticCache:
def __init__(self, similarity_threshold: float = 0.92):
self.threshold = similarity_threshold
self.entries: list[dict] = []
def get_embedding(self, text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_sim(self, a: list[float], b: list[float]) -> float:
a_np, b_np = np.array(a), np.array(b)
return float(np.dot(a_np, b_np) / (np.linalg.norm(a_np) * np.linalg.norm(b_np)))
def get(self, query: str) -> str | None:
query_emb = self.get_embedding(query)
for entry in self.entries:
if self.cosine_sim(query_emb, entry["embedding"]) >= self.threshold:
return entry["response"]
return None
def set(self, query: str, response: str):
embedding = self.get_embedding(query)
self.entries.append({"query": query, "embedding": embedding, "response": response})
sem_cache = SemanticCache(similarity_threshold=0.92)
def smart_completion(query: str) -> str:
# Проверяем семантический кеш
cached = sem_cache.get(query)
if cached:
print("[SEMANTIC CACHE HIT]")
return cached
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": query}],
temperature=0
)
result = response.choices[0].message.content
sem_cache.set(query, result)
return result
Стратегии инвалидации кеша
Кеш должен обновляться. Основные стратегии:
- TTL (Time-To-Live) — автоматическое удаление через N секунд. Для FAQ: 24 часа. Для новостей: 1 час.
- Версионирование промптов — при изменении system prompt добавляйте версию в ключ кеша.
- Ручная инвалидация — API для очистки кеша при обновлении базы знаний.
- LRU (Least Recently Used) — автоматическое удаление наименее используемых записей при заполнении кеша.
Расчёт экономии
| Метрика | Без кеша | С кешем (40% hit rate) |
|---|---|---|
| Запросов в день | 10 000 | 10 000 |
| Вызовов API | 10 000 | 6 000 |
| Стоимость (GPT-4o) | ~$30/день | ~$18/день |
| Средний latency | 2-5 сек | 0.8-2 сек |
| Экономия в месяц | — | ~$360 |
Кеширование — одна из самых простых оптимизаций для AI-приложений. Начните с exact match кеша на Redis, затем добавьте семантический кеш для повышения hit rate. ModelSwitch упрощает контроль расходов с помощью дашборда аналитики.