ذكاء الاصطناعي في Discourse: استجابة المخرجات المنظمة ليست 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:

حسنًا، هذا صحيح تقنيًا، لكنه يشير إلى وجود خطأ برمجي في الكود. تعمل آلية الاستبدال البديلة (fallback) لذا لا يتم رفع خطأ، ولكن من الأفضل إصلاح المصدر بدلاً من نقله إلى مستوى INFO لإخفاء المشكلة، أليس كذلك؟

يسمح JSON باستخدام أحرف السطر الجديد (line feed) كفضاء أبيض، لكنه لا يسمح بتسلسلات الهروب (escape sequences) خارج النصوص؛ ومع ذلك، تقوم دالة الهروب بإخفائها. لإصلاح ذلك، يمكنك تغيير الإعداد لتخفيف الهروب فقط للأحرف ASCII من 0x0 إلى 0x1f شاملاً، وفقًا لمواصفات JSON. (لا أعرف كيفية كتابتها بلغة Ruby لذا لا يوجد طلب سحب PR.)

لتوضيح ذلك، فإن ما يلي هو JSON صالح:

{
  "key": "value"
}

ما يلي هو كود مشفر، وهو غير صالح ويسبب المشكلة:

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