Embeddings (эмбеддинги) — это числовые векторные представления текста, которые отражают его семантический смысл. Тексты с похожим значением будут иметь близкие векторы. Эмбеддинги — фундамент для семантического поиска, рекомендательных систем, кластеризации текстов и RAG-систем. В этой статье покажем, как использовать Embeddings API через ModelSwitch.
Зачем нужны эмбеддинги
Обычный текстовый поиск (по ключевым словам) не понимает смысл. Запрос «как приготовить еду» не найдёт статью «рецепт пасты карбонара». Эмбеддинги решают эту проблему: они преобразуют текст в вектор чисел, где семантически близкие тексты имеют близкие векторы.
Основные применения:
- Семантический поиск — поиск по смыслу, а не по точным совпадениям
- RAG-системы — поиск релевантных документов для контекста языковой модели
- Кластеризация — группировка похожих текстов (отзывы, обращения в поддержку)
- Детекция дубликатов — нахождение семантически одинаковых текстов
- Рекомендации — «похожие статьи», «пользователи с похожими интересами»
Создание эмбеддингов на Python
Используем модель text-embedding-3-small от OpenAI через ModelSwitch:
from openai import OpenAI
import numpy as np
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
def get_embedding(text: str, model: str = "text-embedding-3-small") -> list[float]:
"""Получить эмбеддинг для текста."""
response = client.embeddings.create(
model=model,
input=text
)
return response.data[0].embedding
# Создаём эмбеддинги для нескольких текстов
texts = [
"Как приготовить пасту карбонара",
"Рецепт итальянской пасты с беконом и сыром",
"Квантовые вычисления и кубиты",
"Приготовление блюд итальянской кухни"
]
embeddings = [get_embedding(text) for text in texts]
# Функция для вычисления косинусного сходства
def cosine_similarity(a: list[float], b: list[float]) -> float:
a_np, b_np = np.array(a), np.array(b)
return float(np.dot(a_np, b_np) / (np.linalg.norm(a_np) * np.linalg.norm(b_np)))
# Сравниваем семантическое сходство
for i in range(len(texts)):
for j in range(i + 1, len(texts)):
sim = cosine_similarity(embeddings[i], embeddings[j])
print(f" '{texts[i][:40]}...' <-> '{texts[j][:40]}...' = {sim:.4f}")
Результат покажет, что тексты про пасту и итальянскую кухню имеют высокое сходство (0.85+), а текст про квантовые вычисления — низкое (0.15-0.30).
Пакетное создание эмбеддингов
Для эффективности передавайте несколько текстов в одном запросе:
def get_embeddings_batch(texts: list[str], model: str = "text-embedding-3-small") -> list[list[float]]:
"""Получить эмбеддинги для списка текстов одним запросом."""
response = client.embeddings.create(
model=model,
input=texts
)
# Сортируем по индексу, чтобы порядок совпадал с входными данными
return [item.embedding for item in sorted(response.data, key=lambda x: x.index)]
# Один запрос вместо N
all_embeddings = get_embeddings_batch(texts)
print(f"Получено {len(all_embeddings)} эмбеддингов, размерность: {len(all_embeddings[0])}")
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.modelswitch.ru/v1",
apiKey: "msk_ваш_ключ",
});
async function getEmbeddings(texts: string[]) {
const response = await client.embeddings.create({
model: "text-embedding-3-small",
input: texts,
});
return response.data
.sort((a, b) => a.index - b.index)
.map((item) => item.embedding);
}
const embeddings = await getEmbeddings([
"Искусственный интеллект в медицине",
"Применение AI для диагностики заболеваний",
]);
console.log("Размерность:", embeddings[0].length);
Выбор модели для эмбеддингов
Через ModelSwitch доступны несколько моделей эмбеддингов:
| Модель | Размерность | Цена ($/1M токенов) | Лучше для |
|---|---|---|---|
| text-embedding-3-small | 1536 | $0.02 | Большинство задач, баланс цены и качества |
| text-embedding-3-large | 3072 | $0.13 | Высокая точность, критичные задачи |
| text-embedding-ada-002 | 1536 | $0.10 | Совместимость со старыми системами |
Рекомендация: начните с text-embedding-3-small — она обеспечивает лучшее соотношение качества и стоимости. Переходите на text-embedding-3-large, если нужна максимальная точность.
Эмбеддинги через ModelSwitch стоят столько же, сколько напрямую через OpenAI, но с удобством оплаты в рублях и единым API-ключом для всех моделей.