Эмбеддинг
| Что это | вектор фиксированной длины, кодирующий смысл объекта |
|---|---|
| Типичная размерность | от 384 до 4096 |
| Мера близости | косинусное сходство, скалярное произведение |
| Исторические модели | word2vec (2013), GloVe (2014), BERT (2018) |
| Текстовые модели | Sentence-BERT, E5, BGE, модели эмбеддингов облачных провайдеров |
| Бенчмарк | MTEB |
| Применение | семантический поиск, RAG, кластеризация, рекомендации, поиск дубликатов |
Эмбеддинг (англ. embedding — «вложение») — представление объекта в виде вектора — списка из сотен или тысяч чисел — так, что близкие по смыслу объекты получают близкие векторы. Объектом может быть слово, предложение, целый документ, изображение, товар или пользователь. Эмбеддинги переводят «смысл» на язык геометрии: чтобы найти похожие тексты, достаточно найти ближайшие векторы.
Эмбеддинги — основа векторного поиска, RAG, рекомендательных систем, кластеризации и поиска дубликатов. Внутри трансформеров и языковых моделей каждый токен тоже сначала превращается в эмбеддинг.
История
Идея представлять слова векторами восходит к дистрибутивной гипотезе лингвистики: «слово узнаётся по его окружению». Практический прорыв совершил word2vec Томаша Миколова и коллег из Google (2013): небольшая сеть, обученная предсказывать соседние слова, давала векторы, в которых проявлялись смысловые отношения — знаменитый пример король − мужчина + женщина ≈ королева.[1] Вскоре появились GloVe (Стэнфорд, 2014)[6] и fastText.
Векторы слов не учитывали контекст: у слова «ключ» был один вектор и для замка, и для родника. Модели на основе трансформеров — ELMo и BERT (2018) — стали давать контекстные эмбеддинги. В 2019 году Sentence-BERT показал, как дообучить BERT так, чтобы эмбеддинги целых предложений можно было сравнивать косинусным сходством; так появились современные модели эмбеддингов текста.[2]
Как получают эмбеддинги
Модель эмбеддингов — обычно трансформер-энкодер, обученный методом контрастного обучения: векторы пар «вопрос — релевантный ответ» или «перевод — оригинал» сближаются, а случайных пар — раздвигаются. На выходе любой текст превращается в вектор фиксированной длины.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("intfloat/multilingual-e5-small")
docs = ["passage: PostgreSQL — реляционная СУБД",
"passage: Kubernetes управляет контейнерами",
"passage: pgvector добавляет векторный поиск в Postgres"]
query = "query: как искать похожие векторы в базе данных"
doc_vecs = model.encode(docs, normalize_embeddings=True)
q_vec = model.encode(query, normalize_embeddings=True)
scores = doc_vecs @ q_vec # косинусное сходство для нормированных векторов
print(scores.argsort()[::-1]) # ближайшим окажется фрагмент про pgvector
Библиотека Sentence Transformers даёт доступ к сотням открытых моделей с Hugging Face;[5] облачные провайдеры предлагают модели эмбеддингов через API. Некоторые модели требуют префиксов вроде query: и passage:, отличающих вопрос от документа.
Меры близости
| Мера | Формула | Замечание |
|---|---|---|
| Косинусное сходство | cos θ = a·b / (‖a‖·‖b‖) |
стандарт для текстовых эмбеддингов |
| Скалярное произведение | a·b |
совпадает с косинусом для нормированных векторов, быстрее |
| Евклидово расстояние | ‖a − b‖ |
для нормированных векторов даёт тот же порядок, что косинус |
Выбор модели
- Качество сравнивают на бенчмарке MTEB, охватывающем поиск, классификацию, кластеризацию и десятки языков.[3] Для русского текста нужны мультиязычные модели или модели, обученные на русском.
- Размерность влияет на память и скорость поиска: миллион векторов по 1024 числа с плавающей точкой занимает около 4 ГБ. Модели, обученные по схеме Матрёшки, позволяют обрезать вектор до первых 256 или 512 компонент почти без потери качества.[4]
- Максимальная длина входа — длинные документы приходится разбивать на фрагменты (см. Чанкинг документов).
- Одна модель на всё. Векторы разных моделей несовместимы: при смене модели нужно пересчитать эмбеддинги всей коллекции.
Хранение и поиск
Для небольших коллекций достаточно хранить векторы в массиве NumPy и сравнивать полным перебором. Для миллионов векторов используют индексы приближённого поиска ближайших соседей — в PostgreSQL через расширение pgvector или в специализированных векторных базах. Векторы можно сжимать квантизацией — до 8 бит или даже 1 бита на компоненту — с небольшой потерей точности.
Ограничения
Эмбеддинги хорошо улавливают общий смысл, но хуже — точные совпадения: артикулы, номера версий, редкие имена и отрицания («без сахара»). Поэтому в поисковых системах векторный поиск сочетают с классическим полнотекстовым (BM25) — гибридный поиск — и уточняют результаты переранжированием.
См. также
- Векторный поиск
- pgvector и векторные БД
- RAG (генерация с дополнением поиском)
- Трансформер (архитектура)
- Чанкинг документов
Источники
- T. Mikolov et al. — Efficient Estimation of Word Representations in Vector Space (2013)
- N. Reimers, I. Gurevych — Sentence-BERT (2019)
- N. Muennighoff et al. — MTEB: Massive Text Embedding Benchmark (2022)
- A. Kusupati et al. — Matryoshka Representation Learning (2022)
- Sentence Transformers — документация
- J. Pennington, R. Socher, C. Manning — GloVe: Global Vectors for Word Representation (2014)