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 токена).