Discourse AI: 構造化出力のレスポンスが有効なJSONではありませんでした

昨日アップデートしました[1] が、ログに多くのエラーが発生しています:

Discourse AI: structured output response was not valid JSON, falling back to best-effort parsing (311 bytes) 

HTTP レスポンスを確認しましたが、問題はありませんでした。その後、rails console でテキストを試しました:

...
discourse(prod)> p = JsonCompleter.new
=>
#<JsonCompleter:0x00007f48763b0270
...
discourse(prod)> p.parse text
=>
{"spam" => false,
 "reason" =>
  "..."}
discourse(prod)> p.parse DiscourseAi::Utils::BestEffortJsonParser.escape_control_characters(text)
(discourse):14:in '<main>': unexpected token "\\" (JsonCompleter::ParseError)

どうやら、Discourse が解析前に改行文字をエスケープしていた[2] ことが原因で、エラーが発生していました。


  1. ↩︎

  2. code, pr#41716 で導入 ↩︎

それは警告であり、エラーではありません。

とは言え、人々がこれらについて心配し続けているので、ログレベルを INFO に変更します :face_exhaling:

技術的にはその通りですが、これはコードのバグを示しています。フォールバック機能が動作しているためエラーは発生しませんが、INFO レベルに変更して隠蔽するのではなく、根本原因を修正する方が良いでしょう?

JSON では改行文字を空白として許可していますが、文字列外でのエスケープシーケンスは許可されていません。しかし、エスケープ関数はこれをエスケープ処理してしまいます。これを修正するには、JSON 仕様に従って ASCII 文字 0x0 から 0x1f まで(両端を含む)のみをエスケープするように変更できます。(Ruby の書き方が分からないので PR は作成できません。)

説明のために、以下は有効な JSON です:

{
  "key": "value"
}

以下はエスケープされたもので、無効であり、問題の原因となっています:

{\u000a  "key": "value"\u000a}