Эмбеддинги простыми словами: что это и зачем они нужны в поиске

Эмбеддинг превращает текст в набор чисел, по которому можно искать похожее по смыслу. Объясняем без математики, где эмбеддинги берут и когда векторная база не нужна.

5 мин · · модели · автоматизация

Эмбеддинг в машинном обучении — это список чисел (вектор), который описывает смысл фрагмента текста так, чтобы компьютер мог сравнивать смыслы. Два текста с похожим значением получают близкие векторы, даже если в них нет общих слов. Ниже объясним без формул, что такое эмбеддинг в нейросети, где его берут, зачем он нужен в поиске и RAG и когда на небольших объёмах можно вообще обойтись без векторной базы.

Эмбеддинг в машинном обучении: что это такое

Представьте, что каждому тексту поставили в соответствие точку на карте. Тексты про возврат денег лежат рядом друг с другом, тексты про график работы магазина лежат в другой части карты. Только карта не двумерная, а имеет сотни или тысячи измерений, и координаты в ней вычисляет специальная модель. Набор этих координат и есть эмбеддинг.

По руководству OpenAI по эмбеддингам, эмбеддинг — это вектор из чисел с плавающей точкой, а расстояние между двумя векторами показывает связанность текстов: малое расстояние означает высокую связанность. Для моделей text-embedding-3-small и text-embedding-3-large длина вектора по умолчанию 1536 и 3072 числа, и её можно уменьшить параметром dimensions. Цена зависит от числа токенов входа.

Отсюда и ответ на вопрос «что такое эмбеддинг в нейросети»: это не ответ модели и не текст, а промежуточное числовое представление, ради которого и существуют отдельные модели эмбеддингов. Чат-модель генерирует слова, модель эмбеддингов возвращает только вектор.

Как сравнивают тексты

Чаще всего считают косинусное сходство: чем ближе направления двух векторов, тем ближе число к единице. Игрушечный пример на трёх измерениях (настоящие векторы намного длиннее, значения выдуманы для наглядности):

bash
import math

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a))
    nb = math.sqrt(sum(y * y for y in b))
    return dot / (na * nb)

query = [0.8, 0.2, 0.1]            # «как вернуть деньги»
docs = {
    "возврат товара": [0.9, 0.1, 0.0],
    "режим работы магазина": [0.1, 0.9, 0.2],
    "доставка курьером": [0.2, 0.3, 0.9],
}
for name, vec in docs.items():
    print(name, round(cosine(query, vec), 3))

Вывод программы:

bash
возврат товара 0.984
режим работы магазина 0.363
доставка курьером 0.385

Запрос оказывается ближе всего к документу про возврат, хотя слова «вернуть деньги» в нём могут не встречаться. В этом и состоит смысловой поиск.

Зачем эмбеддинги в поиске и RAG

Руководство OpenAI называет такие применения: поиск, группировка похожих текстов, рекомендации, поиск аномалий, анализ разнообразия и классификация по ближайшей метке. Главный сценарий для чат-ботов — RAG:

  1. Документы режутся на куски, для каждого куска считается эмбеддинг, векторы сохраняются в хранилище.
  2. Вопрос пользователя тоже превращается в вектор.
  3. Находятся куски с самыми близкими векторами.
  4. Эти куски подставляются в запрос к чат-модели, и она отвечает по ним.

Смысловой поиск находит текст по значению, а не по совпадению слов, поэтому «как вернуть деньги» найдёт «оформление возврата». Побочный эффект: поиск может промахнуться на редких терминах, номерах и артикулах, где точное совпадение важнее смысла. Поэтому в серьёзных системах его сочетают с обычным поиском по ключевым словам.

Эмбеддинги LLM и чат-модель: в чём разница

Внутри любой большой языковой модели есть собственные векторные представления слов, но для поиска их обычно не используют. Для этого берут специальные модели эмбеддингов, которые обучены именно сравнивать тексты. Две разные модели эмбеддингов дают несовместимые векторы: если вы сменили модель, весь корпус нужно пересчитать, потому что векторы из разных моделей сравнивать нельзя.

Где взять эмбеддинги

  • Через API поставщика, например text-embedding-3-small у OpenAI. Пример по руководству OpenAI:
bash
from openai import OpenAI

client = OpenAI()  # ключ и адрес поставщика эмбеддингов
resp = client.embeddings.create(
    model="text-embedding-3-small",
    input="Как вернуть деньги за заказ?",
)
vector = resp.data[0].embedding  # список из 1536 чисел
print(len(vector))
  • Локальные модели, которые запускаются на вашей машине или сервере. Они бесплатны по токенам, но требуют железа.
  • Встроенные модели инструментов. Например, у Open WebUI есть небольшая модель эмбеддингов по умолчанию.

В перечне эндпоинтов шлюза Zukko эндпоинта эмбеддингов нет: шлюз даёт Claude, GPT, Gemini, DeepSeek, Qwen и GLM для генерации текста. Для векторного поиска вам понадобится отдельная модель эмбеддингов, а ответы по найденным кускам формирует модель шлюза.

Нужна ли векторная база

Векторная база нужна, когда документов много и их нужно быстро искать. Но для небольших объёмов есть альтернатива: положить документы целиком в запрос. У большинства моделей Zukko контекст 1M токенов, у Grok 4.x он 256K, у GLM 5.3 — 128K.

Посчитаем. Допустим, 200 документов по 2000 токенов дают 400 000 токенов. Формула: токены × цена входа за миллион. Цены на 18 октября 2026.

  • Весь корпус в каждом запросе на gpt-6.1-sol (вход 0,27): 0,4 × 0,27 = $0,108 за вопрос.
  • То же на deepseek-v4.1-flash (вход 0,013): 0,4 × 0,013 = $0,0052.
  • Векторный поиск, 5 кусков по 500 токенов (2500 токенов) на gpt-6.1-sol: 2500 × 0,27 / 1 000 000 = $0,000675.

Если корпус неизменный, а вопросов много, помогает кэш: у gpt-6.1-sol чтение кэша стоит 0,013 за миллион, и тот же корпус в кэше обойдётся в 0,4 × 0,013 = $0,0052 на вопрос, если кэш сработает. Но кэш живёт ограниченное время и зависит от поставщика, поэтому рассчитывать на него без проверки не стоит.

Практический вывод. Длинный контекст удобен для разовых задач и небольших корпусов: меньше кода, нет индексации. Но его стоимость растёт с размером корпуса и числом вопросов, а полнота ответа на очень длинном входе не гарантирована, поэтому проверяйте её на тестовых вопросах. Векторный поиск начинает окупаться, когда документов много или вопросов поток. Подробнее об этом компромиссе: контекст в миллион токенов и RAG на дешёвой модели без векторной БД. Схема целиком описана в статье RAG-пайплайн на своих данных.

Актуальный список моделей, контекста и цен: GET https://api.zukko.pro/v1/models, страница «Модели» в кабинете и справочник моделей.

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

Эмбеддинг и токен — это одно и то же?

Нет. Токен — это кусок текста, на который модель разбивает вход. Эмбеддинг — это вектор чисел, который описывает смысл целого фрагмента. Токены считаются для цены, эмбеддинги — для сравнения.

Можно ли сравнивать векторы разных моделей?

Нельзя. Каждая модель задаёт собственное пространство, поэтому при смене модели нужно пересчитать все документы.

Обязательно ли хранить векторы в специальной базе?

Нет. Для сотен документов хватит обычного массива в памяти или файла. Специальные хранилища нужны для больших объёмов и быстрого поиска.

Нужны ли эмбеддинги, если у модели длинный контекст?

Для небольшого корпуса можно обойтись, для большого и частого поиска — нет, потому что цена каждого вопроса растёт с размером корпуса. Попробуйте оба варианта на своих данных. Ключ для проверки создаётся в кабинете, доступ из России идёт через шлюз, оплата СБП, картой MasterCard или криптой.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.