تنفيذ النموذج (Dialogflow)

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

تحديد محادثتك

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

يمكنك إنشاء أكبر عدد ممكن من الغايات لتحديد القواعد النحوية لمحادثتك بالكامل.

إنشاء الأهداف

انقر على علامة + بجانب عنصر قائمة Intent في شريط التنقّل الأيمن على Dialogflow. يظهر "محرِّر الأهداف" حيث يمكنك إدخال المعلومات التالية:

  • اسم الغرض هو اسم الغرض الذي يظهر في بيئة التطوير المتكاملة (IDE).
  • تتيح لك السياقات تحديد نطاق تشغيل النية حسب حالات معيّنة. اطّلِع على مستندات Dialogflow حول السياقات لمزيد من المعلومات.
  • تؤدي الأحداث إلى تفعيل الأغراض بدون أن يحتاج المستخدمون إلى قول أي شيء. ومن الأمثلة على ذلك حدث GOOGLE_ASSISTANT_WELCOME الذي يسمح لـ "مساعد Google" باستدعاء الإجراء الخاص بك. يتم استخدام هذا الحدث للإجراء التلقائي في الإجراء الخاص بك. يمكنك الرجوع إلى مستنداتنا للحصول على مزيد من المعلومات حول أهداف المساعد المضمّنة.
  • تحدد عبارات التدريب ما يجب على المستخدمين قوله (القواعد النحوية) لتشغيل الهدف. اكتب بعض العبارات هنا (5-10) لما يمكن أن يقوله المستخدمون لإثارة النية. تتعامل Dialogflow تلقائيًا مع الصيغ الطبيعية لأمثلة العبارات التي تقدمها.
  • تحدد الإجراء والمعلمات البيانات التي يجب تمريرها إلى التنفيذ، إذا تم تفعيل التنفيذ لهذا الغرض. يشمل ذلك البيانات المُحلّلة من البيانات التي يُدخلها المستخدم والاسم الذي يمكنك استخدامه في عملية التنفيذ لرصد النية التي تم تشغيلها. ستستخدم هذا الاسم لاحقًا لتعيين غرضك إلى منطق التنفيذ المقابل. يمكنك الاطّلاع على الإجراءات والمَعلمات في مستندات Dialogflow للحصول على مزيد من المعلومات حول تحديد الإجراءات.

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

  • يحدد التنفيذ ما إذا كنت تريد الاتصال بالتنفيذ عند تشغيل هذا الهدف أم لا. ستفعّل هذه الميزة على الأرجح لمعظم الأغراض في وكيل Dialogflow. لرؤية هذا العنصر في الغرض، يجب أن تكون تفعيل التنفيذ لدى الوكيل في قائمة توصيل.

إنشاء الردود في Dialogflow

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

في منطقة الردود، قدِّم الردّ النصي الذي تريد عرضه للمستخدمين. الردود النصية التلقائية هي ردود نصية بسيطة عبر تقنية TTS يمكن أن تعمل على مستوى العديد من عمليات دمج Dialogflow. يتم وصف ردود "مساعد Google" في صفحة الردود.

إنشاء ردود متعلقة بالتنفيذ

تتم استضافة رمز التنفيذ في منطق تنفيذ الردّ التلقائي على الويب لأحد الإجراءات. على سبيل المثال، في نموذج Silly Name Maker، يمكنك العثور على هذا المنطق في index.js لوظيفة السحابة الإلكترونية لبرنامج Firebase.

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

ننصحك بشدة باستخدام مكتبة عميل Node.js لمعالجة الطلبات وعرض الردود. في ما يلي العملية العامة لاستخدام مكتبة العملاء:

  1. إعداد عنصر Dialogflow: يعالج هذا الكائن تلقائيًا الاستماع إلى الطلبات وتحليلها حتى تتمكن من معالجتها في التنفيذ.
  2. إنشاء دوال للتعامل مع الطلبات: تعالج هذه الدوال البيانات التي أدخلها المستخدم والمكوّنات الأخرى للنية، وتنشئ الاستجابة للرجوع إلى Dialogflow.

إعداد الكائن Dialogflow

يُنشئ الرمز التالي مثيلاً لـ Dialogflow ويُجري بعض إعدادات Node.js النموذجية لدوال Google Cloud:

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

إنشاء دوال للتعامل مع الطلبات

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

  1. نفِّذ أي منطق مطلوب لمعالجة البيانات التي أدخلها المستخدم.
  2. صمم ردودك للاستجابة للنوايا التي تثير قلقك. ضع في اعتبارك السطح الذي يستخدمه المستخدمون لديك لإنشاء ردود مناسبة. يمكنك الاطّلاع على إمكانات السطح للحصول على مزيد من المعلومات حول كيفية تلبية الردود على مساحات العرض المختلفة.
  3. استدعِ الدالة ask() مع ردك.

يوضِّح لك الرمز التالي كيفية إنشاء إجابتَين "تحويل النص إلى كلام" اللتين تتناولان القصد من الاستدعاء (input.welcome) وهدف لمربّع حوار (input.number) يرحب بالمستخدم في الإجراء الخاص بك ويعرض رقمًا قاله المستخدم عن هدف Dialogflow بالاسم:

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

يستخدم العنصر المخصّص Input Number (رقم الإدخال) المخصّص حسب النية بالشراء، والذي يصاحب الرمز أعلاه، الكيان @sys.number لاستخراج رقم من عبارات المستخدمين. بعد ذلك، يرسل الهدف المعلَمة num، التي تحتوي على الرقم من المستخدم، إلى الدالة في التنفيذ.

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

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

إعادة طلب عدم تطابق

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

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

إذا لم يتمكّن "مساعد Google" من العثور على إجراء مناسب يتطابق مع البيانات التي أدخلها المستخدم، يُعاد المستخدم إلى سياق الإجراء الخاص بك.

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

لإنشاء هدف احتياطي:

  1. انقر على Intents في قائمة التنقّل في Dialogflow.
  2. انقر على الرمز ⋮ بجانب إنشاء هدف، ثم اختَر إنشاء هدف احتياطية. (بدلاً من ذلك، انقر على الهدف الاحتياطي التلقائي لتعديله).
  3. تحديد عبارات المطالبة لرد الاستلام إلى المستخدمين. يجب أن تكون هذه العبارات حوارية وأن تكون مفيدة بقدر الإمكان للسياق الحالي للمستخدم.

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

    لتنفيذ هذا الإجراء:

    1. فعِّل الخيار تفعيل طلب الردّ التلقائي على الويب لهذا الغرض في قسم التنفيذ ضمن الغرض.
    2. في منطق التنفيذ، تعامل مع الغرض الاحتياطي مثل أي أغراض أخرى، على النحو الموضَّح في قسم إنشاء وظائف للتعامل مع الطلبات.

    على سبيل المثال، تستخدم الدالة التالية الكائن conv.data (وهو حمولة بيانات عشوائية يمكنك استخدامها للحفاظ على الحالة) من مكتبة عميل Node.js لتخزين عدّاد يتتبّع عدد مرّات تشغيل الغرض الاحتياطي. وإذا تم تشغيله أكثر من مرة، فسيتم إنهاء الإجراء. بالرغم من عدم ظهور ذلك في الرمز البرمجي، يجب أن تجعل الأغراض الأخرى تعيد ضبط هذا العدّاد على 0 عند تفعيل هدف غير احتياطي. (اطّلع على نموذج Number Genie للحصول على تفاصيل حول كيفية تطبيق ذلك.)

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

استخدام السياقات

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

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

    • السياقات الحالية للمستخدم هي مجموعة شاملة من السياقات المحددة في القصد.
    • لا توجد مطابقات أخرى للأهداف.

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

  • في حال ضبط سياق ناتج عن هدف احتياطي، يتم إبقاء المستخدم في السياق نفسه بعد تفعيل الغرض الاحتياطي ومعالجته.

لمزيد من المعلومات، راجِع سياقات Dialogflow.

إعادة عرض عدم الإدخال

يمكنك الاطّلاع على صفحة الطلبات لمعرفة تفاصيل حول كيفية التعامل مع الحالات التي لا يقدّم فيها المستخدم إدخالاً إضافيًا على جهاز صوتي مثل Google Home الذي يتطلب تفاعلاً مستمرًا.