كيف تختبر مكالمة هاتفية؟

طريق صحراوي يغشاه ضباب الحركة عند الغروب تحت سماء مخططة بالأزرق والبرتقالي

Mohammed Alshamrani

طائر كناري يضع سماعة رأس كالتي يستخدمها موظفو مراكز الاتصال، جاثمًا على سلك هاتف ليلًا وأضواء المدينة خلفه

تُجري واحدة. كل ساعة.

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

اختبارات الوحدات لا تكشف مشغّل اتصالات يتصرف بغرابة في منتصف الليل، ولا صفحات الحالة كذلك؛ فقد تكون كل التبعيات «تعمل» بينما المكالمات معطلة من طرف إلى طرف.

لذلك بنينا Canary!

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

دورة Canary كل ساعة: يتصل كأنه متصل حقيقي، ويشغّل STT وLLM وTTS عبر خطوط هاتف حقيقية، ويفحص الرحلة كاملة، ثم إما يلتزم الصمت أو ينبّه أحد المناوبين

لم نبدأ بمحاولة «تغطية كل شيء»، بل بدأنا من عملائنا. بُنيت أولى نسخ Canary حول مسارات عملاء حقيقية، هي الرحلات نفسها التي يسلكها المتصلون بهم كل يوم. فإن نجحت هذه، نجحت المنصة. ومن هناك توسّع Canary ليغطي أهم مسارات المنصة. ولا يكتفي بالتحقق من أن المكالمة تمت، بل يفحص الرحلة كاملة: أن الوكيل تكلّم، وأن المحادثة مضت في اتجاهها الصحيح، وأن البيانات وصلت إلى حيث يجب، وصولًا إلى السجل في نظام CRM لدى العميل.

أربعة طيور كناري جاثمة على سلك هاتف ليلًا؛ ثلاثة منها صفراء، والرابع بريشٍ أحمر وأخضر وأزرق وأصفر

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

وحين يتعطل شيء ما، لا نعرف بذلك من العميل. يُطلق Canary تنبيهًا ويُستدعى أحد المناوبين قبل أن يلاحظ أي أحد آخر.

العروض التوضيحية للذكاء الاصطناعي الصوتي سهلة. أما ما يحصل عليه عملاؤنا فهو ضمانة أن المكالمة ستُجاب فعلًا، وبشكل صحيح، في الرابعة فجرًا من يوم جمعة. وCanary هو ما يؤكد لنا ذلك. يغرّد كل ساعة، والغاية كلها ألا يفكر فيه أحد حتى يتوقف عن التغريد.

طائر كناري على سلك هاتف يغرّد، وموجات صوتية تتصاعد من منقاره

فحص واحد، لحظة بلحظة

لماذا وُجد هذا الطائر

  1. الساعة الثالثة فجرًا. وكيل صوتي من Sarj ما زال يجيب عن المكالمات، ولا أحد يراقبه وهو يعمل.
  2. لذلك تحتفظ Sarj بمختبِر. تعرّف إلى Canary: برنامج صغير يتصل بالخدمة الحية وفق جدول زمني ويُبلغ بما يجده.
  3. منصة Sarj حيٌّ من مساحات العمل. وكلاء كل عميل وسيناريوهاته وأرقام هواتفه تقيم خلف جدرانه الخاصة.
  4. ولـCanary مساحة عمل خاصة به، تضم سيناريوهات الاختبار والإعدادات التي تحدد ما يفعله كل تشغيل.
  5. مساحة العمل حدٌّ للملكية، لا محطة تمر بها المكالمة. وعلى منصة Sarj نسميها «مؤسسة».
  6. تحتفظ مساحة العمل بأربعة فحوص: مكالمة واردة، ومكالمة صادرة، ودفعة من مكالمة واحدة، وتحديث سجل في Zoho. والتشغيل الواحد يجري الأربعة كلها.
  7. ينتهي كل فحص بدليل صغير واحد يُجمع هنا عند مكتب التفتيش. حان وقت تتبّع الفحص الأول.

تتبَّع فحصًا هاتفيًا

  1. يخرج من مساحة العمل مساران. الأول هو المسار الهاتفي: يُجري الفحص الصادر مكالمة حقيقية، عبر خط هاتف حقيقي، إلى رقم اختبار.
  2. يطلب Canary من منصة Sarj إجراء المكالمة، تمامًا كما تبدأ المكالمة الصادرة لأي عميل.
  3. تخرج المكالمة عبر وصلة الاتصال الهاتفي، المسماة trunk (الخط الرئيسي)، ثم إلى شبكة الهاتف العادية. فيرنّ خط الاختبار.
  4. يجيب خط الاختبار. وجوده كله لأجل أن يُتصل به: يردّ بالكلام نحو تسعين ثانية، ثم يُنهي المكالمة.
  5. لا يستمع Canary إلى الصوت. بل يسأل المنصة كل بضع ثوانٍ عن سجل المكالمة: يرن، قيد التنفيذ، ما زال ينتظر.
  6. يقول السجل: مكتملة. فيتحقق Canary من أمرين: أن المكالمة انتهت فعلًا بحالة «مكتملة»، وأنها استمرت أكثر من صفر ثانية.
  7. وإذا ثبّت التشغيل خطًا رئيسيًا ورقم متصل محددين، يتحقق Canary أيضًا من أن السجل يُظهر استخدام هذا المسار بعينه، لا خطًا آخر.
  8. يحمل Canary النتيجة عائدًا إلى المكتب: بطاقة واحدة مكتوب عليها «اكتملت المكالمة الهاتفية»، ويُرفق بها السبب كلما فشلت.
  9. تقدّم البطاقة ادعاءً واحدًا محدودًا: أن المكالمة ما زال بإمكانها الخروج من Sarj والوصول إلى نهايتها. ولا تقول شيئًا عما سمعه أيٌّ من الطرفين.

تتبَّع مسارًا مختلفًا

  1. عدنا إلى نقطة التفرّع. المسار الثاني يتجاوز شبكة الهاتف كليًا: الفحص الوارد يذهب مباشرةً إلى الوكيل.
  2. يشغّل Canary متصلًا مسجّلًا وينضم مباشرةً إلى الغرفة الصوتية للوكيل. لا خط هاتف، ولا خط رئيسي، ولا رنين.
  3. أولًا، توقف متعمَّد. هذا الصمت هو إشارة الوكيل لينطق جملته الافتتاحية.
  4. يتكلم الوكيل. ويرى Canary مقطعًا مكتملًا من النص المفرَّغ يصل من الطرف الآخر من الغرفة. هذه هي الإشارة الأولى.
  5. وبعد ثانية، يشغّل Canary مقطعًا قصيرًا مسجلًا مسبقًا، كما يفعل متصل يُلقي التحية ويطرح سؤالًا.
  6. داخل الوكيل، يتحول الكلام إلى نص، ويختار نموذج لغوي الجملة التالية، ثم تتحول تلك الجملة إلى كلام من جديد.
  7. ثم يصل مقطع ثانٍ من النص المفرَّغ، ضمن المهلة الزمنية للفحص: لقد أجاب الوكيل. الإشارة الثانية. نجح الفحص.
  8. هذا هو الادعاء كله: أن الوكيل تكلّم ثم أجاب. لا أن كلامه كان منطقيًا، ولا كيف بدا الصوت.
  9. وهناك سيناريو آخر يستخدم المسار المباشر نفسه. في هذا السيناريو يطلب المتصل المسجّل من الوكيل تحديث سجل عميل في Zoho.
  10. تنتهي المحادثة بشكل طبيعي. لكن ما زال على Canary فحص أمر أخير، وهو ليس في هذه الغرفة.
  11. يُفترض بفحص Zoho أن يحدّث سجل اختبار مخصصًا في Zoho CRM: عميلًا محتملًا اسمه Canary Tester.
  12. يقرأ Canary سجل Zoho مجددًا. وقت آخر تعديل فيه هو 09:09، أي بعد بدء هذا التشغيل في 09:07، مع هامش دقيقتين لانحراف الساعة.
  13. حديث بما يكفي: وصل التحديث إلى Zoho. وهذا يثبت أن السجل تغيّر بعد المكالمة، لكنه لا يثبت أن كل حقل فيه صحيح.

لماذا تهمّ الفحوص

  1. والآن سيناريو Zoho نفسه مرة أخرى، مع فارق واحد: هذه المرة لا يصل التحديث إلى السجل أبدًا.
  2. من داخل المكالمة، لا يبدو أي خلل. الوكيل تكلّم، والوكيل أجاب، والمحادثة انتهت بشكل طبيعي.
  3. يقرأ Canary سجل Zoho مجددًا. وقت آخر تعديل ما زال 14:02 من يوم أمس، أي قبل بدء هذا التشغيل.
  4. هذا التحديث المفقود يُفشل الفحص، رغم أن المحادثة كانت سليمة. هذا هو الفشل الذي يخفيه نصٌّ مفرَّغ يبدو مثاليًا.
  5. ولكل فحص طريقته الخاصة في الإخفاق: مكالمة تنتهي بحالة «فاشلة»، أو وكيل لا يجيب أبدًا ضمن المهلة، أو سجل لا يتحرك إطلاقًا.
  6. عند المكتب، يسهل التمييز بين النتيجتين. طابع زمني حديث: نجح. طابع زمني قديم: فشل، والسبب مكتوب على البطاقة.
  7. التشغيل الفاشل يكتب سطر سجلّ واحدًا موسومًا بأنه تنبيه من Canary. فيدق برج المراقبة جرسه: يصل تنبيه اسمه IntegrationCanaryFailed إلى المهندسين المناوبين.
  8. بعد ساعة، ينجح التشغيل التالي. يهدأ الجرس، ويزداد صف النتائج الساعية علامةً خضراء واحدة.
  9. والآن تخيّل أن التشغيلات توقفت عن الوصول ببساطة. لا يُكتب أي سطر فشل، فلا يجد التنبيه الأول ما يدق من أجله.
  10. بعد ثلاث ساعات دون تشغيل ناجح بالكامل، ينطلق تنبيه ثانٍ: IntegrationCanaryDead. فالصمت يعني إخفاقات متكررة، أو أداة مراقبة توقفت عن العمل.

المنظومة الأوسع

  1. عدنا إلى المكتب، وقد عادت الفحوص الأخرى أيضًا: استجابة الفحص الوارد، والمكالمة الصادرة بمسارها المثبَّت، والدفعة، وسجل Zoho. أربع بطاقات، وتقرير واحد.
  2. فحص الدفعة هو الهادئ بينها. يضع رقمًا واحدًا في قائمة، وينجح حين تعالجها المنصة وتكتمل تلك المكالمة الوحيدة.
  3. تحديد الفحوص التي تعمل يتم عبر إعداد اسمه CANARY_TAGS، لا عبر قاعدة في الكود. والتشغيل الأخضر يثبت سلامة الفحوص المفعّلة فقط، ولا يقول شيئًا عن البقية.
  4. طائر واحد يسأل: هل تعمل الخدمة؟ أما اختبار الأحمال فيسأل: كم متصلًا تستطيع الخدمة استيعابهم في وقت واحد؟ ويدخل من باب منفصل: POST /v1/load/start.
  5. ارفع شريط التمرير لتطلق المتصلين. يحدد الطلب هدفًا ومرحلة تصاعد ومرحلة ثبات: ينضم المتصلون بمعدل خمسة في الثانية افتراضيًا، ثم يبقون على الخط.
  6. كل متصل مهمة موسومة بمعرّف التشغيل، يمكن قراءتها لاحقًا. وهذا ليس أبدًا فحص الدفعة الساعي، الذي يتصل برقم واحد مرة واحدة.
  7. تراجَع خطوة وتأمّل الصورة كاملة: مساحة عمل فيها سيناريوهات اختبار، ومساران، ومكتب لادعاءات محدودة، وسجل يجب أن يتحرك، وبرج يُصغي إلى الصمت.
  8. يطير Canary عائدًا إلى بيته. والفحص التالي سيبدأ بعد سبع دقائق من رأس الساعة، سواء كان أحد يراقب أم لا.
  9. الفجر يطل على المناوبة الليلية. بنى Canary فريقُ الهندسة في Sarj، الذين يفضّلون أن يوقظهم طائر على أن يوقظهم عميل.

المسرد

المصطلحالمعنى
مساحة العمل، وتُسمى «مؤسسة»تُسمى على منصة Sarj «مؤسسة». تملك الوكلاء والسيناريوهات والأرقام والإعدادات. وهي حدٌّ للملكية، لا قفزة في الشبكة.
الفحص الواردالحالة canary-inbound. ينضم متصل مسجّل مباشرةً إلى الغرفة الصوتية للوكيل، وينتظر أن يتكلم الوكيل ثم أن يجيب.
الفحص الصادرالحالة canary-outbound. تتصل المنصة برقم الاختبار المُعدّ عبر خط هاتفي رئيسي (trunk)، ويستعلم Canary عن سجل المكالمة دوريًا حتى تكتمل.
فحص الدفعةالحالة canary-batch. تمر قائمة من رقم واحد عبر آلية الدفعات في المنصة، ويجب أن تنتهي باكتمال تلك المكالمة الوحيدة.
Zoho CRMنظام العملاء الذي يكتب فيه هذا السيناريو. تحدّث الحالة canary-zoho عميلًا محتملًا مخصصًا للاختبار، ثم تفحص حقل Modified_Time الخاص به بعد ذلك.
الخط الرئيسي (Trunk)خط SIP رئيسي: الوصلة المُعدّة بين Sarj ومشغّل الاتصالات. ويمكن للتشغيل أن يثبّت الخط الرئيسي ورقم المتصل اللذين يجب أن تستخدمهما المكالمة.
سجل المكالمةسجل المنصة للمكالمة: حالتها (يرن، قيد التنفيذ، مكتملة، فاشلة)، ومدتها، والخط الرئيسي والرقم اللذان استخدمتهما.
الغرفة الصوتية، وهي غرفة LiveKitجلسة الصوت الفورية التي يكون فيها الوكيل في كل مكالمة. ينضم إليها فحصا الوارد وZoho مباشرةً، دون أي مرحلة هاتفية.
إشارة التفريغ النصيالنص الذي تنتجه المنصة لما قيل، ويوسم بأنه نهائي حين يستقر. يعدّ Canary المقاطع النهائية الواردة من الوكيل، ولا يحكم على مضمونها.
سياسة التنبيهتنبيه في Cloud Monitoring. يطابق IntegrationCanaryFailed سطر سجل فشل، وينطلق IntegrationCanaryDead بعد ثلاث ساعات دون تشغيل أخضر بالكامل.
CANARY_TAGSالإعداد الذي يحدد الحالات التي يشملها التشغيل: inbound وoutbound وbatch وzoho. ويُضبط لكل بيئة على حدة.
اختبار الأحماليرفع POST /v1/load/start عدد مكالمات الانتظار المتزامنة تدريجيًا حتى يبلغ الهدف، وكل منها مهمة موسومة بمعرّف التشغيل. وهو منفصل عن الفحوص الساعية.
المهمةوحدة واحدة من عمل Canary مخزنة في قاعدة بياناته. يقرأ GET /v1/tasks/{id} نتيجتها. ويكتب تشغيل الأحمال مهمة واحدة لكل متصل.
مقالات أخرى

تابع القراءة

نِعَم العمل في Sarj

ما الذي يجعل الشركة شركةً جيدة

Vim-Fu

هل ما زال أحدٌ «يكتب» الكود فعلًا؟

الأسئلة الشائعة

أسئلةمتكررة

تدربت Sarj AI أصلا على بيانات عربية إقليمية، وليست نموذجا إنجليزيا يترجم أثناء التشغيل. تفهم لهجات محلية مثل النجدية والحجازية والخليجية والمصرية والشامية إضافة إلى العربية الفصحى.

تلال صحراوية تكسوها أزهار برية بنفسجية تحت سماء صافية

أتمت المحادثات.وسرع سير العمل.

تؤتمت Sarj AI تفاعلات العملاء المعقدة وتستخرج معلومات المستندات

وتنفذ العمليات الخلفية من البداية إلى النهاية.