Гайд · TNWS AI

Как получить embeddings через vLLM и не перепутать модель с чат-LLM

4 мин—

Подаём две строки в /v1/embeddings со специализированной моделью и проверяем количество и размерность векторов.

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

Вопрос читателя: «как получить embedding из vLLM v1 embeddings». Для сервера vLLM с совместимым embedding checkpoint, а не произвольной генерирующей моделью. Документация явно ограничивает /v1/embeddings моделями для embeddings; проверено 20 сентября 2026 года.

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

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

Официальная страница OpenAI-Compatible Server перечисляет /v1/embeddings и указывает, что маршрут применим только к embedding models. Каждый результат связывается с индексом входа, что позволяет восстановить соответствие текстам. Конкретную размерность выбирает модель, а не универсальный параметр vLLM.

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

  1. Проверьте карточку checkpoint: модель предназначена для создания embeddings на нужном языке.
  2. Запустите отдельный экземпляр vLLM с этой моделью.
  3. Получите фактический model id через /v1/models.
  4. Передайте две тестовые фразы в /v1/embeddings.
  5. Восстановите порядок через index и убедитесь, что оба вектора одинаковой длины.

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

vllm serve /models/your-embedding-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)

import math
model = json.load(urllib.request.urlopen(BASE + "/v1/models"))["data"][0]["id"]
texts = ["Возврат товара в течение двух недель", "Доставка по будням"]
data = call("/v1/embeddings", {"model": model, "input": texts})["data"]
ordered = sorted(data, key=lambda item: item["index"])
assert len(ordered) == len(texts)
assert len(ordered[0]["embedding"]) > 0
assert len(ordered[0]["embedding"]) == len(ordered[1]["embedding"])
assert all(math.isfinite(value) for row in ordered for value in row["embedding"])
print("Размерность:", len(ordered[0]["embedding"]))

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

Вход: две фразы на русском о возврате и доставке. Ожидаемый результат — две записи data с числовыми векторами равной положительной размерности и индексами 0/1. Точные координаты и длину заранее не называем: они зависят от checkpoint.

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

Чат-модель может отлично отвечать словами и не поддерживать маршрут /v1/embeddings. Ошибка такого вызова не свидетельствует о неисправности всего vLLM; сначала проверьте класс загруженного checkpoint. Даже если сервер отдаёт векторы, это не означает, что поиск по русским документам стал качественным. Отметьте контрольные пары «вопрос — нужный документ» и измерьте recall на своей выборке. Храните модельный идентификатор, версию текста и метрику при индексировании: потеря этой связи превращает результат в труднообъяснимые числа.

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

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

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

При замене checkpoint пересчитайте embeddings корпуса и вопросов. Равная длина двух массивов не означает совместимого векторного пространства. Не трактуйте отдельную координату как вероятность темы «доставка»: смысловую оценку дают сравнения целых векторов и проверка выдачи. Добавьте простой реперный запрос, где релевантный документ известен человеку, затем отдельно проверяйте скорость и нагрузку. В обучающем примере не требуется сторонняя векторная база: проверка формы результата самодостаточна.

Для извлечения фактов модель-эмбеддер не годится: она возвращает числа, а не пересказ. Если нужны объяснимые ответы, храните рядом исходный текст и отдавайте генеративной модели только разрешённые фрагменты с источниками. Русские предложения в примере коротки; длинные документы разбивайте по смыслу и проверяйте ограничения конкретного checkpoint, не полагайтесь на скрытое усечение. Повторный запрос к той же модели поможет заметить неожиданное изменение формы данных после обновления сервера.

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

  1. Две записи в ответе однозначно связаны с двумя строками.
  2. Размерность совпадает и все числа конечны.
  3. Релевантность русского поиска проверена отдельно.

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

  • Не требовать embeddings от любой чат-модели.
  • Не смешивать в одном индексе разные модели.
  • Не отождествлять близость и право доступа.

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

Какая модель нужна?

Специализированный embedding checkpoint.

Можно ли указать размерность наугад?

Нет, проверяйте результат конкретной модели.

Вернёт ли маршрут текстовый ответ?

Он возвращает числовые embeddings.

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

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

Какая модель нужна?

Специализированный embedding checkpoint.

Можно ли указать размерность наугад?

Нет, проверяйте результат конкретной модели.

Вернёт ли маршрут текстовый ответ?

Он возвращает числовые embeddings.

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

Комментарии

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