Три популярных ИИ-ассистента для собеседований — Cluely, Final Round AI и Sensei — заявляют о поддержке русского языка, но при тестировании на записи реального интервью с Senior Python-разработчиком все три исказили базовые технические термины. «Kafka» превращалась в «кофту» или «как-то», «Kubernetes» — в «губер нет тест», «subscriber pattern» — в «саб скрайп патерн». Проблема не в качестве русского языка как такового: на общей речи Whisper large-v3, который лежит в основе большинства подобных продуктов, показывает около 8% WER — вполне рабочий результат. Проблема в специфическом гибриде, которым говорят русскоязычные айтишники.

Русский разработчик в одной фразе легко переключается между языками: «Я там сделал subscriber pattern на RabbitMQ, обернул в try-except, и на пятисотой ошибке делаю retry с exponential backoff». Это явление называется code-switching — переключение кодов внутри одного высказывания. Whisper обучался на миллионе часов слабо размеченных данных: YouTube с автосубтитрами, подкасты, аудиокниги, субтитры к фильмам. IT-контента на русском в этом корпусе — десятые доли процента. Когда модель встречает неоднозначный звук, она выбирает статистически более вероятное слово: «кофта» встречалась в обучении тысячи раз, «Kafka» в русскоязычном контексте — единицы.

МодельWER на общей речиWER на технических терминахWER на командах/коде надиктованном
Whisper large-v3 (vanilla)~8%~34%~52%
whisper-large-v3-russian (Antony66, fine-tune на Common Voice RU)~6%~29%~48%
JobPath (наш fine-tune)~4%~7%~11%

Дополнительную сложность создаёт русское произношение английских терминов. «Kubernetes» по-английски звучит как [ku:bər'netis], по-русски — [куберне́тис] с другим ударением. «Nginx» носители произносят [ˈendʒɪnɛks], в русской речи чаще слышится [энджи́никс] или вовсе [нгинкс]. Whisper обучался на носителях языка с нормативным произношением, поэтому русский вариант звучит для модели как другое слово. Поверх этого — чисто русский IT-жаргон: «гошечка» (Go), «жаба» (Java), «крудошлёп», «катать роллауты». Этих слов в тренировочных данных в нужном контексте нет совсем: «гошечка» распознаётся как «хорошо» или «горшочек».

Корень проблемы — code-switching: айтишники говорят на смеси русской грамматики и английских терминов с русским произношением, такого контента почти нет в обучающих данных Whisper.

фото с реального собеседования нашего клиента
фото с реального собеседования нашего клиента · Источник: Habr AI

Архитектура ассистентов для собеседований устроена так, что ошибка на этапе STT не поддаётся исправлению дальше по цепочке. Аудио превращается в транскрипт, транскрипт вместе с резюме и стеком кандидата уходит в LLM, модель генерирует подсказку. Если транскрипт содержит «кофту» вместо «Kafka», никакой системный промпт не объяснит языковой модели, о чём шла речь. LLM либо галлюцинирует, либо отвечает не по теме.

Команда JobPath решила проблему на уровне модели. За полтора месяца они собрали корпус из 200 минут реальных IT-собеседований с согласия участников — пять спикеров из Москвы, Петербурга, Минска, Екатеринбурга и Новосибирска, разные стеки (Python, Go, Java, JavaScript, C++), ручная расшифровка в качестве ground truth. На этом корпусе сделали fine-tune Whisper large-v3. Результат: WER на технических терминах упал с 34% у vanilla Whisper до 7%, на надиктованных командах и коде — с 52% до 11%. Для сравнения, публично доступный fine-tune whisper-large-v3-russian от Antony66, обученный на Common Voice RU, даёт 29% на технических терминах — лучше оригинала, но принципиально проблему не решает, поскольку Common Voice не содержит IT-специфики.

Практическая разница между системами видна на конкретном примере. Один и тот же вопрос интервьюера про N+1 проблему в SQLAlchemy и Django Cluely транскрибирует как «эс-кью-эль-алкемия» и «данже», Sensei — как «sqlachemi» и «Django» (последнее случайно верно). JobPath воспроизводит «SQLAlchemy» и «Django» корректно. Разница выглядит косметической, но LLM, получая на вход «эс-кью-эль-алкемия», теряет контекст и не может сформулировать релевантный ответ про ORM.