Содержание
- Эмбеддинги в машинном обучении: откуда в векторе берутся числа
- Физический смысл эмбеддингов: 256 чисел на единичной сфере
- Как считается близость эмбеддингов и почему шкала у каждой модели своя
- Король минус мужчина плюс женщина: что показал замер эмбеддингов
- Эмбеддинги слов, предложений и документов
- Зачем нужны эмбеддинги: поиск, RAG, рекомендации, классификация
- Какие модели эмбеддингов есть и как получить эмбеддинг самому
- Чем эмбеддинг отличается от токена
- FAQ
Что такое эмбеддинги: как смысл превращается в числа
Черновик готовит редакция с помощью ИИ. За стандарт издания отвечает главный редактор — Валерий Курземнек.
Материал редакции Зерокодера. Числа ниже сняты собственным прогоном 11 сентября 2026 года на двух моделях эмбеддингов: Yandex AI Studio и openai/text-embedding-3-small через OpenRouter. Обновлено: сентябрь 2026.
Эмбеддинги — это представление текста, картинки или товара списком чисел, где близкие по смыслу объекты получают близкие наборы чисел. Вот что такое эмбеддинги в одном определении: вектор фиксированной длины, который модель выдаёт для любого фрагмента текста. Дальше с этим вектором работает обычная арифметика — сложение, вычитание, измерение угла.
Главное:
- В нашем замере 11 сентября 2026 года слово «кот» превратилось в 256 чисел у модели Yandex AI Studio и в 1536 чисел у openai/text-embedding-3-small.
- Длина обоих векторов равна единице, а сами числа лежат в узком коридоре: у Yandex от −0,1685 до 0,1676.
- Близость считают косинусом угла между векторами: значение от −1 до +1, где выше — ближе по смыслу.
- Шкала косинуса у каждой модели своя: пара «кот / автомобиль» получила у Yandex 0,7768, а пара «кот / кошка» у OpenAI — всего 0,3484.
- Скрипт
embed_probe_ru.pyдля повтора всех замеров приведён в статье целиком.
Эмбеддинги в машинном обучении: откуда в векторе берутся числа
Эмбеддинги — это слой представления данных внутри машинного обучения. Вложенность такая: искусственный интеллект → машинное обучение → нейросети → эмбеддинги как формат, в котором нейросеть хранит смысл входных данных. Любая языковая модель начинает работу с того, что превращает текст в векторы, и только потом что-то с ними делает.
Статья «Векторное представление слов» в русской Википедии даёт формальное определение: это общее название подходов, «направленных на сопоставление словам (и, возможно, фразам) из некоторого словаря векторов из R^n для n, значительно меньшего количества слов в словаре». Там же названа теоретическая база — дистрибутивная семантика: слова, которые встречаются в похожих контекстах, имеют похожие значения.
Отсюда и берутся числа. Модель не получает их от человека — она подбирает их сама на большом корпусе текстов, решая вспомогательную задачу вроде «предскажи соседнее слово». Классический алгоритм word2vec описан Миколовым и соавторами в работе 2013 года (arXiv:1301.3781); современные модели вместо этого используют трансформерные кодировщики, обученные сводить рядом перефразировки. Числа в векторе — это подобранные обучением веса, и по отдельности ни одно из них ничего не означает.
Как устроено само обучение, разобрано в материале как работает машинное обучение, а что делает с векторами языковая модель — в статье что такое LLM.
Физический смысл эмбеддингов: 256 чисел на единичной сфере
Физический смысл эмбеддинга измеряется, поэтому ответим числом. Мы отправили слово «кот» двум моделям 11 сентября 2026 года. Yandex AI Studio (text-search-doc) вернул 256 чисел, начало вектора: 0.1187, -0.028, 0.0583, -0.1077, -0.0268, 0.0195. Модель openai/text-embedding-3-small вернула 1536 чисел. Длина вектора в обоих случаях равна единице: 1,0000 у Yandex и 1,0002 у OpenAI.
Это и есть вся физика. Вектор — точка на поверхности сферы в пространстве из 256 или 1536 измерений. Нормировка к единице означает, что важно только направление: два текста сравнивают по углу между их стрелками, а длина стрелки информации не несёт. Отдельное измерение не соответствует никакому человеческому понятию вроде «одушевлённость» — смысл размазан по всем координатам сразу.
Диапазон значений внутри вектора узкий: у Yandex числа для слова «кот» уложились между −0,1685 и 0,1676 при среднем 0,0083, у OpenAI — между −0,1011 и 0,0903. Косинус между двумя такими векторами теоретически лежит от −1 до +1, и отрицательные значения на практике встречаются: в нашем прогоне запрос «как сбросить пароль от личного кабинета» получил с текстом «как приготовить борщ с говядиной и свёклой» косинус −0,0243.
Как считается близость эмбеддингов и почему шкала у каждой модели своя
Близость двух эмбеддингов считают косинусной мерой: скалярное произведение векторов, делённое на произведение их длин. Для нормированных векторов это просто скалярное произведение. Наш замер на одних и тех же русских словах сразу на двух моделях, 11 сентября 2026 года:
| Пара слов | Yandex text-search-doc |
openai/text-embedding-3-small |
|---|---|---|
| кот / кошка | 0,9477 | 0,3484 |
| кот / котёнок | 0,9388 | 0,7682 |
| кот / собака | 0,7976 | 0,4556 |
| кот / автомобиль | 0,7768 | 0,2981 |
| врач / доктор | 0,9427 | 0,3420 |
| врач / юрист | 0,8099 | 0,2969 |
| король / королева | 0,8545 | 0,6307 |
| король / табуретка | 0,5444 | 0,2236 |
Порядок внутри каждого столбца осмысленный: у обеих моделей «кот / кошка» выше, чем «кот / автомобиль», а «король / табуретка» падает в самый низ. Ломается другое — перенос абсолютного значения между моделями. Страница, занимающая первое место в Яндексе по запросам «эмбеддинги слов» и «векторные эмбеддинги», утверждает: «близкие тексты дают 0.7-0.95, разные — 0.0-0.3» (isakov.work, проверено 11.09.2026). По этой шкале пара «кот / автомобиль» у Yandex (0,7768) оказалась бы близкой, а пара «кот / кошка» у OpenAI (0,3484) — далёкой.
Практический вывод один: порог «похоже» калибруется на своих данных и на своей модели. Сменили модель эмбеддингов — пересняли порог заново, иначе поиск начнёт возвращать мусор либо молчать.
Король минус мужчина плюс женщина: что показал замер эмбеддингов
Знаменитую арифметику эмбеддингов мы проверили числами. Формулировка идёт от word2vec (Миколов и соавторы, 2013): если из вектора слова «король» вычесть «мужчина» и прибавить «женщина», результат должен оказаться рядом с «королева». В снятой нами выдаче этот пример пересказывают девять страниц из двадцати четырёх, и ни одна не показывает свой прогон на русских словах — единственное число во всём топе стоит комментарием к чужому коду на bigdataschool.ru: # Вывод покажет: [('queen', 0.71), ...], английскими словами и без самого запуска. Наш результат на девяти словах-кандидатах:
| Кандидат | Yandex text-search-doc |
openai/text-embedding-3-small |
|---|---|---|
| королева | 0,9017 | 0,5870 |
| король | 0,8957 | 0,6530 |
| принцесса | 0,8605 | 0,3982 |
| царица | 0,7830 | 0,4622 |
| монарх | 0,7560 | 0,3213 |
| кошка | 0,6645 | 0,1745 |
| мужчина | 0,5473 | −0,1398 |
Читать это стоит так. Эффект существует: «королева», «принцесса» и «царица» уверенно обходят «кошку» на обеих моделях, а «мужчина» после вычитания уезжает в самый низ вплоть до отрицательного косинуса. При этом чистого попадания в «королеву» нет ни у одной модели: у Yandex исходное слово «король» отстаёт от «королевы» всего на 0,006, а у OpenAI оно вообще выигрывает с 0,6530 против 0,5870. Классический результат воспроизводится только при условии, которое в пересказах обычно опускают: слова-слагаемые из ответа исключают. Порядок зависит и от набора кандидатов — наш набор перечислен в скрипте ниже.
Эмбеддинги слов, предложений и документов
Эмбеддинг предложения — это отдельный вектор той же длины, что и у слова, и получают его одним запросом к модели. Соблазнительная догадка «вектор фразы равен среднему векторов её слов» проверяется за минуту и не подтверждается: у фразы «кот сидит на окне» косинус с усреднённым вектором её четырёх слов составил 0,6780 у Yandex и 0,5634 у OpenAI. Внутри модели вектор предложения тоже собирается из токенов — усреднением по ним либо через служебный токен-агрегатор, — но делается это уже после слоёв внимания, когда каждый токен впитал контекст соседей. Поэтому наружное усреднение готовых векторов слов результат модели не воспроизводит, а «собака укусила человека» и «человек укусил собаку» получают разные векторы.
Есть и различие по природе модели. Статические эмбеддинги вроде word2vec дают слову один вектор навсегда, и у слова «замок» он единственный на оба значения. Контекстные модели на трансформерах выдают вектор с учётом окружения.
Эмбеддинг документа устроен так же, но упирается в предел длины входа: у GigaChat Embeddings контекстное окно составляет 512 токенов (документация Сбера, 11.09.2026), поэтому длинный текст режут на куски и вектор считают для каждого куска отдельно.
Практическая деталь, которой в выдаче нет вовсе: кодировщики бывают асимметричными. У Yandex AI Studio две модели, text-search-query для запросов и text-search-doc для текстов. Мы прогнали через обе один и тот же текст «как сбросить пароль от личного кабинета» и получили косинус 0,6887 между его собственными двумя векторами. Единицы там не будет никогда. Для пары «запрос — подходящий документ» косинус вышел 0,5144, а те же два текста, закодированные оба как документы, дали 0,8260. Смешивать кодировщики в одном индексе означает ломать ранжирование на ровном месте.
Зачем нужны эмбеддинги: поиск, RAG, рекомендации, классификация
Эмбеддинги нужны везде, где сравнение идёт по смыслу, а буквальное совпадение слов не помогает. Базовая операция одна: перевести запрос и все документы в векторы и отсортировать по косинусу. Наш прогон на шести коротких фразах базы знаний, запрос «забыл пароль, как войти»:
| Документ | Yandex (запрос → документ) | openai/text-embedding-3-small |
|---|---|---|
| Для входа без пароля используйте код из СМС. | 0,4232 | 0,5981 |
| Пароль меняется в разделе «Настройки» личного кабинета. | 0,3668 | 0,4749 |
| Возврат товара принимаем в течение 14 дней с чеком. | 0,2149 | 0,2061 |
| Доставка по Москве занимает один рабочий день. | 0,2110 | 0,1156 |
| Гарантия на технику — 12 месяцев со дня покупки. | 0,1872 | 0,1219 |
| Оплатить заказ можно картой или через СБП. | 0,1852 | 0,1878 |
Обе модели подняли наверх два документа про вход и пароль, хотя слово «войти» не встречается ни в одном из них дословно. Это и есть семантический поиск. Поверх него строится RAG: найденные по косинусу куски базы знаний кладут в контекст языковой модели, и она отвечает по найденному тексту вместо памяти весов — подробности в материале про RAG и дообучение. Этот же приём снижает выдумывание фактов, разобранное в статье про галлюцинации нейросети.
Остальные применения — та же арифметика над векторами. Рекомендации: похожие товары ищут по близости их описаний. Классификация: обращение относят к теме, ближайшей по косинусу, без обучения отдельной модели. Кластеризация и дедупликация: похожие тексты собираются в группы по расстоянию. Хранят векторы в специализированных базах — pgvector, FAISS, Qdrant, Chroma; на объёме в сотни документов хватает обычного списка в памяти.
Какие модели эмбеддингов есть и как получить эмбеддинг самому
Моделей эмбеддингов сегодня десятки, и выбирают их по четырём признакам: размерность вектора, качество на русском языке, симметричность кодировщиков и цена. Что мы видели своими глазами 11 сентября 2026 года:
| Модель | Размерность | Замер | Особенность |
|---|---|---|---|
Yandex AI Studio text-search-doc / text-search-query |
256 | наш прогон | два разных кодировщика для запроса и документа |
| openai/text-embedding-3-small (через OpenRouter) | 1536 | наш прогон | один кодировщик, шкала косинуса заметно ниже |
| GigaChat Embeddings (плюс Embeddings-2, GigaEmbeddings-3B-2025-09, EmbeddingsGigaR) | 1024 | документация Сбера | контекст 512 токенов, 14 ₽ за 1 млн токенов |
| word2vec, GloVe, fastText | обычно 100–300 | не мерили | статические, один вектор на слово навсегда |
Числа по GigaChat взяты с карточки модели в документации Сбера, дословно: «Размер контекстного окна 512 токенов. Размер вектора 1024 координат», цена 14 ₽ за 1 млн токенов одинакова для всех четырёх моделей линейки (страница снята 11.09.2026, актуальные значения — у вендора). Размерности Yandex и OpenAI в таблице получены нашим запросом к API.
Получить эмбеддинг самому — четыре шага: завести ключ у провайдера, отправить текст POST-запросом, получить в ответ массив чисел, посчитать косинус между двумя массивами. Ниже датчик embed_probe_ru.py, которым сняты все числа этой статьи. Прогон 11 сентября 2026 года на Windows, Python 3.14.3, 38 запросов к Yandex AI Studio и 37 к OpenRouter, внешних библиотек не требуется:
# embed_probe_ru.py - датчик редакции Зерокодера: что такое эмбеддинг в числах.
import json, math, os, urllib.request
def yc_embed(text, kind="doc"):
"""Вектор текста у Yandex AI Studio. kind: doc для текстов, query для запросов."""
key, folder = os.environ["YC_API_KEY"], os.environ["YC_FOLDER_ID"]
body = {"modelUri": f"emb://{folder}/text-search-{kind}/latest", "text": text}
req = urllib.request.Request(
"https://llm.api.cloud.yandex.net/foundationModels/v1/textEmbedding",
data=json.dumps(body).encode(),
headers={"Authorization": "Api-Key " + key, "x-folder-id": folder,
"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=60) as r:
return json.loads(r.read())["embedding"]
def oa_embed(text, model="openai/text-embedding-3-small"):
"""Вектор текста у OpenAI через OpenRouter."""
body = {"model": model, "input": text}
req = urllib.request.Request("https://openrouter.ai/api/v1/embeddings",
data=json.dumps(body).encode(),
headers={"Authorization": "Bearer " + os.environ["OPENROUTER_API_KEY"],
"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=60) as r:
return json.loads(r.read())["data"][0]["embedding"]
def cos(a, b):
"""Косинусная близость двух векторов: от -1 до +1."""
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)))
if __name__ == "__main__":
v = yc_embed("кот")
print(f"«кот» -> {len(v)} чисел, длина вектора {math.sqrt(sum(x*x for x in v)):.4f}")
print("первые 6:", [round(x, 4) for x in v[:6]])
for a, b in [("кот", "кошка"), ("кот", "автомобиль"), ("король", "королева")]:
print(f" {a} / {b}: YC {cos(yc_embed(a), yc_embed(b)):.4f} | "
f"OpenAI {cos(oa_embed(a), oa_embed(b)):.4f}")
# арифметика: король - мужчина + женщина
k, m, f = yc_embed("король"), yc_embed("мужчина"), yc_embed("женщина")
target = [x - y + z for x, y, z in zip(k, m, f)]
for word in ["королева", "король", "принцесса", "царица", "кошка"]:
print(f" король-мужчина+женщина ~ {word}: {cos(target, yc_embed(word)):.4f}")
Вывод этого скрипта у нас: «кот» -> 256 чисел, длина вектора 1.0000, затем строки близости и пять строк арифметики. Повторный вызов тех же пар через час дал расхождение в четвёртом знаке (0,2981 против 0,2982), так что сравнивать имеет смысл первые три знака.
Чем эмбеддинг отличается от токена
Токен и эмбеддинг живут на разных этажах обработки текста, и путают их постоянно. Токен — кусок текста из заранее собранного словаря модели, единица счёта и оплаты. Эмбеддинг — вектор чисел, единица смысла. Слово из трёх токенов получает один вектор, и число токенов на длину вектора никак не влияет:
| Слово | Токенов в o200k_base |
Разбивка | Вектор |
|---|---|---|---|
| кот | 1 | кот |
256 чисел (Yandex) / 1536 (OpenAI) |
| программирование | 3 | пр, ограмм, ирование |
256 / 1536 |
| эмбеддинг | 3 | эм, бед, динг |
256 / 1536 |
Разбивка снята библиотекой tiktoken 0.12.0 в том же прогоне 11 сентября 2026 года. Внутри языковой модели связь между этажами прямая: каждый токен на входе сначала заменяется своим вектором из таблицы, а дальше слои внимания перемешивают эти векторы с учётом контекста. Токены считают, чтобы знать цену запроса; эмбеддинги считают, чтобы искать по смыслу. Устройство токенизации разобрано отдельно в статье что такое LLM, а базовая механика обучения сети — в материале про нейросети для начинающих.
FAQ
Что такое эмбеддинги простыми словами?
Эмбеддинги — это способ записать смысл текста списком чисел так, чтобы похожие по смыслу тексты получили похожие списки. Модель читает фрагмент и возвращает вектор фиксированной длины: в нашем замере 11 сентября 2026 года слово «кот» дало 256 чисел у Yandex AI Studio и 1536 чисел у openai/text-embedding-3-small. Дальше с векторами работает арифметика: их сравнивают, складывают и вычитают.
Какой физический смысл имеют эмбеддинги?
Вектор эмбеддинга — точка на поверхности сферы в пространстве из сотен измерений. Оба вектора в нашем прогоне нормированы к длине единица (1,0000 у Yandex, 1,0002 у OpenAI), поэтому значение имеет только направление, и близость текстов сводится к углу между стрелками. Отдельное число внутри вектора человеческому понятию не соответствует: смысл распределён по всем координатам, у Yandex они уложились в коридор от −0,1685 до 0,1676.
Что такое косинусная близость и какой порог считать «похоже»?
Косинусная близость — скалярное произведение двух векторов, делённое на произведение их длин; значение лежит от −1 до +1. Универсального порога не существует, его калибруют под конкретную модель. В нашем замере у Yandex text-search-doc пара «кот / автомобиль» получила 0,7768, а у openai/text-embedding-3-small пара «кот / кошка» — только 0,3484. Одно и то же число на разных моделях означает разное.
Чем эмбеддинг отличается от токена?
Токен — фрагмент текста из словаря модели, по нему считают объём и цену запроса. Эмбеддинг — вектор чисел, которым кодируется смысл. Слово «эмбеддинг» в кодировке o200k_base занимает 3 токена (эм, бед, динг), а вектор у него один — из 256 чисел у Yandex или 1536 у OpenAI, независимо от числа токенов. Внутри языковой модели каждый токен сначала заменяется своим вектором, и только потом начинается счёт.
Как получить эмбеддинг самому?
Понадобится ключ провайдера и четыре шага: отправить текст POST-запросом, получить массив чисел, повторить для второго текста, посчитать косинус. Скрипт embed_probe_ru.py из этой статьи делает всё перечисленное на голом urllib без сторонних библиотек и работает с двумя моделями сразу — Yandex AI Studio и openai/text-embedding-3-small через OpenRouter. Наш прогон 11 сентября 2026 года стоил 38 запросов к первой и 37 ко второй.
