← العودة إلى الملاحظات

بناء أداة مشورة ذكية تربط الزائر بالمستشار المناسب — دون نموذج لغوي سحابي

بناء أداة مشورة ذكية تربط الزائر بالمستشار المناسب — دون نموذج لغوي سحابي

تالمواقع心理咨询常常Identifier بطريقتين سيئتين: يملأ الزائر نموذجاً، ويجبره على الاتصال هاتفياً ليسأل هل يوجد متاح. كلا الأمرين بطيء وكلاهما يفقد الناس.

أردت أن أعرف تكلفة استبدال ذلك بفقاعة محادثة مدمجة تؤمّن الفرز بنفسها. جاءت النتيجة أداة المشورة الذكية: مساعد مقابلة فارسي كامل الاتجاه يضعه المركز في موقعه بوسم <script> واحد.

القيد الذي شكّل كل شيء

لم يكن القرار المهم في الواجهة، بل فيما يعمل خلفها.

لا يوجد هنا أي نموذج لغوي سحابي.所谓 «الذكاء» محرك محلي حتمي: مسرد سريري منقّح يربط النص الحر بالمفاهيم، ومطابقة ضبابية لأسماء المستشارين، وتحليل حدود العمر، وتسجيل مرجّح على قائمة المستشارين، وجدول تغذية راجعة يعيد ضبط الأوزان المستقبلية. كلام الزائر لا يغادر الخادم، ولا يوجد مفتاح API لمزوّد، ولا تكلفة لكل رسالة.

هذا القرار يشتري ثلاثة أمور مهمة تحديداً لأدوات الصحة النفسية: يلغي معالج بيانات خارجياً من مسار الإفصاحات الحساسة، ويجعل تكلفة الرسالة صفراً — وهو ما يناسب مركزاً بميزانية صغيرة — ويجعل السلوك قابلاً للتدقيق: كل توصية تأتي بسبب مذكور لا بجملة تبدو معقولة فقط.

ما الذي يحصل عليه الزائر

فقاعة عائمة تفتح لوحة ٣٨٠×٥٨٠، تصبح ملء الشاشة تحت ٤٨٠ بكسل. الحوار آلة حالات فوق خطوات مرقّمة — text أو phone أو number أو choice — مع خطوات شرطية اختيارية ونهايتين محتملتين. لا شيء من ذلك مكتوب بشكل ثابت.

الخطوات نفسها تُحرَّر مباشرة من لوحة إدارة المركز، فيغيّر أسئلة المقابلة أو يعيد ترتيبها أو يضيف فرعاً أو يحوّل النهاية من «اقترح مستشاراً» إلى «سجّل طلباً» دون إعادة نشر. وقد يسرد كل مستأجر النطاقات المسموح بضمّ الأداة فيها؛ والفحص مطابقة دقيقة للمضيف أو نطاق فرعي، وليس مطابقة لسلسلة فرعية عمداً، حتى لا تستطيع notexample.org انتحال example.org.

قاعدتا تحقّق تستحقان الذكر، لأن هذه التفاصيل هي التي تقرّر إن بدا النموذج معادياً أم لا. يجب أن يتكوّن رقم الهاتف من أحد عشر رقماً بالضبط يبدأ بـ 09، وتُحوَّل الأرقام الفارسية قبل الفحص — فلا يُرفض زائر كتب ٠٩ لأنه كتب بلغته. والرقم المريب يبقى تحذيراً لا رفضاً: تتابع المقابلة، لأن الرقم المحظور يعني شخصاً يحتاج المساعدة ولم يحصل عليها.

خطوة الفحص اختيارية، وهي فحص لا تشخيص

إن فعّلها المستأجر، تعرض الأداة استبيان GHQ-28: ٢٨ سؤالاً في أربعة مقاييس فرعية — جسدي، قلق، اجتماعي، اكتئاب. تُصحَّح الإجابات على الخادم وتُفسَّر إلى نطاقات، مع التحذير الرئيسي عند مجموع ٤٣ فأكثر أو مقياس الاكتئاب ١٥ فأكثر، وتحذير أهدأ من مجموع ٢٢.

التمييز الذي يصرّ عليه الكود أن هذا استبيان فحص لا تشخيص. تعرض الأداة الأمر كذلك، وكذلك محرّك المطابقة الذي لا يخبر الزائر أبداً بأي اضطراب لديه؛ فهو يستخرج المفاهيم ويقيّم ويرتّب ويشرح.

ترتيب مستشارين من قائمة

يطبّق محرّك المطابقة أولاً المرشّحات الصارمة — الجنس والفرع وحدود العمر وحماية التخصص القانوني — ثم يقيّم ما بقي على تناسب الموضوع والمفاهيم السريرية المستخرجة والقدرة وعدد المواعيد المتاحة الحيّة والوزن المتعلَّم لكل مستشار. ويعيد أعلى مستشارين، لكلٍّ منهما سبب بلغة واضحة ورابط حجز.

الوزن المتعلَّم هو ما يحوّل هذا من عرض تجريبي إلى منتج: كل تقييم في اللوحة وكل توصية ناجحة تعدّل وزن (المستأجر، المستشار، المفهوم) ضمن نطاق محدود. أي أن موظفي المركز نفسه — بتقييمهم توصية — يعيدون تدريب المحرّك.

مركز هذه المنظومة أحد عشر مفهوماً سريرياً: القلق، الاكتئاب، وسواس الطهار، العلاقات والخلافات بين الأفراد، الزوجية والزواج، الوالد والطفل، الطفل، المراهق والشاب، التطوير الذاتي، القانوني، والطبي النفسي. المسرد المنقّح مقروء، ويمكن لأي مساهم توسيعه.

يُكتب الطلب قبل تشغيل المطابقة

هذا تغيير صغير بنتيجة كبيرة. يُحفظ الطلب قبل تنفيذ المطابقة، فيسجَّل من يحتاج مستشاراً حتى حين لا يجد المحرّك أي تطابق. السلوك السابق كان يُسقطه، وطلبٌ مُسقَط يعني شخصاً طلب المساعدة فلم يسمع رداً.

جانب المركز

لوحة الإدارة هي النصف الآخر من المنتج: لوحة مؤشرات، وصندوق محادثات كامل، وجدول طلبات، وشاشة حل تعارضات، ومحرّر تدفّق، ومدير قائمة المستشارين، وتغذية راجعة، وتحكّم في الزاحف، ومنطقة مدير عام لإدارة المستأجرين. وتُصدَّر الطلبات إلى مصنّف Excel من ورقة واحدة—Users وRequest history— برؤوس مجمّدة وتنسيق فارسي.

ويحرّك زاحف في الخلفية تحديث التوفّر بقراءة صفحات الفريق العامة كل ساعتين، مع إعادة محاولة وتدرّج وانتقال احتياطي للاتصال المباشر. وتُربط روابط الحجز بكل مستشار، وتدخل أعداد المواعيد مباشرة في الترتيب، فيفضّل المحرّك من يمكن حجزه فعلاً.

كيف يكون الأمان

تُجزّأ كلمات المرور بـ PBKDF2-HMAC-SHA256 عند مئة ألف تكرار بملح ١٦ بايت، وتُخزَّن بصيغة salt$hex_digest. والجلسات كوكيز موقّعة بـ httponly وsamesite=lax. وتحمل الردود nosniff وstrict-origin-when-cross-origin وX-Frame-Options: SAMEORIGIN — باستثناء /widget الذي يجب أن يكون قابلاً للضمّ.

وحدّ المعدّل واقعي: ٣٠ طلباً في الدقيقة لكل عنوان IP وتوكن جلسة على واجهة المحادثة، و١٠ محاولات فاشلة للدخول إلى اللوحة لكل IP كل خمس دقائق. ومفتاح API للمستأجر هو هوية المستأجر نفسه — فهو يقيّد التدفّق وقائمة المستشارين وأوزان التعلّم والطلبات — ويمكن تدويره من لوحة المدير العام، فتلتقط الأداة المفتاح الجديد عند التحميل التالي.

الحزمة التقنية، وقاعدة واحدة غير قابلة للتفاوض

FastAPI 0.115.6 مع uvicorn 0.34.0، وJinja2 للوحة، وSQLite للتخزين، وAPScheduler للزاحف وتنظيف الجلسات، وJavaScript وCSS خامان للأداة نفسها — بلا إطار عمل ولا حزم بناء ولا npm. وتُسلَّم الأداة في ثلاثة ملفات ثابتة.

القاعدة غير القابلة للتفاوض: عامل واحد. مهام الجدولة تعيش داخل العملية، وعدّادات حدّ المعدّل في الذاكرة. فعدة عمّال تعني عدة زواحف وعدّادات موزّعة. وسّع رأسياً حتى تُخرَج الجدولة من العملية.

ما الذي سأبنيه تالياً

الخطوة التالية الصادقة ليست نموذجاً أكبر، بل بيانات أفضل: مجموعة تقييم حقيقية من حوارات Intake مع التوصيات التي كان مستشار جيد سيقدّمها فعلاً، ليقاس الترتيب بدل أن يُتنازع عليه. وكل ما عدا ذلك — فرع ثانٍ للتدفّق، أغنى لوحة — سهل نسبياً.

الوثائق التقنية الكاملة منشورة كويكي: البنية، ومرجع الواجهة، ومحرّك المطابقة، وفحص GHQ، ولوحة الإدارة، والنشر، واستكشاف الأخطاء. والمصدر على GitHub برخصة MIT.

ذو صلة: نسخة المراسلة من المحرّك نفسه — روبوت على بل بالشاشة نفسها ومنطق المطابقة نفسه — تتناولها مقالة منفصلة في هذا الموقع.

تواصل
الملاحظة التالية

بناء روبوت مشورة على بل: فحص GHQ-28 ومطابقة تتعلم ذاتياً واثنتي عشرة حالة حوار

→