RASA Chatbot: تجربة المتوازيات



صناعة chatbot مزدهرة. في البداية ، كانوا أغبياء بدرجة كافية ويمكنهم إجراء حوار مع المستخدم ، حيث يقومون بتقديم الإجابات المحتملة وتقديمها. ثم أصبحت الروبوتات أكثر ذكاءً وبدأت في مطالبة المستخدم بإدخال النص من أجل إخراج الكلمات الرئيسية من الإجابات. لقد أدى تطوير التعلم الآلي إلى ظهور القدرة على التواصل مع الروبوت الصوتي أيضًا. ومع ذلك ، فإن معظم الحلول لم تذهب بعيدًا عن البناء نفسه للرسم البياني للحوار والانتقال بين العقد حسب الكلمات الرئيسية.

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



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

الحوار عند النقطة XXX.
إذا أدخل المستخدم عرضًا بالكلمات ["اشتر" ، "تذكرة"] ، فانتقل إلى النقطة "اسأل أين"
إذا قام المستخدم بإدخال عرض بالكلمات ['buy' ، 'cutlet'] ، فانتقل إلى النقطة "اسأل من ماذا"

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

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

الشيء الأكثر غير سارة هو أن الشخص مخلوق لا يمكن التنبؤ به ، على عكس الروبوت ، ويمكن في أي لحظة البدء بطرح سؤال مختلف تمامًا. هذا هو ، في الوقت الذي يكون فيه الروبوت جاهزًا بالفعل لحجز تذكرة ، قد يسأل الشخص "بالمناسبة ، ماذا عن الطقس؟" أو "على الرغم من أنني لا أريد ذلك ، أود الذهاب في سيارتي ، كم يستغرق الطريق؟"

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

هنا يمكنك (ويجب) استخدام التعلم الآلي. ولكن بعد ذلك تنشأ مشاكل جديدة: على سبيل المثال ، إذا كنت تستخدم تدريب التعزيز للتنبؤ بالانتقالات إلى نقاط الرسم البياني ، تثور أسئلة: من أين يمكنك الحصول على بيانات لهذا التدريب ، ومن سيصنف جودة الإجابات؟

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

بعد التحليل والتفكير في جميع أوجه القصور في برامج الروبوت الحالية ، حاول مطورو RASA حل المشكلات على النحو التالي:

  • يمر أي إدخال من المستخدم من خلال "تحديد النية" ، أي أن النص الذي يتم إدخاله باستخدام التعلم الآلي يتم تعيينه إلى نية واحدة (أو عدة). أيضا ، إذا لزم الأمر ، يتم عزل الكيانات من النص وإضافتها إلى ذاكرة الروبوت.
  • تشبه هذه العملية السير الأخرى ، باستثناء نموذج تحديد النية المستخدم.
  • يتم التنبؤ بالإجراء التالي للروبوت باستخدام التعلم الآلي استنادًا إلى السياق ، أي الإجراءات والنوايا السابقة وحالة ذاكرة الروبوت.
  • في الوقت نفسه ، لا توجد الكثير من البيانات اللازمة للتدريب الأولي ، ويمكن للروبوت أن يتنبأ بما يجب القيام به حتى من دون أمثلة وقواعد محددة.

النظر في آليات العمل بمزيد من التفصيل.

RASA NLU


لنبدأ بالحوت الأول الذي يرتكز عليه الروبوت. هذا فهم طبيعي للغة ، يتكون من جزأين رئيسيين: تحديد النية والاعتراف بالكيانات.

كشف النوايا
يعتمد تحديد النية على خوارزمية معدلة تسمى StarSpace من Facebook ، ويتم تنفيذها على Tensorflow. في هذه الحالة ، لا يتم استخدام نماذج مدربة مسبقًا لتمثيلات الكلمات الموجهة ، مما يسمح لك بالتحايل على حدود هذه التمثيلات.

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

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

يتم التدريب بطريقة تقلل من وظيفة الخسارة في شكل مجموع المسافات الزوجية (إما منتجات جيب التمام أو متجه) بين متجهين متشابهين وتلك المتشابهة. وبالتالي ، بعد التدريب ، سيتم ربط ناقل معين بكل نية.

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

بالإضافة إلى الكعكات المذكورة أعلاه ، يسمح لك هذا النهج بالتمييز التلقائي لأكثر من نية واحدة عن الاقتراح. على سبيل المثال: "نعم ، فهمت ذلك. ولكن كيف يمكنني العودة إلى المنزل الآن؟ " يتم التعرف عليه كـ "intent_confirm + intent_how_to_drive" ، والذي يسمح لك بإنشاء المزيد من الحوارات الإنسانية مع الروبوت.

بالمناسبة ، قبل التدريب ، يمكنك إنشاء جمل مصطنعة من الأمثلة عن طريق خلط تلك الموجودة لزيادة عدد أمثلة التدريب.

كيان الاعتراف RASA


الجزء الثاني من NLU هو استخراج الكيانات من النص. على سبيل المثال ، يكتب المستخدم ، "أريد أن أذهب إلى مطعم صيني مع صديقين" ، يجب على الروبوت أن يسلط الضوء ليس فقط على النية ، ولكن أيضًا على البيانات المقابلة لها. أي أن تملأ ذاكرتك أن الأطباق في المطعم يجب أن تكون صينية ، وأن عدد الزوار هو ثلاثة.

لهذا ، يتم استخدام نهج قائم على الحقول العشوائية الشرطية ، والذي تم وصفه بالفعل في مكان ما على Habré ، لذلك لن أكرره. يمكن لأولئك الذين يرغبون في قراءة هذه الخوارزمية على موقع ستانفورد الإلكتروني .

بالإضافة إلى ذلك ، لاحظت أنه يمكنك الحصول على كيانات من النص استنادًا إلى القوالب والنصوص (على سبيل المثال ، أسماء المدن) ، بالإضافة إلى الاتصال بخدمة Facebook Duckling منفصلة ، والتي سيكون من الجميل أيضًا الكتابة عنها يومًا ما.

قصص RASA


الحوت الأزرق الثاني الذي تقوم عليه RASA Core هو القصص. الجوهر العام للقصص هو أمثلة على محادثات حقيقية مع الروبوت ، تم تنسيقها كرد فعل نية. بناءً على هذه القصص ، يتم تدريب شبكة عصبية متكررة (LSTM) ، والتي تقوم بتعيين محفوظات الرسائل السابقة إلى الإجراء المطلوب. يتيح لك هذا عدم تعيين الرسوم البيانية لمربعات الحوار بشكل صارم ، وكذلك عدم تحديد جميع الحالات والانتقالات الممكنة بينها.

مع وجود عدد كاف من الأمثلة ، ستتوقع الشبكة بشكل كاف الحالة التالية للانتقال ، بغض النظر عن وجود مثال محدد. لسوء الحظ ، العدد الدقيق للقصص غير معروف ، وكل ما يمكن الاسترشاد به هو عبارة المطورين: "كلما كان ذلك أفضل ، كان أفضل".

لتدريب النظام ، وليس فقط تسجيل بعض مربعات الحوار المخترعة هناك ، يمكنك استخدام التدريب التفاعلي.

هناك خياران:
1. اجعل عددًا من المهندسين يشاركون في المحادثات مع الروبوت ، وتصحيح التنبؤات غير الصحيحة ، والتعريف غير الصحيح للكيانات والمقابس مع توقع إجراءات التنبؤ بالقصص.

2. احفظ المحادثات في قاعدة البيانات ، ثم استمر في استخدام المهندسين المدربين خصيصًا للنظر في مربعات الحوار هذه ، حيث لم يتمكن المستخدم من حل مشكلته ، أي ، تحول إلى شخص ، أو اعترف الروبوت ببأسه ولم يتمكن من الإجابة.

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

النوايا وأمثلة لها:

Intent_hello
  • مرحبا
  • مرحبا
  • ألوها
  • صباح الخير

...
Intent_thanks
  • شكر
  • لطيف
  • شكرا لك

...
Intent_request
  • وداعا تخطي

Intent_inform
  • وداعا تخطي

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

المطبخ:
النوع: غير منتظم
ملء تلقائي: خطأ
NUM_PEOPLE:
النوع: غير منتظم
ملء تلقائي: خطأ

والآن سوف نعرض أمثلة (جزء صغير) للنوايا المحذوفة أعلاه. الأقواس في الأمثلة هي البيانات الخاصة بتدريب Ner_CRF ، بالتنسيق [الكيان] (اسم متغير للتخزين: ما نقوم بتخزينه).

intent_request_restaurant
  • أنا أبحث عن مطعم
  • هل يمكنني الحصول على [السويدية] (المطبخ) الطعام لـ [ستة أشخاص] (num_people: 6)
  • مطعم يقدم الطعام [الكاريبي] (المطبخ)
  • معرف مثل مطعم
  • أنا أبحث عن مطعم يقدم الطعام (المطبخ)

intent_inform
  • [2] (num_people) أشخاص
  • لـ [ثلاثة] (num_people: 3) أشخاص
  • فقط [واحد] (num_people: 1) شخص
  • كيف نوبة [الشرقية الآسيوية] (المطبخ)
  • ماذا عن الطعام [الهندي] (المطبخ)
  • أه ماذا عن نوع (المطبخ) التركي
  • أم [إنجليزي] (المطبخ)

الآن نحدد تاريخ المسار الرئيسي:

تحية
- utter_greet
* Intent_request
- restaurant_form
- نموذج {"name": "restaurant_form"}
- نموذج {"name": null}
- action_book_restaurant
شكرا
- utter_noworries

هذا هو بوت كامل من أجل عالم مثالي. إذا أشار المستخدم على الفور إلى جميع البيانات اللازمة في الجملة الأولى ، فسيتم حجز جدول. على سبيل المثال ، يكتب "أريد حجز طاولة في مطعم إسباني لخمسة أشخاص." في هذه الحالة ، سيكون num_people 5 ، والمطبخ - الأسبانية ، وهو ما يكفي للروبوت لمزيد من الإجراءات على الحجز.

ومع ذلك ، إذا نظرت إلى الأمثلة ، يمكنك أن ترى أن البيانات غير موجودة دائمًا بالكمية المطلوبة ، وأحيانًا لا تكون موجودة على الإطلاق. لذلك تظهر الحوارات غير الأساسية.

لنفترض أنه لا توجد بيانات حول المطبخ في الطلب ، أي شيء مثل مربع الحوار هذا:
مرحبا
مرحبا
أريد حجز مطعم لخمسة أشخاص
...

لكي تكتمل بشكل صحيح ، تحتاج إلى تحديد محفوظات النموذج التالي:
تحية
- utter_greet
* Intent_request
- restaurant_form
- نموذج {"name": "restaurant_form"}
- الفتحة {"request_slot": "num_people"}
- utter_ask_coven
* النموذج: أبلغ {"cuisine": "mexican"}
- فتحة {"cuisine": "mexican"}
- الشكل: restaurant_form
...

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

هناك طريقتان لإيقاف أي محاولات لقيادة الروبوت من المسار الصحيح: لتحديد القصص المحتملة للحديث "حول لا شيء" ، أو لجميع المحاولات لبدء مثل هذه المحادثة - للإجابة على أن الأمر يستحق العودة إلى العمل.

نظرًا لأن شركتنا في بداية رحلة مدهشة إلى عالم برامج الدردشة ، فهناك فرصة في أن تكون هناك مقالات جديدة حول ما الذي جمعناه وما الذي فعلناه. ترقبوا!

Source: https://habr.com/ru/post/ar470754/


All Articles