ذكاء الاصطناعي في 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}

أي نموذج لغوي كبير (LLM) تستخدم؟

llama-server -hf mradermacher/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M

سيواجه نموذج بـ4 مليار معلمة صعوبة في الامتثال، فهي تتحسن، لكن هذا بالتأكيد من الجيل الأقدم.

إذا كنت تذهب مع 4 مليار معلمة، فربما أنصحك بشيء أحدث… جرّب Qwen 3.5-4B أو Gemma 4 E4B.

أعتقد أن llama.cpp يفرض المخطط من خلال اختيار الرموز التي تتوافق معه فقط. كما قمت بالتقاط استجابة باستخدام tcpdump والتحقق من أن الاستجابة المعادة هي JSON صالح.

ومع ذلك، احتوت على مسافات وانقطاعات أسطر خارج السلاسل النصية (أي إنها JSON منسق بشكل جميل)، وقد تم ترميز انقطاعات الأسطر هذه بواسطة Discourse، مما جعلها غير صالحة (تحققت من ذلك في وحدة تحكم rails).

بالمناسبة، أستخدم ميزة كشف الرسائل المزعجة.

منطقي، أعمل على إصلاح المشكلة.

إصلاح المشكلة هنا: