Как я победил глупость агентов в переводе
Короч. Я просто добавил в промт "make no mistakes".
Пост больше для переводчиков и энтузиастов получился.
Играл я значит в Star Wars: Zero Company. Взял перевод у товарища с волком на юзерпике (после того как помог распотрошить данные игры для согласования родов говорящих). И столкнулся с бедой любых автоматических нейропереводов - на дистанции терминология начинает плыть, и какие-то устойчивые выражения начинают интерпретироваться нейропереводчиком по разному. Это очень херово сказывается на качестве, и сам перевод становится херовым - такое, к сожалению, не редкость.
И такой подумал: "а как вот победить эту хрень?". Ну вот если не хочется ручками все туда-сюда постоянно делать и следить-бдить (осуждаю). И как это еще развернуть в рамках моей приложухи\сервиса для перевода, которой сам пользуюсь. И знаете.. придумалось.
Во-первых, запускаем mcp-сервер с инструментами для агента. Он может ходить в наше запущенное приложение с открытым проектом, получать оттуда текстовые данные, засовывать обратно. Сделали, хорошо. Но глупость это не победило. Окей, добавим к выдаче словарь, который утвердили сами. Лучше, но еще не. Словарь - словарем, но мы же не будем туда заносить нашу интерпретацию например "ritual audio" - "ритуальная фонограмма". Особенно если на пять тыщ строк оно появляется три раза. И десинк таких понятий портит картину, и каждый такой момент в словарь заносить - такое.
Чё придумал. Весь массив оригинального текста парсится на словосвязки (2, 3, 4-граммы), отсекаются предлоги, языко-специфичные штуки (для китайского и японского). Формируется ростер таких словосвязок, длинные поглощают короткие (team lead - event team lead, и если малая форма не имеет весомой частоты), и формируем индекс словосвязка - номера строк вхождений. И когда отправляем данные\строки агенту или он заходит сам, то смотрим этот индекс, и ищем: есть ли среди переведенных строк такие где уже встречаются те же словосвязки что и в строках что мы сейчас отдадим. И если есть, то выбираем примеры перевода и крепим к выдаче. То есть агент уже сразу получает подсказку для консистентности.
В итоге железяка получает не только строки для перевода. Но и: примеры перевода частотных фраз, словарные слова что встретятся в строках, контекст +-3 строки, технические\комметные данные строк если есть. И промт еще на всякий. Всё в матричном jsonе для минимизации объема. От такого обилия агент довольно урчит и становится чуточку смышленнее. Причем неважно - долгая сессия перевода или только открытая - все необходимые данные железяка получает как только поздоровалась с mcp-сервером.
Ах да. После того как железка поработала и собирается вернуть готовый текст начинается второй слой магии. Возвращенный текст снова парсится. И если там не совпадает количество и типы тегов, строк в строке (лол), нет ожидаемого словарного слова - возврат проблемных пунктов с указанием косяков. И так до победного.
Ну и тесты показали интересный результат. Дрейф существенно подсократился. Тональность может гулять, но это проблема из другой оперы, и я примерно понимаю как ее обойти. И скажем надобность в двойном проходе вполне может отпасть. Вот такие пиероги.