Небольшой рассказ о том, как я начал делать инструмент для локального перевода текстов и файлов, с чего началось, и куда пришло.

Тема использования нейросетей в разных областях (в том числе и для перевода) часто обсуждалась на хабре - и я тоже решил поделиться своим велосипедом. В данный момент уже есть базовый функционал и некоторые планы на его расширение.

Код открыт, ссылка на репозиторий будет, ссылки на телеграм-канал не будет. В качестве компенсации за отсутствие ссылки на телеграм будут результаты небольшого исследования, какая LLM модель подходит лучше всего для перевода художественного текста с английского на русский - с замерами времени, качества переводов, а также с текстами полученных переводов.

Изображение на обложке - веб-интерфейс страницы перевода в созданном приложении.

С чего все началось

Знания английского у меня скорее базовые, их достаточно для чтения документации и простых текстов, но для более сложных текстов этих знаний уже не хватает. Читать художественную литературу я люблю, и иногда попадаются очень интересные произведения, которые или находятся в стадии выпуска, или завершены, но все еще переводятся (или перевода вообще не предвидится) - и сложно ждать, когда же будет перевод следующей главы. Понятно, что по большей части переводчики занимаются этим фактически на добровольных началах, но ожидание от этого легче не становится. Что же делать? Пытаться перевести самому.

Однажды мне попался инструмент OneRingTranslator от хабра-юзера @janvarev. Функциональность в нем была реализована через плагины, каждый - на свой инструмент перевода. Я попробовал использовать этот инструмент, но столкнулся с определенными трудностями. Сначала я думал написать обертку на Java, которая будет подготавливать текст для перевода, но это потребовало бы запуск сначала OneRingTranslator, потом Java-обертки и стало понятно, что это не лучшее решение.

Следующая идея - внести изменения в рамках самого проекта. Но изменений было так много, что показалось, как это часто бывает у разработчиков, что проще взять и написать все с нуля. Именно это я и решил попробовать сделать. Краткий список изменений, который я наметил - кэш на основе базы данных, разбиение большого текста на части по параметрам, замена некорректных (не обрабатываемых определенными моделями) символов, перевод файлов. При этом основной упор хотелось сделать на работу локально - чтобы не зависеть от других сервисов, да и доступ к API у известных мне - это платно, а оплатить сейчас что-то порой не так просто.

Моя основная специализация - Java, до этого и другие языки. Все это совпало с желанием немного изучить Python - а как мне кажется, лучше всего изучать язык, решая какую-то реальную задачу. Казалось, что доработок хоть и не мало, но они в целом простые, Python - язык тоже простой и все будет хорошо. Надо приступать.

Проблемы с переводом текстов

Предположим, что наша задача - перевести книгу. Или несколько глав из книги.

Наивный подход - взять текст и загнать в какую-нибудь модель, с запросом вида "ты переводчик, вот текст, переводи".

В итоге можем получить следующие проблемы.

Текст не влезет в контекст. У LLM моделей есть контекст, который имеет определенную длину. Не все модели поддерживают большой контекст, но даже если и поддерживают - большой контекст требует больше ресурсов, в частности видеопамяти.

Но контекст - все-таки решаемая проблема. Следующая проблема хуже. Модель пропускает какие-то куски текста. Причем не факт, что эти пропущенные куски сразу увидишь, значит не понятно, что же в итоге получишь после такого перевода. Некоторые из моделей, специально созданных для перевода (nllb-200, madlad-400), не могут перевести даже 3-4 предложения за раз - вероятность, что потеряется хотя бы одно предложение была очень высока - и даже не 50%, а ближе к 70%.

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

Некоторые модели не корректно обрабатывают определенные символы в тексте. Хотелось бы их заменить. Иногда авторы растягивают слова, и модели трудно понять о чем идет речь. Например, персонах тянет слово "Прииииивеееет", и модели могут запутаться с таким большим числом повторений букв в слове.

Решение - сделать замену символов, на которых модель спотыкается, сделать замену большого числа повторений идущих подряд букв внутри слова. Сделать все это настраиваемым.

Модель для перевода может не понимать, что какое-то слово нужно переводить не дословно, а определенным образом - например, можно почитать, как переводились названия факультетов и имена персонажей в Гарри Поттере.

Решение - дать возможность указать контекст, если модель это позволяет и надеяться, что модель сможет его использовать при переводе.

Если уже есть книга в epub или fb2 формате, хотелось бы скормить ее модели в виде файла и получить на выходе файл с переводом, который можно без лишних движений закинуть в читалку.

Решение - сделать обработку файлов, на вход - файл оригинала, на выход - файл перевода.

Собрав проблемы и решения, можно приступать к реализации.

Как происходит перевод внутри приложения

Здесь описаны скучные технические детали, как построен проект внутри, что происходит при переводе и почему оно именно так устроено.

Нужно обратить внимание, что все это приемлемо работать будет на ПК с видеокартой NVIDIA.

Сервис при старте запускает веб-сервер, который обеспечивает доступ к функционалу через REST API, или через Web-интерфейс http://127.0.0.1:4990.
Swagger с описанием методов доступен по адресу http://127.0.0.1:4990/docs.

Проект разбит внутри на две условных части. Переводчик текста и обработчик файлов. Перевод текста - это основной функционал. А обработка файлов - функционал, который в том или ином виде использует основной. Сначала была идея сделать переводчик файлов, но потом стало понятно, что файлы можно не только переводить.

А теперь поподробнее о каждой части.

Часть 1. Переводчик текста

Процесс перевода выглядит так.

  • Получаем GET или POST запрос через API или интерфейс.

  • Выполняем обработку текста запроса (удаление лишних пробелов, повторяющихся букв, замена слов в тексте, замена символов новой строки, нестандартных символов и прочее).

  • Разбиваем текст на части (по одному абзацу / по нескольким абзацам / по одному предложению / по нескольким предложениям).

  • Обрабатываем части. Сначала пытаемся понять - нужно ли вообще переводить эту часть. Например, текст "1... 2... 3!!!" перевода не требует, так как букв в нем нет - только знаки препинания и цифры.

  • Каждую часть ищем в кэше. В качестве кэша выступает Sqlite база данных. Поиск идет по ключу текст + язык оригинала + язык назначения + имя подели + хэш контекста.

  • Если в кэше пусто - то вызываем плагин для перевода. Плагинов несколько, они изолированы друг от друга, текст переводит только один из них. Ниже эти плагины будет подробнее описаны.

  • Выполняем обработку текста ответа (аналогично тексту запроса).

  • Собираем переводы из всех частей в единый текст, с сохранением разделений по параграфам, для этого у каждой части есть данные, чтобы разбиение было обратимым.

  • Выдаем ответ на GET или POST запрос.

Конечно, каждая часть полностью настраивается. Можно выключить обработку запросов или ответов, настроить, как и что будет заменяться, каким образом будет происходить разбиение и так далее.

Про разбивку на предложения. Казалось, что это простая вещь - разбивай по знакам препинания, и все будет хорошо. К сожалению, в реальности все сложнее. Например, предложение "Mr. John Johnson Jr. was born in the U.S.A but earned his Ph.D. in Israel before joining Nike Inc. as an engineer.". И для разбивки пришлось подключить пару специальных библиотек, которые делают это лучше. Сейчас есть поддержка разбиения через blingfire и pysbd - можно выбрать, какая лучше подойдет. Обе библиотеки считают предложение выше за одно предложение, но возможно в других случаях будут справляться не так хорошо.

Разбивка может происходить так:

  • По предложениям - сколько предложений, столько и частей.

  • По предложениям с ожидаемой длиной - предложения добавляются в часть до тех пор, пока не будет достигнут предел длины.

  • По параграфам - сколько параграфов, столько и частей.

  • По параграфам с ожидаемой длиной - параграфам добавляются в часть до тех пор, пока не будет достигнут предел длины.

Выглядит это не очень очевидно, поэтому рассмотрим на примере: включен параметр разбивать по параграфам с ожидаемой длиной и ограничение по длине = 500. Разбиваем текст, который состоит из параграфов следующей длины: 100, 700, 250, 50, 50, 400, 150, 200.

Текст будет разбит так:

  1. 100 (100 + следующий параграф 700 больше, чем ограничение 500)

  2. 700 (700 больше, чем ограничение в 500, но хотя бы один параграф в части должен быть обязательно - поэтому параметр и называется ожидаемая длина)

  3. 250, 50, 50 (200 + 50 + 50 = 300, меньше, чем ограничение в 500, но следующий параграф - 400, а 300 + 400 уже больше ограничения)

  4. 400 (меньше чем ограничение в 500, но следующий параграф - 150, 400 + 150 превысит ограничение)

  5. 150, 200 - (150 + 200 меньше, чем ограничение в 500)

Теперь про плагины для перевода. Сейчас присутствуют следующие плагины:

  • kobold_cpp - проект. Внешний инструмент для работы с моделями. Сервис выступает как прокси, подготавливает текст и отправляет запрос. Требуется запустить KoboldCpp, загрузить необходимую модель, настроить и открыть ее.

  • lm_studio - проект. Внешний инструмент для работы с моделями. Сервис выступает как прокси, подготавливает текст и отправляет запрос. Поддерживаются основные популярные модели - Qwen, gemma, mistral, gpt-oss и другие. Требуется запустить LM Studio, загрузить необходимую модель, настроить и открыть ее.

  • madlad_400_ctranslate2 - проект (A Multilingual And Document-Level Large Audited Dataset) от Google. Поддержка 400+ ��зыковых пар. Эта модель создана исключительно для перевода текста, поддерживаются только модели проекта madlad-400. Работа через CTranslate2.

  • nllb_200, проект (No Language Left Behind), от facebook**. Поддержка 200+ языковых пар. Эта модель создана исключительно для перевода текста, поддерживаются только модели проекта nllb-200.

  • nllb_200_ctranslate2 - проект, документация. Та же nllb-200, что описана выше, но работает через CTranslate2. Использует преобразованные для Ctranslate2 файлы моделей, которые меньше, соответственно, с меньшим использованием памяти, без потери качества.

  • no_translate - этот плагин не является переводчиком, поэтому не имеет параметров. Возвращает в ответе переданный в запросе текст без изменений. Его можно использовать для отладки при работе с параметрами и разработке функционала сервиса.

Как видно, плагины разбиты на две части (no_translate не считаем) - в случае с kobold_cpp и lm_studio необходимо установить сам инструмент, настроить, загрузить модели и запустить, а сервис только отправит запрос и обработает ответ. В остальных плагинах используются специализированные модели, созданные специально для перевода текста, а обработка происходит внутри сервиса. Эти модели поддерживают много языков, но именно в них я заметил больше всего проблем - ломаются на определенных символах и теряют предложения, если передать текст из двух предложений или более. Кроме того они не поддерживают контекст.

Часть 2. Обработчик файлов

Здесь мы обрабатываем поддерживаемые файлы из входящей директории и помещаем результат в директорию назначения.

Процесс обработки файлов выглядит так.

  • Из входящей директории получаем список файлов.

  • Каждый файл разбивается на имя и расширение.

  • По расширению идет поиск плагина для обработки этого файла. Если таких плагинов более одного - в настройках можно указать, какой тип файлов используется по умолчанию.

  • Плагин открывает файл, пытается определить и поправить кодировку при необходимости.

  • Разбивает текст по параграфам. Также на основе предыдущего текста формируется контекст.

  • Текст параграфа и контекст отправляются на перевод, в первую часть - переводчик текста. Обработка осуществляется в соответствии с параметрами переводчика текста.

  • Результат перевода добавляется после оригинального текста или заменяет собой оригинальный текст.

  • Опционально - исходный и/или переведенный текст заключаются в теги / спец символы, чтобы было легче визуально отличить перевод от оригинала.

  • Перевод происходит до тех пор, пока не закончится текст в файле, или не будет выполнено ограничение по главам или количеству обработанных параграфов.

Немного подробнее про эти пункты. Почему текст бьется на параграфы, а не на несколько параграфов сразу? Так как возможен и перевод с заменой оригинального текста, и с сохранением - проще, когда перевод находится ближе к оригиналу.

Зачем сохранять оригинальный текст? Это нужно в том случае, когда перевод выглядит не очень понятно, и можно сразу заглянуть в оригинал и попробовать понять, что пошло не так. Или в том случае, когда хочется попробовать прочитать текст на оригинале, заглядывая в перевод в том случае, если общее понимание фразы ускользает.

При переводе по параграфам возникает проблема потери контекста. Например, you можно перевести и вы и ты - смотря кто и кому это сказал. Также в предложениях на английском может потеряться род - сделал, сделала - глагол пишется одинаково,
и если рядом нет указание на лицо, выполняющее действие, то не понятно, какой род использовать. Чтобы как-то решить эту проблему, можно попробовать взять контекст - предыдущее содержимое текста, и отправить в модель для улучшения перевода. Это как правило помогает местоимениями вы/ты, иногда помогает с глаголами сделал/сделала. В настройках можно указать параметры контекста, размер, и тд.

Про последний пункт - ограничение перевода. Иногда бывают ситуации, когда нет необходимости переводить всю книгу целиком. Например, нужно посмотреть, как определенная модель справляется с переводом, или прочитать пару глав, чтобы понять, стоит ли вообще читать дальше, или уже не терпится начать читать, а ждать завершения всей книги еще несколько часов.

В таком случае можно перевести часть книги и начать читать. Если по прочтению будет решено продолжить перевод - при включенном кэше переведенные ранее части не будут переводиться повторно и перевод продолжится с точки остановки.

Поддержка форматов файлов реализована аналогично, в виде плагинов. Каждый плагин поддерживает определенны формат файлов. Поддерживается перевод txt, fb2, epub файлов.

Ранее было указано, что эта часть - не переводчик, а обработчик файлов. Это связано с тем, что в планах добавить перевод медиа файлов на основе субтитров - видео, аудио. И сначала из них нужно извлечь субтитры, а потом уже перевести.

Как все это запустить?

Здесь все сложно. Портабельной установки нет и пока нет представления, как ее сделать, с учетом требований наличия CUDA для некоторых плагинов.

Есть следующие варианты, по возрастанию сложности.

  • Через инструмент для запуска Python проектов. Например, Portablesource - про него недавно была статья на хабре, или Pinokio.

  • Через docker - docker-образ не опубликован публично, но в репозитории лежат файлы Dockerfile и compose.yaml для сборки и запуска образа.

  • Установить все необходимые внешние зависимости, установить через venv или еще что-то все необходимые пакеты и запустить как python-проект.

Выбор лучшей модели для перевода с английского на русский

Примечание. Речь идет именно об указанном в заголовке направлении перевода и о художественной литературе. Если нужно перевести с русского на английский, или с японского на русский, или перевести научный/медицинский/юридический текст - результаты могут сильно отличаться.

Развернутые результаты в этой таблице - ссылка на таблицу. В ней за основу взят проект https://hpmor.com / https://hpmor.ru, несколько абзацев из первой главы разбиты на 3 части, каждая часть переводилась независимо от других. Приводить текст таблицы полностью не представляется реальным или необходимым, но ниже будет сводка.

Описание столбцов в файле.

Первый столбец - оригинал на английском, второй - работа команды переводчиков, референс для метрики COMET, дальше идут столбцы с онлайн-сервисами, и затем - результат работы описываемого приложения, на разных плагинах и моделях.

В тексте жирным шрифтом выделены странности перевода, такие как:

  • Перепутан род: Она была ведьмой, - повторила Петуния. "Я видел это".

  • Пропуски предложений: "Папа! (в оригинале "Dad! Mum!") - это как раз описываемая выше проблема. Тут разбивка на предложение не произошла, так как 2 предложения были в кавычках - и часть при переводе потерялась.

  • Неправильный перевод: или же какой-то центавр ей запретил (речь про кентавров);

  • Странный перевод: Она указала на себя самой.; адресованный мистеру Х. Поттеру зелёной чернилой. и так далее.

Под каждым столбцом указаны время, затраченное на перевод (не указано для онлайн-сервисов, только для моделей приложения)для каждой части отдельно и суммарное, оценка качества перевода по COMET, и память, необходимая для загрузки.

Время указано ориентировочно, если памяти хватало - загружалось на 4090 если нет - то на 4090 + 3090, поэтому расчеты больше для общего понимания. Если модель поддерживала размышления - это выключалось. Контекст не использовался. Текст был разбит по параграфам с ожидаемой длиной 1000 символов, кроме специализированных моделей madlad-400, nllb-200, там разбивка была по предложениям.

Методика расчета времени. Запускается модель. Отправлялся "инит" запрос (текст init), после получения ответа считаем, что модель готова к тесту. Затем 3 раза запускался перевод фрагмента, с замерами времени, в качестве результата - бралось среднее. Затем среднее время суммировалось и получалось итоговое время.

На втором листе эта таблица скопирована, перевернута, и удален текст - вот эту сводку уже можно добавить в статью и обсудить результаты.

Модель

Общее время

COMET (avg)

Память (GB)

Оригинал hpmor.com

source

Перевод hpmor.ru

reference

Google translate

88,72

Яндекс переводчик

89,13

deepl translate

89,29

Deepseek online

89,26

madlad400-10b-mt-bfloat16 ctranslate2

10,6

86,8

madlad400-10b-mt-int8 ctranslate2

19,1

86,95

facebook/nllb-200-3.3B **

36,6

82,12

13

nllb-200-3.3B-ct2-float16

19,9

82,12

7

ruadaptqwen2.5-32b-instruct@q4_0

36,4

87,28

21

ruadaptqwen2.5-32b-instruct@q6_k

55

86,84

28

saiga_nemo_12b@Q8_0

15,7

89,51

13

saiga_gemma3_12b_gguf@q_8

31

89,2

14

qwen/qwen3-30b-a3b@k_4_m

14,3

86,7

20

saiga_yandexgpt_8b_gguf

15,7

89,57

9

mistral-small-3.2-24b-instruct-2506@Q6_K

44,5

87,1

21

gemma-2-27b-it-abliterated@Q8_0

65

88,33

30

gemma-3-27b-it-abliterated@Q5_K_M

44,9

88,71

24

t-pro-it-1.0-i1@Q_6_k

77,5

88,11

27

google/gemma-3-12b@Q_8

25,9

87.11

13

vikhr-yandexgpt-5-lite-8b-it_gguf

15,2

87,79

9

В таблице выделены 3 сервиса и 3 модели (так совпало что их число равно), показатель качества перевода которых более 89.

Как видно, победителем по всем показателям стала модель на основе yandex, saiga_yandexgpt_8b_gguf. Немного неожиданный для меня самого результат, учитывая малое число параметров модели, но привожу те данные, что получил. Лучшее качество перевода - 89,57, малое время ответа (для LLM, а не специфичных моделей-переводчиков) - 15,7 секунды, минимальное количество памяти для запуска модели с максимальным качеством - 9 гигабайт. Версия в квантовании Q6, чуть хуже, чем Q8, должна полностью поместиться даже на карту с 8 GB памяти. Близко к ней держатся saiga_nemo_12b@Q8_0 и saiga_gemma3_12b_gguf@q_8.

Из онлайн-сервисов нужно отметить Яндекс переводчик, deepl translate, Deepseek online - все они получили более 89.

Расчет по COMET я сделал позже, когда был завершен перевод со всеми моделями в таблице. Сначала я брал текст, переводил его, искал неточности в переводе, и проставлял время. По ощущениям переводы моделей-победителей мне понравились. Но ощущения это одно, а рассчитанная метрика - уже другое. В данном случае метрика совпала с ощущениями.

Когда видишь, что все 3 модели - "сайга", дообученные варианты моделей, возникают мысли, а не попал ли текст в датасет обучения? Я не смог этого найти в представленных датасетах на карточке модели - первый, второй.

Оригинальная модель yandexgpt-5-lite-8b-instruct с тем же самым запросом вообще отказалась выдавать перевод. Специально добавил оригинальную gemma-3-12b@Q_8 и другую дообученную модель на основе яндекса vikhr-yandexgpt-5-lite-8b-it_gguf - результат был не очень. Можно только добавить, что другие переводы с использованием saiga_yandexgpt_8b_gguf мне показались достаточно хорошими.

Как видно выше, специализированные модели для перевода nllb-200, madlad-400 показали не очень хороший результат, при этом выше было отмечено, что у них много проблем с пропуском текста, с обработкой определенных символов. Наверно, единственный плюс - малое время обработки. И может возникнуть вопрос, а зачем тогда вообще их добавлять?

Они представляются полезными для перевода с редких языков. Небольшие модели, которые можно развернуть локально про часть из 200 языков (тем более 400) и не знают, что такие есть. Скорее всего, качество там будет плохим, но иногда хоть какой-то перевод лучше, чем никакого.

Заключение

Осталось подвести итоги и описать некоторые моменты, которые не попали в текст выше.

Состояние приложения на текущий момент

Проект в стадии разработки - что-то добавляется, что-то переосмысливается и изменяется - поэтому какие-то функции могут работать не так, как ожидалось. Но надеюсь, что со временем все придет в норму.

Чтобы обрабатывать хотя бы простые ошибки в логике на сборку были добавлены юнит-тесты, до интеграционных не добрался.

Цель "немного изучить Python и сделать работающее приложение" в целом выполнена.

В данный момент поддерживается перевод "просто текста", примерно как в Google Translate перевод книг в формате fb2, epub, текстовых файлов в формате txt. Все это сдобрено большим количество параметров, которые должны улучшать качество перевода.

Ссылка на проект

Репозиторий проекта - https://github.com/illian64/llm-translate

Более подробно плагины и их настройки описаны в этом же репозитории по ссылке https://github.com/illian64/llm-translate/tree/master/doc/ru

Какие-то части из этой документации были использованы в статье.

Перевода документации на английский пока что нет и даже не понятно, когда будет. Писать документацию я не люблю (прикрываюсь тем, что в целом разработчики не любят ее писать), с трудом собрался и написал ее хотя бы на русском.

Как использовались нейросети при написании проекта и статьи

Использовался Deepseek для генерации некоторых regexp выражений.

При написании кода, документации, текста этой статьи - не использовались.

Кажется, что писать код с нейросетью кажется плохой идеей, если в основе стоит желание освоить новый для тебя язык программирования.

Дальнейшие планы

Основные планы на данный момент - добавить плагин распознавание текста из медиа-файлов в субтитры и плагин для перевода получившихся субтитров.

Есть планы сделать параллельный перевод текста на двух и более видеокартах, если они есть в системе, для ускорения перевода.

Возможно, у кого-то есть идеи, как повысить качество перевода или что-то улучшить - пишите в комментариях.

Meta Platforms*, а также принадлежащие ей социальные сети Facebook** и Instagram**:

*признана экстремистской организацией, её деятельность в России запрещена

**запрещены в России

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


  1. NeriaLab
    28.09.2025 14:22

    Хорошее приложение, не буду говорить о его плюсах и минусах. У меня есть только один вопрос: Как оно справится с маленькой такой задачей: "Тебя я люблю" на английский и обратно?


    1. illian Автор
      28.09.2025 14:22

      В зависимости от используемой модели. Скорее всего, каждая по своему истолкует.

      Приложение само по себе не переводит, а только подгатавливает текст для перевода. А переводят модели, которые создали и обучили компании и возможно дообучили другие люди.

      На модели saiga_yandexgpt: Тебя я люблю. -> I love you. -> Я люблю тебя.


      1. NeriaLab
        28.09.2025 14:22

        Как Вы понимаете - это неверный перевод, потеря смысла и эмоций


        1. AlexChIt
          28.09.2025 14:22

          Смысл остался, а эмоции по такому предложению определить нельзя.

          1) Можно выделить слово "Тебя": тебя люблю, а не других.

          2) Можно выделить слово "люблю": тебя люблю, а других - ненавижу.

          3) Можно выделить слово "я": тебя люблю я, а не они.

          4) А, может, это предложение сгенерировано компьютером и вообще никаких эмоций не несёт.


        1. x4x7
          28.09.2025 14:22

          Вообще-то не очень понятно. А какой перевод правильный?


    1. badsynt
      28.09.2025 14:22

      Йода, гранд-мастер ордена джедаев нас посетил?


  1. badsynt
    28.09.2025 14:22

    Неправильный перевод: или же какой-то центавр ей запретил (речь про кентавров);

    А альфа Центавра Вас не смущает?


  1. Newm
    28.09.2025 14:22

    У нейросеток не было желания спросить, как правильно организовывать перевод? Я месяц назад спросил... Сразу оговорюсь, мне надо было переводить самиздат, поэтому я изначально не требовал ТОЧНОГО перевода. Я запрашивал читабельный литературный перевод. И по качеству во многих случаях он был лучше оригинала.

    Наиболее эффективно - это подавать на перевод столько, сколько они соглашаются отдать. Для дипсика (я переводил на нем, пока токены по ночам дешевые были) это 8К токенов, то есть на сам перевод я подавал до 10кб текста. Для контекста перед этим подается предыдущая часть до 30-50К токенов. Так решаются проблемы с определением полов героев, единства имен и предметов (хотя и не на 100%, но существенно лучше, чем по предложениям).

    Дальше делался второй проход - редактура. С точно такой же подачей уже переведенного текста. И требованием доперевести непереведенные слова.

    Дальше нейросетки предлагали сделать третий проход для оформления форматирования, но меня жаба задушила.

    И вот после этого у меня получался текст, на котором требовалось сделать примерно по 1-4 правки на странице. То есть при большой лени можно читать даже то что получилось без правок (ну, оно конечно примерно раз на 500 кб текста заворачивало что-нибудь на китайском, это меня точно напрягало и я переводил руками на русский).

    При попытках автоматически переводить по предложениям конечно скорее всего будут отсутствовать непереведенные слова, но, насколько я понимаю, читать такое нормальному человеку с удовольствием невозможно. Там спотыкаешься при чтении на каждом втором предложении.