Эмбеддинг

Материал из llmdocs — справочник разработчика
Портал: ML и MLOps
Эмбеддинг
Что этовектор фиксированной длины, кодирующий смысл объекта
Типичная размерностьот 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) — гибридный поиск — и уточняют результаты переранжированием.

См. также

Источники

  1. T. Mikolov et al. — Efficient Estimation of Word Representations in Vector Space (2013)
  2. N. Reimers, I. Gurevych — Sentence-BERT (2019)
  3. N. Muennighoff et al. — MTEB: Massive Text Embedding Benchmark (2022)
  4. A. Kusupati et al. — Matryoshka Representation Learning (2022)
  5. Sentence Transformers — документация
  6. J. Pennington, R. Socher, C. Manning — GloVe: Global Vectors for Word Representation (2014)