2026 г.

Глава 2. Эмбеддинги: смысл как вектор

Учебник «Большие языковые модели»

В главе 1 мы превратили текст в последовательность токенов — целых чисел от 0 до V−1. Но нейронная сеть — это конструкция из матричных операций и нелинейных преобразований; ей нужны не номера, а векторы, над которыми осмысленны арифметические операции. Переход от дискретного токена к вектору называется эмбеддингом (embedding — «вложение»: дискретное множество вкладывается в непрерывное пространство). Это второе — после токенизации — основание, на котором стоит вся конструкция LLM, и одновременно самостоятельная технология с огромной практической ценностью: семантический поиск, RAG, классификация, кластеризация и рекомендации строятся на эмбеддингах напрямую.

2.1. От номера к вектору

Наивное векторное представление токена — унитарный код (one-hot): вектор длины V, в котором единица стоит на позиции с номером токена, а остальные компоненты нулевые. Такое представление хранит идентичность токена, но не сходство: все векторы попарно ортогональны, расстояния между любыми двумя токенами одинаковы. «Кошка» равноудалена и от «кота», и от «трансформатора» — представление не знает о смысле ничего.

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

E ∈ ℝV×d,

строка с номером i которой и есть вектор токена i. «Вычисление» эмбеддинга — это просто выбор строки матрицы. В языковой модели E — обычный набор обучаемых параметров: при обучении модель двигает эти векторы так, чтобы лучше предсказывать следующий токен, и семантическая структура возникает в них как побочный продукт. При словаре в 100 тысяч токенов и d = 4096 матрица эмбеддингов содержит около 400 миллионов параметров — заметная часть модели.

В основе всего лежит дистрибутивная гипотеза, сформулированная лингвистами задолго до нейросетей: смысл слова определяется совокупностью контекстов, в которых оно употребляется. «Кошка» и «кот» встречаются в похожих окружениях («…мурлычет», «покормить…») — значит, обучение, основанное на предсказании контекста, само стянет их векторы друг к другу.

2.2. Геометрия смысла

Близость векторов принято измерять косинусной мерой — косинусом угла между ними:

cos(a, b) = (a · b) / (|a| · |b|) = Σi aibi / (√(Σi ai2) · √(Σi bi2))

Значение 1 означает сонаправленность, 0 — ортогональность, а отрицательные значения — угол больше 90°. Как эти числа связаны с семантической близостью, определяется обучением конкретной модели: нуль сам по себе не доказывает «несвязанность». Косинус не зависит от длины вектора; для единично нормированных векторов он равен скалярному произведению. Выбор косинуса, скалярного произведения или евклидова расстояния следует брать из контракта модели и проверять на своей задаче.

Знаменитое свойство выученных эмбеддингов — осмысленность не только расстояний, но и направлений. В классической работе о word2vec (Миколов и др., 2013) было показано, что вектор(«король») − вектор(«мужчина») + вектор(«женщина») оказывается ближе всего к вектору(«королева»): разность векторов уловила направление «смены пола», и оно приблизительно одинаково для разных пар слов. Аналогично работают направления «страна → столица», «единственное → множественное число». К красивым примерам стоит относиться трезво — арифметика работает далеко не для всех аналогий, — но сам факт, что линейная структура пространства отражает семантические отношения, фундаментален и многократно подтверждён.

2.3. От статических эмбеддингов к контекстным

Модели первого поколения (word2vec, GloVe, fastText; 2013–2017) строили статические эмбеддинги: у каждого слова — ровно один вектор. Недостаток очевиден на многозначных словах: «ключ» от двери, «ключ» в лесу и «ключ» API получают один общий вектор, усредняющий все смыслы.

Современные модели строят контекстные представления: вектор токена на выходе сети зависит от доступного ему контекста. В предложении «бьёт ключ из-под земли» слово «ключ» получит представление, близкое к «роднику», а в «ключ от квартиры» — к «замку». Именно преобразование статического эмбеддинга (строки матрицы E) в контекстное представление — работа слоёв трансформера, которой посвящена глава 3. Забегая вперёд: внутри LLM токен входит в первый слой своим статическим эмбеддингом, а к последнему слою «обрастает» смыслом предшествующего контекста. У двунаправленного энкодера доступны обе стороны, а у причинной LLM — только предыдущие позиции; по итоговому вектору модель предсказывает следующий токен.

2.4. Эмбеддинги предложений и документов

Для поиска и классификации нужен вектор не токена, а целого текста — предложения, абзаца, документа. Простейший способ — усреднить векторы токенов (mean pooling), но специализированные эмбеддинг-модели текстов дают качественно лучшие результаты. Их дообучают контрастивным методом: модели показывают пары семантически близких текстов (вопрос и ответ, заголовок и статья, перевод и оригинал) и учат сближать их векторы, одновременно расталкивая векторы случайных пар. Функция потерь (InfoNCE) для пары (q, p0), где p0p+, при негативных примерах p1, …, pk имеет вид:

L = −log [ exp(cos(q, p0)/τ) / Σi=0..k exp(cos(q, pi)/τ) ]

где τ — температурный параметр. Интуитивно: это softmax-задача «найди правильный ответ среди подделок», и чем лучше модель её решает, тем полезнее геометрия итогового пространства.

Практически важные свойства эмбеддинг-моделей: размерность вектора (часто сотни или тысячи компонент; большая размерность дороже в хранении и поиске, но не гарантирует лучшего качества), максимальная длина входа, многоязычность (для русского важно выбирать модель, обученную многоязычно) и режимы «запрос/документ» — многие модели кодируют поисковый запрос и документ с разными префиксами, и их нельзя путать. Доступны эмбеддинги двумя путями: по API (OpenAI, Google, Voyage и др., оплата за токены) и локально — модели с доступными весами (семейства BGE, E5, GTE, multilingual-e5 и др.) запускаются на обычном сервере даже без GPU. Доступные веса не обязательно означают открытую лицензию; условия лицензии на модель и обучающие данные надо проверять отдельно.

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

2.5. Практикум

Сначала — косинусная близость «на пальцах», без всяких моделей:

import numpy as np

def cos(a, b):
    return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))

a = np.array([0.9, 0.1, 0.0])
b = np.array([0.8, 0.2, 0.1])
c = np.array([0.0, 0.1, 0.9])
print(cos(a, b))   # ~0.98 -- близки
print(cos(a, c))   # ~0.01 -- далеки в этой игрушечной геометрии

Теперь настоящая многоязычная эмбеддинг-модель (библиотека sentence-transformers; модель ~0,5 ГБ, работает на CPU):

# pip install sentence-transformers
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("intfloat/multilingual-e5-small")

docs = [
    "Индексы ускоряют выполнение запросов в реляционных СУБД.",
    "Кошки спят до шестнадцати часов в сутки.",
    "B-деревья широко используются для организации индексов баз данных.",
    "Query performance in relational databases depends on indexing.",
]
# У моделей семейства e5 документы кодируются с префиксом "passage: ",
# а запросы -- с префиксом "query: ". Это часть контракта модели.
emb = model.encode([f"passage: {d}" for d in docs],
                   normalize_embeddings=True)

q = model.encode(["query: как ускорить SQL-запросы"],
                 normalize_embeddings=True)

scores = emb @ q[0]          # векторы нормированы: скалярное
                             # произведение и есть косинус
for s, d in sorted(zip(scores, docs), reverse=True):
    print(f"{s:.3f}  {d}")

Обратите внимание на два результата этого опыта. Во-первых, фраза про кошек уверенно окажется в конце списка — поиск действительно семантический, слова «SQL» нет ни в одном документе. Во-вторых, английский документ про индексы получит высокую оценку по русскому запросу: многоязычная модель отображает языки в общее векторное пространство, и кросс-языковой поиск работает без отдельного словаря переводов. Лексический поиск тоже можно сделать кросс-языковым, но для этого понадобятся перевод, словари или другой дополнительный слой.

Этот десяток строк — уже работающее ядро семантического поиска. Для небольшой коллекции матрицы NumPy и полного перебора нередко достаточно; граница зависит от размерности, задержки, памяти и нагрузки. На больших наборах применяют специализированные индексы приближённого поиска ближайших соседей (HNSW и другие) и векторные СУБД — к ним мы вернёмся в главе 10, посвящённой RAG.

2.6. Итоги

Эмбеддинг переводит дискретный токен (или целый текст) в плотный вектор, геометрия которого отражает семантику: близким смыслам — близкие векторы, а некоторым смысловым отношениям — устойчивые направления. Внутри LLM эмбеддинги токенов — это обучаемая матрица E ∈ ℝV×d, вход всей дальнейшей обработки; снаружи эмбеддинг-модели текстов — самостоятельный инструмент, на котором строятся семантический поиск, RAG, классификация и кластеризация. Стандартная мера близости — косинусная; для русского языка следует выбирать многоязычные модели и соблюдать их контракты (префиксы запросов и документов, нормализация).

Мы научились превращать текст в последовательность векторов. Следующий шаг — главный: как сеть обрабатывает эту последовательность так, что каждый вектор вбирает в себя смысл контекста. Это механизм внимания и архитектура трансформера.

Упражнения

1. Скачайте модель из практикума и составьте пять пар перефразировок и пять тематически далёких пар. Сравните распределения косинусной близости и найдите пример, на котором простое пороговое правило ошибается.

2. Возьмите 20–30 заголовков статей CITForum из разных разделов, вычислите их эмбеддинги и попарные косинусные близости. Совпадают ли кластеры близких заголовков с рубрикацией сайта?

3. Закодируйте один и тот же вопрос как «query: …» и как «passage: …» и сравните результаты поиска. Насколько сильно нарушение контракта модели влияет на качество?

404 Not Found

404 Not Found


nginx/1.24.0 (Ubuntu)

Связь с редакцией