dimhold.by
← Артыкулы

На сярэдзіне апгрэйда палова маёй калекцыі набрала 0

2 бампы версіі ляжалі ў мяне ў нататках месяцамі, па радку на кожны: bge-base-en на bge-base-en-v1.5 і e5-base на e5-base-v2. Нататка bge абяцае, што пошук стаў лепшы. e5 выкладвае v2 наогул без нататкі, проста з лікам вышэй у табліцы ацэнак. Абодва выглядаюць як апгрэйд, які бяруць не думаючы, як бяруць чарговы патч бібліятэкі.

Адзінае пытанне, якое я сабе задаў, было пра тое, колькі гадзін пойдзе на паўторнае кадаванне калекцыі. Гэта тая частка, за якую прыходзіць рахунак. Што бамп робіць з адказамі, я не мераў ні разу. Я зыходзіў з таго, што версія ўнутры аднаго сямейства гэта невялікі крок, а старыя вектары і новыя ляжаць прыблізна там жа. У выніку я прагнаў 4 пары, 2 сямействы ў 2 памерах. Гэта заняло 5 гадзін працэсара супраць 1.5 на адну пару.

Стэнд

SciFact з BEIR: 5183 дакументы і 300 тэставых запытаў з 339 радкамі разметкі. Дакладны косінус па нармаваных вектарах, ніякага прыблізнага індэкса, так што ні адзін лік ніжэй не прыходзіць ад перабудовы графа. Python 3.12.3, torch 2.14.0 на працэсары, sentence-transformers 6.0.1, numpy 2.5.3, 4 ядры, GPU няма. Адно кадаванне калекцыі займае ад 15 хвілін на малых мадэлях да 85 хвілін на базавай. На машыне была і іншая праца, так што гэтыя хвіліны варта чытаць як парадак велічыні. Уваход абрэзаны на 512 токенах, e5 атрымлівае свае прэфіксы query: і passage: , bge атрымлівае інструкцыю да запыту са сваёй карткі.

Перш чым нечаму верыць, я зверыў стэнд з апублікаванымі ацэнкамі MTEB на тым жа датасеце. 4 мадэлі з 8 трапляюць у апублікаваны лік да 4 знака: e5-base на 0.7308, e5-base-v2 на 0.7194, bge-small-en-v1.5 на 0.7127, e5-small на 0.6560. Яшчэ 3 разыходзяцца ў чацвёртым знаку. Асобна стаіць bge-base-en-v1.5: у мяне выходзіць 0.7404, роўна тое, што называе картка мадэлі BAAI, а рэпазітар вынікаў MTEB называе 0.7435.

Выдача пераставілася, ацэнка не

300 запытаў, што бамп версіі робіць з першай 10 са старой 10 засталося на месцы месцаў nDCG@10 да пасля bge-base-en 1 -> 1.5 7.81 0.732 0.740 e5-base 1 -> 2 5.76 0.731 0.719 bge-small-en 1 -> 1.5 7.85 0.700 0.713 e5-small 1 -> 2 4.43 0.656 0.688
4 пары версій мадэляў на тых жа 5183 дакументах і 300 запытах. Слупок гэта колькі са старой першай 10 бамп пакінуў на месцы, 2 лікі побач гэта nDCG@10 да і пасля. bge base 1 -> 1.5 захоўвае 7.81 месцы і дадае 0.0081, e5 small 1 -> 2 захоўвае 4.43 і дадае 0.0315, e5 base 1 -> 2 захоўвае 5.76 і набірае на 0.0114 менш за версію, якую замяняе.

bge-base-en-v1.5 захоўвае 7.81 са старой першай дзясяткі і 85.3% першых месцаў. nDCG@10 ідзе з 0.7323 да 0.7404, recall@10 з 0.8712 да 0.8742. У 240 запытаў з 300 nDCG дакладна той жа, што быў, у 37 лепшы, у 23 горшы. Значыць на 2.19 месца з 10 стаў іншы дакумент, а ацэнка якасці варухнулася ў трэцім знаку.

e5-small-v2 гэта гучны выпадак. Ён захоўвае 4.43 з 10 і 59% першых месцаў. У аднаго запыту ранейшы пераможца апыняецца на месцы 1423. nDCG пры гэтым усё роўна расце, з 0.6560 да 0.6875. e5-base-v2 мяняе 4.24 месца з 10 і набірае менш за версію, якую замяняе: 0.7194 супраць 0.7308. Роўна тое ж кажа MTEB.

Перастаноўка садзіцца туды, дзе ранейшы парадак трымаўся на манетцы. У bge-base-en у запытаў, якія захавалі свайго пераможцу, адрыў ад другога месца быў 0.0221 у сярэднім, а ў тых, хто пераможцу страціў, 0.0033. Гэты зазор ідзе ў адзін бок ва ўсіх 4 парах. Чаго перавароты каштуюць, пытанне асобнае, а кропак у мяне ўсяго 4: у 3 з іх запыты, якія страцілі пераможцу, усё роўна выйшлі ў плюс, тыя 44 запыты bge пайшлі з 0.3959 да 0.4135. Базавая пара e5 гэта выключэнне: 80 запытаў страцілі пераможцу і ўпалі з 0.5020 да 0.4451.

2 спосабы зламацца

два спосабы зламацца, па слупку на кожны той жа дакумент у двух версіях 0 1 першая дзясятка вышэй за 0.8 да пасля bge-base-en 1 -> 1.5 0.892 97.5% 1.8% e5-base 1 -> 2 0.606 82.1% 75.6% bge-small-en 1 -> 1.5 0.914 99.9% 8.3% e5-small 1 -> 2 -0.007 98.5% 98.6%
Тыя ж 4 пары, 2 рэчы, якія могуць зламацца. Злева тое, куды дзве версіі кладуць той жа дакумент: 0.892 у базавай пары bge супраць -0.007 у малой e5. Справа тое, колькі з першай 10 праходзіць фіксаванае адсячэнне 0.8. Пара bge геаметрыю захоўвае і адводзіць долю вышэй адсячэння з 97.5% на 1.8%. У малой пары e5 гэтая доля трымаецца на 98.6% супраць 98.5%, а геаметрыі ў яе ўжо не засталося.

Бамп bge захоўвае геаметрыю. Той жа дакумент у дзвюх версіях стаіць сам да сябе на косінусе 0.892. Новы запыт па старым індэксе дае nDCG 0.7261 супраць 0.7323 натыўных, значыць састарэлы індэкс усё яшчэ адказвае. З’ехала шкала. Адсячэнне cos > 0.8 гэта якраз той лік, які асядае ў канфігу. Праз яго праходзіць 97.5% ацэнак першай дзясяткі да бампа супраць 1.8% пасля. 2 выпадковыя дакументы калекцыі стаялі на 0.82 у старой версіі і стаяць на 0.58 у новай. bge-small-en робіць тое ж самае яшчэ мацней, з 99.9% да 8.3%.

Пра гэтую частку было аб’яўлена, а я не прачытаў. У нататцы да выпуску v1.5 сказана, што мадэлі змякчаюць праблему размеркавання падобнасці. Гэта роўна той самы лік. Я прачытаў у тым жа сказе словы пра тое, што пошук стаў лепшы, на гэтым і спыніўся.

e5 small ламаецца наадварот. Доля, якая праходзіць праз гэтае адсячэнне, амаль не рухаецца: 98.5% супраць 98.6%. А той жа дакумент у дзвюх яго версіях стаіць на косінусе -0.007. Пошук па старым індэксе з новым запытам дае 0.0021 там, дзе старая мадэль па сваім індэксе дае 0.6560. Я даволі доўга шукаў памылку знака ва ўласным кодзе, перш чым прыняў гэты лік. Базавая пара e5 стаіць пасярэдзіне: той жа дакумент на 0.6061, доля вышэй адсячэння з 82.1% да 75.6%.

Адзін лік тут заслугоўвае папярэджання, бо менавіта на яго звычайна глядзіць дашборд. На бампе e5 small сярэдняя падобнасць першага траплення роўная, 0.8682 да і 0.8724 пасля. Па ёй нельга даведацца, што прастора з’ехала пад табой. У сапраўды зламаным стане яна не маўчыць: сярэдняе першае трапленне 0.0573, вышэй 0.8 аказваецца 0% першай дзясяткі.

Стан пасярэдзіне

палова калекцыі перээмбеджана, палова не запыты, чый размечаны дакумент у перээмбеджанай палове запыты, чый дакумент застаўся ў старой nDCG@10 bge-base-en 1 -> 1.5 0.8011 0.4868 e5-base 1 -> 2 0.7670 0.0000 bge-small-en 1 -> 1.5 0.7261 0.5799 e5-small 1 -> 2 0.7153 0.0000
Індэкс, у якім кожны другі дакумент закадаваны нанова, прачытаны па тым, у якой палове ляжыць размечаны дакумент. У 143 запытаў уся разметка ў перээмбеджанай палове, у 148 у некранутай, у 9 у абедзвюх, таму яны на дыяграму не трапілі. На гатовым індэксе тыя ж 2 групы ў базавай пары bge разыходзяцца на 0.0136, значыць разрыў тут робіць змешаны індэкс.

Стан, па якім ніхто не публікуе лікаў, гэта сама міграцыя. Гадзінамі ці днямі палова калекцыі нясе новыя вектары, а палова яшчэ старыя. Я сабраў такі індэкс напрамую: кожны другі дакумент закадаваны нанова, астатнія не кранутыя, запыты ад новай мадэлі. Сапраўдны бэкфіл ідзе мноствам, якое расце, таму тут форма задачы, а не яе расклад.

У bge-base-en-v1.5 палавінны індэкс набірае 0.6408, ніжэй за абодва чыстыя канцы. Пераэмбеджаная палова забірае 83.7% усіх месцаў першай дзясяткі супраць 48.9% на гатовым індэксе. Запыты, чый размечаны дакумент паспелі пераэмбеджыць, набіраюць 0.8011, значыць больш, чым на гатовым індэксе. Запыты, чый дакумент яшчэ чакаў, набіраюць 0.4868. На поўным індэксе тыя ж 2 групы набіраюць 0.7335 і 0.7471. Значыць падзел робіць змешаны індэкс. У 9 запытаў з 300 разметка ляжыць у абедзвюх паловах, таму яны не трапілі ні ў адну групу.

Абедзве пары e5 даводзяць гэта да канца. 100% месцаў ідзе пераэмбеджанай палове. Запыты, чый дакумент яшчэ чакае, набіраюць 0.0000, значыць 0 рэлевантных дакументаў на 1480 месцаў, якія дастаюцца гэтым 148 запытам. Чаму выйграе пераэмбеджаная палова, я магу растлумачыць толькі для аднаго сямейства. У e5-base дзве паловы стаяць на розных шкалах: сярэдні косінус 0.7289 да новага боку супраць 0.4391 да старога, а ў e5-small разрыў яшчэ большы, 0.7774 супраць -0.0146. У bge-base-en сярэднія ідуць у адваротны бок, 0.4623 супраць 0.4861, значыць месцы там забірае не сярэдняе. Што менавіта, я не ведаю.

Паварот замест перабудовы

Пра гэта ёсць артыкул, Drift-Adapter (arXiv:2509.23471). Ён падганяе невялікае адлюстраванне з новай прасторы ў старую і заяўляе 95-99% ад recall поўнай перабудовы. На гэтых даных артаганальнае адлюстраванне Пракруста, падагнанае на 4000 пар дакументаў, дае nDCG 0.7317 для базавай пары bge супраць 0.7323 натыўных, 0.7177 супраць 0.7308 для базавай e5 і 0.5606 супраць 0.6560 для малой e5. Апошняе гэта 85% шляху назад паміж дзвюма прасторамі, у якіх сярэдні косінус на тым жа дакуменце роўны 0.

Я чытаў гэта як правал, пакуль не заўважыў, што адказваю на іншае пытанне. Артыкул лічыць Recall@10 супраць поўнай перабудовы. На гэтай метрыцы даныя даюць 100.2% для базавай bge, 99.2% для базавай e5, 97.8% для малой bge і 86.1% для малой e5. 3 пары з маіх 4 трапляюць у заяўленую паласу. Горш іх выглядаць прымушала мая ўласная рамка.

Мае 4000 пар гэта і не тая невялікая выбарка, пра якую кажа артыкул. Гэта 4000 з 5183 дакументаў таго самага індэкса, па якім потым ідзе пошук. І 214 з 283 размечаных дакументаў ляжаць сярод іх. Таму я падагнаў тое ж адлюстраванне з bge-small-en на яе ж саму, дзе правільны адказ гэта адзінкавая матрыца. На 200 парах яно губляе 0.036, 0.6635 супраць 0.6995, а на 4000 не губляе нічога. Гэта забівае адгаворку, якой мне хацелася: на тым памеры выбаркі, што я ўзяў, зазор вышэй гэта дрэйф, а не цана таннай падгонкі.

Чаго я не правяраў

Прыблізнага індэкса не было, так што ліку пра тое, што дадае зверху граф HNSW, у мяне няма. Адна калекцыя, адна галіна, толькі англійская. Скачка паміж вендарамі, пра які напісана большая частка разбораў, няма нідзе. Мадэлі bge v1.5 я прагнаў з інструкцыяй да запыту, хаця іх картка называе яе неабавязковай.

Што змянілася ў мяне: версія кадавальніка цяпер ляжыць у тым жа файле, што і любы парог адсячэння, а часткова закадаваны індэкс у выдачу не ідзе. Пераключаць абедзве паловы разам і так было планам па іншых прычынах. Лік для альтэрнатывы цяпер ёсць: 0.6408 супраць 0.7404.