Гайд · TNWS AI

Почему vLLM выдаёт неожиданные ответы: проверка generation_config.json

4 мин—

Проверяем наследование настроек модели из 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.

Пошаговая процедура

  1. Запишите checkpoint и наличие файла generation_config.json рядом с ним.
  2. Сохраните текущие параметры запуска перед экспериментом.
  3. Отправьте три одинаковых коротких запроса и запишите явно заданные параметры.
  4. Запустите тестовый сервер с --generation-config vllm и повторите серию.
  5. Сравнивайте только одну изменённую переменную, качество ответа проверяйте отдельно.

Команда для тестового запуска на локальном адресе (подставьте законно полученный 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 для всех моделей: документация отмечает возможность переопределения умолчаний, а не обещает конкретные числа. Не редактируйте файл весов ради эксперимента и не подменяйте модель одновременно с флагом.

После обнаружения причины добавьте в инфраструктурный тест распечатку команды запуска без секретных значений и конфигурационного выбора. При обновлении веса сравните контрольные примеры на старом и новом контейнере под одинаковыми запросами. Следите за тем, чтобы системный промпт тоже оставался тем же: иначе даже идеальная фиксация параметров генерации не даст чистого сравнения. Если ответ не подтверждён входом, пометьте тест неуспешным независимо от стабильности текста.

Критерии готовности

  1. Известно, есть ли generation_config.json.
  2. Эксперимент меняет только режим конфигурации.
  3. Качество оценивается по фактам, а не совпадению строк.

Типичные ошибки и чего не делать

  • Не считать умолчания универсальными.
  • Не менять одновременно checkpoint и флаг конфигурации.
  • Не трактовать temperature=0 как гарантию истинности.

Частые вопросы

Когда применяется generation_config.json?

По умолчанию, если файл есть в репозитории модели.

Как отключить наследование?

Использовать --generation-config vllm.

Гарантирует ли это одинаковые ответы?

Нет, нужна проверка окружения и тестов.

Официальные источники

Частые вопросы

Когда применяется generation_config.json?

По умолчанию, если файл есть в репозитории модели.

Как отключить наследование?

Использовать --generation-config vllm.

Гарантирует ли это одинаковые ответы?

Нет, нужна проверка окружения и тестов.

Читайте также

Комментарии

Пока тихо. Скажите первое слово