1. قبل البدء
في هذا الدرس التطبيقي، ستتعلّم كيفية إنشاء روبوت دردشة خاص ببيع التجزئة باستخدام Dialogflow CX، وهي منصة ذكاء اصطناعي حواري (CAIP) لإنشاء واجهات مستخدم حوارية. يمكن أن تنفّذ منصة Dialogflow CX وكلاء افتراضيين، مثل برامج الدردشة الآلية وبرامج الدردشة الصوتية وبوابات الهاتف، ويمكنها أن تتيح قنوات متعددة بأكثر من 50 لغة مختلفة.
سيرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية إنشاء برنامج دردشة آلي لموقع إلكتروني خاص ببيع السلع بالتجزئة. اسم النشاط التجاري الوهمي الذي ننشئ روبوت المحادثة له هو: G-Records. G-Records هي شركة تسجيل موسيقي روك مقرّها في كاليفورنيا. لدى شركة الإنتاج 4 فِرق روك متعاقدة معها، وهي: Alice Googler وG's N' Roses وThe Goo Fighters وThe Google Dolls. تبيع شركة G-Records سلعًا خاصة بالفرق الموسيقية لجميع محبّي موسيقى الروك.
في نهاية هذا الدرس العملي، يمكنك استخدام روبوت الدردشة لطلب قمصان أو موسيقى أو يمكنك طرح أسئلة حول طلبك.

أهداف الدورة التعليمية
ستتعرّف على مزايا Dialogflow CX مقارنةً بـ Dialogflow ES من خلال التدريب العملي. ويشمل المفاهيم التالية:
- كيفية إنشاء وكيل افتراضي في Dialogflow CX ضمن Google Cloud
- كيفية إنشاء تدفقات
- كيفية إنشاء كيانات
- تعرَّف على كيفية إنشاء أغراض
- كيفية إنشاء صفحات وصفحات انتقالية باستخدام معالجات الحالة
- كيفية الانتقال بين الصفحات باستخدام مسارات الأهداف
- كيفية الانتقال بين الصفحات باستخدام المَعلمات ومسارات الشروط
- التعرّف على كيفية عرض الردود الشرطية باستخدام وظائف النظام
- التعرّف على كيفية إنشاء رسائل احتياطية
- كيفية استخدام المحاكي
- التعرّف على كيفية إنشاء حالات الاختبار وتغطية الاختبار
سيبدو تصميم وكيل Dialogflow CX النهائي على النحو التالي:

المتطلبات
- يجب أن يكون لديك هوية Google أو عنوان Gmail لإنشاء وكيل Dialogflow CX.
- الوصول إلى Google Cloud
2. إعداد البيئة
إنشاء مشروع على Google Cloud
بما أنّ Dialogflow CX يعمل في Google Cloud، عليك إنشاء مشروع على Google Cloud. ينظّم المشروع جميع مواردك على Google Cloud. يتألف من مجموعة من المتعاونين وواجهات برمجة التطبيقات المفعّلة (والموارد الأخرى) وأدوات المراقبة ومعلومات الفوترة وعناصر التحكّم في المصادقة والوصول.
عند إنشاء مشروع جديد، عليك إدخال اسم المشروع. وسيكون عليك ربطه بحساب فوترة ومؤسسة حاليين.
يُستخدَم حساب الفوترة لتحديد الجهة التي تدفع مقابل مجموعة معيّنة من الموارد، ويمكن ربطه بمشروع واحد أو أكثر. يتم تحصيل رسوم استخدام المشروع من حساب الفوترة المرتبط. في معظم الحالات، يتم ضبط إعدادات الفوترة عند إنشاء مشروع. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات الفوترة. تأكَّد من تفعيل الفوترة لمشروعك على Cloud.

تفعيل واجهة برمجة التطبيقات Dialogflow API
لاستخدام Dialogflow، عليك تفعيل واجهة برمجة التطبيقات Dialogflow API لمشروعك.
- اختَر المشروع الذي تريد تفعيل واجهة برمجة التطبيقات له، ثم انقر على متابعة.
- طيّ قائمة "واجهات برمجة التطبيقات والخدمات" والنقر على إنشاء بيانات اعتماد
- انقر على بيانات التطبيق.
- انقر على لا، أنا لا أستخدمها لأنّك لا تستخدم Kubernetes Engine أو App Engine أو Cloud Functions في الوقت الحالي.
- 3. انقر على تم.

إنشاء وكيل جديد في Dialogflow CX
لإنشاء وكيل جديد في Dialogflow CX، افتح أولاً وحدة تحكّم Dialogflow CX:
- اختَر مشروع Google Cloud الذي تم إنشاؤه سابقًا.
- انقر على إنشاء وكيل.
أكمِل النموذج الخاص بإعدادات الوكيل الأساسية:
- يمكنك اختيار أي اسم معروض.
- اختَر الموقع الجغرافي: us-central1
- اختَر المنطقة الزمنية المفضَّلة.
- اختَر en - الإنجليزية كلغة تلقائية
انقر على إنشاء.

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

تسمح المسارات للفِرق بالعمل على مسارات محادثات فردية. من الممارسات الجيدة تبسيط المسار ليتناسب بسهولة مع الشاشة ويكون أكثر نمطية.
"مسارات المحادثات" هي مفهوم جديد في Dialogflow CX. يتضمّن Dialogflow Essentials مفهوم "الوكلاء الضخمين" (Mega Agents) المشابهين إلى حد ما "للتدفقات" (Flows). ومع ذلك، ستستخدم "عمليات سير العمل" بشكل متكرر أكثر.
في وقت لاحق من هذا الدرس التطبيقي، سنستخدم معالجات الحالة التي يمكنها إنهاء مسار (وبالتالي سيتم الرجوع إلى مسار تالٍ أو سابق)، أو يمكنك إنهاء جلسة الوكيل الكاملة.
هيا بنا ننشئ بعض مسارات الإحالة الناجحة.
إنشاء مسارات
- في Dialogflow CX، انقر على رمز + > إنشاء مسار محادثة.
- حدِّد الاسم:
Catalogواضغط على Enter.

تم إنشاء سير العمل الأول الكتالوج. الآن، أنشئ التدفقات الأخرى:
Order ProcessMy OrderCustomer Care

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

مُحاكي
على يسار Dialogflow CX Console، يمكنك اختبار الوكيل الافتراضي باستخدام المحاكي المضمّن. يمكنك اختبار المحادثة من بدايتها أو من مسار معيّن.
- انقر على الزر اختبار الوكيل في أعلى يسار الشاشة.
- في حقل "التحدّث مع وكيل"، اكتب:
Helloسيردّ الوكيل الافتراضي برسالة ترحيب تلقائية: مرحبًا. كيف يمكنني تقديم المساعدة؟

لنعدّل نص الترحيب التلقائي هذا.
بدء أداة Flow التلقائية
لنبدأ بإنشاء مسار Intent سيتم تفعيله بمجرد الترحيب بالوكيل الافتراضي.
- في الشريط الجانبي إنشاء > عمليات على يمين الصفحة، انقر على عملية البدء التلقائية، ثم اختَر عقدة شجرة البدء.
سيؤدي ذلك إلى فتح صفحة البدء. تم اختيار صفحة البدء تلقائيًا في قسم الشريط الجانبي إنشاء > الصفحات.
- في بدء > المسارات، انقر على نية الترحيب التلقائية.
يصنّف الغرض نية المستخدم النهائي في إحدى مراحل المحادثة. في Dialogflow CX، يمكن أن تكون النوايا جزءًا من معالج الحالة لتوجيه الصفحة النشطة التالية أو التنفيذ.
- أزِل جميع إدخالات ردّ الوكيل، وأضِف هذا النص الجديد:
Welcome, I am the virtual agent of G-Records, a fictional rock label. You can order artists merchandise, ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?
لتسهيل المحادثة، سنحتاج أيضًا إلى بعض أزرار الرد السريع / شرائح الاقتراحات.
- انقر على إضافة خيار مربّع حوار > حمولة مخصّصة واستخدِم مقتطف الرمز أدناه.
- استخدِم مقتطف الرمز أدناه كحمولة مخصّصة، ثم انقر على حفظ.
للمزيد من المعلومات عن حمولات البيانات المخصّصة، يمكنك الاطّلاع على المستندات.
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}

- يمكنك الآن اختبار نية الترحيب في المحاكي.
من المحتمل أنّك تتساءل عن سبب عدم ظهور أي محتوى غني. ويرجع ذلك إلى أنّ المحتوى المنسَّق، مثل شرائح الاقتراحات، يعتمد على عملية دمج. تتطلّب الخطوات التالية حساب فوترة، ولكن يمكنك تخطّيها إذا لم يكن لديك حساب.
- في الشريط الجانبي الأيمن، انقر على إدارة > عمليات الدمج.
- اختَر Dialogflow Messenger وانقر على ربط (Connect).
- في النافذة المنبثقة، انقر على تفعيل.

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

- انقر على الرابط التجربة الآن.
- انقر على رمز روبوت المحادثة في أسفل يسار الصفحة لفتح نافذة المحادثة. اكتب
Helloلبدء المحادثة.

في الوقت الحالي، عندما تنقر على شرائح الاقتراحات، لن يفهم الوكيل الافتراضي ما تقصده. ويرجع ذلك إلى أنّ الوكيل الافتراضي لا ينتقل بين الحالات بعد. يمكننا إجراء ذلك في Dialogflow CX باستخدام الصفحات. لنتابع الدرس التطبيقي، وسنبدأ بإنشاء بعض الكيانات والنوايا.
4. أنواع الكيانات
تُستخدَم أنواع الكيانات للتحكّم في كيفية استخراج البيانات من إدخالات المستخدمين النهائيين. تتشابه أنواع الكيانات في Dialogflow CX مع أنواع الكيانات في Dialogflow ES إلى حد كبير. يوفّر Dialogflow كيانات نظام محدّدة مسبقًا يمكنها مطابقة العديد من أنواع البيانات الشائعة. على سبيل المثال، هناك كيانات نظامية لمطابقة التواريخ والأوقات والألوان وعناوين البريد الإلكتروني وما إلى ذلك. يمكنك أيضًا إنشاء عناصر مخصّصة خاصة بك لمطابقة البيانات المخصّصة.
لنبدأ بإعداد جميع الكيانات المخصّصة قبل أن نتمكّن من تصميم الصفحات في تدفق. سننشئ الكيانات التالية:

إنشاء عناصر
لننشئ عنصر فنان.
- انقر على إدارة > أنواع الكيانات
- انقر على + إنشاء.
- الاسم المعروض:
Artist - الفئات:
-
The Google Dolls(مع مرادف:Google Dolls) -
The Goo Fighters(مع مرادف:Goo Fighters) -
G's N' Roses(مع مرادف:Gs and Roses) Alice Googler- انقر على "خيارات متقدمة" وضع علامة في المربّع بجانب المطابقة التقريبية. (إذا أخطأت في كتابة اسم الفرقة، قد يظل بإمكانك العثور على الكيان الصحيح).
- في "الخيارات المتقدّمة"، ضَع علامة في المربّع بجانب إخفاء المعلومات في السجلّ. (إذا أخطأت في كتابة اسم الفرقة، سيتم تصحيح الاسم في السجلّ).
- انقر على حفظ.
سنحتاج أيضًا إلى كيان لعنصر السلع الترويجية:
- انقر على إدارة > أنواع الكيانات
- انقر على + إنشاء.
- الاسم المعروض:
Merch - الفئات:
T-shirt-
Longsleeve(مع مرادف:Longsleeve shirt) Tour Movie-
Digital Album(مع المرادف:MP3 Album،MP3) -
CD(مع المرادفاتDiscوPhysical CD)
- انقر على حفظ.
سنحتاج أيضًا إلى كيان الألبوم:
- انقر على إدارة > أنواع الكيانات
- انقر على + إنشاء.
- الاسم المعروض:
Album - الفئات:
Live-
Greatest Hits(مع مرادف:Hits)
- انقر على حفظ.
سنحتاج أيضًا إلى كيان للمقاسات:
- انقر على إدارة > أنواع الكيانات
- انقر على + إنشاء.
- الاسم المعروض:
ShirtSize - الفئات:
-
XS(مع مرادف:Extra Small) -
S(مع مرادف:Small) -
M(مع مرادف:Medium) -
L(مع مرادف:Large) -
XL(مع مرادف:Extra Large) -
2XL(مع مرادف:Extra Extra Large) 3XL
- انقر على حفظ.
وكيان أرقام الطلبات، التي تتألف عادةً من 4 أحرف أبجدية رقمية و3 أرقام (مثل ABCD123)
- انقر على إدارة > أنواع الكيانات
- انقر على + إنشاء.
- الاسم المعروض:
OrderNumber - كيانات التعبير العادي
- الكيان: [A-Z]{4}[0-9]{3}
- انقر على حفظ.
يجب أن تبدو إعدادات الكيان مشابهة لما يلي:
@Artist: 
@Merch: 
@Album: 
@ShirtSize: 
@OrderNumber: 
بعد إعداد العناصر المخصّصة، يمكننا إعداد النوايا. لنواصل الدرس التطبيقي.
5- مكان ووقت الاستماع إلى الموسيقى
تصنّف النية هدف المستخدم النهائي في دورة محادثة واحدة. تم تبسيطها بشكل كبير في Dialogflow CX، ولم تعُد تشكّل جزءًا أساسيًا من عناصر التحكّم في المحادثات. لا يستخدم Dialogflow CX سوى النوايا لمطابقة ما يقوله المستخدمون. في Dialogflow ES، كان عليك ربط كل شيء بنية (المَعلمات والأحداث والتنفيذ وما إلى ذلك). لا تحتوي النوايا في Dialogflow CX إلا على عبارات التدريب، وبالتالي يمكن إعادة استخدامها. لم يعُد يتحكّم في المحادثة. وبالتالي، ستكون عملية إنشاء النوايا واضحة ومباشرة:
يمكن أن تستخدم عبارات التدريب في النوايا الكيانات لاستخراج الإدخال "المتغير"، وهذا هو السبب في أنّ إنشاء أنواع الكيانات مسبقًا هو ممارسة جيدة، وهو ما فعلناه في الصفحة السابقة من خطوات المعمل.
إنشاء أغراض
لنبدأ بإعداد جميع الأهداف قبل أن نتمكّن من تصميم الصفحات في مسار.
- انقر على إدارة > النوايا.
- انقر على + إنشاء
استخدِم التفاصيل التالية:
- الاسم المعروض
redirect.artists.overview - الوصف
Artists overview: The bands supported by the label

انتقِل إلى أسفل الصفحة وأنشئ عبارات التدريب التالية:
Which bands are signed?Which bandsWhich artistsWhich artists are part of the record labelWho is part of the labelFrom which bands can I buy merchandiseBand merchandiseWhich music do you have?I would like to know who are signed to the labelWho are supported by the labelFrom who can I buy shirtsWhat music can I orderCan I get an overview of all the artists

- انقر على حفظ.
- لنواصل الآن إنشاء جميع النوايا الأخرى. استخدِم خيالك لإنشاء المزيد من عبارات التدريب. من أفضل الممارسات أن يكون لديك 10 عبارات تدريبية على الأقل لكل غرض لتغطية الطرق المختلفة التي قد يفعّل بها المستخدم هذا الغرض. ولأغراض هذا الدرس التطبيقي، سيكون من الجيد أيضًا أن يكون لديك عدد أقل من ذلك.
في ما يلي بعض الأمور التي يجب البحث عنها:
- يُرجى العِلم أنّه أثناء إدخال عبارة التدريب، سيضيف Dialogflow CX تلقائيًا تعليقات توضيحية إلى الكيانات. إذا لم يتم ذلك، قد تحتاج إلى تعديل العنصر (عن طريق إضافة مرادف) أو إضافة تعليق توضيحي يدويًا إلى عبارة التدريب بنفسك.
- عبارات التدريب الأقصر: يمكن لنظام الفهم اللغوي الطبيعي في Dialogflow أيضًا العمل مع عبارات التدريب الأقصر، وقد قدّمنا بعض الأمثلة هنا.
- التدريب المفرط: قد يؤدي استخدام عدد كبير جدًا من عبارات التدريب لغرض معيّن إلى التدريب المفرط والحصول على نتيجة غير مرغوب فيها. من أفضل الممارسات استخدام الاختبار التكراري والتزايدي وإضافة عبارات تدريبية في حال عدم العثور على نية مطابقة.
الاسم المعروض | عبارات التدريب |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
بعد أن أصبحت العناصر القابلة لإعادة الاستخدام (التدفقات والكيانات والنوايا) جاهزة، يمكننا تجميعها معًا من خلال إنشاء صفحات ومعالجات الحالة.
6. الصفحات ومعالجات الحالة
يمكن وصف محادثة Dialogflow CX (جلسة) وتصوّرها على أنّها آلة ذات حالات محدودة. لنأخذ آلة البيع كمثال، يمكن تصميمها كآلة ذات حالات محدودة. تتضمّن هذه الآلة الحالات التالية: "في انتظار العملات المعدنية" و"اختيار الحلوى" و"تقديم الحلوى"، وعند إدخال مجموعة من البيانات، تنتقل الآلة بين هذه الحالات. على سبيل المثال، يؤدي إدخال عملة معدنية إلى نقل آلة البيع الذاتية من "في انتظار العملات المعدنية" إلى "اختيار الحلوى". الصفحات هي الطريقة التي يمكننا من خلالها تصميم هذه الحالات لمساعد افتراضي في Dialogflow CX.
عندما يتفاعل مستخدم نهائي مع Dialogflow CX في محادثة، تنتقل المحادثة من صفحة إلى أخرى، وبالتالي في أي لحظة معيّنة، تكون هناك صفحة واحدة فقط هي الصفحة الحالية، وتُعتبر الصفحة الحالية نشطة، كما يُعتبر التدفق المرتبط بهذه الصفحة نشطًا أيضًا.
بالنسبة إلى كل Flow، يمكنك تحديد العديد من الصفحات، حيث يمكن لصفحاتك المجمّعة التعامل مع محادثة كاملة حول المواضيع التي تم تصميم Flow من أجلها. يحتوي كل مسار على صفحة بدء خاصة. عندما يصبح أحد المسارات نشطًا في البداية، تصبح صفحة البدء هي الصفحة الحالية. في كل خطوة من المحادثة، ستبقى الصفحة الحالية كما هي أو سيتم الانتقال إلى صفحة أخرى. سيتيح لك هذا المفهوم إنشاء وكلاء أكبر يتضمّنون العديد من الصفحات وعدة أدوار في المحادثة.
تحتوي الصفحات على عمليات تنفيذ (مربّعات حوار إدخال ثابتة و/أو خطافات ويب) ومَعلمات ومعالجات حالة. تتم عملية التحكّم في المحادثة من خلال معالجات الحالة، ما يتيح لك إنشاء مسارات انتقال مختلفة للانتقال إلى صفحة أخرى في Dialogflow CX، بما في ذلك جعلها مشروطة (لتفريع المحادثات).
يتم التحكّم في حالة المحادثة من خلال التعامل مع عمليات الانتقال بين الصفحات باستخدام ثلاثة أنواع مختلفة من المسارات:
- مسارات تحديد النية: عندما يجب مطابقة النية (على سبيل المثال، تغيير الصفحة استنادًا إلى ما يقوله المستخدم النهائي). (الخطوط الزرقاء في المخطط المرئي)
- مسارات الشرط: عندما يجب التحقّق من شرط معيّن (مثل تغيير الصفحة استنادًا إلى مَعلمات معيّنة مخزّنة في الجلسة) (الخطوط البرتقالية في الرسم التوضيحي المرئي)
- معالِجات الأحداث: عندما يجب التعامل مع حدث احتياطي معيّن (مثل عدم إدخال أي بيانات أو عدم العثور على تطابق، وذلك لتوضيح الغرض للمستخدم النهائي إما من خلال مسار الغرض أو مسار الشرط) (الخطوط الخضراء في الرسم التوضيحي)
يتم تحديد عبارات المحادثة (أي المحتوى أو الردّ على المستخدم) من خلال التنفيذ، الذي يمكن أن يكون ثابتًا أو ديناميكيًا:
- التنفيذ الثابت: عند تقديم ردّ ثابت بشأن التنفيذ
- التنفيذ الديناميكي: عندما يتم استدعاء خطاف ويب للتنفيذ من أجل الردود الديناميكية
بالنسبة إلى روبوت البيع بالتجزئة، سننشئ بعض مسارات الأهداف ونقدّم بعض استجابات تنفيذ الإدخال الثابت، والتي سيتم عرضها للمستخدم فور تفعيل الصفحة. في وقت لاحق، سننشئ مَعلمات مع مسارات شرطية لجمع المعلومات التي ستحتاج إليها لتقديم طلب شراء سلع.
مسارات Intent للصفحات
إنشاء الصفحات في "مسار البدء التلقائي"
في ما يلي مخطط انسيابي لتدفق البدء التلقائي:

لننقر على هذا الرابط معًا:
- انقر على إنشاء > مسار البدء التلقائي.
- انقر على صفحة البدء.
- انقر على رمز + بجانب الطرق
- أضِف redirect.artists.overview.
- انتقِل للأسفل إلى الانتقال، ثم انتقِل إلى مسار الفهرس.
- انقر على حفظ
- كرِّر الخطوات أعلاه بالنسبة إلى
redirect.product.overviewوالصفوف الـ 11 الأخرى من هذا الجدول:
صفحة (في التدفق) | المسارات > الغرض | المسارات > الانتقال إلى |
بدء |
| - |
بدء |
| Flow: Catalog |
بدء |
| Flow: Catalog |
بدء |
| Flow: Catalog |
بدء |
| Flow: Catalog |
بدء |
| Flow: Catalog |
بدء |
| Flow: Catalog |
بدء |
| المسار: خدمة العملاء |
بدء |
| المسار: خدمة العملاء |
بدء |
| المسار: خدمة العملاء |
بدء |
| Flow: My Order |
بدء |
| Flow: My Order |
بدء |
| Flow: My Order |
بدء |
| الصفحة: إنهاء الجلسة |

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

إنشاء الصفحات في "مسار الكتالوج"
ينتمي نص المحادثة التالي إلى مسار "الكتالوج":
> "Hi"
"Welcome, I am the virtual agent of G-Records, a fictional rock label.
You can order artists merchandise, ask questions about your order or shipping,
and I can tell you more which artists are currently signed with us. How can I help?"
> "Which bands are signed with this record label?"
"The following bands are signed with G-Records:
Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
From which of these artists would you like to order merchandise?"
> "Alice Googler"
"You want to rock with Alice Googler merchandise. Awesome!
We sell shirts, music or the tour movie.
Which merchandise item do you want?"
"(Suggestion chips: [Shirts] [Music] [Tour Movie])"
> "I would like to buy a Shirt"
"Do you want a longsleeve or a t-shirt?"
"(Suggestion chips: [T-shirt, Longsleeve, Price?])"
> "What's the price difference?"
"A t-shirt costs $25 and a longsleeve costs $30.
Do you want a longsleeve or a t-shirt?"
> "A t-shirt",
"What shirt size do you want?"
"(Suggestion chips: [XS, S, M, L, XL, 2XL, 3XL])"
> "M"
"A T-shirt of Alice Googler size: M costs $25. Shall I continue to order?"
سيختلف مربّع الحوار عند اختيار موسيقى أو فيلم جولة: بالنسبة إلى "موسيقى"، سيظهر مربّع الحوار على النحو التالي:
> "Music"
"We have a Greatest Hits Album or the Live Album. Which one do you want?"
"(Suggestion chips: [Greatest Hits, Live, Price?])"
> "The Live Album"
"Do you want this album on CD or MP3?"
"(Suggestion chips: [CD, MP3])"
> "What's the price difference?"
"A CD costs $15. The digital album on MP3 costs $10.
Do you want this album on CD or MP3?"
> "Digital Album",
"The Digital Album: Alice Googler - Live costs $10. Shall I continue to order?"
بالنسبة إلى "فيلم الجولة"، سيبدو مربع الحوار على النحو التالي:
> "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
في ما يلي مخطط انسيابي لجميع الصفحات ضمن مسار "الكتالوج":

لاحظ مدى تعقيد هذا المسار:
- يمكنني تخطّي السؤال عن الفنانين وطرح السؤال "ما هي السلع المتوفرة؟" على الفور.
- من "مسار البدء التلقائي"، يمكنني أن أقول: "أريد شراء قميص The Google Dolls" أو "أريد شراء شيء ما". وهذا يعني أنّ الوكيل الافتراضي سيطرح أسئلة متابعة لملء الخانات الخاصة بهذه المَعلمات المطلوبة. ينتقل مباشرةً إلى صفحة المنتج.
- يأتي مربّع الحوار "السعر" من صفحة "السعر" التي سيتم إعادة استخدامها.
- على الرغم من أنّ الحوار الخاص بفيلم Tour يبدو أبسط حوار، سننفّذ في الواقع إجراءً خاصًا معه. سنعيد استخدام هذا الجزء من مربّع الحوار، لذا يمكن للمستخدمين النهائيين أيضًا إدخاله مباشرةً لأحد المنتجات الأخرى، إذا كانوا يقدّمون كل المعلومات في وقت واحد:
> "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
لنبدأ أولاً بربط الصفحات.
- انقر على إنشاء > الكتالوج
- انقر على صفحة البدء.
- انقر على رمز + بجانب الطرق
- أضِف redirect.artists.overview.
- انتقِل للأسفل إلى الانتقال، واختَر صفحة، ثم اختَر: + صفحة جديدة
- استخدِم اسم الصفحة:
Artist Overviewواضغط على حفظ
لنُكمل الآن بقية الخطوات:
- يمكن تكرار الخطوات السابقة مع الصفحات والنوايا وعمليات التنفيذ التالية. الاستيلاء على هذا الجدول الصفحة هي الصفحة التي ستختارها في التدفق، والمسارات > الانتقال إلى هو التدفق أو الصفحة الجديدة التي ستنشئها وتنتقل إليها.
صفحة (في التدفق) | المسارات > الغرض | المسارات > الانتقال إلى |
بدء الكتالوج |
| نظرة عامة على الفنّان |
بدء الكتالوج |
| المنتج |
بدء الكتالوج |
| نظرة عامة على المنتج |
بدء الكتالوج |
| نظرة عامة على المنتج |
بدء الكتالوج |
| قمصان |
بدء الكتالوج |
| موسيقى |
بدء الكتالوج |
| إنهاء الجلسة |
بدء الكتالوج |
| إنهاء العملية |
نظرة عامة على الفنّان |
| نظرة عامة على المنتج |
لنواصل الآن ونضيف المزيد من عمليات التنفيذ الثابتة.
- في مسار "قائمة الفنانين"، انقر على صفحة نظرة عامة على الفنان.
- انقر على تعديل عملية التنفيذ في قسم تنفيذ الطلب.
- استخدِم عمليات التنفيذ الثابتة التالية (ردّ الوكيل):
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- انقر على حفظ.
- في مسار "الكتالوج"، انقر على صفحة نظرة عامة على المنتج.
- انقر على تعديل عملية التنفيذ في قسم تنفيذ الطلب.
- استخدِم عبارة التنفيذ الثابتة التالية (يقول الوكيل):
We sell shirts, music or the tour movie.
- انقر على حفظ.
مَعلمات الصفحة
تُستخدَم المَعلمات لتسجيل القيم التي يقدّمها المستخدم النهائي والإشارة إليها أثناء الجلسة. لكل مَعلمة اسم ونوع كيان. @Artist و@Merch هما الحد الأدنى من المَعلمات التي نحتاج إلى جمعها لتنفيذ طلب شراء سلع. بالنسبة إلى القمصان العادية أو ذات الأكمام الطويلة، عليك أيضًا جمع @ShirtSize، وفي حال أردت طلب موسيقى، ستحتاج أيضًا إلى اسم @Carrier و@Album.
يجب وضع علامة مطلوبة على هذه المَعلمات. وبعد أن يصبح ذلك مطلوبًا، عليك تقديم طلبات مخصّصة لتذكُّر المستخدم النهائي، وتقديم الإجابات الصحيحة حتى يمكن جمع هذه المَعلمات. تتوفّر بعض الآليات في Dialogflow CX التي يمكن أن تساعدك في ذلك.
على سبيل المثال، يمكنك تقديم رسائل تنفيذ ثابتة مخصّصة في قسم المَعلمة. إذا كانت المَعلمة مطلوبة، سيتم عرض عمليات استيفاء المَعلمات هذه. ستتم إضافة رسائل الرد هذه إلى قائمة انتظار الردود. خلال دور أحد العملاء، من الممكن (وأحيانًا من المستحسن) طلب تنفيذ عدة طلبات، وقد يؤدي كل منها إلى إنشاء رسالة رد. يحتفظ Dialogflow بهذه الردود في قائمة انتظار الردود. للاطّلاع على مزيد من المعلومات حول دورة حياة الصفحة وترتيب إضافة عمليات التنفيذ هذه إلى قائمة انتظار الردود، يُرجى قراءة مستندات صفحة Dialogflow CX.
إنشاء المَعلمات في صفحة "نظرة عامة حول الفنّان"
لنحدّد بعض مَعلمات الصفحة:
- في مسار قائمة الفنانين، انقر على صفحة نظرة عامة على الفنان.
- انقر على + في مربّع المَعلمات. أضِف المَعلمة artist:
- الاسم المعروض:
artist - نوع الكيان:
@Artist - مطلوب: التحقّق
- الإخفاء في السجلّ: وضع علامة
- سنضيف الآن بعض رسائل التنفيذ الخاصة بالمعلمات المخصّصة. إذا لم يجمع الوكيل الافتراضي المَعلمة artist بعد، سيتلقّى المستخدم النهائي رد الوكيل هذا المُضاف إلى قائمة انتظار الردود:
From which of these artists would you like to order merchandise?
- أضِف خيار حوار ثانيًا يوفّر شرائح اقتراحات غنية. انقر على إضافة خيار حوار واستخدِم الرمز التالي (بتنسيق JSON):
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
من الممكن التعامل مع طلبات مختلفة للردّ الاحتياطي بناءً على عدد المحاولات التي أجراها المستخدم النهائي للإجابة عن هذه الطلبات. يمكنك إجراء ذلك باستخدام معالجات أحداث المَعلمات. تتوفّر معالجات أحداث مضمّنة مختلفة يمكنك الاختيار من بينها، مثل مَعلمات غير صالحة أو عبارات طويلة جدًا أو لم يتم إدخال أي بيانات أو لم يتم إدخال أي بيانات في المحاولة الأولى أو المحاولة الثانية أو لم يتم العثور على تطابق. الفرق بين عدم إدخال أي بيانات وعدم العثور على تطابق هو أنّه في حالة عدم إدخال أي بيانات، لم يقدّم المستخدم أي إجابة، بينما في حالة عدم العثور على تطابق، قدّم المستخدم إجابة ولكن لم يتمكّن Dialogflow CX من مطابقة هذه الإجابة مع أي صفحة.
- انتقِل للأسفل إلى قسم معالِجات أحداث إعادة الطلب.
- انقر على إضافة معالج أحداث واختَر الحدث:
No-match default - استخدِم نص التنفيذ الثابت التالي للحدث:
I missed that. Please, specify the artist. You can choose between: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- انقر على حفظ.
- انقر على إضافة معالج أحداث واختَر الحدث:
No-input default - استخدِم نص التنفيذ الثابت التالي للحدث:
I am sorry, I could understand the artist's name. You can choose between Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- انقر على حفظ.
مسارات حالة الصفحة
تكون المَعلمات فعّالة جدًا عند استخدامها مع مسارات الصفحة الشرطية. عندما يتم تقييم شرط على أنّه صحيح، سيتم استدعاء مسار الصفحة المرتبط به. يمكن أن يكون الشرط إحدى المَعلمات تساوي قيمة معيّنة أو لا يمكن أن تكون إحدى المَعلمات غير متوفّرة أو تمّ إكمال نموذج وغير ذلك الكثير. يمكنك العثور على مزيد من المعلومات حول المَعلمات والشروط في مستندات Dialogflow CX.
بالنسبة إلى وكيلنا الافتراضي الخاص بقطاع البيع بالتجزئة، سنحتاج إلى جمع سلسلة من المَعلمات، وبالتالي سنحتاج إلى إنشاء شرط للتحقّق مما إذا تم إكمال "نموذج" أم لا. النموذج هو قائمة بالمعلمات التي يجب جمعها من المستخدم النهائي للصفحة. يتفاعل الوكيل الافتراضي مع المستخدِم النهائي في عدة أدوار محادثة، إلى أن يجمع كل مَعلمات النموذج المطلوبة، والمعروفة أيضًا باسم مَعلمات الصفحة.
يضبط Dialogflow CX تلقائيًا قيم المَعلمات التي يقدّمها المستخدم النهائي أثناء ملء النموذج. للتحقّق مما إذا كان النموذج الكامل للصفحة الحالية قد تم ملؤه، استخدِم الشرط التالي: $page.params.status = "FINAL"
إنشاء المسارات الشرطية في صفحة "نظرة عامة حول الفنّان"
لننشئ مسارًا شرطيًا سينتقل إلى الصفحة التالية بعد التعرّف على الفنان:
- في صفحة نظرة عامة على الفنان، انقر على الرمز + في قسم قنوات التوزيع.
- انتقِل إلى قسم الحالة.
- اختَر واحد على الأقل (أو)
- بعد ذلك، سنكتب تعبيرًا
- المَعلمة:
$page.params.status - المشغّل:
= - القيمة:
"FINAL"
- الآن، سننشئ رسالة تنفيذ ثابتة معيّنة على المسار، تؤكّد اختيار المستخدم النهائي. انتقِل للأسفل إلى قسم التنفيذ واكتب رسائل التنفيذ التالية:
$session.params.artist, great choice! Rock on!You want to rock with $session.params.artist merchandise. Awesome!
- عندما يكون الشرط صحيحًا، يجب الانتقال إلى صفحة نظرة عامة على المنتج. انتقِل للأسفل إلى قسم الانتقال واستخدِم الصفحة التالية:
Product Overview - انقر على حفظ.

إنشاء المسارات في صفحة "نظرة عامة على المنتج"
بعد أن تعرّفنا على كيفية إنشاء المَعلمات والمسارات الشرطية، لننشئ المزيد من المَعلمات للصفحات التالية:
نظرة عامة على المنتج
- إنشاء المَعلمة
artistفي صفحة نظرة عامة على المنتج:
- الاسم المعروض:
artist - نوع الكيان:
@Artist - مطلوب: التحقّق
- الإخفاء في السجلّ: وضع علامة
- تنفيذ الطلب الأوّلي:
From which of these artists would you like to order merchandise?
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- معالج الأحداث >
No-match default:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from? - الحمولة المخصّصة:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- معالج الأحداث >
No-input default:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist were you trying to mention? - الحمولة المخصّصة:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- إنشاء المَعلمة
merch:
- الاسم المعروض:
merch - نوع الكيان:
@Merch - مطلوب: علامة اختيار
- الإخفاء في السجلّ: وضع علامة
- التنفيذ:
Which merchandise item do you want? - انقر على: إضافة خيار حوار > حمولة مخصّصة:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- معالج الأحداث >
No-match default - تنفيذ معالج الأحداث:
We sell Shirts, Music or the Tour movie. Which of these items do you want? - الحمولة المخصّصة:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- معالج الأحداث >
No-input default - تنفيذ معالج الأحداث:
I couldn't understand which merchandise item you wanted to buy. You can choose between: Shirts, Music or the Tour movie. Which item do you want? - الحمولة المخصّصة:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- أنشئ مسارًا سينتقل إلى صفحة المنتج عند توفير
artistوتوفير العنصرmerch.
- الشرط:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.artist != null - التعبير:
$session.params.merch != null - التنفيذ:
Alright! $session.params.merch of $session.params.artist, let's go! - الانتقال: الصفحة:
Product
- إنشاء مسار عندما يقول المستخدم "قمصان"
- Intent: redirect.shirts
- الانتقال: الصفحة:
Shirts
- إنشاء مسار عندما يقول المستخدم "موسيقى"
- الغرض: redirect.music
- الانتقال: الصفحة:
Music
- إنشاء مسار عندما يطلب المستخدم معلومات حول السعر
- Intent: redirect.price
- الانتقال: إنشاء صفحة جديدة:
Price
بعد ضبط الإعدادات المذكورة أعلاه، سيظهر لك تمثيل مرئي مشابه للصورة أدناه. يُرجى العِلم أنّ مسارات الأهداف تكون باللون الأزرق في المخطّط، بينما تكون مسارات الشروط باللون البرتقالي. على الرغم من عدم توضيح ذلك، تكون معالجات الأحداث باللون الأخضر، وعندما تنتقل أنواع مسارات متعدّدة إلى صفحة، سيكون الخط باللون الرمادي.

حتى الآن، تعلّمت كيفية إنشاء تدفقات وكيانات ونيّات وصفحات باستخدام معالجات الحالة، مثل مسارات النية والمسارات الشرطية استنادًا إلى المَعلمات. في وقت لاحق من هذا الدرس التطبيقي، سنستخدم التشعّب الشرطي في التنفيذ لتقديم حوارات مختلفة استنادًا إلى الإدخال.
يمكنك استخدام الإعدادات التالية لإنهاء إعداد الوكيل الافتراضي.
صفحة القمصان:
- أنشئ الإعدادات التالية في صفحة القمصان:
- تنفيذ الطلب:
Do you want a longsleeve or a t-shirt? - حمولة مخصّصة لعملية إكمال الإدخال:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
},
{
"text": "Price?"
}
]
}
]
]
}
- إنشاء مسار Intent:
redirect.priceمع انتقال إلى صفحةPrice - أنشئ المَعلمة التالية:
- المَعلمة:
merch- نوع الكيان:@MerchوRequiredوRedact in log - المَعلمة > معالج الأحداث >
No-match default - المَعلمة > تنفيذ معالج الأحداث:
You can choose between a t-shirt or a longsleeve. Which of these do you want? - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- المَعلمة > معالج الأحداث >
No-input default - المَعلمة > تنفيذ معالج الأحداث:
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want? - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- انقر على "تنفيذ الإدخال" (entry fulfillment) وانتقِل للأسفل إلى الإعدادات المُسبقة للمَعلمات (Parameter presets). في كل مرة تصبح فيها صفحة "القمصان" نشطة، سيتم ضبط مَعلمة الفئة على قمصان:
المعلَمة | القيمة |
|
|
- إضافة مسار شرطي:
- مطابقة قاعدة واحدة على الأقل (أو)
- التعبير:
$session.params.merch = "T-shirt" - التعبير:
$session.params.merch = "Longsleeve" - الانتقال إلى الصفحة الجديدة:
Shirt Size
صفحة الأسعار:
بما أنّ الرسائل المتعلقة بالأسعار ستعتمد على السلعة أو الفئة المحدّدة (الموسيقى أو القمصان)، سنحلّ هذه المشكلة لاحقًا في المختبر. يكفي إدخال عنصر نائب في الوقت الحالي.
- أنشئ الإعدادات التالية في صفحة السعر:
- تنفيذ الطلب:
PRICE TODO
بما أنّه يمكنك طلب السعر من أماكن مختلفة في المحادثة، يجب أن يقدّم لك دائمًا إجابة ويعيدك إلى الجزء السابق من الحوار لمواصلة الطلب. هناك 5 مواضع في شجرة الحوار يمكنك فيها التفرّع للحصول على معلومات الأسعار. (القميص، ومقاس القميص، والموسيقى، وشركة النقل، وأيضًا مباشرةً من خلال مسار Intent)، وبالتالي سنحتاج إلى بعض المسارات الشرطية للرجوع:
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.category = "shirts" - التعبير:
$session.params.merch = "null" - الانتقال إلى الصفحة الجديدة:
Shirts
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.category = "shirts" - التعبير:
$session.params.size = "null" - الانتقال إلى الصفحة الجديدة:
Shirt Size
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.category = "music" - التعبير:
$session.params.album = "null" - الانتقال إلى الصفحة الجديدة:
Music
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.category = "music" - التعبير:
$session.params.merch = "null" - الانتقال إلى الصفحة الجديدة:
Carrier
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.category = "null" - الانتقال إلى الصفحة الجديدة:
Product Overview
صفحة مقاس القميص:
- أنشئ الإعدادات التالية في صفحة مقاس القميص:
- تنفيذ الطلب:
What shirt size do you want? - حمولة مخصّصة لعملية إكمال الإدخال:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- أنشئ مسار Intent:
redirect.priceمع انتقال إلى صفحةPrice. - أنشئ المَعلمة التالية:
- المَعلمة:
shirtsize- نوع العنصر:@ShirtSize-Required،Redact In Log - المَعلمة > معالج الأحداث >
No-match default - المَعلمة > تنفيذ معالج الأحداث:
Please tell me the shirt size, such as XL. - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- المَعلمة > معالج الأحداث >
No-input default - المَعلمة > تنفيذ معالج الأحداث:
I couldn't understand the shirt size. What size do you want? - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$page.params.shirtsize != "null" - الانتقال إلى الصفحة:
Product
صفحة الموسيقى:
- أنشئ الإعدادات التالية في صفحة الموسيقى:
- تنفيذ الطلب:
We have a Greatest Hits Album or the Live Album. Which one do you want? - حمولة مخصّصة لعملية إكمال الإدخال:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
},
{
"text": "Price?"
}
]
}
]
]
}
- أنشئ مسار Intent:
redirect.priceمع انتقال إلى الصفحة:Price. - أنشئ المَعلمة التالية:
- المَعلمة:
album- نوع العنصر:@Album-Required،Redact In Log - المَعلمة > معالج الأحداث >
No-match default - المَعلمة > تنفيذ معالج الأحداث:
You can choose between Greatest Hits and Live Album. Which of these do you want? - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- المَعلمة > معالج الأحداث >
No-input default - المَعلمة > تنفيذ معالج الأحداث:
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want? - المَعلمة > حمولة مخصّصة لتنفيذ معالج الأحداث:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- انقر على تنفيذ الإدخال وانتقِل للأسفل إلى إعدادات المَعلمات المُسبَقة، وفي كل مرة تصبح فيها صفحة "الموسيقى" نشطة، سيتم ضبط مَعلمة الفئة على music:
المعلَمة | القيمة |
|
|
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$page.params.album != "null" - الانتقال إلى الصفحة:
Carrier
صفحة مشغّل شبكة الجوّال:
- أنشئ الإعدادات التالية في صفحة شركة النقل:
- تنفيذ الطلب:
Do you want this album on CD or MP3? - حمولة مخصّصة لعملية إكمال الإدخال:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
},
{
"text": "Price?"
}
]
}
]
]
}
- أنشئ مسار Intent:
redirect.priceالذي ينتقل إلى صفحةPrice. - أنشئ المَعلمة التالية:
- المَعلمة:
merch- نوع العنصر:@Merch-Required،Redact In Log - المَعلمة > معالج الأحداث >
No-match default - المَعلمة > تنفيذ معالج الأحداث:
Do you want a physical CD or the digital album? - المَعلمة > تنفيذ معالج الأحداث: الحمولة المخصّصة:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "Digital Album"
}
]
}
]
]
}
- المَعلمة > معالج الأحداث >
No-input default - المَعلمة > تنفيذ معالج الأحداث:
I couldn't understand if you mean CD or MP3. Which one do you want? - المَعلمة > تنفيذ معالج الأحداث: الحمولة المخصّصة:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
}
]
}
]
]
}
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$page.params.merch != "null" - الانتقال إلى الصفحة:
Product
صفحة المنتج:
- أنشئ المَعلمات التالية:
اسم العرض الخاص بالمَعلمة | نوع عنصر المَعلمة | عمليات التحقّق |
|
| مطلوب، إخفاء المعلومات في السجلّ |
|
| مطلوب، إخفاء المعلومات في السجلّ |
- يجب أن تستوفي المَعلمة artist متطلبات الطلب الأولي التالية، والتي ستظهر عندما لا يكون الفنان معروفًا.
You didn't mention which artist you are interested in. You can ask me to buy the $session.params.merch of the artist you like or ask which artists we signed. How can I help?
{
"richContent": [
[
{
"options": [
{
"text": "Which artists?"
}
],
"type": "chips"
}
]
]
}
- أضِف أيضًا معالج أحداث
No-input defaultمع التنفيذ:I couldn't understand what you just said. Ask me which artists are signed. - و
No-match defaultمعالج أحداث مع التنفيذ:I missed that. Please ask me which artists are signed.
- تحتاج المَعلمة merch أيضًا إلى معالجات أحداث إعادة الطلب.
- أضِف معالج أحداث
No-input defaultمع التنفيذ:I couldn't understand what you just said. Which merchandise item do you want? - و
No-match defaultمعالج أحداث مع التنفيذ:I missed that. Which merchandise item do you want?
سينتقل المسار التالي إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "فيلم جولة".
- إضافة مسار شرطي:
- مطابقة كل قاعدة (و)
- التعبير:
$session.params.artist != null - التعبير:
$session.params.merch = "Tour Movie" - إعدادات مسبقة للمَعلمات إضافة مَعلمة >
price = 25 - الانتقال إلى الصفحة الجديدة:
Confirmation
سينتقل المسار التالي إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "قميصًا" ويتم تحديد مقاس القميص.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null - إعدادات مسبقة للمَعلمات إضافة مَعلمة >
price = 25 - الانتقال إلى الصفحة:
Confirmation
سينتقل المسار التالي إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "قميصًا بأكمام طويلة" ويتم تحديد حجم القميص.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null - إعدادات مسبقة للمَعلمات إضافة مَعلمة >
price = 30 - الانتقال إلى الصفحة:
Confirmation
سينتقل المسار التالي إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "قرصًا مضغوطًا" ويتم أيضًا اختيار اسم الألبوم.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null - إعدادات مسبقة للمَعلمات إضافة مَعلمة >
price = 15 - الانتقال إلى الصفحة:
Confirmation
سينتقل المسار التالي إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "ألبومًا رقميًا" ويتم اختيار اسم الألبوم.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null - إعدادات مسبقة للمَعلمات إضافة مَعلمة >
price = 10 - الانتقال إلى الصفحة:
Confirmation
بعد ذلك، سننشئ بعض الشروط المتقدّمة باستخدام طلبات تحدّد المعلومات الناقصة. سيعود المسار التالي إلى صفحة الموسيقى عندما يكون الفنّان معروفًا ويختار المستخدم "قرصًا مضغوطًا" أو "ألبومًا رقميًا" ولكن لم يتم اختيار اسم الألبوم.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null - التنفيذ:
I would also need to know which album you would like to buy! - الانتقال إلى الصفحة:
Music
سينتقل المسار الأخير إلى صفحة التأكيد عندما يكون الفنان معروفًا ويختار المستخدم "قميصًا" أو "قميصًا بأكمام طويلة"، ولكن عندما لا يتم اختيار حجم القميص.
- إضافة مسار شرطي:
- التعبير المخصّص:
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null - التنفيذ:
I would also need to know which shirt size you need! - الانتقال إلى الصفحة:
Shirt Size
في الجزء التالي من المختبر، سنستفيد من عمليات التنفيذ الشرطية لتقديم رسائل تنفيذ مختلفة استنادًا إلى الإدخال.
7. الردود الشرطية
ستعرض بعض الردود حوارًا مختلفًا استنادًا إلى الإدخال، وستتفرّع الحوارات، ونطلق على ذلك اسم الردود الشرطية. يمكن أن يصبح هذا الأمر مثيرًا للاهتمام عندما لا تستخدم عمليات التنفيذ عبر Webhook، حيث يتم تحديد الردود الشرطية على الخلفية. قد يبدو المثال على النحو التالي:
if [condition]
[response]
elif [condition]
[response]
elif [condition]
[response]
else
[response]
endif
- مثال على [شرط]:
$session.params.user-age >= 21. يستخدم تنسيقًا مشابهًا للتنسيق المستخدَم في شروط المسارات. - تتلقّى [الاستجابة] استجابة نصية ثابتة
- تبدأ الردود الشرطية دائمًا بـ
if - كتل
elifوelseاختيارية
يمكن أن يستفيد Dialogflow CX أيضًا من وظائف النظام المضمّنة. على سبيل المثال، لتنسيق تاريخ أو وقت، أو لعرض الوقت الحالي ($sys.func.NOW())
لننهِ مسار الكتالوج من خلال إصلاح صفحتَي التأكيد والسعر.
صفحة التأكيد:
الآن، سننشئ صفحة التأكيد. يجب استيفاء المتطلبات التالية:
- إذا كانت السلع قرصًا مضغوطًا أو ألبومًا رقميًا سنعرض الحقول التالية في التأكيد: artist وmerch وalbum وprice.
- إذا كانت السلعة هي قميص أو قميص بأكمام طويلة سنعرض الحقول التالية في التأكيد: الفنان والسلع والمقاس والسعر.
- خلاف ذلك (وبالتالي إذا كانت قيمة السلع الترويجية هي فيلم الجولة). سنعرض الحقول التالية في التأكيد: artist وmerch وprice.
- انقر على صفحة التأكيد.
- انقر على "تعديل التنفيذ" (Edit Fulfillment) > "ردود الوكيل" (Agent Responses) > خيار إضافة حوار > الردّ الشرطي:
if ($session.params.merch = "CD" OR $session.params.merch = "Digital Album")
The $session.params.merch: $session.params.artist - $session.params.album costs $$session.params.price. Shall I continue to order?
elif ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve")
A $session.params.merch of $session.params.artist size: $session.params.shirtsize costs $$session.params.price. Shall I continue to order?
elif $session.params.merch = "Tour Movie"
The $session.params.merch of $session.params.artist costs $$session.params.price. Shall I continue to order?
else
It looks like something went wrong with your order. You can say "Reset", to restart the order process.
endif
- Create the following Custom payload:
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Yes, confirm"
}
],
"type": "chips"
}
]
]
}
Next, create two intent routes:
confirm.proceed.ordertransitions to:Order ProcessFlow.decline.proceed.ordertransitions toEnd Flow
When the user declines the order, and does not want to proceed the order process, we will have to transition back to the welcome page, but all the parameters have to be cleared. We can do this by specifically setting null to all the possible parameters. You can do this with Parameter presets.
- In the decline.proceed.order intent route, scroll down to Parameter presets and add the following parameters:
Parameter | Value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notice that we have created an additional parameter called restart. If this parameter is present, the Default Start Flow, should know to continue the conversation by showing a customized message.
- Click on the Default Start Flow, Start Page, and create another Conditional Route:
$session.params.restart = "true"- Fulfillment:
"Welcome back, as the virtual agent of G-Records, I can help you order artists merchandise, you can ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?" - Custom payload:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Select the Start Page and click on the
redirect.endintent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
Price Page:
Let's also fix the Price TODOs. The price information will be static for now. Click on the Price Page in the Catalog Flow, and use the following entry fulfillment:
- Delete the Agent Says entry fulfillment.
- Create a new Conditional Response:
if $session.params.category = "shirts"
A t-shirt costs $25 and a longsleeve costs $30.
elif $session.params.category = "music"
A CD costs $15. The digital album on MP3 costs $10.
else
A t-shirt costs $25 and a longsleeve costs $30. A CD costs $15 and a digital album on MP3 $10. In case you are interested in the Tour Movie, that one is $25.
endif

Well done, by now you completed the Catalog flow. Your flow should look similar to this diagram:
8. Wrapping up the agent
We are almost at the end of this lab. Let's configure the last flows together, and take in practice all the new things that we have learned.
Creating the My Order Flow
- Go to the My Order Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
My Order Start |
| My Order |
My Order Start |
| My Order Status |
My Order Start |
| My Order Cancellation |
My Order Start |
| End Session |
My Order Start |
| End Flow |
My Order |
| My Order Status |
My Order |
| My Order Cancellation |
Default Start Flow |
| Flow: My Order |
Default Start Flow |
| Flow: My Order |
- Let's create the following entry fulfillment for the My Order Page:
- Entry fulfillment:
I can look up the status of your order, or I can cancel an order.
- In the My Order Page create the following parameter:
- Displayname:
ordernumber - Entity Type:
@OrderNumber - Required: checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123. - Event Handler:
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler:
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL" - Fulfillment:
And do you want to Cancel your order, or should I look up the status?
- Click on Add state handler > Event Handlers and create the Event Handler:
No-input default
- Fulfillment:
I'm sorry, what was that? Would you like me to cancel an order or look up the status? - Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- Create the Event Handler:
No-match default
- Fulfillment:
Would you like me to cancel an order or lookup the status? - Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- In the My Order Status Page create the following parameter:
- Displayname:
ordernumber - Entity Type:
@OrderNumber - Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123. - Event Handler:
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler:
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Status Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null - Fulfillment:
Your order $session.params.ordernumber has been shipped, it can take up to approx 2 weeks before you will receive your items. - Add dialogue option > Text:
Is there anything else I can help you with?
- In the My Order Cancelation Page create the following parameter:
- Displayname:
ordernumber - Entity Type:
@OrderNumber - Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123. - Event Handler:
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler:
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Cancelation Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null - Fulfillment:
Your order $session.params.ordernumber has been canceled. - Add dialogue option > Text:
Is there anything else I can help you with?
- Test the flow and create the following two test scenarios:
>"About my order"
>"ABCD123"
>"Status"
And:
>"What's the status of order DEFG222"
- Select the Start Page and click on the
redirect.endintent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day! - Select the Start Page and click on the
redirect.homeintent. Create the following parameter preset:restart = true
Default Negative intents (Fallback)
When you create a virtual agent, a default negative intent is created for you. You can add training phrases to this intent that act as negative examples that will trigger a No-match event. There may be cases where end-user input has a slight resemblance to training phrases in normal intents, but you do not want these inputs to match any normal intents.
- Try in the simulator:
I don't like Alice Googler.
You will see that the virtual agent answers with the Product Overview Page, to continue ordering Alice Googler merchandise. However, your end user does not like that artist. Let's use the Default Negative Intent for this.
- Go to Manage > Intents and select the Default Negative Intent.
- Add the following training phrases that will trigger the No-match event.
I don't like Alice GooglerI am not a fan of G's N' RosesI can't stand the music of the Google Dolls
- Hit Save and test the following sentence in the simulator:
I am really not a fan of the Goo Fighters
This time the No-match event was triggered, you stayed on the Start Page.
Default Fallback Messages
- Click the Default Start Flow, select the
sys.no-input-defaultevent handler.
The No-input fallback basically means: No text or speech answers were detected. Likely no answers were given, or the system couldn't hear it. Therefore, let's make the fallback messages more specific. Use the tab key, to create alternative dialogues:
- Remove all answers, and add these text dialogues:
I'm sorry, I didn't receive an answer. Can you say it again?I missed your answer, can you say it again?Sorry, I didn't hear anything. Can you say it again?I couldn't hear what you were saying, what was that?I'm sorry, I missed your answer. What were you trying to say?
Don't forget to click Save.
- Click the Default Start Flow, select the
sys.no-match-defaultevent handler.
The No Match fallback basically means: Text or speech answers were detected but nothing in Dialogflow CX got matched.
- Remove all answers, and add these text dialogues:
Sorry, I didn't get that. Can you please rephrase?I'm sorry, I don't understand. Can you please rephrase?I don't understand, please rephrase.Sorry, I didn't get that. What was that?I didn't get that, can you please rephrase?
Don't forget to click Save.
- It's advised to repeat these steps for the Catalog, My Order, Order Process and Customer Care flows.
Here's a tip: when creating fallback messages, make them more explicit, by rephrasing the previous question or by mentioning an example. You could create these type of No-match and No-input events on Page level when creating parameters. In our labs, we have already done this.
Creating the Order Process Flow
- Go to the Order Process Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
Order Process Start |
| End Session |
Order Process Start |
| End Flow |
Order Process Start |
| New Page: Shipping Details |
- Let's create the following entry fulfillment for the Shipping Details Page:
- Entry fulfillment:
To complete your order I will first need to collect your shipping details.
- Create the following parameters:
These parameters will make use of built-in system entities. System entity support differs for each language. See the docs for more information.
Parameter Display name | Entity | Required? | Initial prompt fulfillment | No-match default | No-input default |
| @sys.person | Required |
|
|
|
| @sys.person | Required |
|
|
|
| @sys.address | Required |
|
|
|
| @sys.any | Required |
|
|
|
| @sys.geo-city | Required |
|
|
|
| @sys.geo-country | Required |
|
|
|
| @sys.email | Required |
|
|
|
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL" - Transition to new Page:
Payment Details
- Create the following entry fulfillment.
Let's fake it that this virtual agent makes use of Google Pay. Don't worry this tutorial won't make real transactions. Create the following entry dialogues:
- Agent Says:
Alright $session.params.firstname! We will make use of Google Pay, that's connected to your email account: $session.params.email.
- Conditional Response
if $session.params.merch != "Digital Album"
Shipping costs an additional 5 dollars. This will make the total price $$sys.func.TO_TEXT($sys.func.ADD($session.params.price, 5)).
Your merchandise will be shipped to:
$session.params.firstname $session.params.lastname
$session.params.address
$session.params.zipcode $session.params.city
$session.params.country
To continue the order process please explicitly say "I confirm". Do you want to confirm your $session.params.artist $session.params.merch order?
else
The total costs will be: $$session.params.price.
After purchasing the digital album, you will receive an email with the download link.
To continue the order process please explicitly say "I confirm".
Do you want to confirm your $session.params.artist $session.params.merch order?
endif
- أنشئ مسار Intent التالي
- النية:
confirm.proceed.order - يقول موظّف الدعم:
Thank you for your order! Your merchandise will be shipped today! - إضافة خيار حوار > النص:
Here's the order number: ABCD123 - إضافة خيار حوار > نص:
Have a good day! - الانتقال:
End Session
- اختَر صفحة البدء وانقر على الغرض
redirect.end. أنشِئ عملية التنفيذ التالية:Thank you for contacting G-Records! Have a nice day! - اختَر صفحة البدء وانقر على الغرض
redirect.home. أنشئ إعدادًا مُسبقًا للمعلمة على النحو التالي:restart = true
رائع! أصبح لدينا الآن برنامج دردشة يعمل بشكل كامل خاص ببائع تجزئة في العالم الحقيقي. في الميزة الاختبارية التالية، سنختبر مدى أداء الوكيل الافتراضي.
9- اختبار الوكيل الافتراضي
يمكنك استخدام المحاكي المضمّن لاختبار حوارات وكيلك الافتراضي. تتمثّل ميزة اختبار التدفقات في المحاكي في أنّه سيظهر لك نظرة عامة جيدة على التدفقات والصفحات والمَعلمات والأحداث (DTMF) التي جمعها المحاكي أثناء التنقّل في تدفقاتك. ويسهّل ذلك عملية الاختبار مقارنةً باختبارها مباشرةً في عملية الدمج، لأنّ هذه الأنواع من المعلومات ستكون مخفية عن المستخدم النهائي. يمكنك حتى إنشاء حالات اختبار وحفظها وإعادة استخدامها. هذا الإجراء منطقي جدًا، ففي حال كنت تريد الحفاظ على تدفقاتك أو تعديلها بمرور الوقت، يمكنك التأكّد من أنّ أيًا من تغييراتك لن يؤدي إلى إتلاف عملك السابق.
يمكن أيضًا تصدير واستيراد حالات الاختبار التي تم إنشاؤها سابقًا، وذلك عن طريق تخزين الاختبارات في Google Cloud Storage أو على الجهاز. سيؤدي تصدير اختبار إلى تنزيل ملف ثنائي كبير. لمزيد من المعلومات عن المحاكي وحالات الاختبار، يمكنك الاطّلاع على مستندات المحاكي / حالات الاختبار.
قبل إنشاء بعض حالات الاختبار، لننهي أولاً بقية الوكيل الافتراضي:
إنشاء مسار خدمة العملاء
- انتقِل إلى مسار خدمة العملاء، وأنشِئ انتقالات الأهداف التالية:
صفحة (في التدفق) | المسارات > الغرض | المسارات > الانتقال إلى |
Customer Care Start |
| الشحن |
Customer Care Start |
| رد الأموال |
Customer Care Start |
| التبديل |
Customer Care Start |
| إنهاء العملية |
Customer Care Start |
| إنهاء الجلسة |

- أنشئ عمليات تنفيذ الإدخالات التالية لصفحة الشحن:
Shipping physical merchandise items can take up to 2 weeks.Is there anything else I can help you with?
- أنشئ عمليات إدخال البيانات التالية لصفحة ردّ الأموال:
We offer free returns and refunds. We provide one free return label for each order. You can use it within 30 days from receiving your order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.Is there anything else I can help you with?
- أنشئ عمليات إدخال البيانات التالية لصفحة المقايضة:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.Is there anything else I can help you with?
- اختَر صفحة البدء وانقر على الغرض
redirect.end. أنشِئ عملية التنفيذ التالية:Thank you for contacting G-Records! Have a nice day! - اختَر صفحة البدء وانقر على الغرض
redirect.home. أنشئ إعدادًا مُسبقًا للمعلمة على النحو التالي:restart = true
إنشاء حالات الاختبار
- انقر على الزر اختبار الوكيل على يسار الشاشة.
عند فتح المحاكي لأول مرة، عليك اختيار بيئة وكيل وتدفق نشط. في معظم الحالات، يجب استخدام بيئة المسودة ومسار البدء التلقائي.
- النوع:
Hi

- اسأل:
Which artists are signed with your label? - قُل:
The Google Dolls - قُل:
I am interested in buying a shirt - قُل:
A t-shirt - قُل:
Medium - انقر الآن على زر حفظ حالة الاختبار. يمكنك العثور على هذا الخيار في أعلى المحاكي (بجانب سهم الإعادة ورمز إعادة ضبط سلة المهملات).

- قدِّم له التفاصيل التالية:
- اسم حالة الاختبار:
Buy Google Dolls t-shirt size M - العلامات: #catalog, #shirts, #t-shirt, #TheGoogleDolls
- انقر على حفظ.
لننشئ المزيد من حالات الاختبار.
- أولاً، امحِ الحوار الحالي بالنقر على رمز إعادة الضبط (سلة المهملات).
- أنشئ حالات الاختبار التالية:
شراء قميص Alice Googler:
>"Buy the Alice Googler t-shirt."
>"XL"
- اسم حالة الاختبار:
Buy the Alice Googler t-shirt - العلامات:
#catalog, #shirts, #t-shirt, #AliceGoogler
أريد شراء قميص مقاس M: (لم يتم ذكر اسم الفنان، ولكنك تريد تخطّي صفحات نظرة عامة على الفرق الموسيقية ونظرة عامة على المنتجات والقمصان ومقاسات القمصان)
>"Buy a t-shirt size M"
>"The Google Fighters"
- اسم حالة الاختبار:
Buy a t-shirt size M - العلامات:
#catalog, #shirts, #t-shirt, #TheGoogleFighters - الوصف: (لم يتم ذكر اسم الفنان، ولكنك تريد تخطّي صفحات النظرة العامة على الفرق الموسيقية والنظرة العامة على المنتجات والقمصان ومقاسات القمصان)
شراء موسيقى G's N' Roses (سيؤدي ذلك إلى تخطّي صفحة النظرة العامة على الفرق الموسيقية وصفحة النظرة العامة على المنتجات)
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- اسم حالة الاختبار:
Purchase music of G's N' Roses - العلامات:
#catalog, #music, #CD, #GsNRoses, #live - الوصف: (سيؤدي ذلك إلى تخطّي صفحة النظرة العامة على النطاقات وصفحة النظرة العامة على المنتجات)
التحقّق من معلومات السعر:
>"Which products"
>"Shirts"
>"What's the price difference?"
>"Longsleeve"
>"What does it cost?"
>"M"
>"The Google Dolls"
>"No"
>"Which bands"
>"The Gooo Fighters"
>"Music"
>"How much does it cost?"
>"Greatest Hits"
>"What's the price difference?"
>"Mp3"
>"No"
>"I want to buy the tour movie"
>"Alice Googler"
>"Yes"
- اسم حالة الاختبار:
Price info - العلامات:
#catalog, #music, #tourmovie, #shirts - الوصف: اختبار معلومات الأسعار في نقاط مختلفة من مربّع الحوار
اختبار حالات الاختبار المسجّلة مسبقًا
- انقر على إدارة > حالات الاختبار في القائمة الرئيسية لـ Dialogflow على اليمين.
- اختَر جميع حالات الاختبار، ثمّ انقر على الزرّ تشغيل أعلى الجدول.
ستنفّذ منصة Dialogflow CX جميع حالات الاختبار المحدّدة على التسجيل الذي تم حفظه كـ "حالة اختبار ذهبية". وإذا كانت النتائج هي نفسها التي حفظتها بها، يعني ذلك أنّ الاختبارات قد اجتازت بنجاح. - إذا حدث تغيير في المسارات، مثل الصفحات التي لم يتم ضبط إعداداتها بشكلٍ صحيح أو النوايا التي وجّهتك إلى الصفحات الخاطئة، ستفشل الاختبارات.

- في المحاكي، اطرح السؤال التالي:
How long will shipping take? - دوِّن النتيجة واحفظ حالة الاختبار باسم
Shippingمع العلامة:#shipping. - انتقِل إلى لوحة "الإدارة" (Manage) > "حالات الاختبار" (Test Cases) واضغط على الزر تشغيل (Run) في أعلى يسار الشبكة لتشغيل حالة الاختبار
Shippingفقط.
من المفترض أن يجتاز هذا الاختبار.
- ارجع إلى مسار رحلة العميل في خدمة العملاء، واختَر صفحة البدء، ثم انقر على عنوان المسارات.
سيؤدي ذلك إلى عرض شاشة تتضمّن شبكة تعرض جميع الطرق.
- إزالة
redirect.shipping.info route - انتقِل إلى لوحة "الإدارة" (Manage) > "حالات الاختبار" (Test Cases) واضغط على الزر تشغيل (Run) في أعلى يسار الشبكة لتشغيل حالة الاختبار
Shippingفقط.
من المفترض أن يتعذّر إجراء هذا الاختبار.
- يمكنك النقر على الاختبار الذي تعذّر إجراؤه للاطّلاع على تفاصيل هذا التعذّر.
في هذه الحالة، تعذّر إجراء الاختبار وظهرت رسالة الخطأ التالية:
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
يعود السبب إلى أنّ الصفحة لم تعُد متوفّرة في المسار. توقّعنا الانتقال إلى صفحة Shipping، ولكننا لم ننتقل أبدًا من صفحة Start. (أو سيتلقّى المستخدمون النهائيون رسالة احتياطية).
بعبارة أخرى، هذا طلب لم يتم تنفيذه، أي نتيجة اختبار سلبية خاطئة. تعذّر إجراء الاختبار. توقّعنا ظهور صفحة الشحن، ولكن لم يحدث شيء أو ظهرت رسالة احتياطية.
- ارجع إلى "مسار خدمة العملاء"، وأضِف
redirect.shipping.infoكمسار غرض إلى صفحة البداية. لا تنسَ الانتقال إلى صفحة الشحن والنقر على حفظ. - في المحاكي، سجِّل حالة الاختبار التالية:
I want to swap my item، واحفظ حالة الاختبار هذه باسمSwapping#swapping. - افتح إدارة > طلبات المستخدمين > redirect.refund.info وأضِف عبارة التدريب التالية:
I want to swap this item for a refund
بدون عبارة التدريب هذه، عندما يطلب المستخدم تغيير سلعة لاسترداد الأموال المدفوعة مقابلها، سيتم توجيهه إلى الغرض redirect.swapping.info، ولكننا لا نريد تقديم معلومات عن تغيير السلع، بل نريد تقديم معلومات عن عمليات ردّ الأموال.
- أنشئ حالة الاختبار الذهبية التالية:
I want to swap this item for a refundفي المحاكي، واحفظ حالة الاختبار هذه باسمSwap for Refund#refund - ارجع إلى الغرض إدارة > الأغراض > redirect.refund.info، وأزِل السطر
I want to swap this item for a refund. - ارجع إلى إدارة > حالات الاختبار، واختَر حالة الاختبار الاستبدال مقابل استرداد الأموال، ثم انقر على تشغيل.
تعذّر إجراء آخر اختبار، وظهرت رسالة الخطأ التالية:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.`
Is there anything else I can help you with?
Page: Page mismatch:
Expected: Refund
Actual: Swapping
بعبارة أخرى، هذا طلب تم فهمه بشكل خاطئ، وهو نتيجة اختبار موجبة خاطئة. تعذّر إجراء الاختبار. توقّعنا ظهور صفحة ردّ الأموال، ولكن تم تفعيل صفحة التبديل.
التغطية
في Dialogflow CX، يشير اختبار التغطية إلى مقياس يُستخدَم لوصف مدى تنفيذ حوار الوكيل الافتراضي (الصفحات والقصد) عند تشغيل مجموعة اختبار معيّنة. إنّ نسبة تغطية الاختبارات العالية في الوكيل الافتراضي، والتي يتم قياسها كنسبة مئوية، تعني أنّه تم تنفيذ المزيد من الحوارات أثناء الاختبار، ما يشير إلى أنّ هناك فرصة أقل لاحتواء أخطاء غير مكتشفة (مثل الطلبات التي لم يتم فهمها) مقارنةً بوكيل افتراضي لديه نسبة تغطية اختبارات منخفضة.
- لعرض تقرير تغطية الاختبار لجميع حالات الاختبار، انقر على التغطية.
- انقر على علامة التبويب الانتقالات.
سيؤدّي ذلك إلى عرض تغطية الاختبار لجميع انتقالات الصفحات.

- انقر على علامة التبويب النوايا.
سيؤدّي ذلك إلى عرض تغطية الاختبار لجميع النوايا.

تهانينا، لقد أنشأت واختبرت الآن مثالاً كاملاً من العالم الواقعي لروبوت بائع تجزئة. لننتقل إلى صفحة المختبر التالية لقراءة الخلاصة والاطّلاع على بعض المراجع المفيدة.
10. الخاتمة
Dialogflow CX هي منصة للذكاء الاصطناعي الحواري (CAIP) تُستخدَم لإنشاء وكلاء افتراضيين، مثل روبوتات الدردشة أو الروبوتات الصوتية. تتيح منصة Dialogflow CX لفريقك تسريع عملية إنشاء تجارب حوارية على مستوى المؤسسة من خلال أدوات إنشاء برامج المحادثة المرئية، والنوايا القابلة لإعادة الاستخدام، وإمكانية معالجة المحادثات المتعددة الأدوار.
في هذا الدرس التطبيقي حول الترميز، تعلّمت كيفية إنشاء وكيل افتراضي للبيع بالتجزئة في العالم الحقيقي. تطرّقنا إلى المفاهيم التالية:
- التدفقات
- المَعلمات والكيانات المخصّصة والكيانات التابعة للنظام
- Pages
- معالجات الحالة، مثل مسارات Intent ومسارات Condition
- رسائل التنفيذ الثابتة والردود الشرطية
- الطلبات الاحتياطية
- المحاكي وحالات الاختبار والتغطية

المراجع
لمزيد من المعلومات حول Dialogflow CX، يمكنك الاطّلاع على المدونات والمستندات التالية.