JSONストリーム解析が失敗するとエラーなしで翻訳が静かに切り捨てられる

この件に関するデータポイントを一つ追加します。私どもは、同じ根本的なメカニズムが異なった形で現れているように見受けられます。

観測環境: Discourse コア + discourse-ai、LLM: OpenAI 経由の GPT-5.1(カスタム API 接続、シードモデルではありません)。

再現の証拠

同じ元の投稿(ロシア語、約2000文字、見出し/太字/箇条書き/リンクを含む)を、ネイティブ AI 翻訳機能を用いて複数のロケールに翻訳した結果:

  • ポーランド語(pl):埋め込み画像の Markdown が構造を失いました。![alt text|690x460](upload://...) から、! プレフィックスと | セパレータが欠落し、代替テキストと寸法がプレーンテキストとして連結された不正なリンクに変わりました。結果として、埋め込み画像ではなくクリック可能なリンクとしてレンダリングされました。
  • ウクライナ語(uk):段落区切りの代わりに、投稿全体にリテラルの \n\n シーケンスがプレーンテキストとして表示されました。この翻訳では画像の Markdown は無事でした。つまり、破損は特定の症状に固定されているわけではなく、実行によって変動します。

上記の切り捨て問題とは異なり、私どものケースでは内容の欠落はありません。全文は存在しますが、エスケープシーケンスや Markdown 構文が破損しており、出力が短くなるわけではありません。プロバイダーが異なります(OpenAI vs Google)、症状も異なります(破損 vs 切り捨て)が、疑われる根本原因は同じです。StructuredOutput#read_buffered_propertyBestEffortJsonParser#extract_key にフォールバックしており、このフォールバックは JSON 文字列シーケンス(\n がリテラルのまま)をアンエスケープせず、またフォールバックがパーシング途中にトリガーされた場合、Markdown 構文の隣接する特殊文字も適切に処理できていないようです。

Sidekiq や Rails のログにもエラーは記録されていません。これもまた、サイレントフェイルオーバーの挙動を示しています。

「いいね!」 1