יצירת מילוי בקשה (Dialogflow)

השירות מגדיר את ממשק השיחה שאליו הפעולה צריכה לקבל של המשתמשים, והלוגיקה לעיבוד הקלט, ולבסוף על הפעולה.

הגדרת השיחה

עכשיו, אחרי שהגדרתם פעולות, תוכלו ליצור את השיחה התואמת לפעולות האלה. עושים זאת על ידי יצירת אובייקטים מסוג Intent ב-Dialogflow שמגדירים את הדקדוק או את מה שהמשתמשים צריכים שיפעיל את הכוונה והמילוי המתאים את הכוונה כשהוא מופעל.

ניתן ליצור כמה כוונות שרוצים כדי להגדיר את כל השיחה הדקדוק.

יצירת כוונות

לוחצים על הסימן + ליד האפשרות Intents בתפריט הניווט הימני. מופיע עורך Intent שבו אפשר להזין את הפרטים הבאים:

  • שם ה-Intent הוא השם של ה-Intent שמוצג בסביבת הפיתוח המשולבת (IDE).
  • הקשרים מאפשרים לכם להגדיר את הטריגר של הכוונה במקרים ספציפיים. לקריאת מסמכי התיעוד של Dialogflow בנושא הקשרים אפשר לקבל מידע נוסף.
  • אירועים מפעילים כוונות מודעה בלי שהמשתמשים יצטרכו לומר משהו. אחת האירוע לדוגמה הוא האירוע GOOGLE_ASSISTANT_WELCOME, שמאפשר ל-Google Assistant כדי להפעיל את הפעולה. האירוע הזה משמש לפעולה שלך 'פעולת ברירת מחדל'. במסמכי התיעוד שלנו יש מידע נוסף על כוונות עזר מובנות.
  • ביטויי אימון מגדירים מה המשתמשים צריכים לומר (הדקדוק) כדי להפעיל את הכוונה. צריך להקליד כאן כמה ביטויים (5-10) ממה שהמשתמשים יכולים לומר כדי להפעיל את הכוונה. Dialogflow מטפל באופן אוטומטי בווריאציות טבעיות של הדוגמה וביטויים שאתם מספקים.
  • פעולה ופרמטרים מגדירים אילו נתונים להעביר למילוי הזמנות, אם מופעל עבור Intent זה. נכללים בכך נתונים שנותחו קלט של משתמשים והשם שבו ניתן להשתמש במילוי ההזמנה כדי לזהות הופעלה. תשתמשו בשם הזה מאוחר יותר כדי למפות את הכוונה שלכם לוגיקה תואמת של מילוי הזמנות. למידע נוסף, אפשר לעיין בקטע פעולות ופרמטרים. מידע נוסף על הגדרת פעולות במסמכי התיעוד של Dialogflow.

  • תגובות הן הכלי Dialogflow Response Builder, שבו אפשר להגדיר לתת מענה ל-Intent הזה ישירות ב-Dialogflow, בלי להתקשר תכונה זו שימושית עבור תשובות סטטיות שאינן דורשות תוכלו להשתמש בו כדי לתת לכם הודעות פתיחה או פרידה פשוטות. עם זאת, סביר להניח שתשתמשו במילוי הזמנות כדי להגיב למשתמשים את הכוונות שלכם.

  • Fulfillment מציין אם אתם רוצים לקרוא למילוי ההזמנה כשהכוונה הזו מופעלת. סביר להניח שתפעילו את התכונה הזו Intents בסוכן Dialogflow. כדי לראות את הפריט הזה מתוך Intent, עליך להפעיל את מילוי ההזמנות בשביל הנציג בתפריט Fulfillment.

יצירת תשובות ב-Dialogflow

בשביל כוונות מסוימות, יכול להיות שלא יהיה צורך לקבל תגובה מהמילוי ההזמנה. במקרים כאלה, תוכלו להשתמש בכלי ליצירת תשובות ב-Dialogflow כדי ליצור תשובות מדויקות.

באזור תגובות, מציינים את התשובה הטקסטית שאליה רוצים לחזור. משתמשים. תגובות טקסט ברירת מחדל הן תגובות טקסט פשוטות עם טקסט TTS שיכולות לפעול בכל המכשירים כמה שילובים עם Dialogflow. מתוארות התשובות של Google Assistant בדף תגובות.

יצירת תגובות למילוי הזמנות

קוד מילוי ההזמנות מתארח בלוגיקת מילוי ההזמנות של התגובה לפעולה מאתר אחר (webhook) עבור פעולה. למשל, בדוגמה של Silly Name Maker, הלוגיקה הזו נמצאת ב-index.js לפונקציה של Cloud Functions for Firebase.

כשמופעלת Intent שמשתמשת במילוי הזמנה, מקבלים בקשה מאת תיבת דו-שיח שמכילה מידע על הכוונה. לאחר מכן אתם מגיבים על ידי עיבוד הכוונה והחזרת התשובה. הבקשה הזו וגם התגובה מוגדרת על ידי Dialogflow webhook.

מומלץ מאוד להשתמש בספריית הלקוח של Node.js כדי לעבד בקשות ולהחזיר תשובות. זה התהליך הכללי לשימוש בספריית הלקוח:

  1. לאתחל את האובייקט של Dialogflow. האובייקט הזה מטפל באופן אוטומטי בהאזנה לבקשות ובניתוח שלהן, שתוכלו לעבד אותם במילוי ההזמנות.
  2. יצירת פונקציות לטיפול בבקשות. הפונקציות האלה מעבדות את הקלט של המשתמש ורכיבים אחרים של הכוונה, יוצרים את התשובה כדי לחזור ל-Dialogflow.

אתחול האובייקט Dialogflow

הקוד הבא מייצר את Dialogflow ויוצר משהו סטנדרטי (בוילרפלייט) הגדרת Node.js ל-Google Cloud Functions:

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() עם התשובה שלך.

הקוד הבא מראה איך לבנות שתי תגובות TTS שמטפלות Intent להפעלה (input.welcome) ו-Intent של תיבת דו-שיח (input.number) מברך את המשתמש על הפעולה ומדהה את מספרו של המשתמש Intent של 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();
}

מספר הקלט של קהל בהתאמה אישית עם כוונת רכישה, שמתלווה לקוד שלמעלה, משתמש באופרטור ישות @sys.number לחילוץ מספר מדברים של משתמש. הכוונה אז שולח את הפרמטר num, שמכיל את המספר מהמשתמש, במילוי האוטומטי.

במקום להשתמש ב-handlers נפרדים לכל כוונה, אפשר להוסיף פונקציית גיבוי. בתוך פונקציית הגיבוי, בודקים איזו Intent הופעל ולעשות את הדבר המתאים בהתאם.

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 לא יכול להתאים לאף אחד מדקדוקי הקלט שהוגדרו באובייקטים של Intent ביטויים לאימון, הם מפעילים Intent חלופי. כוונות חלופיות בדרך כלל לבקש מהמשתמש לספק את הקלט הנדרש לפעולה. אפשר לספק ביטויי הפניה. לשם כך, מציינים אותם באזור Response של Intent חלופי. לחלופין, אפשר להשתמש ב-webhook כדי לספק תשובות.

כשתשובה של משתמש לא תואמת לביטויי האימון של הפעולה, Google Assistant מנסה לטפל בקלט. ההתנהגות הזו מאפשרת למשתמשים לבצע שינויים פעולות באמצע שיחה. לדוגמה, משתמש שואל, "אילו סרטים משחקים השבוע?" ואז משנה את ההקשר באמצע השיחה: "מה זה? the weather tomorrow?" בדוגמה הזו, כי "What is the weather tomorrow? " אינה תשובה חוקית לשיחה שמופעלת על ידי ההנחיה הראשונית, Assistant מנסה באופן אוטומטי לטפל בהתאמה ולהעביר את המשתמש שיחה הולמת.

אם Assistant לא מצליחה למצוא פעולה מתאימה שתואמת לקלט של המשתמש, המשתמש מוחזר להקשר של הפעולה.

כי Assistant עשויה להפריע לפעולה כדי להגיב במקרה של אי-התאמה חוקית הם לא להשתמש בכוונות חלופיות כדרך למלא שאילתות של משתמשים. שלך צריך להשתמש רק בכוונות חלופיות כדי לבקש מהמשתמש לקבל קלט תקין.

כדי ליצור Intent חלופי:

  1. לוחצים על אובייקטים בתפריט הניווט ב-Dialogflow.
  2. לוחצים על ⋮ לצד יצירת Intent ובוחרים באפשרות יוצרים Intent חלופי. (לחלופין, לוחצים על ברירת המחדל של החלופה) כוונה לערוך אותו.)
  3. צריך לציין ביטויים להנחיה כדי לדבר אל המשתמשים. הביטויים האלה צריכים להיות להיות שימושיות ככל האפשר בהקשר הנוכחי של המשתמש.

    כדי לעשות זאת בלי מילוי הזמנות: מציינים ביטויים באזור תשובה. של הכוונה. Dialogflow לבחור ביטויים מהרשימה הזו באופן אקראי חוזרים למשתמשים עד שמופעלת כוונה ספציפית יותר.

    כדי לעשות זאת באמצעות מילוי הזמנה:

    1. בקטע מילוי הזמנה של ה-Intent, מחליפים את מצב האפשרות הפעלת קריאה לפעולה מאתר אחר (webhook) עבור ה-Intent הזה.
    2. בלוגיקת מילוי ההזמנות, צריך לטפל ב-Intent החלופי כמו בכל מקרה אחר Intent, כפי שמתואר במאמר יצירת פונקציות לטיפול בבקשות. .

    לדוגמה, הפונקציה הבאה משתמשת באובייקט conv.data ( מטען ייעודי (payload) שרירותי שאפשר להשתמש בו כדי לשמור על מצב) ספריית לקוח של Node.js לאחסון מונה שעוקב אחר מספר הפעמים שבהן מופעלת Intent חלופי. אם זה מופעלת יותר מפעם אחת, הפעולה מפסיקה. אומנם לא מוצגת עליך לגרום לכוונות אחרות לאפס את המונה הזה ל-0 כאשר מופעלת Intent ללא חלופה. (אפשר לעיין ב דוגמת מספר 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 יפעיל Intents חלופיים רק במצבים מסוימים. האפשרות הזו מועילה אם רוצים שיהיו לכם כוונות חלופיות שונות עבור תרחישים שונים של חוסר התאמה.

  • אם לא מגדירים הקשרים ב-Intent חלופי, זה נחשב Intent גלובלי של גיבוי ש-Dialogflow מפעיל כשאין Intent אחר תואמת. אם בוחרים להשתמש באחד מהם, צריך להגדיר רק אחד מהם.
  • אם מגדירים הקשרי קלט ל-Intent חלופי, Dialogflow הוא הגורם לכך Intent חלופי כשמתקיים התנאי הבא:

    • ההקשרים הנוכחיים של המשתמש הם קבוצת-על של ההקשרים שמוגדרים בכוונה טובה.
    • אין התאמות אחרות של Intent.

    כך אפשר להשתמש בכמה כוונות חלופיות עם הקשרי קלט שונים כדי להתאים אישית תרגום מחדש ללא התאמה לתרחישים ספציפיים.

  • אם מגדירים הקשר פלט ב-Intent חלופי, המשתמש נשאר אותו הקשר אחרי הפעלה ועיבוד של ה-Intent החלופי.

למידע נוסף, ראו הקשרים של Dialogflow.

שליחה מחדש ללא קלט

בדף הנחיות מוסבר איך כאשר המשתמש לא מספק עוד קלט במכשיר קולי, כמו כדי להפעיל את Google Home נדרשת אינטראקציה מתמשכת.