- BrainTools - https://www.braintools.ru -
В прошлой статье [1] я рассказывал, как за несколько месяцев в одиночку запилил сервис генерации статей, и как он в итоге оказался комплексной платформой по работе с контентом.
За эти месяцы в процессе разработки постоянно всплывали проблемы. Что-то было связано косяками с моей стороны, а что-то — с особенностями работы LLM.
Об одной из таких проблем, достаточно абсурдной и при этом с трудом поддающейся решению, я расскажу отдельно.
Еще на ранних этапах разработки я запустил конвейер по написанию (точнее, рерайтингу) новостей.
Для понимания — кратко о том, как работает новостной пайплайн:
поиск новостей по определенному запросу — в данном случае из англоязычных источников (в силу тематики),
парсинг текста выбранных новостей из первоисточника,
глубокий рерайтинг с переводом на русский язык,
финальная редактура, расстановка ссылок, парсинг картинок, и т.д. вплоть до постинга на сайт.
Сначала все это более-менее работало — тексты, хоть и требовали небольшой редактуры, выходили нормальными.
Но буквально в один день эти тексты как будто стала писать Зоя Вексельштейн [2]:
То есть, в итоговом тексте были рандомно разбросаны непереведенные слова. Не только сложные технические термины, но и достаточно простые слова. В пайплайне генерации статей эта проблема тоже встречалась.
Поиск показал, что проблему Not-Translated Words в машинном переводе пытались решить уже давно. Вот материал [3] от 1998 года — правда, там авторы 45% таких случаев списывали на недостаточный лексикон систем перевода:
Учитывая объемы данных, на которых обучаются LLM, здесь дело было явно не в отсутствии слова в словаре.
Когда проблема только появилась, я списал ее на недостаточно проработанный системный промпт. Поэтому и решение на первом этапе искал внутри этого промпта.
К слову говоря, процентов 20 всего времени в процессе разработки я тратил именно на промпты. Я себе запилил систему версионирования промптов + A/B тесты, где после обновления промпта прогонял его по бенчмарку 10-20 раз для более значимой статистической выборки. И, если промпт давал желаемый результат без регрессии, принимал его.
Само собой все принципы промпт-инжиниринга также использовал. Роль, задача, контекст и т.д. Для ризонинг моделей — дополнительные примочки.
Результат = не вышло. И пришлось задуматься о смене модели или создании дополнительного слоя «переводчика». Но ни того ни другого по очевидным причинам не хотелось.
Раз внутри промпта проблема не решалась, значит проблема была в самой LLM. Поэтому следующим шагом я сменил модель, которая отвечала за написание. Сменил Gemini 2.5 flash на DeepSeek (какой там был актуальным осенью прошлого года). Обе модели +/- были в одном ценовом диапазоне.
После этого в тексте, наравне с инглишем, появились иероглифы. При том, что первоисточники всегда были англоязычными, и китайского текста в них точно не было:
В общем, характерной чертой Дипсика оказались иероглифы — либо из-за артефактов обучения [4] на китайских датасетах, либо из-за того, что DeepSeek R1 «думал» на китайском [5], даже если запрос был на другом языке.
На самом деле, он думал [6] на китайском и английском, и в текстах проявлялись оба языка.
В конечном итоге мне не подошли обе модели — выбор был между иероглифами и «fabric» c «details». Ставить написание новостей на поток с такими вводными было нельзя.
Третьей попыткой я решил добавить дополнительный слой, так как других альтернатив я не видел. Брать более дорогие модели не хотел, а все остальные, что были в том же ценовом диапазоне не справлялись с базовыми задачами. Дело было даже не в иероглифах.
Задачей LLM на этом этапе было найти непереведенные слова и перевести их. С оговоркой что переводим только те слова, у которых есть общепринятый русскоязычный вариант.
Это решило проблему на 95%. То есть, текст выходил более-менее нормальным, но было две проблемы.
Первая — дополнительный этап часто игнорировал вторую часть и дословно переводил (а то и транскрибировал) даже непереводимую игру слов. Например:
Можно выделить три основных подхода к локальному запуску. Олл-ин-ван решения вроде LM Studio или GPT4All предлагают максимально простой старт — устанавливаете программу, скачиваете модель через встроенный каталог и начинаете работу.
Причем в некоторых материалах гиперрусификация соседствовала с недопереводом:

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

Выглядело это более академично, хотя и сильно увеличивало затраты времени на финальную редактуру материала.
А решилось все само собой. Когда Google выпустил модель Gemini 3 Flash, я заменил DeepSeek и Gemini 2.5 на третью версию. Инглиш исчез, термины переводятся корректно, общее качество текста тоже стало выше.
Мораль этой истории такая: если для решения какой-то задачи с LLM текущего поколения нужно танцевать с бубном, не расстраивайтесь. Есть вероятность, что следующее поколение моделей будет решать эту проблему нативно (чем перечеркнет смысл ваших многомесячных трудов).
И касается это не только перевода.
В попытках решить проблему, я пытался понять, почему она вообще возникала. Проблема, кстати, была не только у меня — на Gemini версий от 1.5 до 2.5 жаловались [7] особенно часто [8].
Причин нашлось несколько, все они так или иначе уходят корнями в обучение LLM:
В текстах, на которых обучалась модель, есть много мест, где исходные слова оставлены намеренно — имена, бренды, сленг или термины в технической документации. В итоге модель уверена [9], что копировать исходные слова в переведенный текст допустимо.
Модели склонны пропускать в исходном виде слова с высокой энтропией перевода (то есть, у которых множество вариантов перевода в разных контекстах). При обучении модели пропуск такого слова в исходном виде приносил [10] меньший штраф, чем использование неверного варианта перевода. Для менее мощных LLM выбор правильного перевода для такого слова — еще и слишком «дорогая» операция с точки зрения [11] расхода токенов, и дешевле оставить [12] его как есть.
Какие-то слова для моделей могут быть мало знакомы — то есть, они редко встречались при обучении или у них слишком неоднозначная статистика включений. Тогда для модели тоже проще не переводить [13] это слово вообще.
Вкрапления слов на третьих языках (как в нашем варианте — на китайском) появляются, потому что модель явно не штрафовали за токены на «неправильном» языке, если эти токены подходили по смыслу. Ну и обучение на смешанных документах тоже в этом виновато [14] (достаточно 2% многоязычных данных, чтобы перевод потом ломался).
Ну а раз проблемы хорошо известны, то в каждом новом поколении моделей они шаг за шагом решаются. Поэтому переход на более новую версию LLM действительно может кардинально улучшить качество перевода текста.
В моем случае это произошло при переходе от Gemini 2.5 к Gemini 3.0. С тех пор ошибочно переведенные или оставленные без перевода слова практически не встречаются.
Автор: nenkre
Источник [15]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/31327
URLs in this post:
[1] В прошлой статье: https://habr.com/ru/articles/1041288/
[2] Зоя Вексельштейн: https://www.youtube.com/watch?v=3W40tBACFbI
[3] материал: https://link.springer.com/chapter/10.1007/3-540-49478-2_32
[4] обучения: http://www.braintools.ru/article/5125
[5] «думал» на китайском: https://www.reddit.com/r/LocalLLaMA/comments/1i8xy0f/multilingualizing_the_thought_process_of/
[6] думал: https://huggingface.co/lightblue/DeepSeek-R1-Distill-Qwen-1.5B-Multilingual/blob/main/README.md
[7] жаловались: https://www.reddit.com/r/Bard/comments/1kighlo/gemini_is_randomly_using_words_from_other/
[8] часто: https://www.reddit.com/r/Bard/comments/1c5sepj/gemini_randomly_decided_to_speak_polish_for/
[9] уверена: https://www.emergentmind.com/papers/2208.00463
[10] приносил: https://arxiv.org/html/2405.18922v1
[11] зрения: http://www.braintools.ru/article/6238
[12] оставить: https://www.machinetranslation.com/blog/deepseek-v3-translation-use
[13] проще не переводить: https://stackoverflow.com/questions/69595863/machine-translation-transformer-output-unknown-tokens
[14] тоже в этом виновато: https://arxiv.org/html/2601.00364v2
[15] Источник: https://habr.com/ru/articles/1044114/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1044114
Нажмите здесь для печати.