Эмбеддинг-модели: как их обучают
Как устроены современные эмбеддинг-модели для поиска: контрастивное обучение и лосс InfoNCE, in-batch и hard negatives, префиксы query:/passage: и матрёшка-эмбеддинги.
Интуиция
Word2vec даёт вектор слова, а поиску нужен вектор целого запроса и целого документа. Наивный ход — усреднить векторы слов — теряет порядок и логику: «билет из Москвы в Париж» и «билет из Парижа в Москву» дадут одинаковый вектор. Современный эмбеддер (E5, BGE, text-embedding от OpenAI) — это трансформер-энкодер: каждый токен получает контекстный вектор, затем пулинг (pooling) собирает их в один вектор текста — обычно усреднением (mean pooling) или вектором служебного CLS-токена.
Но главное отличие от word2vec — не архитектура, а задача обучения. Word2vec учили предсказывать соседние слова, а эмбеддинг-модель учат прицельно под поиск: запрос и отвечающий на него документ должны оказаться рядом в векторном пространстве, а всё нерелевантное — дальше.
Как это работает: контрастивное обучение
Данные — пары (запрос, релевантный документ): вопрос и принятый ответ с форума, заголовок и текст статьи, запрос и кликнутый документ. В батч кладут B таких пар. Для каждого запроса его документ — позитив, а документы остальных B−1 пар — негативы «бесплатно», без отдельной разметки: это называется in-batch negatives. Обучение контрастивное (contrastive learning), лосс — InfoNCE:
По сути это softmax-классификация «найди свой документ среди чужих»: скор позитива тянется вверх относительно негативов, температура τ задаёт резкость. Градиент буквально стягивает векторы пары и расталкивает запрос с негативами.
И здесь ключевая тонкость: случайные негативы слишком лёгкие. Когда негатив — текст про другую тему, softmax и так почти уверен, градиент близок к нулю, модель ничему не учится. Качество делают hard negatives — похожие, но нерелевантные документы: их майнят через BM25 или прошлую версию самой модели («что ты сейчас считаешь близким, хотя это не ответ?»). Именно они учат тонким различиям вроде «возврат товара» против «возврат средств». Полный рецепт обучения E5/BGE двухэтапный: слабое предобучение (weakly supervised) на миллиардах шумных пар из веба, затем файнтюн на размеченных наборах вроде MS MARCO с намайненными hard negatives.
Обрати внимание на характер кривых: на случайных негативах recall@1 подолгу застревает (дистракторы возле пар почти не попадают в батч, а далёкие негативы не дают градиента), на hard negatives каждый шаг бьёт точно по текущему конкуренту — раскладка получается чище, и 100% достигается в несколько раз быстрее.
Асимметрия и матрёшка
Запрос и документ — разные роли: запрос короткий и вопросительный, документ длинный и повествовательный. Поэтому семейство E5 требует префиксы query: и passage: перед текстом — модель обучалась с ними и кодирует роли по-разному; забыть префикс при индексации — тихо потерять несколько пунктов recall.
Матрёшка-эмбеддинги (Matryoshka Representation Learning, MRL) решают вопрос «какая размерность нужна»: лосс при обучении считают не только на полном векторе, но и на его префиксах, поэтому первые k координат — самостоятельный рабочий эмбеддинг. Один и тот же вектор на 1024 измерения можно обрезать до 256 под бюджет памяти и скорости, потеряв лишь немного качества и ничего не переобучая.
Дообучение под домен и оценка
Если на своём корпусе (медицина, юриспруденция, внутренний жаргон) recall низкий, есть два пути. Дешёвый — не трогать эмбеддер и поставить реранкер поверх выдачи. Дорогой — дообучить эмбеддер: собрать пары из своих данных (FAQ, клики, синтетические вопросы от LLM к своим документам), намайнить hard negatives по своему корпусу, обучать контрастивно с маленьким learning rate, чтобы не разрушить общие способности модели, — и переиндексировать базу, ведь новые векторы несовместимы со старыми.
Выбирают и оценивают эмбеддеры по MTEB — большому бенчмарку задач с эмбеддингами, — но это лишь ориентир: решает recall@k на золотом сете из ваших запросов и документов (как его собрать — в теме оценка качества RAG). Размерность — отдельный трейд-офф: больше измерений — чуть выше качество, но память индекса и стоимость поиска растут линейно.
- «Как дообучить эмбеддер под свой домен?» — пары запрос–документ из своих данных → майнинг hard negatives → контрастивный файнтюн с маленьким LR → переиндексация и замер recall@k на золотом сете. И проговори альтернативу: часто хватает реранкера.
- «Зачем hard negatives?» — случайные негативы слишком лёгкие, градиент по ним почти нулевой; hard negatives учат отличать похожее от релевантного.
- «Что такое матрёшка-эмбеддинги?» — обучение, при котором первые k координат — самостоятельный эмбеддинг: вектор режется под бюджет без переобучения.
- «Почему у E5 префиксы query:/passage:?» — асимметрия ролей: запрос и документ кодируются по-разному, модель должна знать, что перед ней.