Почему перевести документ — значит заполнить форму, а не перевести PDF
Отдайте таможенную декларацию универсальному переводчику — получите стену корректных предложений. Отдайте тот же файл инспектору, который обязан его проверить, — получите отказ, потому что графа 4 перестала быть графой 4. Официальный документ не текст, который вдобавок свёрстан: это бланк, где смысл значения зависит от того, в какой графе оно стоит, и который читают, построчно сверяя с оригиналом.
Этот текст — о разнице между «перевести документ» и «заполнить бланк»: как устроен перевод по шаблонам, сколько он стоит, где ломается и — эту часть обычно пропускают — какие два отказа вылезают только после нескольких месяцев эксплуатации.
Бланк — это не проза, которую сверстали
Прочитайте свидетельство о рождении как текст — получите последовательность подписей и значений: фамилия, имя, дата рождения, орган ЗАГС, серия и номер. Прочитайте как бланк — получите кое-что строже: у каждого значения ровно одно допустимое место, часть из них юридически значима, а серия и номер — то, что вообще делает бумагу документом, а не рассказом о нём.
Перевод как прозы сохраняет слова. Он не сохраняет места. Отказ здесь не в том, что на выходе неверно, — отказ в том, что выход больше нельзя сверить с оригиналом, а для заверенного перевода в этом и состоит вся суть.
Есть и вторая, тихая проблема. У скана нечего сохранять. Сфотографированная страница паспорта — это пиксели. Переносить структуру неоткуда: в файле её нет, она есть только в глазах человека, который на него смотрит. Любой подход, построенный на «сохраним исходное форматирование», здесь остаётся без предмета.
Три исхода, и решает их то, что вы загрузили
На практике у пайплайна перевода документов три возможных финала, и выбор происходит до всякого перевода:
| Что на входе | Что на выходе |
|---|---|
| Скан или image-PDF, совпавший с известным бланком | Заполняется собственная форма шаблона, поле за полем |
| Всё, что является или становится DOCX, без совпавшего бланка | Перевод пишется прямо в XML исходного файла, вёрстка выживает |
Всё остальное — .txt, .csv, .xlsx, .json, .po | Простой текстовый файл |
Две вещи из этой таблицы стоит проговорить вслух — обе понимают неправильно.
«Нет шаблона» не значит «нет форматирования». DOCX без совпавшего бланка возвращается как DOCX с целой вёрсткой. Шаблон добавляет не выживание вёрстки, а извлечение по полям и форму, сделанную под конкретный тип документа. Именно это заставляет работать сканы, а для сканов больше ничего и не работает.
Шаблоны — для сканов. В нашем пайплайне заполнение шаблона включается, только если документ image-PDF. PDF с настоящим текстовым слоем или DOCX уходят по пути замены на месте, даже когда шаблон подошёл бы, — потому что замена на месте строго лучше, когда есть во что заменять.
Из чего на самом деле состоит шаблон
Шаблон — это три вещи, и их стоит различать, потому что ломаются они по-разному.
DOCX-бланк с плейсхолдерами. Документ на языке перевода, свёрстанный как оригинал, где вместо фамилии стоит {{surname}}. Заполнение механическое.
Схема полей. Список значений, какие у этого типа документа бывают, их типы и обязательность. Именно против неё оценивается извлечение: объявленное и не доставленное поле становится видимым пробелом, а не молчаливым.
Промпт извлечения. Инструкция, превращающая изображение страницы в эти поля.
Мы поставляем 16 таких форм на три языковые пары: одиннадцать ru→en (свидетельства ЗАГС, паспорт, четыре выписки ЕГРН, выписка ЕГРЮЛ), четыре ko→ru (экспортная декларация, сертификат происхождения, инвойс, упаковочный лист) и одна китайская экспортная таможенная декларация.
Механическая часть механичнее, чем звучит, и менее приятна, чем хотелось бы. Плейсхолдеры живут внутри объединённых ячеек таблиц, в колонтитулах и — из-за того, как текстовые процессоры хранят текст, — один {{exporter_address}} регулярно оказывается разрезан на три отдельных фрагмента внутри файла. Всё, что такие бланки заполняет, обязано сначала собрать плейсхолдер обратно, а всё, что их правит, — собрать и положить так же.
Сколько это стоит на живом документе
Один полный прогон, замеренный от начала до конца на китайской экспортной таможенной декларации в перевод на русский:
| Извлечено полей | 45 |
| Переводимых сегментов | 44 |
| На выходе | Заполненная DOCX-форма, 557 слов |
| Стоимость | $0,0244 |
| Время | 256 секунд |
| Чисел сохранено | 26 из 28 |
Последняя строка — единственная, которая по-настоящему важна, и её обычно не публикуют. Таможенная декларация состоит из чисел: коды ТН ВЭД, количества, вес, суммы, регистрационный код компании. Двадцать шесть из двадцати восьми исходных чисел появились в выводе без изменений. Из двух оставшихся одно — намеренно переформатированная дата (20260702 → 02.07.2026), а второе — настоящая потеря: второй код компании в графе, под который в бланке не было места.
Вот это второе и есть честный урок всего подхода. Извлечение значение нашло. Форме было некуда его положить. Шаблон способен доставить только то, подо что у него есть графа, а отсутствующая графа снаружи выглядит ровно как отсутствующее значение.
Выбор бланка — отдельная задача
Когда форм шестнадцать, что-то должно решать, какая из них подходит документу. Решение дешевле и глупее, чем принято думать: взвешенный подсчёт ключевых слов, порог на каждую форму и список исключений. Ни одного обращения к модели. Работает за миллисекунды и почти всегда попадает.
Почти.
Недавно мы прогнали через собственный матчер выписку из реестра индивидуальных предпринимателей — шесть страниц, русский — и он уверенно выбрал шаблон паспорта: 0,367 при пороге 0,3. Паспорта в документе нет. Нет слова «паспорт», нет строки органа, выдавшего документ, — нет ни одного слова, по которому паспорт опознаётся.
Дотащили его туда два обстоятельства: выписка цитирует документ, удостоверяющий личность предпринимателя, под заголовком со словами «гражданина Российской Федерации». Две общие фразы, встретившись по три раза, перевесили форму, у которой не совпал ни один отличительный ключ.
Сиюминутное лечение — исключение, мы его и выкатили. Настоящий урок структурный: взвешенная сумма способна взять порог, не совпав ни по одному опознающему признаку. Если строите такое — считайте наличие отличительных терминов, а не только общий счёт.
Отказ, о котором не предупреждают
А вот этого мы не ждали, и ради него написан весь раздел.
Шаблон делают так: берут один настоящий перевод, уже выполненный человеком, и заменяют в нём значения плейсхолдерами. Это самый быстрый способ, и формы получаются хорошие. У него есть ловушка: любое значение, которое автор заменить забыл, остаётся в шаблоне — и дальше утверждается о каждом документе, который эта форма когда-либо отрендерит.
Мы прогнали все шестнадцать своих форм именно на это. Пятнадцать оказались чисты. Одна нет — нотариальное согласие на выезд несовершеннолетнего, которое печатало:
place of birth: Vladivostok— обоим родителям и сопровождающему;- пол, закреплённый за позицией, а не прочитанный из документа;
- и в блоке печати — имя нотариуса с его ИНН, при том что рабочие плейсхолдеры нотариуса стояли неиспользованными двумя абзацами ниже.
Каждое согласие, выпущенное этой формой, утверждало это — о том, о ком документ был на самом деле. И ничего не выглядело сломанным. Бланк, печатающий правдоподобный город, выглядит в точности как бланк, который этот город прочитал, — потому такой дефект и переживает ревью.
Если вы работаете с шаблонами, проверку стоит автоматизировать: разложить каждую форму в текст, вычеркнуть плейсхолдеры и посмотреть, какой конкретики осталось. Большая часть найденного окажется законной типографикой бланка — «ПАСПОРТ ГРАЖДАНИНА РОССИЙСКОЙ ФЕДЕРАЦИИ» на паспортной форме на месте. Остальное — чьё-то место рождения.
Когда шаблон — неподходящий инструмент
Шаблоны узкие намеренно, и честное позиционирование состоит именно в этой узости:
- Они покрывают те типы документов, под которые есть форма. Шестнадцать форм — это шестнадцать форм. Документ вне набора уходит на путь замены на месте, сохраняет вёрстку и не получает извлечения по полям.
- Документ должен действительно быть этим типом. См. раздел про матчер: уверенный неверный ответ хуже, чем никакого, поэтому «шаблон не подошёл» обязано быть допустимым исходом, а не сбоем.
- Они не восстанавливают вёрстку. Заставить модель заново собрать структуру документа, чью вёрстку не смогла вытащить конверсия, — другая задача, и мы не заявляем, что её решили.
Для договора, отчёта или письма правильный ответ — замена внутри DOCX, и шаблон там ничего не добавит. Для скана таможенной декларации это единственный ответ, дающий то, что принимающая сторона сможет проверить.
Главное
- Официальный документ — это бланк, и смысл в нём позиционный. Перевод как прозы сохраняет слова и теряет проверяемость, ради которой заверенный перевод и существует.
- Шаблоны нужны для сканов. Когда у файла есть настоящая вёрстка, замена текста на месте сохранит её лучше любой формы. Шаблоны отрабатывают там, где сохранять нечего.
- Шаблон доставит только то, подо что есть графа. Объявляйте поля и плейсхолдеры вместе и проверяйте, что каждому извлечённому значению есть куда лечь.
- Выбор формы заслуживает того же внимания, что и извлечение. Взвешенный счёт способен выбрать форму, не совпав ни по одному отличительному признаку; это надо измерять, а не предполагать.
- Проверяйте формы на оставшиеся в них значения. Шаблон, снятый с настоящего документа, наследует его факты, пока кто-нибудь не посмотрит, — а со стороны вывода дефект не виден.
FAQ
Что такое перевод документов по шаблонам?
Это перевод типового документа через извлечение значений его полей, перевод этих значений и заполнение специально сделанной формы на языке перевода — вместо перевода документа сплошным текстом. Применяется к документам с фиксированной и юридически значимой вёрсткой: свидетельствам, декларациям, выпискам из реестров.
Теряется ли форматирование DOCX, если шаблон не подошёл?
Нет. DOCX без совпавшего шаблона переводится на месте, внутри собственного XML файла, поэтому вёрстка сохраняется. Шаблон добавляет извлечение по полям и форму под конкретный тип документа — а это важнее всего для сканов, где сохранять в файле просто нечего.
Почему не дать ИИ пересобрать вёрстку?
Потому что «пересобрать вёрстку» и «сохранить вёрстку» — разные задачи с разными отказами. Сохранение работает, когда структура в файле есть. Пересборка нужна, когда конверсия структуру не вытащила, и это открытая задача, а не выпущенная функция; к обещаниям обратного стоит относиться настороженно.
Как понять, что шаблон выбран правильно?
Измерять на настоящих документах, включая те, на которых вы ждёте провала. Наш матчер уверенно отправил выписку из реестра предпринимателей на паспортную форму, не совпав ни по одному её опознающему ключу, — дефект был виден только после прогона корпуса и чтения результата.
Сколько чисел переживает перевод документа?
На нашем замеренном прогоне китайской таможенной декларации 26 из 28 исходных чисел вышли без изменений, ещё одно — намеренно переформатированная дата. Единственная настоящая потеря — значение, под которое в форме не было поля. Числовая целостность измерима, и требовать стоит именно её: оценки точности на прозе ничего не говорят о том, выжил ли код ТН ВЭД.
Заключение
Различие между «перевести документ» и «заполнить бланк» звучит как деталь реализации, а решает, годен ли результат. Перевод прозы оптимизируется под чтение; перевод документов обязан оптимизироваться под сверку, потому что кто-то положит две версии рядом и сравнит графу с графой.
Поэтому и интересная инженерия здесь не в шаге перевода. Она в выборе правильной формы, в том, чтобы каждому извлечённому значению нашлось место, и в том, чтобы сам бланк не утверждал тихо факты о постороннем человеке.
Если вы переводите свидетельства, декларации или выписки и хотите увидеть, что даёт извлечение по полям на ваших собственных документах, попробуйте KTTC — на выходе будет заполненный бланк, который можно проверить построчно, а другой и не нужен.
