Інфраструктура кешування промптів: зниження витрат та затримок LLM
Оновлено 11 грудня 2025 року
Оновлення грудня 2025: Префіксне кешування Anthropic забезпечує 90% зниження витрат та 85% зменшення затримок для довгих промптів. Автоматичне кешування OpenAI увімкнено за замовчуванням (50% економії витрат). 31% запитів до LLM демонструють семантичну подібність — масштабна неефективність без кешування. Читання з кешу коштує $0.30/M токенів проти $3.00/M для нових запитів (Anthropic). Багаторівнева архітектура кешування (семантичне → префіксне → інференс) максимізує економію.
Кешування промптів Anthropic зменшує витрати до 90% та затримки до 85% для довгих промптів.¹ OpenAI досягає 50% зниження витрат з автоматичним кешуванням, увімкненим за замовчуванням. Дослідження показують, що 31% запитів до LLM демонструють семантичну подібність до попередніх запитів, що представляє масштабну неефективність у розгортаннях без інфраструктури кешування.² Організації, що експлуатують продуктивні AI-застосунки, втрачають значні кошти без належних стратегій кешування.
Кешування промптів працює на кількох рівнях — від префіксного кешування на стороні провайдера, яке повторно використовує обчислення KV-кешу, до семантичного кешування на рівні застосунку, яке повертає попередні відповіді для подібних запитів. Розуміння кожного рівня та коли його застосовувати допомагає організаціям оптимізувати як витрати, так і затримки для їхніх специфічних патернів навантаження.
Основи кешування
Витрати на інференс LLM походять з двох джерел: обробка вхідних токенів та генерація вихідних токенів. Стратегії кешування націлені на обидва:
Кешування вхідних токенів (префіксне кешування)
Кожен запит до LLM обробляє вхідні токени через механізм уваги моделі, генеруючи пари ключ-значення, що зберігаються в KV-кеші. Коли кілька запитів мають ідентичні префікси — системні промпти, приклади few-shot або контекст документів — обчислення KV-кешу непотрібно повторюються.
Рішення префіксного кешування: Зберігати обчислені KV-значення для поширених префіксів. Наступні запити з відповідними префіксами пропускають повторне обчислення, починаючи з кешованого стану.
Вплив на витрати: - Anthropic: Читання з кешу коштує $0.30/M токенів проти $3.00/M для нової обробки (90% економії) - OpenAI: 50% знижка для кешованих токенів - Google: Варіативне ціноутворення залежно від контекстного вікна
Вплив на затримки: Пропуск обчислення префікса зменшує час до першого токена на 50-85% залежно від довжини префікса.
Кешування виводу (семантичне кешування)
Деякі запити заслуговують на ідентичні відповіді — повторювані питання, детерміновані запити або пошуки, що не потребують повторної генерації.
Рішення семантичного кешування: Зберігати вихідні відповіді з ключем за семантично подібними вхідними даними. Повертати кешовані відповіді без виклику LLM для відповідних запитів.
Вплив на витрати: Кешовані відповіді повністю усувають API-виклики — 100% економії при попаданнях у кеш.
Вплив на затримки: Відповідь повертається за мілісекунди замість секунд для інференсу LLM.
Ієрархія кешування
Продуктивні системи зазвичай реалізують кілька рівнів кешування:
Запит → Семантичний кеш (100% економії) → Префіксний кеш (50-90% економії) → Повний інференс
↓ ↓ ↓
Кешована відповідь Кешований KV-стан Нове обчислення
Кожен рівень захоплює різні можливості оптимізації на основі патернів подібності запитів.
Кешування промптів на рівні провайдера
Anthropic Claude
Anthropic пропонує найбільш конфігуроване кешування промптів:³
Ціноутворення: - Запис у кеш: надбавка 25% до базової ціни вхідних токенів - Читання з кешу: знижка 90% (10% від базової ціни) - Точка беззбитковості: 2+ попадання в кеш на кешований префікс
Вимоги: - Мінімум 1024 токени на контрольну точку кешу - До 4 контрольних точок кешу на запит - Час життя кешу: 5 хвилин з останнього доступу (продовжується до 1 години при регулярних попаданнях) - До 5 кешованих реплік розмови
Реалізація:
import anthropic
client = anthropic.Anthropic()
# Позначити вміст для кешування за допомогою cache_control
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are an expert assistant for our enterprise software...",
"cache_control": {"type": "ephemeral"} # Позначити для кешування
}
],
messages=[{"role": "user", "content": "How do I configure user permissions?"}]
)
Найкращі практики: - Розміщувати статичний вміст (системні промпти, документацію) на початку промпту - Розміщувати динамічний вміст (введення користувача, розмову) в кінці - Використовувати контрольні точки кешу на природних межах - Моніторити рівень попадань у кеш для перевірки оптимізації
OpenAI
OpenAI реалізує автоматичне кешування без змін у коді:⁴
Ціноутворення: - Кешовані токени: 50% від базової ціни вхідних токенів - Без надбавки за запис у кеш
Вимоги: - Мінімум 1024 токени для права на кешування - Попадання в кеш відбуваються з кроком 128 токенів - Час життя кешу: 5-10 хвилин неактивності
Автоматична поведінка: - Промпти понад 1024 токени автоматично кешуються - Система виявляє відповідні префікси між запитами - Зміни в API не потрібні
Моніторинг:
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[...],
)
# Перевірити використання для попадань у кеш
print(f"Кешовані токени: {response.usage.prompt_tokens_details.cached_tokens}")
print(f"Загальна кількість вхідних токенів: {response.usage.prompt_tokens}")
Google Gemini
Google надає кешування контексту для моделей Gemini:⁵
Ціноутворення: - Варіативне залежно від розміру кешованого контексту та тривалості - Плата за зберігання кешованого вмісту
Можливості: - Явне створення та управління кешем - Налаштовуваний час життя (TTL) - Спільне використання кешу між запитами
Реалізація:
from google.generativeai import caching
# Створити кешований вміст
cache = caching.CachedContent.create(
model='models/gemini-1.5-pro-001',
display_name='product-documentation',
system_instruction="You are a product expert...",
contents=[product_docs],
ttl=datetime.timedelta(hours=1)
)
# Використовувати кешований вміст у запитах
model = genai.GenerativeModel.from_cached_content(cached_content=cache)
response = model.generate_content("How do I configure feature X?")
Amazon Bedrock
AWS пропонує кешування промптів у попередньому перегляді для підтримуваних моделей:⁶
Вимоги: - Claude 3.5 Sonnet вимагає мінімум 1024 токени на контрольну точку - Друга контрольна точка вимагає 2048 токенів
Патерн реалізації відповідає підходу cache_control Anthropic у структурі API Bedrock.
Префіксне кешування vLLM
Самостійно розгорнутий інференс з vLLM включає автоматичне префіксне кешування:⁷
Архітектура
Автоматичне префіксне кешування (APC) vLLM зберігає KV-блоки в хеш-таблиці, забезпечуючи повторне використання кешу без деревоподібних структур:
Ключовий дизайн: - Усі KV-блоки зберігаються в пулі блоків при ініціалізації - Пошук на основі хешу для відповідності префіксів - Операції O(1) для управління блоками - Збережена ефективність пам'яті PagedAttention
Конфігурація
from vllm import LLM
llm = LLM(
model="meta-llama/Llama-3.1-8B-Instruct",
enable_prefix_caching=True, # Увімкнути APC
gpu_memory_utilization=0.90,
)
Вплив на продуктивність
vLLM з PagedAttention демонструє в 14-24 рази вищу пропускну здатність порівняно з наївними реалізаціями.⁸ Префіксне кешування додає:
- 10-кратна різниця у вартості між кешованими та некешованими токенами
- Зменшення затримок на порядок для відповідних префіксів
- Ефективність пам'яті через спільні KV-блоки
Міркування щодо безпеки
vLLM підтримує ізоляцію кешу для спільних середовищ:
# Сіль кешу для кожного запиту запобігає міжорендарному доступу до кешу
response = llm.generate(
prompt="...",
sampling_params=SamplingParams(...),
cache_salt="tenant-123" # Ізолювати кеш за орендарем
)
Ін'єкція солі кешу в хеші блоків запобігає атакам через часові канали, де зловмисники виводять кешований вміст через спостереження за затримками.
Розширення LMCache
LMCache розширює vLLM розширеними можливостями кешування:⁹
Можливості: - Повторне використання KV-кешу між екземплярами двигуна - Багаторівневе сховище (GPU → RAM CPU → диск) - Кешування непрефіксного вмісту - Зменшення затримок у 3-10 разів у бенчмарках
Архітектура:
vLLM Engine → LMCache → GPU VRAM (гарячий)
→ CPU RAM (теплий)
→ Локальний диск (холодний)
Семантичне кешування
Семантичне кешування повертає попередні відповіді для семантично подібних (не лише ідентичних) запитів:
GPTCache
GPTCache надає відкрите семантичне кешування для LLM-застосунків:¹⁰
Архітектура:
Запит → Ембединг → Векторний пошук → Перевірка подібності → Відповідь/API-виклик
↓ ↓ ↓
BERT/OpenAI Milvus/FAISS Поріг (0.8)
Компоненти: - LLM Adapter: Інтеграція з різними провайдерами LLM - Embedding Generator: Векторизація запитів - Vector Store: Пошук за подібністю (Milvus, FAISS, Zilliz) - Cache Manager: Зберігання та отримання - Similarity Evaluator: Відповідність на основі порогу
Реалізація:
from gptcache import cache
from gptcache.adapter import openai
# Ініціалізувати семантичний кеш
cache.init(
pre_embedding_func=get_text_embedding,
data_manager=manager,
)
# Використовувати кешовані виклики OpenAI
response = openai.ChatCompletion.create(
model='gpt-4',
messages=[{"role": "user", "content": "What is machine learning?"}]
)
# Семантично подібні запити ("Explain ML", "Define machine learning")
# повертають кешовану відповідь
Продуктивність
GPTCache досягає значних покращень ефективності:¹¹
- Зменшення API-викликів: До 68.8% по категоріях запитів
- Рівень попадань у кеш: 61.6% до 68.8%
- Точність: 97%+ позитивний рівень попадань
- Зменшення затримок: 40-50% при попаданнях у кеш, до 100x для повних попадань
Розширені техніки
Адаптивні пороги VectorQ:¹²
Статичні пороги подібності (наприклад, 0.8) погано працюють для різноманітних запитів. VectorQ вивчає специфічні для ембедингів порогові регіони, які адаптуються до складності запитів:
- Прості фактичні запити: Вищі пороги (суворіша відповідність)
- Відкриті запити: Нижчі пороги (більше повторного використання)
- Неоднозначні запити: Динамічне коригування
Виявлення патернів SCALM:
SCALM покращує GPTCache через виявлення патернів та аналіз частоти: - 63% покращення рівня попадань у кеш - 77% зменшення використання токенів - Ідентифікує високочастотні патерни записів у кеші
Коли використовувати семантичне кешування
Гарні кандидати: - Запити у стилі FAQ з обмеженим простором відповідей - Пошукові запити (інформація про продукт, документація) - Детерміновані відповіді (обчислення, форматування) - Застосунки з високим трафіком та повторюваністю запитів
Погані кандидати: - Креативна генерація, що вимагає унікальності - Персоналізовані відповіді (специфічний для користувача контекст) - Чутлива до часу інформація - Патерни запитів з низькою повторюваністю
Патерни реалізації
Чат-застосунки
Чат-системи виграють від обох видів кешування — префіксного та семантичного:
Кешування системного промпту:
# Статичний системний промпт кешується на початку запиту
system_prompt = """
You are a customer support agent for Acme Corp...
[2000+ токенів інструкцій та знань]
"""
# Динамічна розмова додається після кешованого префікса
messages = [
{"role": "system", "content": system_prompt, "cache_control": {...}},
{"role": "user", "content": user_message}
]
Кешування історії розмови: Anthropic підтримує кешування до 5 реплік розмови, зменшуючи витрати на багатоходові розмови.
RAG-застосунки
Retrieval-augmented generation кешує отриманий контекст:
# Структура кешу для RAG
cached_context = {
"system": system_prompt, # Завжди кешується
"documents": retrieved_chunks, # Кеш на кластер запитів
"examples": few_shot_examples # Стабільний між запитами
}
# Змінюється лише запит користувача
dynamic_content = {
"query": user_question
}
Кешування фрагментів документів: Коли кілька запитів отримують ті самі документи, префіксне кешування усуває надлишкову обробку спільного контексту.
Агентні робочі процеси
Агентні системи з викликом інструментів виграють від префіксного кешування:
Системний промпт → Визначення інструментів → Історія розмови → Поточний запит
(кешовано) (кешовано) (частково кешовано)