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

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

הגדרת השיחה

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

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

יצירת Intents

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

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

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

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

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

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

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

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

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

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

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

  1. מפעילים את האובייקט Dialogflow. האובייקט הזה מטפל אוטומטית בהאזנה לבקשות ובניתוח שלהן, כדי שתוכלו לעבד אותן במילוי הבקשה.
  2. יוצרים פונקציות לטיפול בבקשות. הפונקציות האלה מעבדות את קלט המשתמש ורכיבים אחרים של ה-Intent, ובונות את התגובה כך שתוחזר ל-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 שמטפלות בכוונת הפעלה (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();
}

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

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

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

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

Assistant עלולה להפריע לפעולה כדי להגיב לתרחיש חוקי ללא התאמה, ולכן אין להשתמש באובייקטים חלופיים מסוג Intent כדרך למלא שאילתות של משתמשים. יש להשתמש באובייקטים חלופיים מסוג Intent רק כדי לבקש מהמשתמש קלט חוקי.

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

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

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

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

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

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

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

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

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

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

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

השמעת קלט ללא קלט

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