Гайд · TNWS AI

Как подключить Chat API vLLM и проверить model ID до первого запроса

4 мин—

Запускаем vLLM с чат-моделью, получаем фактический model ID и проверяем форму ответа без предположений о содержимом.

Задача и применимость

Вопрос читателя: «как подключить локальный vLLM Chat Completions API». Для vLLM online serving и текстовой модели с chat template; документация сервера проверена 20 сентября 2026 года. Локальный пример предполагает заранее скачанный совместимый checkpoint и разрешение на его использование. Номер версии зафиксируйте через установленный пакет: документация latest со временем меняется.

Для воспроизводимости запишите фактическую версию установленного vLLM, модельный checkpoint и параметры запуска. Путь /models/your-chat-checkpoint либо /models/your-embedding-checkpoint в команде ниже — заполнитель, а не реальный файл. Наличие GPU, объём памяти и условия лицензии весов проверяются до запуска. Демонстрация не утверждает, что ответ модели заранее известен по буквам.

Проверенные возможности

Официальный сервер поддерживает /v1/chat/completions для генеративных моделей с chat template; идентификатор модели передают в поле model. Пример документации запускает vllm serve и отправляет messages. Разработчики отдельно предупреждают: параметр user игнорируется, а совместимость специфических полей следует проверять.

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

  1. Уточните, что checkpoint является чат-моделью с собственным chat template.
  2. Запустите сервер только на локальном адресе для теста.
  3. Получите GET /v1/models и возьмите реальный data[0].id.
  4. Передайте системное и пользовательское сообщения в /v1/chat/completions.
  5. Проверьте choices и сохранившийся model id прежде, чем подключать интерфейс.

Команда для тестового запуска на локальном адресе (подставьте законно полученный checkpoint):

vllm serve /models/your-chat-checkpoint --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": "system", "content": "Отвечай только по данному тексту."},
    {"role": "user", "content": "Текст: доставка по будням. Когда доставка?"}],
    "stream": False, "max_tokens": 80}
answer = call("/v1/chat/completions", payload)
print(answer["choices"][0]["message"]["content"])

Пример входа и ожидаемого результата

На входе короткое правило «доставка по будням». Ожидаемый смысл ответа — доставка по будням; модель может сформулировать его иначе. Обязательная техническая проверка: есть choices[0].message.content, а ID берётся именно из /v1/models, не из названия файла наугад.

Как интерпретировать результат

Не путайте доступность порта и готовность полезного ответа. Сервер может запуститься, а конкретный checkpoint иметь несовместимый чат-шаблон; тогда сообщение user сериализуется плохо либо запрос вернёт ошибку. Сначала проделайте контрольный опыт из двух строк с известным ответом. Если он неудачен, исследуйте логи модели и формат template, а не меняйте сразу десять параметров сэмплирования. При создании приложения зафиксируйте checkpoint, версию vLLM и команду запуска, иначе повторение теста через месяц может описывать другую конфигурацию.

Развёртывание без потери контекста

Список /v1/models полезен для обнаружения реального имени загруженной модели. Когда клиент отправляет неизвестную строку model, сложнее понять: сломался сервер или не совпали имена. Проверяйте ответ на этапе инициализации и явно сообщайте оператору о пустом списке. Для русскоязычного продукта проверьте контрольные вопросы на кириллице, числах и отрицаниях. То, что модель технически отвечает по-русски, не доказывает корректного понимания фактов; исследуйте отдельную подборку с ожидаемыми ответами.

Проверки качества и границы метода

После успешного запроса не переносите диагностический адрес 127.0.0.1 прямо в фронтенд пользователя. Браузер клиента не обращается к localhost вашего сервера; ему потребуется ваш защищённый backend. Отделите auth приложения от auth модели и ограничьте вывод в логи. Если модель не смогла ответить по входной строке, выводите отказ, а не подставляйте внешние знания. Для миграции SDK сначала проверьте OpenAI-подобную структуру на своей сборке: название интерфейса не является обещанием абсолютной совместимости всех параметров.

План проверки включает также второй вопрос без ответа во входе: «Работает ли доставка ночью?» Ожидаемое поведение по инструкции — не заявлять время ночной доставки. Если ответ выдуман, причина может быть в модели, system-инструкции или длине контекста; HTTP 200 при этом всё равно означает лишь успешный обмен данными. Сохраняйте эти два теста как регрессионные после смены веса или настроек запуска.

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

  1. Фактический model id получен из сервера.
  2. Структура ответа содержит choices[0].message.content.
  3. Ответ опирается на указанное условие о буднях.

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

  • Не выдумывать модельный ID.
  • Не считать HTTP 200 подтверждением фактов.
  • Не подключать публичный фронтенд напрямую к локальному API.

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

Нужен ли шаблон чата?

Да, Chat API рассчитан на модель с chat template.

Где узнать model?

В ответе /v1/models.

Хранит ли один запрос историю другого?

Передавайте историю явно в messages.

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

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

Нужен ли шаблон чата?

Да, Chat API рассчитан на модель с chat template.

Где узнать model?

В ответе /v1/models.

Хранит ли один запрос историю другого?

Передавайте историю явно в messages.

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

Комментарии

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