Embeddings

POST https://router.1-lab.online/v1/embeddings превращает текст в вектор чисел. Похожие по смыслу тексты дают близкие векторы — на этом строятся семантический поиск, RAG (ответы по базе знаний), поиск дубликатов и кластеризация.

Модели эмбеддингов: openai/text-embedding-3-small (дешевле, размерность 1536) и openai/text-embedding-3-large (точнее, размерность 3072). Цены — на странице цен. Оплачивается только вход.

Параметры

Параметр Что задаёт
model ID модели эмбеддингов (обязательный)
input строка или список строк (обязательный)

cURL

curl https://router.1-lab.online/v1/embeddings \
  -H "Authorization: Bearer $ROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/text-embedding-3-small",
    "input": ["Как вернуть товар надлежащего качества?", "Сроки доставки по Москве"]
  }'

Ответ (сокращённо):

{
  "object": "list",
  "data": [
    { "object": "embedding", "index": 0, "embedding": [0.0123, -0.0456, ...] },
    { "object": "embedding", "index": 1, "embedding": [0.0789, 0.0012, ...] }
  ],
  "model": "openai/text-embedding-3-small",
  "usage": { "prompt_tokens": 17, "total_tokens": 17 }
}

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://router.1-lab.online/v1", api_key=os.environ["ROUTER_API_KEY"])

resp = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input=["Как вернуть товар надлежащего качества?", "Сроки доставки по Москве"],
)
vectors = [item.embedding for item in resp.data]
print(len(vectors), "векторов, размерность", len(vectors[0]))

TypeScript

const resp = await client.embeddings.create({
  model: "openai/text-embedding-3-small",
  input: ["Как вернуть товар надлежащего качества?", "Сроки доставки по Москве"],
});
const vectors = resp.data.map((d) => d.embedding);

Советы

  • Отправляйте тексты списком: один запрос на сотню текстов быстрее и проще, чем сто запросов.
  • Документы в базе и поисковые запросы обрабатывайте одной и той же моделью. Если меняете модель — переиндексируйте всю базу.
  • Длинные документы разбивайте на фрагменты по 200–800 слов: так поиск точнее, а фрагмент не превысит предел модели (8 192 токена).