Эмбеддинг — это текст, превращённый в вектор из нескольких сотен или тысяч чисел. Тексты, близкие по смыслу, дают близкие векторы, даже если в них нет общих слов. На этом держатся семантический поиск, RAG (ответы модели по вашей базе знаний), поиск дублей, кластеризация обращений и рекомендации.
В PlusVibe эмбеддинги доступны через OpenAI-совместимый /v1/embeddings: тот же ключ, что и для чат-моделей, оплата в рублях. Ниже — какие модели есть, чем они отличаются и как собрать простой RAG.
Какие модели доступны
Размер вектора каждой модели мы проверили живым вызовом перед публикацией. Максимальную длину входа отдаёт GET /v1/model-capabilities.
qwen3-embedding-8b409632 768 токенов—
qwen3-embedding-4b256032 768 токеновда
qwen3-embedding-0.6b102432 768 токенов—
jina-embeddings-v4204832 768 токеновда
text-embedding-3-small153632 768 токенов—
nemotron-embed-vl204810 240 токенов—
bge-m310248192 токена—
giga-embeddings20484096 токеновда
embeddinggemma-300m7682048 токенов—
frida1536512 токеновда
multilingual-e5-large1024512 токенов—
Прочерк в последней колонке значит, что подтверждённых данных о размещении в России у нас нет, а не что модель точно работает за рубежом. Четыре модели с отметкой «да» можно отобрать фильтром «Только серверы в РФ» на вкладке «Эмбеддинги» в каталоге. Среди них две модели российской разработки — FRIDA и Giga-Embeddings. Как с ними работать и зачем им префиксы, мы подробно разобрали в статье «Модели на серверах в России».
Цены
У эмбеддингов оплачивается только входящий текст — выходных токенов нет. Цены за 1 млн токенов:
| Модель | Вход | Выход |
|---|---|---|
| qwen3-embedding-8b | 5 ₽/1M | 0 ₽/1M |
| qwen3-embedding-4b | 7 ₽/1M | 0 ₽/1M |
| qwen3-embedding-0.6b | 3 ₽/1M | 0 ₽/1M |
| jina-embeddings-v4 | 7 ₽/1M | 0 ₽/1M |
| text-embedding-3-small | 5 ₽/1M | 0 ₽/1M |
| nemotron-embed-vl | 8 ₽/1M | 0 ₽/1M |
| bge-m3 | 5 ₽/1M | 0 ₽/1M |
| giga-embeddings | 7 ₽/1M | 0 ₽/1M |
| embeddinggemma-300m | 2 ₽/1M | 0 ₽/1M |
| frida | 4 ₽/1M | 0 ₽/1M |
| multilingual-e5-large | 5 ₽/1M | 0 ₽/1M |
Цены подставляются из каталога в момент открытия страницы.
Как выбрать модель
- Длина фрагментов. Если вы режете документы на крупные куски или индексируете целые страницы, берите модели с входом 32 768 токенов. У
fridaиmultilingual-e5-largeвсего 512 токенов — это примерно абзац, длинный текст придётся резать мельче. - Размер вектора. Чем он больше, тем больше места занимает индекс и тем медленнее поиск по нему. Для базы на миллионы фрагментов разница между 768 и 4096 числами на фрагмент заметна и в памяти, и в деньгах за хранилище.
- Где обрабатываются данные. Если в текстах есть данные клиентов или внутренние документы, выбирайте модели на серверах в России.
- Цена. Индексация базы — разовая, но объёмная операция, а запросы пользователей идут постоянно. Сравните цены из таблицы выше на своём объёме.
Надёжнее всего — прогнать 20–30 реальных вопросов ваших пользователей на двух-трёх моделях и посмотреть, какая чаще находит правильный фрагмент. Это недорого: оплачивается только вход, а тестовый набор из нескольких десятков вопросов и фрагментов — это тысячи токенов, а не миллионы.
Запрос
curl https://plusvibeapi.ru/v1/embeddings \
-H "Authorization: Bearer $PLUSVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-embedding-4b",
"input": ["первый текст", "второй текст"]
}'
В input можно передать строку или массив строк — массив векторизуется одним запросом, и это быстрее, чем слать тексты по одному. Векторы приходят в data[i].embedding в том же порядке, что и тексты. Параметр encoding_format: "base64" возвращает вектор в base64 вместо списка чисел. Параметр dimensions у text-embedding-3-small принимает только значение 1536 — на 512 мы получили ошибку 400.
Простой RAG на Python
Минимальная схема: векторизуем базу знаний, находим фрагмент, ближайший к вопросу, и отдаём его чат-модели вместе с вопросом. Этот код мы запустили перед публикацией без изменений:
import math
import os
from openai import OpenAI
client = OpenAI(
base_url="https://plusvibeapi.ru/v1",
api_key=os.environ["PLUSVIBE_API_KEY"],
)
EMBED_MODEL = "qwen3-embedding-4b"
docs = [
"Возврат товара возможен в течение 14 дней при сохранении чека.",
"Доставка по Москве занимает один-два рабочих дня.",
"Оплатить заказ можно картой или по счёту для юрлиц.",
]
def embed(texts):
resp = client.embeddings.create(model=EMBED_MODEL, input=texts)
return [item.embedding for item in resp.data]
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))
doc_vectors = embed(docs) # один запрос на весь список
question = "Можно ли вернуть покупку через неделю?"
q_vector = embed([question])[0]
best = max(range(len(docs)), key=lambda i: cosine(q_vector, doc_vectors[i]))
print("найдено:", docs[best])
answer = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{"role": "system", "content": "Отвечай только по справке. Если ответа в ней нет, так и скажи."},
{"role": "user", "content": f"Справка: {docs[best]}\n\nВопрос: {question}"},
],
)
print(answer.choices[0].message.content)
В вопросе нет слов «возврат» и «товар», но поиск нашёл именно фрагмент про возврат, а модель ответила, что вернуть покупку можно — в течение 14 дней при сохранённом чеке.
В реальном проекте векторы хранят не в списке, а в векторной базе — pgvector в PostgreSQL, Qdrant, Chroma и подобных, — и вместо одного фрагмента берут три-пять ближайших. Готовые обвязки для этого есть в LangChain: как подключить его к PlusVibe, рассказано в статье про LangChain в России.
Частые ошибки
Смешали векторы разных моделей. Векторы разных моделей несовместимы: у них разная длина и разное пространство. Запрос и документы нужно векторизовать одной моделью, а смена модели означает переиндексацию всей базы. Колонку в векторной БД заводите под размер из таблицы выше.
Слишком длинные фрагменты. Не отправляйте текст длиннее максимума на вход из таблицы. Режьте документы на фрагменты с запасом по длине — так и поиск точнее: один фрагмент отвечает на один вопрос.
Эмбеддинг-модель вызвали через /v1/chat/completions. Для эмбеддингов нужен /v1/embeddings.
403 «Модель недоступна для этого API-ключа». У ключа задан список разрешённых моделей. Добавьте модель эмбеддингов в этот список в кабинете.
Итог
Через PlusVibe доступны одиннадцать моделей эмбеддингов, четыре из них работают на серверах в России. Все вызываются одним OpenAI-совместимым запросом и тем же ключом, что и чат-модели. Формат запроса — в документации. Если нужны свежие данные из интернета, а не из вашей базы, посмотрите статью про веб-поиск в LLM по API. Компании могут работать по договору.
Эмбеддинги для RAG и поиска
Одиннадцать моделей, включая модели на серверах в России. Оплата в рублях.
Получить ключ →


