メインコンテンツへスキップ

Quality Gate

すべての翻訳は、ディスクに書き込まれる前に決定論的な検証ゲートを通過します。Quality Gateは、機械翻訳の一般的な失敗パターンを捕捉します。暗黙のフォールバックはなく、ロケールファイルにゴミデータが書き込まれることもありません。

検証チェック

チェック捕捉する内容ゲートラベル
空/空白モデルが空の文字列または空白を返した[GATE] empty
ソースのエコーモデルが元の英語の入力をそのまま返した[GATE] source-echo
ハルシネーションループ繰り返されるトライグラム(3文字)パターン(例: "Qo' Qo' Qo'"[GATE] hallucination
長さの膨張出力がソースよりも著しく長い[GATE] length
文字体系の準拠ターゲットロケールに対して誤った文字体系(スクリプト)が使用されている[GATE] script
ICU複数形カテゴリそのロケールに必要な複数形が欠落している[GATE] icu-plural

空/空白

空の文字列、空白のみ、またはnullである翻訳を拒否します。これは、難しいキーに対して何も返さないモデルを捕捉します。

ソースのエコー

モデルが翻訳せずに英語のソーステキストをそのまま返した場合に検出します。短い文字列や指定が不十分なプロンプトでよく発生します。

ハルシネーションループ

出力内のトライグラム(3文字)パターンを分析します。出力の長さに対して、いずれかのトライグラムがしきい値を超えて繰り返された場合、その翻訳は拒否されます。これにより、"Qo' Qo' Qo' Qo' Qo'"のような劣化した出力を捕捉します。

長さの膨張

出力の長さがmaxLengthRatio × source length(デフォルト: 4倍)を超える翻訳を拒否します。これは、短い入力に対して長文を生成するモデルのハルシネーションを捕捉します。

設定ファイルのmaxLengthRatioで設定可能です。

文字体系の準拠

設定されたscriptフィールドを持つロケール(例: 平原クリー語音節文字の"script": "cans")の場合、出力にターゲットの文字体系に適切な非ASCII文字が含まれているかを検証します。アラビア語、CJK(中日韓)、または音節文字のロケールに対してラテン文字のみの出力が行われた場合は拒否されます。

失敗時の動作

  1. 失敗した翻訳は、[GATE]プレフィックス、キー名、理由、および値のプレビューとともに標準エラー出力(stderr)にログとして記録されます。
  2. そのキーはロケールファイルには書き込まれません
  3. リトライカスケードが開始されます(下記参照)。
[GATE] hero.title: source-echo — "Welcome to our platform"
[GATE] nav.about: hallucination — "À À À À À À À À"

リトライカスケード

バッチが失敗した場合(JSON解析エラーまたはQuality Gateによる拒否)、rosettaはバッチサイズを段階的に小さくしてリトライします。

Full batch (80 keys) → parse error
└→ Half batch (40 keys) → 2 failures
└→ Individual keys (1 each) → isolates the 2 problem keys

リトライの予算(上限)はmaxRetriesによって制限されます(デフォルト: 3、言語ごとに設定可能)。これにより、継続的に失敗するキーに対するトークン消費の暴走を防ぎます。

リトライを使い切った後、問題のあるキーはログに記録され、スキップされます。これらは次回のsync実行時に再度リトライされます。

プロンプトキャッシング

システムメッセージ(トーン&マナー、文法規則、スタイルノート)は、ユーザーメッセージ(翻訳するキー)から分割されます。この分割は意図的なものです。

  • 特定のロケールにおいて、システムメッセージはすべてのバッチで同一です。
  • AnthropicやGoogleなどのプロバイダーは、繰り返されるシステムメッセージをキャッシュします。
  • 結果: 最初のバッチではトークンコストを全額支払いますが、それ以降のバッチではユーザーメッセージの分だけを支払います。

これにより、多くのバッチを持つプロジェクトのトークンコストを大幅に削減できます。

ICU MessageFormatの検証

integrityコマンドは、CLDRの複数形ルールに照らし合わせてICU MessageFormatの複数形パターンを検証します。ソースファイルで以下のようなICU構文を使用している場合:

"items": "{count, plural, one {# item} other {# items}}"

Rosettaは、翻訳されたバージョンにターゲットロケールで必要なすべての複数形カテゴリが含まれているかを確認します。たとえば、アラビア語ではoneotherだけでなく、6つのカテゴリ(zeroonetwofewmanyother)が必要です。

すべてのロケールで複数形の網羅性を確認するには、i18n-rosetta integrityを実行します。

用語の強制

辞書を使用したコーチングペア(coached pairs)の場合、rosettaは翻訳後に用語チェックを実行します。Quality Gateを通過した後、LLMが実際に必須の辞書用語を使用したかどうかを検証します。

[TERM] en→fr: 2 term violation(s)
• hero.title: "dashboard" → expected "tableau de bord" but got "panneau de contrôle"

用語の違反は警告であり、ブロックするエラーではありません。翻訳はそのままディスクに書き込まれます。これは意図的な動作です。LLMが別の言葉を選ぶ正当な理由(コンテキストや文法など)がある可能性があり、用語の不一致でブロックするとかえって悪影響を及ぼすためです。

違反を修正するには、コーチング辞書を更新するか、ロケールファイルを手動で編集します。


関連項目