TL:DR версия

Если поработать с промптами и гейтами, то можно перевести большущий японо-английский словарь к виду японо-русского с очень неплохим качеством. Идея применима к другим языкам. Сделал пайплайн, запускал 100 Luna-воркеров-переводчиков одновременно через CLI. Вышло недорого.

Тут словарь, тут гитхаб с пайплайном, тут примеры статей.

Почему нужен новый словарь

У некоторых стран была очень сильная школа языкознания. Например, в Советском Союзе научно-исследовательские институты активно работали над словарями самых разных языков мира, изучали их грамматику, фонетику, синтаксис и культурный контекст. Очень хорошо было развито языкознание и в англоязычных странах — прежде всего в Великобритании и США. Поэтому словари с переводом на английский зачастую гораздо полнее аналогичных словарей с переводом на русский.

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

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

Совершенно понятное желание — взять лучшее из каждого словаря и слить воедино, переведя попутно всё на русский. Собственно, этим я и занялся.

Самый авторитетный из них, словарь Кенрова, восходит к «Большому японско-русскому словарю», созданному в Советском Союзе в 1970-х годах. Понятно, что за полвека лексика заметно изменилась: какие-то слова и формы устарели, появилось огромное количество новых, многое было заимствовано из других языков. Поэтому всерьёз полагаться только на этот словарь сегодня уже трудно.

В русскоговорящем сообществе японистов рекомендуется японско-английский словарь Jitendex, в котором есть практически всё необходимое для того, чтобы без особых проблем потреблять японский контент. Многие ребята поэтому учат и английский, и японский одновременно, что достойно восхищения, но плохо масштабируется. Пацану 14 лет, он хочет читать визуальные новеллы в оригинале — а мы говорим, что ему надо бы сначала английский подтянуть. Никуда не годится, нужен большой, современный и полный яп-рус словарик.

Jitendex как основа

В качестве основы для такого словаря я решил взять Jitendex и выяснить, насколько дорого обойдётся качественно перевести его с помощью LLM. Сначала я экспериментировал с агентами Sonnet в Claude Code, а затем перешёл на ChatGPT и его недорогую модель Luna. Решил переваривать этот словарик по частям: взять сначала самые частотные 1,5 тысячи слов и усилиями десятка добровольцев выявить и сгруппировать типичные косяки, которые делает LLM-ка при переводе. При каждой новой итерации улучшать промпт, пока не будет достигнут идеал.

Предыдущие попытки машинного перевода словарей — с помощью Google Translate или ранних версий ChatGPT — давали крайне низкое качество. Причём его практически невозможно было исправить ни промптингом, ни последующей детерминированной обработкой. Поэтому я был весьма удивлён, когда увидел результаты Luna: из первой сотни переведённых словарных статей лишь примерно треть содержала какие-либо заметные недочёты. Более того, оказалось, что большинство этих проблем можно устранить простой корректировкой промпта.

Как научить LLM переводить словарь

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

В словарях есть немало структурированных данных: например, информация о том, глагол это слово или существительное, метки типа «устар.», «жарг.» и прочее. Примеры употребления слов тоже приятно держать отдельно, как и их переводы. Напрашиваются structured outputs, которые ChatGPT отлично поддерживает.

Секретный соус перевода словарей — дать агенту понять, что от него не требуется дословный перевод. Японское 始める переводится на английский как begin, commence, start и kick off. Все четыре перевода — довольно частотные и очень обычные слова. В русском же есть «начинать» и «приступать». «Стартовать», «инициировать», «давать начало» и прочее — это уже что-то менее частотное и несущее нюансы.

Агент не должен оглядываться на то, сколько квазисинонимов приведено в исходном словаре. Он должен взять заголовок исходной статьи, поглядеть на примеры употребления и представить свою версию того, как бы эта статья выглядела на русском, лишь слегка опираясь на английские переводы. Это было трудновато объяснить агентам. По этой же причине меня не устраивала версия Луны без ризонинга — подобное творчество требует нескольких проходов по тексту.

Масштабирование, инфраструктура и цена

Наконец, важно не сесть в лужу с тарификацией. Принцип тут простой: тарификация за токены по API — дорого, подписка — дёшево. Рассуждая так, я поначалу просил ChatGPT Sol создавать субагентов Luna и радовался, что аж три агента-переводчика трудятся параллельно — и больше нельзя.

В какой-то момент я вспомнил, что у Codex есть CLI, а там можно запустить неопределённо большое количество маленьких литературных негров. Нагрузочное тестирование показало, что 80–100 слегка размазанных по времени потоков дают отличную пропускную способность. Сервера OpenAI тоже оказались не против и за неделю работы пайплайна ни разу меня не заблокировали.

Оркестратором был Sol Medium, переводчиками — Luna Medium. Каждые 10 тысяч слов мы брали небольшую выборку переводов и сравнивали её с оригиналами, а ещё выгружали весь прогресс в виде дистрибутива-словаря Yomitan. Первые полторы тысячи статей вообще перевели Тэррой, но, честно говоря, качество не так уж отличалось.

Тем не менее приоритизация по частотности — это явно неплохая идея. Более частотные словарные статьи должны получать больше заботы и внимания, ведь пользователь будет читать их непропорционально чаще, чем что-то из списка TOP130k.

Процесс перевода 400 тысяч статей должен быть легко прерываемым и возобновляемым. Поначалу я загрузил исходный словарик в SQLite-базу, но потом подумал: а чего мелочиться, давайте уж сразу Postgres — и можно не думать сильно про параллельность, транзакции и прочие технические детали. Если при следующем переводе словарика какая-то добрая душа предоставит свой компьютер, мы сможем и в тысячу одновременных потоков работать. Навайбкоженные quality-gate'ы проверяли, что результат соответствует json-схеме, а внутри полей нет мусора вроде слов, в которых латиница пересекается с кирилицей и хираганой.

Перевод занял примерно полторы недели и пять кодексовых ресетов на 100-долларовой подписке. Сколько это было в токенах, я забыл посчитать, поэтому посчитал квадратики в Usage: навскидку вышло 4–5 миллиардов. Я попросил ChatGPT прикинуть, во сколько бы обошёлся банкет, плати я за токены по API. Он сказал, что от 3 000 до 6 000 зелёных.

Короче говоря, не платите по API, если выбор есть.

Название и дистрибуция

Хотелось кириллическое название, но не унылую аббревиатуру как у лингвистов. Остановился на названии «Колобок», потому что — а почему бы и нет. Колобок явно в тренде в этом году, надо похайпить.

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

Значение работы, дальнейшие шаги

Опыт «Колобка» показал, что если у вас есть словарь с изучаемого языка на хоть какой-нибудь ещё язык, а LLM-ки поддерживают оба языка на приличном уровне, значит, у нас есть словарь на любой другой язык. Хочешь тамильско-турецкий словарь? Без проблем! Суахильско-болгарский? Раз плюнуть! В целом, даже толковые моноязычные словари можно использовать для переводческих словарей — данных для модели хватит. Дальше надо пробовать ту же методику на других словарях, а также пытаться использовать более дешевые модельки, сохраняя качество. Буду рад идеям.

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