Гайд · TNWS AI
Как проверить пользу prefix caching vLLM для повторных вопросов к документу
Включаем prefix caching, сохраняем общий префикс и измеряем время обработки повторных вопросов без обещания ускорения каждого ответа.
Задача и применимость
Вопрос читателя: «как ускорить повторные запросы vLLM prefix caching». Для vLLM engine с поддерживаемым KV-cache и повторяющимся префиксом prompt; официальное описание и параметр --enable-prefix-caching проверены 20 сентября 2026 года. Эффект зависит от модели, памяти и нагрузки.
Для воспроизводимости запишите фактическую версию установленного vLLM, модельный checkpoint и параметры запуска. Путь /models/your-chat-checkpoint либо /models/your-embedding-checkpoint в команде ниже — заполнитель, а не реальный файл. Наличие GPU, объём памяти и условия лицензии весов проверяются до запуска. Демонстрация не утверждает, что ответ модели заранее известен по буквам.
Проверенные возможности
Automatic Prefix Caching переиспользует KV cache для общей начальной части последовательности запросов, уменьшая повторную обработку совпадающего префикса. Документация называет повторные вопросы к одному длинному документу типичным случаем. Engine Arguments поддерживают --enable-prefix-caching и варианты алгоритма хеширования; для чувствительного multi-tenant сценария не заменяйте криптографический выбор случайно.
Пошаговая процедура
- Составьте искусственный длинный документ с постоянным началом.
- Запустите тестовый сервер с --enable-prefix-caching.
- Отправьте первый запрос с документом и одним вопросом, засеките время.
- Отправьте второй запрос с тем же префиксом и другим вопросом.
- Сравните замеры после прогрева и метрики cache hits при одинаковых условиях.
Команда для тестового запуска на локальном адресе (подставьте законно полученный checkpoint):
vllm serve /models/your-chat-checkpoint --enable-prefix-caching --host 127.0.0.1 --port 8000
Готовый запрос и контроль ответа
В приведённом фрагменте используется стандартная библиотека Python и простой общий помощник для отправки JSON. Подставьте при необходимости Bearer-токен через защищённую переменную окружения и проверьте, что ваш сервер его ожидает.
import json, urllib.request
BASE = "http://127.0.0.1:8000"
def call(path, payload):
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(BASE + path, data=data,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(request, timeout=120) as reply:
return json.load(reply)
import time
model = json.load(urllib.request.urlopen(BASE + "/v1/models"))["data"][0]["id"]
common = "Документ: возврат 14 дней. Доставка по будням. " * 100
for question in ("Каков срок возврата?", "Когда доставка?"):
payload = {"model": model, "messages": [{"role": "user",
"content": common + "\nВопрос: " + question}], "max_tokens": 48}
started = time.perf_counter()
result = call("/v1/chat/completions", payload)
print(question, round(time.perf_counter() - started, 3),
result["choices"][0]["message"]["content"])
Пример входа и ожидаемого результата
Первый вход содержит общий искусственный документ и вопрос про срок; второй — тот же текст и вопрос про доставку. Ожидаемые ответы по смыслу: 14 дней и по будням. Ожидаемый измеряемый эффект — возможность повторно использовать префикс; улучшение времени не гарантировано одним парным экспериментом.
Как интерпретировать результат
Ключевое слово здесь «префикс»: если вставить текущую дату, ID пользователя или вопрос в самое начало, совпадение может исчезнуть. Стабильный документ размещайте до меняющейся части, но не передавайте чужой приватный документ другому пользователю ради кэша. Сам KV-cache является оптимизацией вычислений, а не хранилищем подтверждённых фактов и не уровнем авторизации. Второй ответ всё равно нужно сверить с источником. Эффект заметнее, когда длинная общая часть действительно повторяется, а не у двух коротких независимых сообщений.
Развёртывание без потери контекста
Измерять одно время от клиента недостаточно: холодная загрузка модели, очередь и длина ответа могут превысить экономию на prefill. Повторите тест несколько раз, отделите первый прогрев, сохраняйте время до первого токена, серверные метрики и количество обработанных входных токенов. Проверяйте, что оба запроса используют одну модель и одинаковый шаблон чата. После изменения system message в начале промпта сравнение больше не чистое. Не обещайте фиксированный коэффициент ускорения без измерений на своём GPU.
Проверки качества и границы метода
Engine Arguments перечисляют выбор хеш-алгоритма для prefix cache и отмечают риски не-криптографических вариантов в multi-tenant среде. Если ваша инфраструктура обрабатывает данные нескольких клиентов, не оптимизируйте безопасность наугад ради скорости. Проверьте, есть ли реальная выгода от общей документации и насколько изменился p95 при конкурентной нагрузке. Отдельно тестируйте случай с непохожим префиксом — там высокой доли попаданий не ожидается, и это нормальный результат.
Следите за счётчиком попаданий prefix cache вместе с задержкой. Если счётчик не растёт, сначала сравните точные входные префиксы и настройки шаблона, затем исследуйте вытеснение кэша под нагрузкой. Даже растущий hit rate не означает улучшение каждого запроса: декодирование длинного ответа может доминировать над prefill. Записывайте предполагаемую общую часть как часть тестового сценария, но держите настоящий документ закрытым, если он принадлежит клиенту.
Критерии готовности
- Первый и второй промпты имеют одинаковое начало.
- Смысл обоих ответов сверяется с документом.
- Скорость и cache hits измерены отдельно.
Типичные ошибки и чего не делать
- Не вставлять переменные данные в начало общего префикса.
- Не принимать кэш за защиту данных.
- Не делать вывод об ускорении по одной паре запросов.
Частые вопросы
Что переиспользует APC?
KV cache совпадающего префикса.
Ускорит ли он любой запрос?
Нет, нужен повторяющийся префикс.
Нужен ли контроль доступа?
Да, кэш его не заменяет.
Официальные источники
Частые вопросы
Что переиспользует APC?
KV cache совпадающего префикса.
Ускорит ли он любой запрос?
Нет, нужен повторяющийся префикс.
Нужен ли контроль доступа?
Да, кэш его не заменяет.
Читайте также
Как извлечь JSON по схеме в vLLM через response_format
Схема для извлечения артикула и количества из текста: разбираем ответ и проверяем значения против исходника.
Как обработать named tool call в vLLM без произвольного выполнения кода
Требуем вызов одной безопасной функции, валидируем аргументы и не отдаём модели право запускать произвольные команды.
Как ограничить ответ vLLM вариантами choice при классификации заявок
Получаем одну из заранее разрешённых меток и отдельно проверяем, что классификация совпала с текстом обращения.
Комментарии
Пока тихо. Скажите первое слово