Как получить вектора для вычисления similarity между текстами
Что проверяют
Понимаете ли вы разницу между лексической и смысловой похожестью и выбираете ли представление под задачу, а не по моде. Следом обычно спрашивают, как масштабировать поиск на миллионы текстов и как оценить качество.
Как отвечать
Разложите методы от простого к сильному:
- TF-IDF и BM25: разреженные векторы по словам, в scikit-learn это
TfidfVectorizerиcosine_similarity. Быстро, объяснимо, хорошо находит тексты с общими терминами, но «купить авто» и «приобрести машину» для него не похожи. Для русского нужна лемматизация, иначе формы слова считаются разными признаками; - статические эмбеддинги слов (word2vec, fastText): вектор текста как среднее векторов слов. Синонимы уже ловятся, но порядок слов и отрицание теряются. У word2vec нет векторов для незнакомых слов, fastText собирает их из символьных n-грамм;
- sentence-эмбеддинги (bi-encoder): модели из
sentence-transformers, для русского многоязычные вродеmultilingual-e5илиbge-m3. Текст целиком становится плотным вектором, похожесть считается косинусом. У E5 обязательны префиксыquery:иpassage:, без них качество падает; - cross-encoder: подаёт пару текстов в модель сразу и точнее bi-encoder, но векторов не даёт и считается на каждую пару. Его ставят вторым этапом, чтобы переранжировать топ после быстрого поиска.
Векторы нормализуют, тогда косинус равен скалярному произведению. На больших объёмах ближайших ищут через ANN-индекс: FAISS, HNSW, pgvector. Качество проверяют на своих размеченных парах по recall@k, а рейтинг MTEB даёт лишь стартовый список кандидатов.
Где спотыкаются
Берут сырой BERT и усредняют выходы или берут [CLS]. Без дообучения на задачу похожести такие векторы плохо различают смысл: косинусы почти всех пар сбиваются в узкий диапазон высоких значений.
Переносят порог похожести между моделями. Значение 0.8 у двух разных моделей означает разное, порог подбирают на своих данных.
Сравнивают векторы из разных моделей или версий одной модели. Пространства несовместимы, после смены энкодера пересчитывают весь корпус.