Інфраструктура кешування промптів: зниження витрат та затримок LLM

Префіксне кешування Anthropic забезпечує 90% зниження витрат та 85% зменшення затримок для довгих промптів. Автоматичне кешування OpenAI увімкнено за замовчуванням (50% економії витрат). 31% запитів до LLM демонструють...

Інфраструктура кешування промптів: зниження витрат та затримок LLM

Інфраструктура кешування промптів: зниження витрат та затримок 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
}

Кешування фрагментів документів: Коли кілька запитів отримують ті самі документи, префіксне кешування усуває надлишкову обробку спільного контексту.

Агентні робочі процеси

Агентні системи з викликом інструментів виграють від префіксного кешування:

Системний промпт → Визначення інструментів → Історія розмови → Поточний запит
    (кешовано)         (кешовано)              (частково кешовано)

Запросити пропозицію_

Розкажіть про ваш проект і ми відповімо протягом 72 годин.

> ПЕРЕДАЧА_ЗАВЕРШЕНА

Запит отримано_

Дякуємо за ваш запит. Наша команда розгляне його та відповість протягом 72 годин.

В ЧЕРЗІ НА ОБРОБКУ