Embedding

embedding — вектор смысла для слова, фрагмента текста или картинки

Раздел
Языковые модели
Обновлено
11.08.26

Embedding (эмбеддинг) — это длинный вектор чисел, который представляет смысл слова, фразы, документа или изображения. Близкие по смыслу объекты получают близкие вектора. Это позволяет искать по смыслу, а не по ключевым словам, кластеризовать документы и сравнивать тексты на любом языке. На embedding'ах построены семантический поиск, RAG, рекомендации и кросс-модальный поиск «текст ↔ картинка».

Коротко

Коротко. Embedding — это вектор из сотен или тысяч чисел, в который превращается слово, фраза, документ или изображение. Близкие по смыслу объекты получают близкие вектора: «кот» и «котёнок» рядом, «кот» и «автомобиль» далеко. На этом построены семантический поиск, RAG, кластеризация документов и сопоставление текста и картинок. Embedding-модели часто маленькие (десятки–сотни мегабайт) и быстрые.

Что это такое

Поисковая строка: «как уменьшить размер модели для слабой видеокарты». Классический поиск ищет точные слова: «уменьшить», «размер», «модели». Документы про «квантизацию» или «pruning» в ответ не попадут — там нужных слов нет.

Семантический поиск работает иначе. Запрос превращается в вектор (1536 чисел для OpenAI ada-002, 768 для bge-small). Документы в базе тоже хранятся как вектора. Поиск ищет те, чьи вектора ближе всего к вектору запроса. Слова разные — смысл близкий — нужные документы находятся.

Это и есть embedding в действии. Произвольный текст — будь то слово, абзац или целая статья — превращается в точку в многомерном пространстве. Координаты этой точки описывают «смысл» объекта так, как его видит модель. Чем ближе точки, тем ближе смысл.

Идея развивалась много лет: word2vec и GloVe сделали популярными распределённые представления слов, а контекстные энкодеры научились давать одному слову разные векторы в разных предложениях. Embeddings стали базовым механизмом для RAG, семантического поиска, кластеризации и сопоставления модальностей.

В большом разборе «RAG и AI-поиск» embedding показан как рабочий этап: документ делится на фрагменты, каждый фрагмент получает вектор, после чего поиск может сопоставлять близкие смыслы даже при разных формулировках.

Как это работает

Embedding-модель — это обычно небольшая нейросеть (transformer без output-projection), обученная так, что близкие по смыслу пары текстов получают близкие вектора.

Жизненный цикл одного embedding'а:

  1. Вход. Произвольный текст: слово, фраза или абзац в пределах контекстного лимита выбранной embedding-модели.
  2. Токенизация. Текст режется на токены.
  3. Forward pass через embedding-модель. Внутри — слои трансформера, на выходе — вектор фиксированной длины.
  4. Нормализация. Часто вектор делится на свою длину, чтобы все embedding'и были на единичной сфере — упрощает сравнение через косинусное расстояние.

Размерность вектора задаёт выбранная модель. У разных семейств это могут быть сотни или тысячи координат. Числа из двух разных моделей нельзя сравнивать напрямую, даже если размерность случайно совпала.

Сравнение двух embedding'ов: чаще всего косинусное расстояние:

similarity = dot(A, B) / (|A| · |B|)

Косинусная близость лежит в диапазоне от −1 до 1, в том числе для нормализованных векторов. Значение ближе к 1 означает похожее направление, но рабочий порог зависит от модели, корпуса и задачи.

Что мощно: семантическая близость работает между языками и модальностями.

  • «кот» (русский) → почти такой же вектор, как «cat» (английский) в многоязычных моделях.
  • Фотография кота → почти такой же вектор, как текст «cat» в моделях типа CLIP.
  • «уменьшить размер модели для слабой видеокарты» → близко к статье про «квантизацию», даже если в ней нет слов «уменьшить» и «слабой».

Пример на практике

Видеомонтажёр собирает «семантический поиск по своим заметкам» — 3 года Markdown-файлов про проекты, монтаж, оборудование. Хочет искать по смыслу, а не по точным словам.

Стек:

  1. Embedding-модель: выбирается по языку корпуса, лицензии, размерности и доступной среде. Англоязычный checkpoint нельзя автоматически считать подходящим для русского.
  2. Векторная БД: ChromaDB (можно начать с in-memory). Запускается одной командой.
  3. Пайплайн индексации:
    • Прочитать все .md файлы.
    • Разбить на смысловые фрагменты подходящего размера.
    • Для каждого куска посчитать embedding.
    • Сохранить вектор + текст в Chroma.
  4. Пайплайн поиска:
    • Запрос пользователя → embedding.
    • Найти несколько ближайших векторов и применить нужные фильтры.
    • Вернуть тексты этих кусков.

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

В ComfyUI всё то же собирается визуально — нода CLIP Text Encode или специализированная embedding-нода превращает текст или картинку в вектор, дальше нода Cosine Similarity сравнивает с базой. Тот же подход — и текст→текст, и текст→картинка, и картинка→картинка.

С чем часто путают

  • Embedding и токен — токен это id из словаря. Embedding — это вектор смысла. У каждого токена есть свой embedding (look-up таблица в LLM), но «embedding» как термин чаще означает вектор для текста целиком.
  • Embedding и feature vector — feature vector в классическом ML обычно сконструирован человеком (например, [возраст, доход, длина]). Embedding — выучен моделью; отдельные числа в нём не интерпретируются.
  • Embedding и hash — hash это уникальный детерминированный отпечаток, не несущий смысла (близкие тексты дают разные хеши). Embedding — мягкий: близкие тексты дают близкие вектора.
  • Embedding и vector database — embedding это объект (вектор). Vector database — хранилище таких объектов с поиском по близости.
  • Embedding и LoRA — LoRA в diffusion это адаптер для модели, не вектор. В Stable Diffusion слово «Embedding» исторически означает Textual Inversion — это отдельный концепт, см. ниже.

Частые ошибки и заблуждения

  • «Embedding безопасно публиковать вместо текста». Вектор не является обычной обратимой кодировкой, но может раскрывать признаки исходных данных и использоваться в атаках восстановления. К нему применяют те же правила доступа, что и к чувствительному корпусу.
  • «Embeddings одной модели совместимы с другой». Нет. Каждая модель создаёт свои вектора в своём пространстве. text-embedding-3-small и bge-small-en — это разные пространства, их вектора нельзя сравнивать напрямую.
  • «Чем выше размерность — тем лучше». Размерность сама по себе не измеряет качество поиска. Модели сравнивают на размеченных запросах из своего корпуса.
  • «Достаточно одного embedding для документа любой длины». Один вектор большого документа часто теряет локальные детали. Размер фрагментов и перекрытие подбирают по структуре текста и измеряют на поисковой выборке.
  • «Embedding отражает истину». Он отражает то, на чём модель училась. На редких языках или специфичных доменах качество может проседать.

Связанные термины

  • Vector Database — хранилище и поиск по embedding'ам.
  • RAG — основной use-case embeddings: поиск релевантных кусков перед генерацией.
  • Semantic search — поиск по смыслу через embeddings.
  • CLIPмодель, делающая embedding и текста, и картинки в одно пространство.
  • Cosine similarity — стандартная метрика близости двух embedding'ов.
  • Chunking — разбивка длинных документов перед embedding'ом.
  • Reranking — пере-сортировка найденных embedding'ов через более точную модель.
  • Textual Inversion — особый embedding в Stable Diffusion, не путать с обычным.

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

Сколько занимает один embedding в памяти? Размерность × 4 байта (FP32) или × 2 байта (FP16). Для 1536-мерного embedding'а — 6 КБ или 3 КБ. На миллион документов нужны гигабайты, но не терабайты.

Где брать embedding-модель? Hugging Face MTEB Leaderboard — рейтинг open-source моделей.

Можно ли искать русский запрос по английским документам? Да, если использовать многоязычную модель: bge-m3, mE5, paraphrase-multilingual-MiniLM. На моноязычной (например, ada-002) качество кросс-языкового поиска ниже.

Сколько документов можно проиндексировать локально? Объём зависит от размерности и типа вектора, индекса, метаданных, фильтров и запаса памяти. Его оценивают на контрольной части корпуса, а затем измеряют скорость поиска и размер индекса при росте данных.

Как обновлять индекс при изменении документов? Перепосчитать embedding изменённых кусков, обновить в БД. Поддерживается во всех vector databases. Полная переиндексация нужна только при смене embedding-модели.

Главное

Embedding — числовое представление объекта, в котором близость должна отражать полезное для задачи сходство. На embeddings строят RAG, рекомендации, кросс-модальный поиск и кластеризацию. Размерность сама по себе не показывает качество: важны язык, домен, способ обучения и метрика. Подходящую модель выбирают по retrieval-тесту на собственных запросах.