기계 번역을 전부 검토했습니다. 문제는 검토 단계였습니다.

언어

번역 키트를 출시하기 전에, 작은 예제 앱에서 테스트를 진행했습니다. JSON, Flutter ARB, Android, Apple .strings, gettext, Markdown 등 6가지 형식의 70개 문자열을 독일어, 러시아어, 일본어, 아랍어, 스페인어로 번역했습니다. 번역에는 자체 머신에서 vLLM으로 구동되는 오픈 Qwen 모델(Qwen3.8-Flash-Next, 4비트 양자화)을 사용했습니다. 번역된 모든 문자열은 저장 전에 검사를 거칩니다. 350개 중 4개가 거부되었습니다. 이 4건의 거부는 모두 오검출이었습니다.

검사의 내용

앱을 망치는 번역은 없는 것만 못하므로, 모든 문자열은 자리 표시자(%1$s, {name}, {{count}}), 태그, 줄 바꿈, URL을 유지해야 합니다. 대상 언어의 문자 체계로 작성되어야 하며, 비어 있거나, 넘치거나, 영어로 남아 있으면 안 되고, 복수형은 해당 언어가 가진 범주를 정확히 커버해야 합니다. 실패한 문자열은 문제를 명시해 다시 요청하고, 다시 실패하면 제외되어 앱에서 해당 문자열만 영어로 표시됩니다.

거부된 4건

검사를 수정한 후 두 번째 실행에서는 번역 메모리에 이미 있는 나머지를 제외하고 모델에게 해당 4개 문자열만 요청했으며, 350개 전체를 45초 만에 저장했습니다.

실패할 것으로 예상했으나 실패하지 않은 부분

복수형은 단순 번역이 무너지는 지점입니다. 영어에는 one과 other 두 가지가 있지만, 러시아어에는 one, few, many, other 네 가지가 있고, 아랍어에는 여섯 가지 범주가 있으며, 일본어에는 단일 형태만 있습니다. 우리는 대상 언어의 정확한 범주를 요청하고 각 형태의 자리 표시자를 확인했습니다. 모델은 러시아어에서 "1 день, 2 дня, 5 дней"를, 아랍어에서는 여섯 가지 형태를 모두 작성했습니다. 다섯 개 언어의 모든 Android 복수형이 첫 시도에 통과했으며, 일본어 복수형 메시지를 제외한 모든 복수형 메시지도 통과했습니다(일본어 메시지는 우리의 검사 로직이 오독했습니다).

어떤 검사도 잡아내지 못하는 것

이후 예제의 22개 웹 문자열을 Polyglot이 지원하는 42개 언어로 번역했습니다. 924개 중 924개 문자열이 통과했습니다. 내용을 읽어보니 하나가 눈에 띄었습니다. 크메르어에서 "You are offline"이 "당신은 온라인 상태입니다"라는 의미의 문장으로 번역되어 있었습니다. 올바른 문자로 잘 형성된 크메르어 문장이었고 빠진 부분도 없었기 때문에 모든 검사를 통과했습니다. 검사는 앱이 깨지는 부분을 잡아내지만, 잘못된 의미는 해당 언어를 읽을 줄 아는 사람이 필요합니다.

핵심 요약

기계 출력에 대한 자동 검사는 실제 출력 데이터를 기준으로 테스트해야 합니다. 가상의 번역으로 작성한 단위 테스트는 통과했지만, 실제 모델이 실제 일본어를 작성하자 몇 분 만에 공백이 드러났습니다. Polyglot에는 이러한 검사와 4가지 케이스별 테스트가 수정된 상태로 포함되어 있습니다. 검사 기능 자체는 무료 오픈소스입니다: GitHub의 translation-checks.

업데이트됨: