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

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

qwen3e_4b

89,4 %

0,784

giga_480m

89,2 %

0,809

char_tfidf (без GPU)

87,5 %

0,777

praxis-large — облачная LLM

81,0 %

0,695

Qwen3.6-27B — облачная LLM

76,7 %

0,584

Qwen3.5-4B — локальная LLM

74,8 %

0,590

Определение типа документа, 2279 документов, 17 типов. Приведены три лучших варианта из тринадцати, обе облачные модели и локальная поменьше — все три языковые модели спрашивали вхолодную. Десять векторных вариантов из тринадцати точнее даже лучшей из них.

Десять способов из тринадцати оказались точнее прямого запроса к языковой модели. Разница в стоимости при этом — на порядки: отнесение к ближайшему центру это одно умножение матриц, запрос к 27-миллиардной сети — совсем другая статья расходов.

Оговорка к таблице выше. Языковые модели спрашивали вхолодную

Векторные способы строят центры типов по размеченным документам — то есть правильные ответы они видели. Языковой модели не дали ни одного примера: системная подсказка со списком типов, текст документа, назови код. Это сравнение метода, подготовленного к задаче, с методом, которого попросили угадать.

Честный поединок потребовал бы дать модели те же размеченные примеры — несколько штук прямо в подсказке или полноценное дообучение. Такой замер напрашивался — и был проведён отдельно, ниже.

Поэтому корректная формулировка звучит скромнее заголовочной: на узкой задаче с фиксированным списком классов дешёвый специализированный вектор обыгрывает дорогую универсальную модель, которую к этой задаче не готовили. Вывод про стоимость от оговорки не меняется — меняется вывод про интеллект. Статья про нечестные сравнения, содержащая нечестное сравнение, была бы неловкой.

И здесь символьный вариант ведёт себя противоположно тому, как он вёл себя на темах. На темах он проваливался на новых документах (50,7 %), потому что опознавал шаблоны, а не смысл. На типах он держится — 81,4 % на документах без близнецов, — потому что тип документа и есть шаблон. Счёт остаётся счётом у любого контрагента. Слабость на одной задаче оказалась ровно тем же свойством, что сила на другой.

Что показало дообучение

Оговорку проверили замером, и проверку поставили с оглядкой на всё, что уже выяснилось по ходу. Локальную модель Qwen3.5-4B дообучили теми же метками (LoRA, одна эпоха, полчаса на видеокарте) и сравнили «до и после». Проверочную выборку отделили от обучающей по группам близнецов — все копии одного шаблона на одной стороне, чтобы модель не проверялась на том, что уже видела. А перед этим набор почистили. Ансамбль из тех же тринадцати векторов прошёлся по всем папкам и указал 91 документ, где не меньше девяти способов из тринадцати относят его к чужому типу. Что с каждым делать, решал второй, независимый сигнал: если тот же чужой тип подтверждали ключевые слова в имени файла или отдельный запрос к языковой модели — документ переставляли в этот тип (48 из 91), иначе выкидывали (43). Папка «заявок на подключение» потеряла две трети содержимого — там лежали акты сверки и счета.

Замер

На независимых

Общая

Qwen3.5-4B — вхолодную

66,9 %

73,7 %

Qwen3.5-4B + дообучение

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 и её дата релиза названы потому, что это публичные факты про публично выложенную модель; будь на первом месте любая другая, в тексте стояло бы её имя.

Комментарии (0)