Текст написан автором и отредактирован с помощью ИИ
TL;DR: Платные модели embedding плохо работают с малоресурсными языками. OpenAI text-embedding-3-large набирает R@1 = 0,21 на армянском — уровень случайного угадывания. Причина — токенизатор: cl100k_base не содержит армянских токенов и разбивает текст побайтово, раздувая его в 10 раз по сравнению с английским. Бесплатные мультиязычные модели с SentencePiece/WordPiece-токенизаторами не имеют этой проблемы. Протестировано 19 моделей на 245 триплетах EN/RU/HY из TMDB. Лучший retrieval — LaBSE (R@1 = 0,83), лучший alignment — multilingual-e5-large (0,86).
Работая над прототипом IPTV/OTT RecSys, на старте взял коммерческий облачный embedding как baseline — распространённый шаблон при разработке продуктов с ML. Качество кроссязыкового сопоставления EPG-заголовков оказалось низким. Стал искать подходящую модель — написал простой бенчмарк из 7 триплетов и 4 синонимных пар. Выяснилось, что бесплатные мультиязычные модели работают значительно лучше платных. Замена модели улучшила RecSys на практике, но размер тестов вызывал сомнения — 7 примеров всё-таки мало для уверенных выводов.
В итоге это выросло в полноценное исследование: 19 моделей, 245 триплетов, 783 дуплета для теста сокращений — на домене мультиязычного EPG (английский, русский, армянский).
Результаты подтвердили первоначальные находки по alignment (средний cosine): бесплатная модель с Hugging Face набирает 0,86, OpenAI text-embedding-3-large — 0,34, Cohere embed-v4.0 — 0,47. Но добавление retrieval-метрик (Recall@1, MRR) полностью перетасовало рейтинг — и выявило модели-ловушки с красивым alignment, но нулевой дискриминацией.
Код, весь синтетический/публичный датасет (TMDB-триплеты, тесты на сокращения, синонимные пары) и полные таблицы результатов — в открытом доступе. Двухнедельный продуктовый EPG-дамп не публикую по понятным причинам; его агрегированные статистики (распределение языков, доля сокращений и т.п.) приведены прямо в тексте.
Постановка задачи
Армянские IPTV/OTT EPG-ленты по природе мультиязычны: в одном и том же фиде регулярно встречаются армянский (HY), русский (RU) и английский (EN). Армянский — государственный язык. Русский широко распространён и часто доминирует в метаданных вещания на постсоветском пространстве. Английский — стандарт для международного контента и глобальных источников данных. Поэтому трилингвальное сопоставление заголовков — это практическое продуктовое требование.
Анализ 14-дневного продуктового дампа EPG (239 каналов, 35 170 записей) показывает языковой состав заголовков:
|
Язык |
Доля |
|---|---|
|
Только RU |
53,7% |
|
Только HY |
29,9% |
|
Только EN |
12,0% |
|
Два языка |
4,3% |
Ни одна запись не содержала все три языка одновременно — каждая запись имеет один заголовок, написанный на одном или максимум двух языках, поэтому рекомендательная система должна сопоставлять их исключительно через близость эмбеддингов.
Каждый IPTV-оператор получает EPG-данные из нескольких источников. Одна и та же программа появляется на разных каналах с разными идентификаторами записей, разными названиями, разными транслитерациями и на разных языках. Чтобы агрегировать историю просмотров пользователя по каналам — и строить на её основе рекомендации — система должна уметь сопоставлять эти записи между собой. Рекомендательная система, не способная выполнять кросс-языковое сопоставление, даёт некачественные рекомендации для неанглоязычного контента.
Армянский язык (hy) представляет особую сложность:
-
Нелатинская, некириллическая письменность (уникальный армянский алфавит: Հ, Ա, Յ, Ե, …)
-
Низкоресурсный язык: слабо представлен в обучающих данных большинства моделей эмбеддингов
-
Смешение армянского, русского и английского в EPG-заголовках
-
Доменно-специфичные сокращения
|
Сокращение |
Расшифровка |
Рус. аналог |
Встречаемость |
|---|---|---|---|
|
Հ/Ն |
Теленовелла (Herustanovel) |
— |
1 971 |
|
Հ/Ս |
Телесериал (Herustaserial) |
т/с |
598 |
|
Գ/Ֆ |
Худ. фильм (Gegharvestakan film) |
к/ф |
112 |
|
Հ/Շ |
Телешоу (Herustashou) |
— |
88 |
|
Մ/Ս |
Мультсериал (Multserial) |
м/с |
84 |
Методология
В примерах ниже сокращения и заголовки приведены на русском для удобства читателей. В датасете и бенчмарке аналогичные тесты проводятся и на армянском — с армянскими сокращениями (Գ/Ֆ, Հ/Ս, Մ/Ս и др.) и армянскими заголовками.
Датасет
-
245 триплетов (EN, RU, HY): 7 рукописных EPG-записей + 238 реальных из TMDB API
-
783 дуплета для теста устойчивости к сокращениям (например, “Название” vs “к/ф Название”).
-
4 пары HY-HY синонимов для внутриязыковой консистентности
Метрика
Средний косинусный коэффициент по трём кроссязыковым парам:
-
cos(embed(EN), embed(RU))— EN-RU -
cos(embed(EN), embed(HY))— EN-HY -
cos(embed(RU), embed(HY))— RU-HY
Итоговый балл = среднее трёх. Почему среднее, а не минимум? Минимум скрывает ситуации, когда модель хороша на двух парах и плоха на одной. Среднее более устойчиво к выбросам в конкретной паре, а детальная разбивка по парам всё равно приведена в таблице результатов.
Устойчивость к сокращениям — средний cos(embed(title), embed(prefix + title)) по 783 дуплетам (отдельно для RU и HY). Идеальная модель даёт 1.0: добавление “к/ф” или “м/ф” перед названием не должно менять эмбеддинг.
HY-HY внутриязыковая консистентность — средний cos(embed(A), embed(B)) по 4 парам армянских синонимов (например, “Մարզական ամփոփում” vs “Սպորտային ամփոփագիр”). Проверяет, различает ли модель семантически идентичные фразы на низкоресурсном языке.
Recall@1 — для каждого заголовка на языке A ищем ближайший по cosine среди всех 245 заголовков на языке B. Если ближайший — правильный перевод, это hit. Поиск выполняется в обе стороны (A->B и B->A), R@1 = среднее двух направлений. Итоговый R@1 = среднее по трём парам (EN<->RU, EN<->HY, RU<->HY).
MRR (Mean Reciprocal Rank) — аналогично R@1, но учитывает позицию правильного ответа: если правильный перевод на 1-м месте — 1,0; на 2-м — 0,5; на 3-м — 0,33 и т.д. Среднее по трём парам.
Cross-lang mean измеряет alignment (насколько близки правильные пары). R@1 и MRR измеряют discrimination (отличает ли модель правильную пару от 244 неправильных). Для продакшн-системы нужны оба свойства.
Ограничения методологии
-
Instruct-модель исключена.
multilingual-e5-large-instructисключена из бенчмарка: instruct-модели проектируются для асимметричных задач (query -> document) и требуют instruction prefix. В нашей задаче (симметричное попарное сравнение заголовков) использование instruct-модели без префикса некорректно, а добавление префикса меняет саму задачу. Результаты non-instruct e5-моделей — корректная нижняя граница. -
Нет query prefix для семейства E5. Модели
intfloat/multilingual-e5-*иintfloat/e5-*документируют рекомендуемый префикс"query: "для входных текстов. В нашем бенчмарке все тексты передаются без префиксов. Это значит, что результаты E5 — нижняя граница: с корректными префиксами их результаты могут быть ещё выше. -
Jina v3: task-адаптер активирован. Для
jinaai/jina-embeddings-v3и API, и локальный ST-бэкенд используютtask="retrieval.passage"/prompt_name="retrieval.passage". Остаточный разрыв (0,851 vs 0,811) может быть связан с различиями в “технической” части, так как уже исключили “самую частую” причину расхождений. -
HY-HY синонимы (N=4) — слишком малая выборка для статистически значимых выводов. Метрика приведена как иллюстративная.
-
Дисперсия не приведена. Таблица содержит средние по 245 триплетам, но без стандартного отклонения или доверительных интервалов. Для близких моделей (e5-base 0,861 vs e5-large 0,863) разница может быть незначима / различна в пределах шума.
-
TMDB != реальный EPG. 238 из 245 триплетов взяты из TMDB — это community-переводы. Реальные EPG-заголовки грязнее: обрезки, транслитерации, опечатки, смешение языков в одном поле. Бенчмарк может завышать реальную production-эффективность.
Модели
19 моделей, 6 бэкендов:
Локальные (SentenceTransformers):
-
intfloat/multilingual-e5-large(2023) -
intfloat/multilingual-e5-base(2023) -
intfloat/e5-large-v2(2023) -
intfloat/e5-large(2022) -
sentence-transformers/LaBSE(2022) -
BAAI/bge-m3(2024) -
Alibaba-NLP/gte-multilingual-base(2024) -
Metric-AI/armenian-text-embeddings-1(2024) -
jinaai/jina-embeddings-v3— локально через ST -
paraphrase-multilingual-mpnet-base-v2(2021) -
paraphrase-multilingual-MiniLM-L12-v2(2021) -
distiluse-base-multilingual-cased(2020) -
all-MiniLM-L6-v2(2021)
FlagEmbedding:
-
BAAI/bge-m3— тот же чекпойнт, другой бэкенд
API:
-
OpenAI
text-embedding-3-large(2024) -
Cohere
embed-v4.0(2025) -
Cohere
embed-multilingual-v3.0(2023) -
Jina
jina-embeddings-v3(2024) -
Voyage
voyage-multilingual-2(2024)
Железо
MacBook M2 Max, 32 GB RAM. Локальные модели через CPU/Metal, API через интернет. Время замерено на батче из 735 текстов (245 триплетов x 3 языка). Абсолютные значения мс/текст приведены для сравнения моделей между собой, а не как ориентир серверной производительности.
Результаты
|
# |
Бэкенд |
Модель |
Год |
$$ |
Cross-lang |
EN-RU |
EN-HY |
RU-HY |
HY-HY |
Abbrev |
мс/текст |
|---|---|---|---|---|---|---|---|---|---|---|---|
|
1 |
st |
|
2023 |
|
0,863 |
0,870 |
0,855 |
0,864 |
0,964 |
0,940 |
20 |
|
2 |
st |
|
2023 |
|
0,861 |
0,867 |
0,851 |
0,865 |
0,958 |
0,948 |
14 |
|
3 |
jina |
|
2024 |
$$ |
0,851 |
0,883 |
0,835 |
0,836 |
0,913 |
0,899 |
9 |
|
4 |
st |
|
2024 |
|
0,811 |
0,843 |
0,774 |
0,816 |
0,855 |
0,944 |
19 |
|
5 |
st |
|
2023 |
|
0,782 |
0,775 |
0,769 |
0,802 |
0,833 |
0,920 |
19 |
|
6 |
st |
|
2022 |
|
0,756 |
0,737 |
0,734 |
0,798 |
0,863 |
0,969 |
12 |
|
7 |
cohere |
|
2023 |
$$ |
0,749 |
0,796 |
0,695 |
0,757 |
0,951 |
0,911 |
7 |
|
8 |
st |
|
2022 |
|
0,746 |
0,761 |
0,743 |
0,735 |
0,934 |
0,794 |
18 |
|
9 |
st |
|
2024 |
|
0,734 |
0,745 |
0,720 |
0,735 |
0,910 |
0,875 |
10 |
|
10 |
st |
|
2024 |
|
0,728 |
0,782 |
0,688 |
0,714 |
0,737 |
0,899 |
12 |
|
11 |
st |
|
2021 |
|
0,728 |
0,781 |
0,651 |
0,751 |
0,762 |
0,793 |
17 |
|
12 |
voyage |
|
2024 |
$$ |
0,728 |
0,781 |
0,690 |
0,712 |
0,783 |
0,888 |
10 |
|
13 |
st |
|
2020 |
|
0,709 |
0,792 |
0,644 |
0,689 |
0,749 |
0,749 |
15 |
|
14 |
st |
|
2021 |
|
0,697 |
0,768 |
0,614 |
0,709 |
0,752 |
0,796 |
12 |
|
15 |
st |
|
2024 |
|
0,677 |
0,726 |
0,643 |
0,662 |
0,849 |
0,831 |
13 |
|
16 |
flag |
|
2024 |
|
0,677 |
0,726 |
0,643 |
0,662 |
0,849 |
0,831 |
11 |
|
17 |
cohere |
|
2025 |
$$ |
0,472 |
0,637 |
0,372 |
0,408 |
0,572 |
0,695 |
17 |
|
18 |
openai |
|
2024 |
$$ |
0,342 |
0,544 |
0,216 |
0,267 |
0,666 |
0,774 |
8 |
|
19 |
st |
|
2021 |
|
0,165 |
0,129 |
0,106 |
0,260 |
0,460 |
0,837 |
10 |
Размерность эмбеддингов: 3072 (OpenAI), 1024 (e5-large, Jina, Cohere, Voyage, bge-m3), 768 (e5-base, LaBSE, armenian, mpnet, gte), 512 (distiluse), 384 (MiniLM). Влияет на размер индекса и скорость ANN-поиска.
Рис. 1. Модели, ранжированные по средней кроссязыковой косинусной близости (EN↔RU, EN↔HY, RU↔HY). Зелёная линия — порог 0,8.
Рис. 2. Разбивка по языковым парам. OpenAI проваливается на любой паре с армянским (EN↔HY = 0,216, RU↔HY = 0,267).
Retrieval: Recall@1 и MRR
Та же таблица, отсортированная по MRR — способности модели найти правильное соответствие среди 245 кандидатов:
|
# |
Бэкенд |
Модель |
Cross-lang |
R@1 |
MRR |
R@1 EN-RU |
R@1 EN-HY |
R@1 RU-HY |
|---|---|---|---|---|---|---|---|---|
|
1 |
st |
|
0,746 |
0,834 |
0,864 |
0,878 |
0,831 |
0,794 |
|
2 |
st |
|
0,863 |
0,802 |
0,837 |
0,869 |
0,778 |
0,759 |
|
3 |
st |
|
0,734 |
0,778 |
0,816 |
0,841 |
0,767 |
0,725 |
|
4 |
st |
|
0,677 |
0,766 |
0,806 |
0,845 |
0,749 |
0,704 |
|
5 |
flag |
|
0,677 |
0,766 |
0,806 |
0,845 |
0,749 |
0,704 |
|
6 |
st |
|
0,861 |
0,754 |
0,794 |
0,831 |
0,735 |
0,698 |
|
7 |
jina |
|
0,851 |
0,756 |
0,791 |
0,847 |
0,700 |
0,720 |
|
8 |
cohere |
|
0,749 |
0,731 |
0,782 |
0,859 |
0,665 |
0,669 |
|
9 |
st |
|
0,728 |
0,705 |
0,752 |
0,851 |
0,616 |
0,647 |
|
10 |
voyage |
|
0,728 |
0,684 |
0,730 |
0,849 |
0,582 |
0,622 |
|
11 |
st |
|
0,728 |
0,632 |
0,690 |
0,769 |
0,537 |
0,590 |
|
12 |
st |
|
0,709 |
0,629 |
0,688 |
0,804 |
0,547 |
0,537 |
|
13 |
st |
|
0,811 |
0,605 |
0,659 |
0,716 |
0,469 |
0,631 |
|
14 |
cohere |
|
0,472 |
0,556 |
0,607 |
0,880 |
0,373 |
0,414 |
|
15 |
st |
|
0,697 |
0,539 |
0,597 |
0,731 |
0,414 |
0,473 |
|
16 |
openai |
|
0,342 |
0,438 |
0,481 |
0,894 |
0,210 |
0,210 |
|
17 |
st |
|
0,782 |
0,159 |
0,211 |
0,239 |
0,088 |
0,151 |
|
18 |
st |
|
0,756 |
0,121 |
0,169 |
0,165 |
0,082 |
0,116 |
|
19 |
st |
|
0,165 |
0,031 |
0,063 |
0,049 |
0,026 |
0,018 |
Рис. 3. Recall@1 и MRR — способность модели найти правильное соответствие среди 245 кандидатов. LaBSE лидирует по обеим метрикам.
Рис. 4. Recall@1 по языковым парам. Монолингвальные e5-large/e5-large-v2 проваливаются на retrieval несмотря на высокий alignment.
Анализ
1. Alignment vs Discrimination: две разные истории
Рейтинг по alignment (cross-lang mean) и по retrieval (MRR) — не одно и то же. Самые показательные перестановки:
|
Модель |
Ранг по Cross-lang |
Ранг по MRR |
Δ |
|---|---|---|---|
|
|
#5 |
#17 |
+12 |
|
|
#6 |
#18 |
+12 |
|
|
#15 |
#4 |
-11 |
|
|
#4 |
#13 |
+9 |
|
|
#8 |
#1 |
-7 |
|
|
#9 |
#3 |
-6 |
Что происходит? Модели e5-large-v2 и e5-large — монолингвальные (английские). Они маппят армянский и русский текст в один плотный кластер: cosine высокий для всех пар (и правильных, и неправильных), но R@1 = 0,16 и 0,12 — модель “угадывает” правильный матч лишь в 12-16% случаев. Высокий alignment без discrimination — ловушка: метрика выглядит хорошо, а в production поиск не работает.
Аналогичный эффект проявляется у локального Jina v3: alignment 0,811 (#4), но R@1 = 0,605 (#13). API-версия того же чекпойнта показывает R@1 = 0,756 — разрыв может быть связан с различиями в runtime и precision между SentenceTransformers и Jina API.
LaBSE, наоборот, тренировался на параллельных корпусах с contrastive loss — именно на задачу различения. Его alignment умеренный (0,746), но R@1 = 0,834 — лучший результат в бенчмарке.
2. Мультиязычные e5 — лучший баланс alignment и retrieval
Два мультиязычных варианта e5 стабильно в топ-6 по обеим метрикам. e5-large — #1 по alignment (0,863) и #2 по MRR (0,837). e5-base (0,861 / 0,794) побеждает большинство моделей по обоим критериям при вдвое меньшем размере.
Почему мультиязычные e5 работают?
-
Тренировка на массивных параллельных корпусах (CCMatrix, WikiMatrix)
-
Хорошая субсловная репрезентация для нестандартных скриптов
Почему монолингвальные e5 проваливаются на retrieval? У e5-large и e5-large-v2 нет мультиязычных обучающих данных. Нелатинский текст маппится в узкую область пространства — cosine между любыми двумя армянскими текстами высокий, но неинформативный.
3. armenian-text-embeddings-1: fine-tuning улучшает retrieval, но ломает alignment
Metric-AI/armenian-text-embeddings-1 — это multilingual-e5-base, дообученный на ~250M токенов армянского текста (пары заголовок/тело с Reddit, переведённые на армянский через Gemma 2 27B). Это единственная пара “родитель-потомок” в бенчмарке, позволяющая напрямую измерить эффект fine-tuning.
|
Метрика |
|
|
Δ |
|---|---|---|---|
|
Cross-lang (alignment) |
0,861 |
0,734 |
-0,127 |
|
EN-RU alignment |
0,867 |
0,745 |
-0,122 |
|
EN-HY alignment |
0,851 |
0,720 |
-0,131 |
|
HY-HY |
0,958 |
0,910 |
-0,048 |
|
R@1 (retrieval) |
0,754 |
0,778 |
+0,024 |
|
MRR (retrieval) |
0,794 |
0,816 |
+0,022 |
|
Ранг по MRR |
#6 |
#3 |
+3 |
Fine-tuning на армянском улучшил retrieval (MRR: #6 -> #3), но обрушил alignment по всем парам. Показательно: EN-RU alignment упал с 0,867 до 0,745 — пара, не имеющая отношения к армянскому. Это классический catastrophic forgetting: дообучение на одном языке разрушает кроссязыковое выравнивание, выученное при мультиязычном предобучении.
4. Провал коммерческих API на армянском
Детальная разбивка для OpenAI:
-
EN-RU: 0,544 (alignment) / 0,894 (R@1) — дискриминация на EN-RU отличная
-
EN-HY: 0,216 / 0,210 — шум по обеим метрикам
-
RU-HY: 0,267 / 0,210 — шум по обеим метрикам
Примечательно: OpenAI набирает лучший в бенчмарке R@1 EN-RU (0,894), но проваливается на любой паре с армянским. Модель не обучалась на достаточном количестве армянского текста. Армянский алфавит — не латиница и не кириллица, токенизатор разбивает армянские слова на множество мелких фрагментов, теряя семантику.
Cohere v4 (2025) vs v3 (2023): 0,472 vs 0,749 (alignment), 0,556 vs 0,731 (R@1) — регрессия на нашей задаче по обеим метрикам. Обновление модели ухудшило поддержку малоресурсных языков.
5. Tokenizer fertility: почему коммерческие API проваливаются
Ключ к пониманию — в токенизаторе. Мы токенизировали 5 параллельных EPG-заголовков (EN/RU/HY) двумя токенизаторами и усреднили результаты.
Мультиязычные токенизаторы (SentencePiece в e5/bge-m3, WordPiece в LaBSE — оба с большим мультиязычным словарём):
-
Средний HY/EN ratio: ~2x — армянский лишь вдвое “дороже” английского
-
Средний RU/EN ratio: ~1.6x
-
Пример:
ֆ/ֆ Արարատի գաղտնիքը-> 6 токенов (▁ֆ,/,ֆ,▁Արարատի,▁գաղտնի,քը)
OpenAI cl100k_base (byte-level BPE, используется в text-embedding-3-large):
-
Средний HY/EN ratio: ~10x. Из 100 277 токенов словаря cl100k_base ни один не декодируется в UTF-8 строку с армянскими символами (U+0530-U+058F, лигатуры U+FB00-U+FB17). На нашей выборке армянский токенизируется строго побайтово (tok/byte = 1.00)
-
Средний RU/EN ratio: ~2.9x
-
Пример:
ֆ/ֆ Արարատի գաղտնիքը-> 37 токенов = 37 UTF-8 байт, каждый токен — 1 байт
Разница между токенизаторами — в 5 раз (2x vs 10x). Rust et al. (2021) показали, что сильная переразбивка на субтокены (высокая fertility / over-segmentation) ухудшает качество, и токенизатор по важности сопоставим с объёмом обучающих данных. Мультиязычные SentencePiece/WordPiece-модели обучены на больших мультиязычных корпусах и содержат армянские субслова в словаре. В cl100k_base (OpenAI) армянских мержей нет — текст разбивается побайтово (tok/byte = 1.00). Не все коммерческие API используют такой токенизатор: например, Jina v3 работает через XLM-RoBERTa и токенизирует армянский наравне с локальными моделями – что отражается на качестве: Jina v3 = 0,851, тогда как OpenAI text-embedding-3-large = 0,342 на той же метрике.
Побайтовая токенизация коррелирует с низким качеством эмбеддингов: модель получает в 10 раз больше токенов на тот же семантический вход, и каждый токен несёт минимум информации. Это не единственный фактор (объём армянского текста в обучающих данных тоже играет роль), но fertility объясняет, почему проблема системная, а не случайная.
И ещё один аспект: коммерческие API тарифицируют по токенам. Армянский текст обходится в ~10x дороже английского — вы платите больше за худшее качество.
6. Потребление памяти
Для продуктового деплоя важен не только с/текст, но и потребление RAM. В prod мы используем NVIDIA RTX 4000 Ada с 20GB VRAM.
|
Модель |
Параметры |
RAM (inference) |
|---|---|---|
|
|
278M |
~1.1 GB |
|
|
560M |
~2.2 GB |
|
|
568M |
~2.3 GB |
|
|
471M |
~1.9 GB |
Все перечисленные encoder-модели укладываются в 20 GB VRAM.
7. FlagEmbedding vs SentenceTransformers
Один и тот же чекпойнт BAAI/bge-m3 через разные бэкенды:
-
SentenceTransformers (fp32): 13 мс/текст
-
FlagEmbedding (fp16): 11 мс/текст (на 15% быстрее)
В нашем бенчмарке метрики качества совпали до округления (cross-lang 0,677, все подметрики идентичны). Часть ускорения объясняется fp16 — сравнение не строго изолирует runtime от precision. Тем не менее при сопоставимом качестве FlagEmbedding — практичный выбор для продакшна:
# SentenceTransformers (fp32): ~13 мс/текст
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-m3")
embeddings = model.encode(texts, normalize_embeddings=True)
# FlagEmbedding (fp16): ~11 мс/текст -- тот же checkpoint, другой runtime + fp16
import numpy as np
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
embeddings = model.encode(texts)["dense_vecs"]
embeddings = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True)
8. Jina v3: task-адаптер решает всё
Jina v3 использует task-специфичные LoRA-адаптеры — один и тот же чекпойнт jinaai/jina-embeddings-v3 даёт радикально разные результаты в зависимости от того, активирован ли адаптер.
В ранней версии бенчмарка API-бэкенд передавал task: "retrieval.passage", а локальный ST-бэкенд — нет. Результат: 0,851 vs 0,705 (разница 0,146). Это был артефакт конфигурации, не баг модели.
После исправления (добавление prompt_name="retrieval.passage" в model.encode()) оба бэкенда используют один и тот же адаптер. Alignment-скор вырос с 0,705 до 0,811 (разрыв сократился с 0,146 до 0,040). Остаточная разница может быть связана с precision (fp32 vs API) и различиями в tokenization.
# API -- task передаётся в JSON payload
payload = {"input": texts, "model": "jina-embeddings-v3", "task": "retrieval.passage"}
# Локальный ST -- prompt_name активирует тот же LoRA-адаптер
model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True)
embeddings = model.encode(texts, prompt_name="retrieval.passage")
Вывод: для моделей с task-адаптерами (Jina v3, и аналогичных) обязательно указывайте task/prompt_name — иначе вы тестируете базовую модель без адаптера и получаете заниженные результаты.
9. Стабильность ранжирования
Ранговая корреляция между 7 рукописными триплетами и полным набором из 245 — Spearman ρ = 0,80. Топ-2 (семейство multilingual-e5) стабильно, но в середине таблицы есть значимые перестановки: bge-m3 упал с 9-го на 16-е место, LaBSE — с 5-го на 8-е. 7 примеров достаточно для грубого скрининга, но не для окончательных выводов.
Тест устойчивости к сокращениям
Отдельный эксперимент: 783 пары “чистое название” vs “сокращение + название”:
"Тайна Арарата" --> embed_1
"к/ф Тайна Арарата" --> embed_2
score = cos(embed_1, embed_2)
Идеальная модель даёт 1.0 (сокращение не меняет вектор). Реальные результаты:
|
Модель |
Устойчивость |
|---|---|
|
|
0,969 |
|
|
0,948 |
|
|
0,944 |
|
|
0,940 |
|
|
0,920 |
|
|
0,911 |
|
… |
|
|
|
0,749 |
|
|
0,695 |
* Для монолингвальных моделей (e5-large, e5-large-v2) высокий балл — артефакт: они маппят весь нелатинский текст в один плотный кластер, поэтому cos(текст, префикс+текст) ~ 1.0 тривиально. Их R@1 = 0,12-0,16.
Рис. 5. Устойчивость к сокращениям (RU и HY). Cosine между “Название” и “к/ф Название” — идеал 1,0. Cohere v4 показывает худший результат (0,695).
Рекомендации
Для продакшна EN+RU+HY
|
Приоритет |
Модель |
Cross-lang |
MRR |
Обоснование |
|---|---|---|---|---|
|
Best retrieval |
|
0,746 |
0,864 |
#1 по R@1 и MRR, contrastive training |
|
Баланс |
|
0,863 |
0,837 |
#1 по alignment, #2 по MRR |
|
Компактный |
|
0,861 |
0,794 |
278M параметров, 768d |
|
API |
|
0,851 |
0,791 |
Без локального деплоя |
Чего избегать
-
e5-large-v2,e5-large— монолингвальные ловушки: alignment 0,78/0,76, но R@1 = 0,16/0,12. Маппят нелатинский текст в один кластер -
all-MiniLM-L6-v2— только для английского (R@1 = 0,03) -
OpenAI
text-embedding-3-large— отличный EN-RU R@1 (0,894), но армянский на уровне шума (R@1 EN-HY = 0,210) -
Cohere
embed-v4.0— регрессия vs v3 по обеим метрикам
Воспроизведство
pip install -r requirements.txt
python benchmark.py --api st --model intfloat/multilingual-e5-base
./run_benchmark.sh # Полный прогон
Всё открыто: код, данные, результаты. MIT.
Выводы
-
Alignment != Retrieval. Рейтинги по alignment и retrieval перетасовываются:
e5-large-v2— #5 по alignment, #17 по MRR;LaBSE— #8 по alignment, #1 по MRR. Всегда измеряйте обе стороны. -
Монолингвальные модели — ловушка.
e5-largeиe5-large-v2маппят нелатинский текст в один кластер: cosine высокий, но R@1 = 0,12-0,16. Красивая цифра alignment скрывает нулевую дискриминацию. -
Лучшие бесплатные превосходят платные — мультиязычные модели (LaBSE, multilingual-e5-large, armenian-text-embeddings-1, bge-m3) лидируют по retrieval. Jina API (MRR 0,791) конкурентоспособен. Флагманы OpenAI и Cohere v4 — в хвосте по армянским парам.
-
Новее не значит лучше. Cohere v4 хуже v3 на армянском по обеим метрикам. Обновлённые версии моделей могут регрессировать.
-
Малая выборка достаточна только для грубого скрининга — 7 триплетов дали ранговую корреляцию ρ = 0,80 с полным набором из 245. Для уверенности в середине таблицы нужен больший dataset.
-
Препроцессинг сокращений — низко висящий фрукт. Раскрытие
к/фв “художественный фильм” перед эмбеддингом должно улучшить все модели. -
Напишите статью о своём бенчмарке. При подготовке этого текста обнаружились пробелы в методологии: некорректное включение instruct-модели для симметричной задачи, расхождение API vs локальный запуск Jina из-за task-адаптера. Добавление R@1/MRR полностью перетасовало рейтинг и изменило рекомендации. Оформление результатов в статью — дешёвый способ peer review до публикации.
Бенчмарк, датасет и код: https://github.com/s1mb1o/epg-embedding-benchmark. Лицензия MIT.
Разработано при создании рекомендательной системы для IPTV/OTT-платформы с мультиязычным EPG.
Автор: s1mb1o
- Запись добавлена: 10.03.2026 в 07:15
- Оставлено в
Советуем прочесть:
- Супер видеоредактор Veo 3, ИИ ломает языковой барьер, бесплатный ИИ-кодер от Google и др. новости ИИ
- Рынок векторных баз под угрозой, Amazon встроил поиск по embedding-вектору прямо в S3
- OpenAI развернёт ChatGPT для вооружённых сил США
- Criteo стала первым ad-tech партнёром OpenAI
- Embedder для ИТ-крестьянина
- Fine tuning или RAG. Что выбрать?
- Суд отклонил ходатайство Илона Маска в отношении OpenAI
- Как мы построили embedding-модель уха на Vision Transformers: от идеи до 88% точности
- pg_auto_embeddings — считаем эмбеддинги для текста прямо в Postgres, без экстеншенов
- OpenAI открыла менторскую программу OpenAI Grove для предпринимателей в сфере ИИ


