Гайд · TNWS AI
Почему vLLM выдаёт неожиданные ответы: проверка generation_config.json
Проверяем наследование настроек модели из generation_config.json и фиксируем параметры запроса для воспроизводимого теста.
Задача и применимость
Вопрос читателя: «почему vLLM temperature по умолчанию другой generation_config». Для генеративных checkpoints в vLLM online serving; сверено по документации 20 сентября 2026 года. Наличие generation_config.json зависит от конкретного репозитория модели. Проверяйте реальный файл, а не считайте, что он есть всегда.
Для воспроизводимости запишите фактическую версию установленного vLLM, модельный checkpoint и параметры запуска. Путь /models/your-chat-checkpoint либо /models/your-embedding-checkpoint в команде ниже — заполнитель, а не реальный файл. Наличие GPU, объём памяти и условия лицензии весов проверяются до запуска. Демонстрация не утверждает, что ответ модели заранее известен по буквам.
Проверенные возможности
Документация предупреждает, что сервер по умолчанию применяет generation_config.json из Hugging Face репозитория модели, если файл существует. Это может изменить умолчания некоторых параметров сэмплирования. Чтобы отключить такое наследование, команда запуска поддерживает --generation-config vllm.
Пошаговая процедура
- Запишите checkpoint и наличие файла generation_config.json рядом с ним.
- Сохраните текущие параметры запуска перед экспериментом.
- Отправьте три одинаковых коротких запроса и запишите явно заданные параметры.
- Запустите тестовый сервер с --generation-config vllm и повторите серию.
- Сравнивайте только одну изменённую переменную, качество ответа проверяйте отдельно.
Команда для тестового запуска на локальном адресе (подставьте законно полученный checkpoint):
vllm serve /models/your-chat-checkpoint --generation-config vllm --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)
model = json.load(urllib.request.urlopen(BASE + "/v1/models"))["data"][0]["id"]
payload = {"model": model, "messages": [
{"role": "user", "content": "Одной строкой перескажи: доставка только в будни."}],
"temperature": 0, "max_tokens": 64, "stream": False}
for _ in range(3):
reply = call("/v1/chat/completions", payload)
print(reply["choices"][0]["message"]["content"])
Пример входа и ожидаемого результата
Вход — одна и та же фраза про доставку и три вызова с temperature=0. Ожидаемая проверка — записать три текста и выяснить, отражают ли они исходное условие. Код не обещает буквальную идентичность результатов на разных GPU и сборках; цель эксперимента — обнаружить изменение поведения при смене конфигурации.
Как интерпретировать результат
Когда два окружения запускают одну модель, но ответы различаются, люди часто обвиняют новый релиз весов. Сначала проверьте параметры старта: один процесс может наследовать generation_config.json, другой — запускаться с --generation-config vllm. Даже если в HTTP-запросе указан temperature, другие оставшиеся настройки могут отличаться. Разделите эффект параметров генерации и эффект модели: зафиксируйте хеш файлов, версию сервера, длину входа и характер тестового набора. Без этого сравнение «раньше было лучше» не имеет воспроизводимого основания.
Развёртывание без потери контекста
temperature=0 уменьшает случайность выбора токена, но не превращает языковую модель в фактологическую базу. Проверяйте вывод по исходной фразе и не ставьте оценку качества по точному совпадению формулировки. Для продакшена решите, кто управляет политикой сэмплирования: файл автора модели или ваше приложение. Если выбираете наследование, документируйте изменение файла при обновлении checkpoint. Если выбираете --generation-config vllm, явно передавайте значимые параметры в запросе и храните их рядом с экспериментом.
Проверки качества и границы метода
Полезен контрольный набор из трёх видов текстов: однозначный факт, предложение с отрицанием и задача на извлечение номера. Записывайте отдельно корректность, формат и длину ответа. Если поменялось только распределение формулировок, это не обязательно ухудшение фактов. Нельзя заявлять универсальное значение temperature для всех моделей: документация отмечает возможность переопределения умолчаний, а не обещает конкретные числа. Не редактируйте файл весов ради эксперимента и не подменяйте модель одновременно с флагом.
После обнаружения причины добавьте в инфраструктурный тест распечатку команды запуска без секретных значений и конфигурационного выбора. При обновлении веса сравните контрольные примеры на старом и новом контейнере под одинаковыми запросами. Следите за тем, чтобы системный промпт тоже оставался тем же: иначе даже идеальная фиксация параметров генерации не даст чистого сравнения. Если ответ не подтверждён входом, пометьте тест неуспешным независимо от стабильности текста.
Критерии готовности
- Известно, есть ли generation_config.json.
- Эксперимент меняет только режим конфигурации.
- Качество оценивается по фактам, а не совпадению строк.
Типичные ошибки и чего не делать
- Не считать умолчания универсальными.
- Не менять одновременно checkpoint и флаг конфигурации.
- Не трактовать temperature=0 как гарантию истинности.
Частые вопросы
Когда применяется generation_config.json?
По умолчанию, если файл есть в репозитории модели.
Как отключить наследование?
Использовать --generation-config vllm.
Гарантирует ли это одинаковые ответы?
Нет, нужна проверка окружения и тестов.
Официальные источники
Частые вопросы
Когда применяется generation_config.json?
По умолчанию, если файл есть в репозитории модели.
Как отключить наследование?
Использовать --generation-config vllm.
Гарантирует ли это одинаковые ответы?
Нет, нужна проверка окружения и тестов.
Читайте также
Как извлечь JSON по схеме в vLLM через response_format
Схема для извлечения артикула и количества из текста: разбираем ответ и проверяем значения против исходника.
Как обработать named tool call в vLLM без произвольного выполнения кода
Требуем вызов одной безопасной функции, валидируем аргументы и не отдаём модели право запускать произвольные команды.
Как ограничить ответ vLLM вариантами choice при классификации заявок
Получаем одну из заранее разрешённых меток и отдельно проверяем, что классификация совпала с текстом обращения.
Комментарии
Пока тихо. Скажите первое слово