Тринадцать способов превратить деловой документ в набор чисел, аккуратная таблица с победителем — и три проверки, которые последовательно её обнулили. История о том, как измерение оказалось интереснее результата.
4695 документов · 11 тем · 13 вариантов векторизации · эталон размечен людьми, а не моделью

Три последовательные проверки готового вывода — карта того, что будет ниже. Каждая обнуляет предыдущий рейтинг.
Задача в одну строку
В крупную компанию ежедневно приходят десятки тысяч документов: счета, акты, накладные, договоры, проектная документация. Их нужно разложить по темам — чтобы каждый попал в своё подразделение, а не в общую кучу на ручной разбор.
Современный способ такой. Каждый документ превращается в вектор — список из нескольких сотен чисел, устроенный так, что близкие по смыслу документы получают близкие числа. Дальше работает геометрия: у каждой темы считается «центр», а новый документ относится к ближайшему. Вопрос эксперимента: какой именно моделью строить эти векторы? Кандидатов набралось тринадцать — от трёхмиллиардной нейросети до символьного приёма, придуманного задолго до нейросетей.
Сначала — честная линейка
Чтобы сравнивать модели, нужен эталон: набор документов, про которые заранее известна правильная тема. И здесь эксперимент можно испортить так, что этого не заметишь.
Соблазнительный путь — взять разметку, которую уже сделала одна из моделей. Тогда сравнение оказывается замкнутым на себя: модель, породившая разметку, получает «домашнее преимущество», и никакая аккуратность в подсчётах этого не лечит. Ровно эта ошибка была допущена в первой версии эксперимента, и тот отчёт впоследствии сняли целиком.
Правильный эталон нашёлся в самой компании. Каждый документ когда-то был направлен в конкретное подразделение — живым человеком, по смыслу содержимого. Эта маршрутизация и стала разметкой: 4695 документов, 11 тем, ни одна модель к ней не причастна.
После прогона всех тринадцати вариантов получилась ровная таблица. Наверху giga_480m и qwen3e_4b с одинаковыми 76,8 %, дальше с небольшим отставанием остальные. Можно было писать вывод и расходиться.
Проверка первая. Четверть выборки оказалась оригиналами
Деловой документооборот устроен монотонно: один контрагент, один шаблон, ежемесячный счёт — меняются только номер и дата. Группировка документов по тексту (без участия эмбеддингов, чтобы не подыгрывать никому) показала: из 4695 документов независимых лишь 1162 — 25 %.
Это меняет смысл проверки. Стандартный протокол убирает из центра темы сам оцениваемый документ — но если у него есть близнец, тема по-прежнему находится по близнецу. Модель не обобщает, а узнаёт копию.
Пересчёт с исключением всей группы близнецов сдвинул все числа вниз на 6–16 процентных пунктов. Честный диапазон оказался не 55–77 %, а 45–70 %. И, что важнее, поехал верх таблицы: qwen3e_4b, деливший первое место, опустился на четвёртое — он выигрывал от повторов больше остальных.
Отдельный сюрприз достался символьному варианту. На документах, у которых есть близнецы, он даёт 67,8 %, а на действительно новых — 50,7 %. Разрыв в 17 пунктов: это не понимание смысла, это сопоставление шаблонов. У нейросетевых моделей такого провала нет.
Проверка вторая. Правило оказалось важнее модели
Всё это время документ относился к ближайшему центру темы. Но темы устроены неоднородно: 11 тем распадаются на 95 плотных подгрупп — акты, альбомы чертежей и задания на экспертизу лежат в одной теме, а выглядят по-разному. Один центр на такую тему — заведомо плохое правило.
Следующий заход использовал те же самые векторы, без всякого дообучения моделей, и менял только правило: вместо ближайшего центра — простая обучаемая надстройка поверх готовых чисел.

Одни и те же векторы, два разных правила отнесения. Каждая линия — один вариант векторизации. Лидер по старому правилу (красная линия) оказывается седьмым; аутсайдер, работающий вообще без нейросети, поднимается на четвёртое место.
Смена правила добавила каждой модели от 7 до 34 процентных пунктов — это больше, чем вся разница между самими моделями. Порядок перетасовался полностью: giga_480m, уверенный лидер, опустился на седьмое место, а наверх вышли символьные варианты, которым не нужна видеокарта. Первая пятёрка при этом статистически неразличима.
Больше всех выиграли те, кто раньше был в хвосте. Значит, их низкие места отражали не отсутствие информации в векторах, а неудобство этих векторов для конкретного правила сравнения. Полтора месяца измерялось не столько качество моделей, сколько их совместимость с одним частным способом применения.
Проверка третья. Популярная метрика не измеряла ничего
Качество кластеризации принято оценивать индексом ARI. Он добросовестно считался — до тех пор, пока не встал вопрос о его устойчивости. Оказалось, что разброс одной модели от случайной инициализации алгоритма сопоставим с разбросом между всеми моделями. Рейтинг по ARI был рейтингом случайных чисел.
Заодно выяснилось, что автоматическая группировка «с нуля» на этих данных не восстанавливает темы ни для одного варианта: вместо 11 тем алгоритм находит 45–72 мелкие группы. Темы задаются центрами, а не обнаруживаются сами.
Вторая задача: не тема, а тип
Параллельно шла проверка на другом наборе и другой задаче. Тема отвечает на вопрос «о чём документ и кому его отдать», тип — на вопрос «что это за документ»: договор, письмо, акт сверки, доверенность, ТОРГ-12. Набор — 2279 документов, 17 типов, разложенных по папкам.
Здесь же нашёлся естественный конкурент. Ту же задачу можно поставить прямо: отправить текст в большую языковую модель и попросить назвать тип — вхолодную, то есть без единого размеченного примера, только список допустимых типов в инструкции. Для сравнения так и сделали, двумя облачными моделями.
Способ |
Точность |
macro-F1 |
|---|---|---|
|
89,4 % |
0,784 |
|
89,2 % |
0,809 |
|
87,5 % |
0,777 |
|
81,0 % |
0,695 |
|
76,7 % |
0,584 |
|
74,8 % |
0,590 |
Определение типа документа, 2279 документов, 17 типов. Приведены три лучших варианта из тринадцати, обе облачные модели и локальная поменьше — все три языковые модели спрашивали вхолодную. Десять векторных вариантов из тринадцати точнее даже лучшей из них.
Десять способов из тринадцати оказались точнее прямого запроса к языковой модели. Разница в стоимости при этом — на порядки: отнесение к ближайшему центру это одно умножение матриц, запрос к 27-миллиардной сети — совсем другая статья расходов.
Оговорка к таблице выше. Языковые модели спрашивали вхолодную
Векторные способы строят центры типов по размеченным документам — то есть правильные ответы они видели. Языковой модели не дали ни одного примера: системная подсказка со списком типов, текст документа, назови код. Это сравнение метода, подготовленного к задаче, с методом, которого попросили угадать.
Честный поединок потребовал бы дать модели те же размеченные примеры — несколько штук прямо в подсказке или полноценное дообучение. Такой замер напрашивался — и был проведён отдельно, ниже.
Поэтому корректная формулировка звучит скромнее заголовочной: на узкой задаче с фиксированным списком классов дешёвый специализированный вектор обыгрывает дорогую универсальную модель, которую к этой задаче не готовили. Вывод про стоимость от оговорки не меняется — меняется вывод про интеллект. Статья про нечестные сравнения, содержащая нечестное сравнение, была бы неловкой.
И здесь символьный вариант ведёт себя противоположно тому, как он вёл себя на темах. На темах он проваливался на новых документах (50,7 %), потому что опознавал шаблоны, а не смысл. На типах он держится — 81,4 % на документах без близнецов, — потому что тип документа и есть шаблон. Счёт остаётся счётом у любого контрагента. Слабость на одной задаче оказалась ровно тем же свойством, что сила на другой.
Что показало дообучение
Оговорку проверили замером, и проверку поставили с оглядкой на всё, что уже выяснилось по ходу. Локальную модель Qwen3.5-4B дообучили теми же метками (LoRA, одна эпоха, полчаса на видеокарте) и сравнили «до и после». Проверочную выборку отделили от обучающей по группам близнецов — все копии одного шаблона на одной стороне, чтобы модель не проверялась на том, что уже видела. А перед этим набор почистили. Ансамбль из тех же тринадцати векторов прошёлся по всем папкам и указал 91 документ, где не меньше девяти способов из тринадцати относят его к чужому типу. Что с каждым делать, решал второй, независимый сигнал: если тот же чужой тип подтверждали ключевые слова в имени файла или отдельный запрос к языковой модели — документ переставляли в этот тип (48 из 91), иначе выкидывали (43). Папка «заявок на подключение» потеряла две трети содержимого — там лежали акты сверки и счета.
Замер |
На независимых |
Общая |
|---|---|---|
|
66,9 % |
73,7 % |
|
93,7 % |
88,1 % |
Определение типа документа, 17 типов, ≈360 отложенных документов на разбиение, три разбиения. «На независимых» — только документы без близнецов; это и есть колонка, сравнимая с векторными способами. «Вхолодную» — тот же протокол, что в таблице выше: список типов и текст, без единого примера.
На независимых документах дообучение добавило 27 пунктов — с 67 до 94 %. Вхолодную независимые документы даются даже хуже общей выборки: это редкие, непохожие ни на что экземпляры, а массовые шаблоны модель правильно зовёт и без обучения. Чтобы сравнить прибавку с векторами честно, их точность пересчитали на тех же вычищенных метках: giga_480m — 92 %, qwen3e_4b — 88 %, дешёвый символьный вариант — 86 %. Дообученная модель впереди лучшего вектора примерно на два пункта, дешёвого — на семь. Открытый вопрос «дообучение или вектор» получает ответ: небольшой, но реальный перевес у дообучения.
К этим числам две оговорки. Первый, наивный заход давал 90 % — на случайном сплите, где половина близнецов ежемесячного счёта попадала и в обучение, и в тест; групповой сплит эту прибавку убирает. А чистка опиралась на согласие тех же тринадцати моделей — то есть слегка подстроила эталон под то, в чём модели уверены. Подъём от неё достался всем: векторам она добавила один-два пункта, и перевес дообучения — сверх этого общего сдвига. Сорок восемь меток из двух с лишним тысяч теперь проставлены моделью, а не отправителем — та же зависимость от разметки, с которой началась вся история, только в малой дозе и под двумя сигналами.
Одно место чистка расшатала: после переноса десятка документов между «дополнительным соглашением» и «приложением к договору» модель стала путать эту пару чаще — узнавание приложений упало с 96 до 70 %. Граница там размытая по существу, и передвигать её по консенсусу моделей — значит переносить туда же и их общее заблуждение.

Доля верно опознанных документов каждого типа. Серая точка — вхолодную, бирюзовая — после дообучения; красная перемычка — где стало хуже. Дообучение вытягивает редкие непохожие типы (письмо, реестр, акт приёма-передачи) и расшатывает пару, куда чистка перенесла спорные документы. Строки без сдвига — типы, которые модель опознавала верно и без обучения.
Модели нашли ошибки в разметке
Побочный результат оказался полезнее ожидаемого. У 55 документов из 2279 не меньше одиннадцати вариантов из тринадцати единогласно назвали тип, отличный от того, что был проставлен в метаданных оператора ЭДО. Именно по этому типу документы и раскладывались по папкам при сборке набора.
Проверка показала, что правы были модели. Хуже всего дело обстояло в папке заявок на подключение: 23 документа из 39 — больше половины — оказались актами сверки, счетами, письмами и договорами. Именно у этого типа была самая низкая точность распознавания. Модели не ошибались на сложном классе — они спотыкались о загрязнённую папку.
Откуда взялась грязь, объясняется способом сборки набора. Документы выгружались из системы электронного документооборота по заявленному типу: вот столько договоров, вот столько актов, вот столько доверенностей. Вручную ничего не перепроверялось, и на то была причина, казавшаяся убедительной: в справочнике оператора ЭДО договор и дополнительное соглашение — разные типы, отдельные позиции. Раз контрагент прислал документ с пометкой «договор», значит это договор.
Оказалось, что полагаться на эту пометку нельзя. У входящего документа тип проставляет отправитель — контрагент, у которого свой документооборот, свои привычки и никакого интереса к чужой аккуратности. Он выбирает ближайший подходящий пункт из списка: проект договора уезжает в «дополнительные соглашения», а заявка на подключение превращается в свалку для всего, что не подошло к другим типам.
Получилось, что эталоном служила не разметка, а добросовестность сотен посторонних организаций. И это третий раз за проект, когда виноватым оказался эталон, а не модели: сначала разметка, сделанная одной из сравниваемых моделей; потом близнецы, превратившие обобщение в узнавание копий; теперь чужие метки, принятые на веру. Модели всё это время работали лучше, чем показывали измерения.
Что всё-таки устояло
После трёх проверок осталось немного — но это немногое проверено всерьёз. Вот все тринадцать вариантов и то, чего они на самом деле стоят.
Вариант |
Разм. |
Темы, по центру |
Тип |
|---|---|---|---|
giga_480m |
1024 |
70,1 % |
89,2 % |
nomic_v2 |
768 |
68,1 % |
87,5 % |
qwen3e_06b |
1024 |
67,7 % |
85,6 % |
qwen3e_4b |
2560 |
67,1 % |
89,4 % |
e5_large |
1024 |
65,6 % |
87,1 % |
char_tfidf_svd_512 |
512 |
65,2 % |
87,5 % |
bge_m3 |
1024 |
64,0 % |
87,1 % |
giga_3b |
2048 |
58,4 % |
85,0 % |
rubert_base_dp |
768 |
53,0 % |
78,5 % |
sbert_ru |
1024 |
47,3 % |
80,6 % |
rubert_tiny2 |
312 |
46,2 % |
76,9 % |
char_raw_4096 |
4096 |
45,5 % |
86,2 % |
nomic_v15 |
768 |
45,0 % |
81,8 % |
Все тринадцать вариантов, отсортированы по темам. «Темы, по центру» — честная точность отнесения к ближайшему центру после исключения близнецов (сценарий без размеченных примеров). «Тип» — точность на втором наборе, 2279 документов. Оба столбца — сырой вектор, без обучаемого правила и без дообучения; перестановку при смене правила показывает слоуп-график выше.
70,1 % — лучшая честная точность на темах, после исключения близнецов
89,4 % — лучший из тринадцати вариантов на определении типа документа
93,7 % — дообученная модель на непохожих документах, после чистки эталона
Наверху таблицы — giga_480m, и с заметным отрывом: 70,1 % против 68,1 % у следующей, тогда как весь хвост укладывается в три пункта. При этом она самая компактная из серьёзных моделей — 480 миллионов параметров против трёх-четырёх миллиардов у соседей. На определении типа она разошлась с лучшим на 0,2 пункта. Оговорки к этому первенству всё те же: оно держится только на сценарии без размеченных примеров — смена правила отнесения (вторая проверка) сбрасывает giga_480m на седьмое место, как и всех. Вывод узкий: на такой задаче размер модели качество не предсказывает.
Если размеченных примеров нет — а при запуске их нет — работает только отнесение по центру темы, и там
giga_480mпервая.Если примеры есть — сначала стоит менять правило, а не модель. Выигрыш больше, а стоит это дешевле: линейный дискриминант считается мгновенно и забирает почти всю прибавку. Полноценное дообучение целой модели на тех же метках обгоняет лучший вектор на пару пунктов — реальный, но небольшой перевес ценой обучения всей сети.
Размер вектора ничего не решает. При искусственном сведении всех вариантов к одной длине в 256 чисел порядок сохранился, а лидеры потеряли один-два пункта. Двухтысячемерный вектор не лучше тысячемерного просто потому, что он длиннее.
Цена точности
Остаётся вопрос, ради которого всё затевалось: сколько ручного труда это снимает. У самого дешёвого варианта — отнесения по ближайшему центру темы — ответ пока скромный. Если требовать, чтобы автоприсвоение было верным в 95 случаях из 100, уверенно раскладывается лишь 6–14 % потока, остальное уходит на проверку человеку.
Но это потолок самого дешёвого механизма, а не задачи. Обучаемое правило поверх тех же векторов дало на темах +7…+34 пункта, а на определении типа дообученная модель вышла на 94 % даже на самых непохожих документах. Порогового расчёта для этих способов пока не делали, но там, где точность на десятки пунктов выше, и доля уверенных присвоений будет заметно больше. Путь к реальной разгрузке людей есть — он не в дешёвом пороговом присвоении, а в обучении на своих данных. Ровно к этому вели вторая проверка и раздел про дообучение.
Что забрать с собой
Эталон, размеченный вашей же моделью, — не эталон. Происхождение разметки стоит проверить прежде, чем сравнивать что-либо.
Дубликаты считаются до, а не после. Четверть независимых документов означает, что эффективная выборка вчетверо меньше заявленной, а все проценты завышены. То же и при дообучении: если близнецы одного шаблона окажутся и в обучении, и в проверке, точность «после» будет завышена — здесь это стоило нескольких пунктов.
Метрику надо проверять на устойчивость. Достаточно прогнать её несколько раз со сменой случайного зерна. Если разброс одной модели сравним с разбросом между моделями — метрика ничего не ранжирует.
Правило применения может весить больше выбора модели. Прежде чем перебирать нейросети, стоит убедиться, что из уже имеющихся векторов выжато всё.
Метаданные, пришедшие извне, — это чужое мнение, а не факт. Тип, категория, код — всё, что проставил отправитель, годится как подсказка и не годится как эталон. Особенно если проставлявший не несёт никаких последствий за ошибку.
Систематическое несогласие моделей с разметкой — сигнал о разметке. Если тринадцать разных способов единогласно спорят с папкой, скорее всего ошибается папка. Ансамбль дешёвых моделей — рабочий инструмент поиска ошибок в данных, даже когда его не для этого строили.
Ни одна из этих проверок не была запланирована. Каждая появилась из вопроса «а точно ли?», заданного к уже готовому, оформленному и почти отправленному выводу. Такие вопросы стоят дёшево и почти всегда окупаются — правда, ценой переписывания отчёта.
Материал основан на внутреннем сравнительном эксперименте: 13 вариантов векторизации, эталон из 4695 документов с разметкой по фактической маршрутизации между подразделениями, отдельный набор из 2279 документов и 17 типов для второй задачи. Числа приведены после исключения дубликатов там, где это оговорено.
Автор и компания, где проводился эксперимент, не связаны ни со Сбером, ни с ai-sage, ни с другими разработчиками сравнивавшихся моделей. giga_480m и её дата релиза названы потому, что это публичные факты про публично выложенную модель; будь на первом месте любая другая, в тексте стояло бы её имя.