שמירת הנתונים בשיחה (Dialogflow)

אפשרויות נוספות ב-Dialogflow

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

  1. צריך להזין שם נציג וליצור נציג חדש ב-Dialogflow לדוגמה.
  2. כשמסיימים לייבא את הנציג, לוחצים על מעבר לנציג.
  3. מתפריט הניווט הראשי, עוברים אל מילוי הזמנה.
  4. מפעילים את עורך מוטבע ולוחצים על פריסה. העורך מכיל את הקוד לדוגמה.
  5. בתפריט הניווט הראשי, נכנסים אל Integrations (שילובים) ולוחצים על Google Assistant.
  6. בחלון החלון הקופץ, מפעילים את האפשרות שינויים בתצוגה מקדימה אוטומטית ולוחצים על בדיקה כדי לפתוח את סימולטור הפעולות.
  7. בסימולטור, מזינים Talk to my test app כדי לבדוק את הטעימה!
המשך

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

הדרישות משתנות מעט בהתאם לשמירת נתונים בשיחה או בשיחות מרובות. כדי לשמור נתונים בשיחה, תוכלו להשתמש בשדה conversationToken של האובייקט AppResponse.

כדי לשמור נתונים בשיחות שונות, צריך לבצע את הפעולות הבאות:

  1. בודקים אם המשתמש מאומת או כאורח.
  2. מאחסנים את נתוני המשתמשים או ניגשים אליהם באמצעות השדה userStorage של האובייקט AppResponse.

שמירת נתונים בין פניות בשיחה

השדה conversationToken הוא מחרוזת שמכילה אסימון אטום שמוחזר ל-Action בכל שיחה. לדוגמה, אם תגדירו את הערך "count=1" ב-AppResponse בפניה הראשונה של השיחה, הערך של AppRequest שיתקבל בסיבוב השני של השיחה יכלול את "count=1" ב-conversationToken.

האסימון תמיד מופעל במחרוזת ריקה בתחילת שיחה. אם אתם משתמשים בספריית הלקוח Actions on Google Node.js, אתם יכולים להשתמש בממשק עם אסימון השיחה כאובייקט JSON באמצעות conv.data, כאשר conv הוא המופע של Conversation.

בדוגמה הבאה מוסבר איך לשמור מונה בשדה conversationToken בשדה AppResponse:

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

הערה: קובץ ה-JSON שמוצג בהמשך מתאר תגובת webhook שמשתמשת ב-outputContexts במקום ב-conversationToken.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

שימו לב: קובץ ה-JSON שמוצג בהמשך מתאר תגובה של תגובה לפעולה מאתר אחר (webhook).

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

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

שמירת נתונים בשיחות

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

קביעת סטטוס אימות המשתמש וטיפול בו

סטטוס האימות של המשתמש יכול להיות GUEST או VERIFIED. בתחילת כל שיחה, Actions on Google מגדיר את סטטוס האימות של המשתמש על סמך מגוון אינדיקטורים בתחילת כל שיחה. לדוגמה, סטטוס אימות של משתמש שמחובר ל-Google Assistant במכשיר הנייד הוא VERIFIED.

אלה הסיבות האפשריות לכך שסטטוס האימות של משתמש הוא GUEST:

  • האפשרות תוצאות אישיות מושבתת אצל המשתמש.
  • המשתמש השבית את ההגדרה פעילות באינטרנט ובאפליקציות. חשוב לזכור שחלק מהמשתמשים עשויים להשבית את ההגדרה הזו ברמת הדומיין.
  • אם התכונה Voice Match מופעלת במכשיר, וההתאמה נכשלת או שהמשתמש מפעיל את Assistant בלי להשתמש בקול שלו (למשל: לחיצה ארוכה על Google Home).
  • המשתמש לא מחובר.

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

אם אתם משתמשים ב-Actions On Google Client Library for Node.js, תוכלו להתממשק עם אחסון המשתמש כאובייקט JSON באמצעות conv.user.storage, כאשר conv הוא המופע של Conversation. בדוגמה הבאה מוסבר איך לשמור מונה בשדה userStorage ב-AppResponse:

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Java

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

שימו לב: קובץ ה-JSON שמוצג בהמשך מתאר תגובה של תגובה לפעולה מאתר אחר (webhook).

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

שימו לב: קובץ ה-JSON שמוצג בהמשך מתאר תגובה של תגובה לפעולה מאתר אחר (webhook).

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

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

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

תפוגת האחסון של המשתמש

כש-Assistant יכולה להתאים זהות למשתמש, התוקף של התוכן של userStorage לא פג לעולם, ורק המשתמש או הפעולה עצמה יכולים למחוק אותו.

כש-Assistant לא מצליחה להתאים זהות למשתמש, התוכן של userStorage נמחק בסוף השיחה. הנה כמה דוגמאות למקרים שבהם Assistant לא יכולה להתאים זהות למשתמש:

  • התכונה Voice Match הוגדרה ואין התאמה.
  • המשתמש השבית את המידע האישי.

ניקוי התוכן של השדה userStorage

כדי למחוק את התוכן בשדה userStorage בפעולה, אפשר להגדיר את השדה resetUserStorage ב-AppResponse כ-true. אם מגדירים את הערך של userStorage כמחרוזת ריקה, הערך של userStorage לא ישתנה בשלב הבא של השיחה. כך תוכלו להימנע משליחת כל userStorage בסבב שבו התוכן לא השתנה.

אם אתם משתמשים ב-Actions On Google Client Library for Node.js, אפשר פשוט להגדיר את הערך של conv.user.storage כ-{} (אובייקט ריק).

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Java

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

שימו לב: קובץ ה-JSON שמוצג בהמשך מתאר תגובה של תגובה לפעולה מאתר אחר (webhook).

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

שימו לב: קובץ ה-JSON שמוצג בהמשך מתאר תגובה של תגובה לפעולה מאתר אחר (webhook).

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

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

  1. פותחים את אפליקציית Assistant בטלפון.
  2. מקישים על סמל חלונית ההזזה.

  3. בכרטיסייה Explore, מאתרים את הפעולה שרוצים להציג או לנקות עבורה את האחסון של המשתמש, ומקישים עליה כדי לפתוח את דף הפרטים.
  4. גוללים לתחתית הדף.
    • כדי להציג את התוכן של השדה userStorage, מקישים על [הצגת הנתונים המאוחסנים].
    • כדי להסיר את נתוני המשתמש השמורים, מקישים על הפסקת האפשרות של $action לזכור אותי.