徹底的な調査の結果、一見すると単一の翻訳問題に見えたものが、実際には同時に発生していた3つの独立した問題であり、それが大きな混乱を招いていたことが判明しました。
特に、コミュニテックのRichard氏に心から感謝申し上げます。彼の丁寧なコミュニケーション、卓越した能力、そして何より「Data Explorer」のアプローチを提案してくれたことには敬意を表します。SQLクエリを通じて、ようやく3つの問題すべてを特定することができました。素晴らしい貢献です。
問題1:LLMによる間違ったロケール検出
ロケール検出に使用されているLLMが、英語で書かれているがポルトガル語の地名を含む投稿を誤って分類してしまいます。
例:*「Hanamaro ChakiのWA展がFortress of São João do Picoで開幕」*というタイトルの投稿は完全に英語で書かれています。しかし、ロケール検出器はこれをpt-BRとして分類しました。おそらく、文中に含まれるポルトガル語の地名(「Fortress of São João do Pico」、「Casa da Cultura de Santa Cruz」)が原因です。
結果として、システムは投稿がすでにポルトガル語であると誤認し、ポルトガル語への翻訳を行いませんでした。代わりに、英語を「不足している言語」とみなして英語への翻訳を行ってしまいました。
これは、ある言語の投稿が頻繁に別の言語の地名や固有名詞を参照する多言語コミュニティにおいて、特に問題となります。
提案される解決策: より高度なモデル(例:Mistral Large)を使用してロケール検出を行い、本文の言語と文中に埋め込まれた固有名詞を適切に区別できるようにします。
問題2:Mistral APIによる503エラーの発生とバッチジョブの中断
Mistral APIが断続的に503 unreachable_backendエラーを返しています。バックフィル処理は最終的にこれらのエラーの一部を再試行しますが、Jobs::LocalizeTopicsジョブは503エラーに遭遇すると実行途中でクラッシュしてしまいます。その結果、バッチ内の残りのトピックは次のスケジュール実行まで翻訳されずに残ってしまいます。
これにより、ランダムなトピックのランダムなロケールで翻訳が欠落する予測不能なパターンが生じます。
ログの証拠:
DiscourseAi::Translation: Translated 13 topics to de
[crash in localize_topics.rb:57]
このジョブは13件のトピックを翻訳した後、クラッシュしました。残りのトピックは次のバックフィルサイクルまでドイツ語への翻訳を受けませんでした。
問題3:AI翻訳対象カテゴリの自動サブカテゴリ登録の不一致
私のケースでは、「AI翻訳対象カテゴリ」の設定に手動でカテゴリを追加したことはありません。自動的に追加されたように見えました。しかし、2つのサブカテゴリ(ViewpointsとBeaches)は、存在しコンテンツを含んでいたにもかかわらず、自動的には追加されませんでした。
私の仮説:システムは、翻訳が有効化された後に新しい投稿が作成されたサブカテゴリのみをターゲットリストに自動追加するようです。ViewpointsとBeachesは翻訳が有効になる前にコンテンツが追加されていたため、自動追加されず、結果として翻訳もされませんでした。
これは混乱を招く挙動です。もし自動登録ロジックが存在するならば、それは一貫性があり遡及的に適用されるべきか、あるいはUI上でサブカテゴリを手動で追加する必要があることを明確に示すべきです。
まとめ
この3つの問題が同時に発生したため、診断が極めて困難でした。翻訳されていない投稿の原因が、ロケールの誤検出によるものか、503エラーによるクラッシュによるものか、それとも単にカテゴリがターゲットリストから欠落しているだけなのかを、深いログ分析とSQLクエリを行わない限り区別する方法はありませんでした。
Richard氏が提案したData Explorerクエリが、この調査の鍵となりました。この詳細な分析がチームの役に立つことを願っています。必要であれば、追加のログや例を提供することもできます。
このトピックでのチームの活動に感謝いたします!
