1. מבוא
בשיעור ה-Lab הזה תפתחו פעולה פשוטה באמצעות Dialogflow ותלמדו איך לשלב אותה עם Google Assistant.
התרגילים מאורגנים כדי לשקף חוויה נפוצה של מפתחי ענן:
- יצירת נציג של Dialogflow גרסה 2
- יצירת ישויות
- יצירת כוונות
- הגדרת תגובה לפעולה מאתר אחר (webhook) באמצעות פונקציות של GCP Cloud
- שימוש במאגר הידע כדי לייבא שאלות נפוצות
- בדיקת הצ'אט בוט
- הפעלת השילוב של Google Assistant
מה תפַתחו
אנחנו ניצור אפליקציית Google Assistant לקבוצת המפגשים של 'נשים בקול'. אפשר לשאול מתי המפגש הבא יתקיים, מהו מאמר טיפים לספר או שאלות כלליות על קבוצת המפגש. |
מה תלמדו
- איך יוצרים צ'אט בוט באמצעות Dialogflow v2
- איך יוצרים שיחה לינארית באמצעות Dialogflow
- איך להשתמש בישויות
- איך להשתמש במאגר הידע
- איך מגדירים מילוי הזמנות ב-webhook בפונקציות של Dialogflow ו-GCP
- איך מעבירים את האפליקציה אל Google Assistant באמצעות Actions on Google
דרישות מוקדמות
- כדי ליצור נציג ב-Dialogflow צריך כתובת ב-Google Identity או ב-Gmail.
- אנחנו נספק לך זיכויים בענן ל-GCP עבור השימוש ב-GCP Cloud Functions
- כדי לקבל את נתוני הנציג, צריך לגשת לגיליון הציבורי הזה ב-Google Sheets.
- פותחים אותו בכרטיסייה חדשה: https://docs.google.com/spreadsheets/d/1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY/edit?usp=sharing
- לא נדרש ידע בסיסי ב-JavaScript, אבל הוא יכול לעזור לכם אם רוצים לשנות את קוד האספקה של התגובה לפעולה מאתר אחר (webhook).
2. בתהליך ההגדרה
הפעלת פעילות באינטרנט בדפדפן
- לוחצים על: http://myaccount.google.com/activitycontrols
- הקפדה על חיפוש באינטרנט ההגדרה 'פעילות באפליקציות' מופעלת:
יצירת נציג ב-Dialogflow
- פותחים את: https://console.dialogflow.com
- בסרגל הימני, מתחת ללוגו, בוחרים באפשרות יצירת נציג חדש. אם יש לכם נציגים קיימים, צריך ללחוץ קודם על התפריט הנפתח.
- בחירת שם הנציג:
yourname-wiv
(באמצעות שם משלך) - כברירת המחדל של שפת ברירת המחדל, בוחרים באפשרות אנגלית – en
- כאזור הזמן שמוגדר כברירת מחדל, בוחרים את אזור הזמן הקרוב ביותר אליכם.
- לא בוחרים באפשרות Mega Agent. (בעזרת התכונה הזו אפשר ליצור סוכן מקיף שיכול לתזמר בין סוכני "תת". אנחנו לא צריכים את זה עכשיו.)
- לחץ על צור.
הגדרה של Dialogflow
- בתפריט הימני, לוחצים על סמל גלגל השיניים ליד שם הפרויקט.
- מזינים את תיאור הנציג הבא: נשים בנציג של Voice.
- כדי להפעיל תכונות בטא, גוללים למטה אל תכונות בטא והופכים את המתג הרצוי.
- גוללים למטה אל Log Settings (הגדרות היומן) והופכים את שני המתגים כדי לרשום את האינטראקציות של Dialogflow וכדי לתעד את כל האינטראקציות ב-Google Cloud Stackdriver. נזדקק למידע הזה בהמשך, אם נרצה לנפות באגים בפעולה שלנו.
- לוחצים על שמירה.
- לוחצים על סיום
הגדרת Actions on Google
- לוחצים על הקישור ל-Google Assistant בחלונית השמאלית, בקטע איך זה עובד ב-Google Assistant.
הפעולה הזו תפתח את הכתובת: http://console.actions.google.com
הערה: חשוב לוודא שאתם מחוברים לאותו חשבון Google שאיתו נכנסתם ל-Dialogflow.
משתמשים חדשים ב-Actions on Google צריכים למלא קודם את הטופס הזה:
- מנסים לפתוח את הפעולה בסימולטור** על ידי לחיצה על שם הפרויקט.**
- בוחרים באפשרות פיתוח בסרגל התפריטים.
מבטלים את הסימון של האפשרות התאמה להגדרת השפה של המשתמש. כדי לוודא ששפת ברירת המחדל של Assistant לא תחרוג מהמרת הטקסט לדיבור.
- לוחצים על שמירה.
- בוחרים באפשרות בדיקה בסרגל התפריטים.
- מוודאים שההגדרה של הסימולטור היא אנגלית ולוחצים על דיבור לאפליקציית הבדיקה שלי.
הפעולה הזו תכיל את פניכם, עם הגדרת ברירת המחדל הבסיסית של Dialogflow. המשמעות היא שהגדרת השילוב עם Action on Google עבדה!
הגדרת Google Cloud
למדריך זה נדרש חשבון GCP עם חשבון לחיוב. אם עדיין אין לכם חשבון, תוכלו ליצור חשבון לפי השלבים הבאים.
בדרך כלל, כדי לשלם על חשבון לחיוב, נדרש אמצעי תשלום כמו כרטיס אשראי. בסדנה הזאת נוכל להשתמש בקרדיטים כדי לדלג על התהליך הזה.
- עוברים לכתובת ה-URL ומתחברים.
- לוחצים: לוחצים כאן כדי לגשת לזיכויים
- לוחצים על 'אישור' ו כן, אני רוצה
הכול מוכן. יצרתם חשבון לחיוב בסכום של 25 דולר, והם אמורים להספיק כדי להשתמש ב-Cloud Functions למשך זמן רב.
הפעלת Google Sheets API
אם הנציג צריך יותר מתגובות סטטיות מסוג Intent (לדוגמה, כדי לאחזר נתונים משירות אינטרנט, ממסד נתונים או מגיליון), אתם צריכים להשתמש במילוי הזמנות כדי לחבר את שירות האינטרנט לנציג. חיבור שירות האינטרנט מאפשר לבצע פעולות על סמך ביטויי משתמשים ולשלוח תגובות דינמיות חזרה למשתמש.
לדוגמה, אם משתמש רוצה לקבל טיפ לגבי בלוג או ספר, שירות האינטרנט יכול לבדוק במסד הנתונים שלכם ולתת למשתמש מאמר לקריאה.
במדריך הזה לא נשתמש במסד נתונים, אלא נשתמש בגיליון אלקטרוני ב-Google Sheets. אחרי שהגיליון יתעדכן, גם הפעולה של Google Assistant תתעדכן. מצוין!
- אם עדיין לא עשיתם זאת, פותחים את הגיליון האלקטרוני הזה ב-Google Sheets בכרטיסייה חדשה בדפדפן:
- https://docs.google.com/spreadsheets/d/1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY/edit#gid=1240329448
- חשוב: צריך ליצור עותק של הגיליון הזה. לוחצים על קובץ > יצירת עותק
- אחרי העתקת הגיליון, לוחצים על שיתוף
- נצטרך לתת לחשבון השירות של Dialogflow הרשאות עריכה. כדי לעשות זאת, פותחים את Dialogflow > הגדרות (גלגל גלגל השיניים).
- גוללים למטה אל Google Project.
- מעתיקים את כתובת חשבון השירות (אימייל). הוא אמור להיראות בערך כך: dialogflow-<someid>@<my-gcp-project>.iam.gserviceaccount.com
- מדביקים את חשבון השירות בחלון הקופץ 'שיתוף' ב-Google Sheets ומעניקים לו הרשאות עריכה.
- בשלב הבא צריך לזכור את מזהה הגיליון שאנחנו עובדים עליו כרגע.
The Sheets URL will look something like this:
https://docs.google.com/spreadsheets/d/1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o/edit#gid=1240329448
But we are only interested in the Sheet id, which is the part between:
https://docs.google.com/spreadsheets/d/ ו-/edit#gid=1240329448 (בלי לוכסנים).
So it will look something like this: **1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o**
**Write this Sheet ID down**, or copy it to Notepad. In the Webhook steps we will use this again.
- פתיחה בכרטיסייה אחרת בדפדפן. http://console.cloud.google.com. (אם יש לכם פרויקטים נוספים ב-Google Cloud, צריך להפעיל את הפרויקט החדש ב-Dialogflow: yourname-wiv). – בסרגל החיפוש מחפשים את האפשרות: Google Sheets API
- לוחצים על האפשרות הזאת ואז על הלחצן הפעלת Google Sheets API בחלק העליון של המסך.
3. ישויות מותאמות אישית
ישויות הן אובייקטים שהאפליקציה או המכשיר שלכם מבצעים בהם פעולות. אפשר לחשוב על זה בתור פרמטרים או משתנים. בפעולה שלנו נבקש:
"אני רוצה טיפ לקריאה על
צ'אט בוטים
/ אני רוצה טיפ לקריאה על
voice*"*
בין אם אתם אומרים צ'אט בוטים, Voice או שניהם, הנתונים יאספו מישות מותאמת אישית שתשמש כפרמטר בבקשה שלי לשירות אינטרנט.
מידע נוסף על ישויות של Dialogflow
יצירת ישות הערוץ
- לוחצים במסוף Dialogflow על האפשרות שבתפריט: ישויות.
- לוחצים על יצירת ישות
- שם הישות:
tech
(יש להקפיד להשתמש באותיות קטנות בלבד) - מציינים את האפשרויות עם המילים הנרדפות. (אפשר להקיש על Tab כדי לעבור בין הממשק).
Chatbots - Chatbots, Chat, Web
Voice - Voice, Voicebots, Voice Assistants
Both - Both, All
5**.** עוברים למצב **עריכה גולמית** בלחיצה על לחצן התפריט שליד לחצן השמירה הכחול.
- שימו לב שאפשר להזין גם את כל הישויות בפורמט CSV. האפשרות הזו יכולה להיות שימושית כשיש הרבה ישויות שצריך ליצור.
"Chatbots","Chatbots","Chat","Web"
"Voice","Voice","Voicebots","Voice Assistants"
"Both","Both","All"
- לוחצים על שמירה.
4. כוונות
ב-Dialogflow נעשה שימוש בכוונות כדי לסווג את כוונות המשתמש. לאובייקטים מסוג Intent יש ביטויים לאימון, שהם דוגמאות למה שמשתמש עשוי לומר לנציג.
לדוגמה, משתמש שרוצה לדעת מי רוצה לדעת מתי האירוע הבא יתקיים, עשוי לשאול:
מתי המפגש הבא?
כשמשתמש כותב או אומר משהו, שנקרא ביטוי משתמש, מערכת Dialogflow מתאימה את ביטוי המשתמש לכוונה הטובה ביותר של הנציג שלכם. התאמה של כוונת רכישה נקראת גם סיווג כוונת רכישה.
מידע נוסף על מנגנוני Intent של Dialogflow
שינוי של Intent הודעת הפתיחה שמוגדר כברירת מחדל
כשיוצרים נציג חדש ב-Dialogflow, המערכת יוצרת באופן אוטומטי שני אובייקטים מסוג Intent שמוגדרים כברירת מחדל. ברירת המחדל של כוונת הרכישה היא התהליך הראשון שאליו מגיעים כשמתחילים שיחה עם הנציג. ברירת המחדל של Intent חלופי היא הזרימה שאתם מקבלים ברגע שהנציג לא יכול להבין אתכם או לא יכול להתאים לכוונה למה שאמרתם.
- לוחצים על Intents > ברירת המחדל של כוונת הרכישה של ה-Intent
במקרה של Google Assistant, היא תתחיל באופן אוטומטי עם ברירת המחדל של Intent המשתמש. הסיבה לכך היא ש-Dialogflow מאזין לאירוע הפתיחה. עם זאת, אתם יכולים לעורר את הכוונה גם על ידי אמירת אחד מביטויי האימון שהוזנו.
זו הודעת הפתיחה לגבי ברירת המחדל של Intent קבלת הפנים:
משתמש | נציג |
"Ok Google, talk to <yourname>-WIV" | "היי, אני דנה, הנציגה הווירטואלית של נשים ב-Voice"."אפשר לבקש ממני מידע על מפגשים, נשים ב-Voice או טיפ לקריאה. "מה היית רוצה לדעת?" |
- גוללים למטה אל תגובות.
- ניקוי כל תגובות הטקסט.
- בכרטיסיית ברירת המחדל, יוצרים את 3 התשובות הבאות. (לוחצים על 'הוספת תשובות' > 'טקסט' או 'תגובה של SSML', בכל שורה חדשה:)
- היי, אני אנה, הנציגה הווירטואלית של נשים ב-Voice.
- אפשר לבקש ממני מידע על מפגשים, נשים ב-Voice או טיפ לקריאה.
- מה ברצונך לדעת?
ההגדרות האישיות אמורות להיות דומות לצילום המסך הזה.
- הפלט הקודם משמש צ'אט בוטים. אנחנו יכולים לשנות מעט את הפלט, במיוחד עבור Google Assistant. נשתמש ב-SSML (Speech Synthesis Markup Language) כדי ליצור השהיות במשפטים שלנו. לוחצים על הכרטיסייה Google Assistant.
- לא להפעיל את המתג 'ברירת מחדל', כי לא נעשה שימוש חוזר בהודעה של הצ'אט בוט.
- לוחצים על הוספת תגובות > תשובה פשוטה
- מוסיפים את גרסת הטקסט הבאה:
Hey there, I'm Anna, the virtual agent of Women in Voice.
You can ask me for information about meetups, Women in Voice or a reading tip. What would you like to know?
- לאחר מכן לוחצים על התאמה אישית של פלט האודיו
- ומוסיפים את גרסת SSML הבאה:
<speak><p><s>Hey there, I'm Anna, the virtual agent of Women in Voice.</s><s>
You can ask me for information about meetups, Women in Voice or a reading tip.</s></p><break time="500ms"/><p><s>
What would you like to know?</s></p></speak>
ההגדרות האישיות אמורות להיות דומות לצילום המסך הזה.
- לוחצים על שמירה.
כאן תוכלו למצוא מידע נוסף על SSML ל-Actions on Google.
- בואו נבדוק את הכוונה הזו. קודם כל נוכל לבדוק את זה בסימולטור של Dialogflow.
מקלידים: Hello. אמור להחזיר את ההודעה הזו.
- עכשיו חוזרים למסוף Actions on Google.
(מומלץ לשמור את הקובץ בכרטיסייה אחרת).
לוחצים על: "דיבור אל אפליקציית הבדיקה שלי". ועליך להאזין להודעת הפתיחה החדשה.
שינוי ה-Intent המוגדר כברירת מחדל כחלופה
- לוחצים על Intents > ברירת מחדל של Intent חלופי
- גוללים למטה אל תגובות.
- ניקוי כל תגובות הטקסט.
- בכרטיסיית ברירת המחדל, יוצרים את התשובות הבאות, כל אחת בשורה חדשה, כך שניתן יהיה לעבור בין האפשרויות הבאות:
Sorry, can you repeat this?
I didn't understand you. You can ask me questions about Women in Voice, a book or article tip or when the next meetup will be.
- לוחצים על שמירה.
הערה: אם לא מזינים פלט של Google Assistant, היא תוגדר לברירת המחדל.
יוצרים את כוונת העצירה
- לוחצים על האפשרות Intents בתפריט.
- לוחצים על Create Intent.
- מזינים את שם ה-Intent:
Stop Intent
- לוחצים על הוספת ביטויים לאימון.
No
That's it
Bye
I don't want that
Goodbye
It's ok for now
Quit
I want to stop
Close this
End the conversation
- גוללים למטה אל תגובות.> הוספת תשובה
- מוסיפים את אפשרויות הטקסט הבאות:
Alright! Hopefully we will see you at one of our meetups!
No problem. See you at one of our meetups!
- מחליפים את המצב של המתג: הגדרת Intent כסיום השיחה. כך המערכת תוודא ברגע שכוונת ה-Intent הזו תתאים, הפעולה של Google Assistant תיסגר.
- לוחצים על שמירה.
יצירת כוונת המפגש
מטרת המפגש תכלול את החלק הבא בשיחה:
משתמש | נציג |
מתי המפגש הבא? | "המפגש הבא יהיה ב-<date> בשעה <time> ב<location>. הנושא יהיה <topic>. והדוברים הם: <speakers>. אפשר להירשם באמצעות הניוזלטר שלנו." |
- לוחצים על האפשרות Intents בתפריט.
- לוחצים על Create Intent.
- מזינים את שם ה-Intent:
Meetup Intent
(חשוב להשתמש באות M ובאותיות גדולות (I) - אם תאיתו את הכוונה בצורה שונה, השירות לקצה העורפי לא יפעל!) - לוחצים על הוספת ביטויים לאימון.
When is the next meetup?
Do you have any events?
Which events are in the planning?
Are there meetup events soon?
I would love to attend a meetup
Can I join a virtual meetup?
When will you get together?
Can I join?
What does your calendar look like?
- לוחצים על מילוי הזמנה > הפעלת האפשרות למילוי הזמנות
- מחליפים את המצב של המתג הפעלת קריאה לפעולה מאתר אחר (webhook) עבור ה-Intent הזה.
- לוחצים על שמירה.
יוצרים את כוונת לטיפ
המטרה של הטיפ לכלול את החלק הבא בשיחה:
משתמש | נציג |
"אני רוצה לקבל טיפ לקריאה". | "רוצה לקרוא עוד על צ'אט בוטים, קול או שניהם?" |
"קול" | "מעולה, הנה הטיפ היומי! התג <type> <title> של <author>. רוצה טיפ נוסף על ספר או מאמר? אוכל גם לתת לך מידע נוסף על מפגשים או על מה שאנחנו עושים. איך אפשר לעזור?" |
- לוחצים שוב על האפשרות Intents בתפריט.
- לוחצים על Create Intent.
- מזינים את שם ה-Intent:
Tip Intent
(חשוב להשתמש באות L גדולה ו-I גדולה. - אם תאיתו את הכוונה בצורה שונה, השירות לקצה העורפי לא יפעל!) - לוחצים על הוספת ביטויי אימון ומוסיפים את הפרטים הבאים:
Can I get a tip for an article?
I would like to receive a reading tip
Any book tips?
What's nice to read?
I want to learn more about Chatbots, what should I read?
What are nice blogs?
Do you have book suggestions?
I want to receive information about Both
Can I have Chatbots reading tip
I would like to read more about Voice
Voice please
Both are okay.
Reading tip
Tip
Blog
Article
Book
Book suggestions
Yes
Yeah
Another tip
Yes one more
- גוללים למטה אל פעולות ופרמטרים.
- סימון טכנולוגיה כנדרש
לוחצים על Configure Prompt ומזינים:
Do you want to read more about Chatbots, Voice or Both?
- לוחצים על מילוי הזמנה > הפעלת האפשרות למילוי הזמנות
הפעם אנחנו לא כותבים את התשובה בתוך הקוד. התשובה תגיע מהפונקציה של Cloud Functions! כך הופכים את המתג הפעלת קריאה לפעולה לפעולה מאתר אחר (webhook) עבור ה-Intent הזה.
לוחצים על מילוי הזמנה > הפעלת האפשרות למילוי הזמנות
- מחליפים את המצב של המתג הפעלת קריאה לפעולה מאתר אחר (webhook) עבור ה-Intent הזה.
- לוחצים על שמירה.
5. מחברי ידע
מחברי ידע משלימים כוונות מוגדרות. הם מנתחים מסמכי ידע כדי למצוא תשובות אוטומטיות. (למשל: שאלות נפוצות או מאמרים מקובצי CSV, אתרים באינטרנט ואפילו קובצי PDF!) כדי להגדיר אותם, צריך להגדיר מאגר ידע אחד או יותר, שהם אוספים של מסמכי ידע.
בואו ננסה את זה.
- בוחרים את התג en כדי לבחור את השפה האנגלית בתפריט העליון.
- בוחרים באפשרות ידע (בטא) בתפריט.
- לוחצים על הלחצן הכחול הימני: יצירת מאגר ידע
- להקליד שם של מאגר ידע. נשים ב-Voice ולוחצים על שמירה.
- לוחצים על יצירת הקישור הראשון.
- פעולה זו תפתח חלון.
משתמשים בהגדרות הבאות:
שם המסמך: גיליון שאלות נפוצות בנושא נשים ב-Voice
סוג ידע: שאלות נפוצות
סוג Mime: CSV
- נצטרך את הנתונים מהגיליון הזה, יש לוודא שגיליון הנתונים פתוח ולבחור בכרטיסייה 'שאלות נפוצות'.
- בוחרים באפשרות קובץ > הורדה > CSV
- חוזרים ל-Dialogflow, לוחצים על Upload File from computer (העלאת קובץ מהמחשב) ובוחרים את קובץ ה-CSV שהורדתם. לוחצים על Create.
נוצר מאגר ידע:
- לוחצים על הוספת תגובה.
יוצרים את התשובות הבאות ולוחצים על שמירה:
$Knowledge.Answer[1]
- לוחצים על הצגת פרטים.
יוצגו כל השאלות הנפוצות שהטמעתם ב-Dialogflow.
זה קל!
לתשומת ליבכם, אתם יכולים גם להפנות לאתר HTML אונליין עם שאלות נפוצות כדי לייבא שאלות נפוצות לנציג שלכם. אפשר אפילו להעלות קובץ PDF עם קטע טקסט, ו-Dialogflow יציג שאלות.
- כדי לחזור לכל המחברים של מאגר הידע, לוחצים על Knowledge (בטא) בתפריט של Dialogflow.
- אפשר לשנות את העוצמה והחולשה של מאגר הידע. זה הגיוני, אם אתם חושבים שהשאלות הנפוצות מנצחות או מפסידות מכוונות משלכם. אין לנו הרבה כוונות, אז כדאי לחזק את מאגר הידע שלנו. שינוי קנה המידה ל--0.2. לאחר גרירת פס ההזזה, הערך יישמר באופן אוטומטי.
עכשיו יש להתייחס לשאלות הנפוצות כ'תוספות' שצריך להוסיף לנציגים שלכם, ליד כוונתכם. אי אפשר לאמן את המודל באמצעות שאלות נפוצות של מאגר הידע. לכן, יכול להיות שלא תהיה התאמה אם שואלים שאלות בדרך אחרת לגמרי, כי לא נעשה בהן שימוש ב-Natural Language Understanding (מודלים של למידת מכונה). לכן לפעמים כדאי להמיר את השאלות הנפוצות לכוונות.
6. מילוי הזמנות של ה-webhook
יצירת פונקציה של Google Cloud Functions
- עוברים אל http://console.cloud.google.com בכרטיסייה אחרת בדפדפן.
- בוחרים בתפריט הימני Cloud Functions
- לוחצים על Create Function (יצירת פונקציה).
- מציינים את ההגדרות האישיות הבאות:
- שם:
dialogflow
- הזיכרון שהוקצה: 256MiB
- טריגר: HTTP
- מעתיקים את כתובת ה-URL ללוח.
- בוחרים באפשרות עורך מוטבע
- זמן ריצה: NodeJS 8
- פונקציה להרצה:
dialogflow
- מוודאים שתיבת הסימון הזו מסומנת:
- הנה התוכן של package.json. צריך להעתיק ולהדביק את הקובץ הזה בכרטיסייה package.json של העורך.
קטע הקוד הזה טוען את ספריות ה-NPM הנכונות ל-Google Cloud:
{
"name": "dialogflow",
"description": "Cloud Functions",
"engines": {
"node": "8"
},
"dependencies": {
"request": "^2.85.0",
"request-promise": "^4.2.5",
"dialogflow-fulfillment": "^0.6.1",
"actions-on-google": "^2.2.0",
"googleapis": "^48.0.0",
"moment": "^2.24.0"
},
"devDependencies": {
"eslint": "^5.12.0",
"eslint-plugin-promise": "^4.0.1",
"ngrok": "^3.2.7"
},
"private": true
}
- הנה התוכן של ה-index.js. צריך להעתיק ולהדביק את הכתובת הזו בכרטיסייה index.js של העורך.
קטע הקוד הזה ישולב עם ספריית googleapis כדי לאחזר נתונים מגיליון Google Sheets. נעשה בו שימוש בספרייה actions-on-google כדי להציג כרטיסים במכשיר עם Google Assistant. הוא משתמש בספרייה dialogflow-fulfillment כדי לסווג כוונות של Dialogflow. והיא משתמשת ברגע בספרייה כדי לטפל באובייקטים של תאריך ושעה.
/* jshint esversion: 8 */
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const ACCOUNTS_SHEET_ID = '1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY';
const {
BasicCard,
Button,
} = require('actions-on-google');
const {google} = require('googleapis');
const moment = require('moment');
moment.locale('nl');
const { WebhookClient } = require('dialogflow-fulfillment');
var books;
var meetups;
const SHEETS_SCOPE = 'https://www.googleapis.com/auth/spreadsheets.readonly';
/**
* Authenticates the Sheets API client for read-only access.
*
* @return {Object} sheets client
*/
async function getSheetsClient() {
// Should change this to file.only probably
const auth = await google.auth.getClient({
scopes: [SHEETS_SCOPE],
});
return google.sheets({version: 'v4', auth});
}
/**
* Return a natural spoken date
* @param {string} date in 'YYYY-MM-DD' format
* @returns {string}
*/
var getSpokenDate = function(date){
let datetime = moment(date, 'YYYY-MM-DD');
return `${datetime.format('D MMMM')}`;
};
/* When the tipIntent Intent gets invoked. */
function tipIntent(agent) {
var par = agent.parameters.tech;
var selection = [];
//console.log(par);
//console.log(books);
for(var i = 0; i<books.length; i++){
if(books[i][2].toLowerCase() == par.toLowerCase()) {
selection.push(books[i]);
}
}
var random = Math.floor(Math.random() * selection.length);
var booktip = selection[random];
//console.log(selection[random]);
let spokenText = `<p><s>Alright, here's the tip of the day!</s></p><p>The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.</p>`;
let writtenText = `Alright, here's the tip of the day! The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`;
//console.log(booktip[8]);
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(`<speak>${spokenText}</speak>`);
conv.ask(new BasicCard({
title: `Tip of the day!`,
subtitle: `${par}`,
text: `The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`,
buttons: new Button({
title: 'Read',
url: `${booktip[8]}`,
})
}));
conv.ask(`<speak><p><s>Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?</s></p></speak>`);
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(writtenText + ' Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?');
}
}
function meetupIntent(agent) {
let conv = agent.conv();
let record;
console.log(meetups);
for(var i = 0; i<meetups.length; i++){
let d = moment(meetups[i][0], 'YYYY-MM-DD');
let today = moment(new Date());
if(moment(d).isSameOrAfter(today)) {
// the i event is not in the past
record = meetups[i];
console.log(record);
break;
}
}
let date = getSpokenDate(record[0]);
let spokenText1 = `The next meetup will be ${date} at ${record[1]} in ${record[3]}.`;
let spokenText2 = `The topic will be <emphasis level="moderate">${record[2]}.</emphasis>`;
let spokenText3 = `You can register via our newsletter.`;
let writtenText = `${spokenText1} The topic will be ${record[2]}. ${spokenText3}`;
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
conv.ask(`<speak>${spokenText1} ${spokenText2} ${spokenText3}</speak>`);
conv.ask(new BasicCard({
title: `Meetup`,
subtitle: `${record[2]}`,
text: `${record[0]} ${record[1]} - ${record[3]}`,
buttons: new Button({
title: 'Register',
url: `http://www.meetup.com`
})
}));
conv.ask('<speak><p><s>Is there anything else I can help you with?</s></p></speak>');
agent.add(conv);
} else {
agent.add(`${writtenText} Is there anything else I can help you with?`);
}
}
exports.dialogflow = async (request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
const client = await getSheetsClient();
const allBooks = await client.spreadsheets.values.get({
spreadsheetId: ACCOUNTS_SHEET_ID,
range: 'Books&Blogs!A:I',
});
const allEvents = await client.spreadsheets.values.get({
spreadsheetId: ACCOUNTS_SHEET_ID,
range: 'Meetups!A:D',
});
books = allBooks.data.values;
meetups = allEvents.data.values;
books.shift();
meetups.shift();
var intentMap = new Map();
intentMap.set('Tip Intent', tipIntent);
intentMap.set('Meetup Intent', meetupIntent);
agent.handleRequest(intentMap);
};
- לחיצה על הקישור 'משתני סביבה', 'רישות, זמן קצוב לתפוגה' ועוד
- בוחרים את חשבון השירות Dialogflow Integrations.
(כברירת מחדל הוא משתמש בחשבון שירות של GAE App Engine, אבל החשבון הזה צריך להיות זהה לחשבון השירות ששותף בתוך Google Sheets, בשלבים הראשונים של המדריך הזה).
- לפני שנפרוס את הפונקציה של Cloud Functions. נשנה שורה אחת בקוד שלנו בכרטיסייה index.js. שורת הקוד השלישית:
const
ACCOUNTS_SHEET_ID = '1Yo_E8KONgSiUm00ZmTOqtjXCwULmc2JuI3sjxRyvrkE';
באחד מהשלבים הראשונים, רשמנו את המפתח הזה ב'פנקס רשימות'. לכן צריך להעתיק את המזהה הזה ולהדביק אותו בקוד.
- עכשיו אנחנו מוכנים. לוחצים על הלחצן Create. זה ייקח כמה רגעים, כי מתבצעת פריסה של הפונקציה ללא שרת (serverless).
הפעלה של מילוי הזמנות ב-Dialogflow
- חזרה ל-Dialogflow
- לוחצים על מילוי הזמנה בתפריט הראשי.
- מפעילים את המתג webhook.
- מזינים את כתובת ה-URL של הפונקציה ב-Cloud Functions שהועתקה ללוח.
לדוגמה: https://us-central1-leeboonstra-wiv-uhtefa.cloudfunctions.net/dialogflow
- לוחצים על שמירה.
- נבדוק את ה-webhook כדי לראות אם הקוד פועל ונבדוק את הזרימה ישירות בסימולטור של Dialogflow.
7. Actions on Google
Actions on Google היא פלטפורמת פיתוח ל-Google Assistant. הוא מאפשר פיתוח של 'פעולות' על ידי צד שלישי – יישומונים ל-Google Assistant שמספקים פונקציונליות מורחבת.
כדי להפעיל פעולה ב-Google, צריך לבקש מ-Google לפתוח אפליקציה או לדבר איתה.
הפעולה הזו תפתח את הפעולה, תשנה את הקול ותתבצע יציאה מהשפה 'נייטיב' היקף ההרשאות של Google Assistant. כלומר, כל מה שמבקשים מהנציג בשלב הזה צריך ליצור על ידכם. במסגרת הפעולה עצמה, אי אפשר לבקש פתאום מ-Google Assistant מידע על מזג האוויר ב-Google, אם זה מה שמעניין אותך. עליך להשאיר (לסגור) את היקף הפעולה הנוכחית (האפליקציה שלך).
בדיקת הפעולה בסימולטור של Google Assistant
נבדוק את השיחה הבאה:
משתמש | Google Assistant |
"Ok Google, talk to my test app" | "קבלת גרסת הבדיקה של האפליקציה שלי". |
משתמש | השם שלך-WIV |
- | "היי, אני אנה, הנציגה הווירטואלית של נשים ב-Voice. את יכולה לבקש ממני מידע על מפגשים, נשים ב-Voice או טיפ לקריאה. מה היית רוצה לדעת?" |
אפשר לתת לי טיפ לבלוג? | "רוצה לקרוא עוד על צ'אט בוטים, קול או שניהם?" |
צ'אט בוטים | "מעולה, הנה הטיפ היומי! המאמר צ'אט בוטים והאתגר של עלויות בלתי נראות של קובוס באפור.רוצה טיפ נוסף על ספר או מאמר? אוכל גם לתת לך מידע נוסף על מפגשים או על מה שאנחנו עושים. איך אפשר לעזור?" |
מתי המפגש הבא? | "המפגש הבא יהיה ב-29 באפריל בשעה 18:00 ב-Hangouts וירטואלי. הנושא יהיה 'סדנה אונליין: יצירת פעולות של Google עם Dialogflow!'. אפשר להירשם דרך הניוזלטר שלנו.יש עוד משהו שאוכל לעזור לך איתו?" |
מהי כתובת האתר שלך? | "אתם יכולים למצוא אותנו בכתובת www.Winvoice.com. אשמח לעזור לך בכל שאלה או בעיה אחרת. |
לא, זה הכול, תודה | "מצוין. אני מקווה שנתראה באחד מהמפגשים שלנו!" |
- חוזרים לסימולטור של Google Assistant
פותחים את: https://console.actions.google.com
- לוחצים על סמל המיקרופון ושואלים את השאלות הבאות:
Talk to my test app.
- עכשיו נשאל:
Can I have a tip for a blog?
הפלט אמור להחזיר:
"רוצה לקרוא עוד על צ'אט בוטים, קול או שניהם?"
Chatbots
"מעולה, הנה הטיפ היומי! המאמר צ'אט בוטים והאתגר של עלויות בלתי נראות של קובוס באפור.
רוצה טיפ נוסף על ספר או מאמר? אוכל גם לתת לך מידע נוסף על מפגשים או על מה שאנחנו עושים. איך אפשר לעזור?"
- ננסה גרסה אחרת של אותה שאלה:
"Yes, I want to read more about Voice"
"מעולה, הנה הטיפ היומי! העיצוב של ממשקי משתמש עם קול: עקרונות של תכונות שיחה. ... של Cathy Pearl.
רוצה טיפ נוסף על ספר או מאמר? אוכל גם לתת לך מידע נוסף על מפגשים או על מה שאנחנו עושים. איך אפשר לעזור?"
שימו לב שאף פעם לא השתמשתם בביטוי האימון הזה ב-Dialogflow. היא בדיוק תאמה לכוונה הנכונה.
שימו לב גם שלא קיבלתם שאלת המשך כי סיפקתם מספיק מידע כדי לאפשר ל-Dialogflow להמשיך.
- ממשיכים ב-Dialogflow עם הביטויים הבאים:
What's the URL for your website
Bye
שגיאות? כדאי לבדוק את היומנים!
בכל פעם שמשתמשים ב-console.log()
בקוד הפונקציה של Cloud Functions, נתונים נכתבים ביומני GCP (Stackdriver). כדי לגשת ליומנים האלה, פותחים את מסוף Cloud > רישום ביומן.
בתפריט הנפתח הראשון, בוחרים באפשרות Cloud Functions > בתיבת הדו-שיח הזו לסינון היומנים.
8. מזל טוב
יצרת את הפעולה הראשונה שלך ב-Google Assistant ב-Dialogflow. כל הכבוד!
כפי שאולי הבחנת, הפעולה שלך פעלה במצב בדיקה, המקושר לחשבון Google שלך. אם תתחברו למכשיר Nest או לאפליקציית Google Assistant בטלפון iOS או Android, באמצעות אותו החשבון. גם לך יש אפשרות לבדוק את הפעולה שביצעת.
כעת זוהי הדגמה של סדנה. אבל כשיוצרים בקשות ל-Google Assistant באופן אמיתי, אפשר לשלוח את הפעולה לאישור. מידע נוסף זמין במדריך הזה.
אילו נושאים דיברנו?
- איך יוצרים צ'אט בוט באמצעות Dialogflow v2
- איך יוצרים ישויות בהתאמה אישית באמצעות Dialogflow
- איך יוצרים שיחה לינארית באמצעות Dialogflow
- איך מגדירים מילוי הזמנות ב-webhook באמצעות Dialogflow ו-Google Cloud Functions
- איך מעבירים את האפליקציה אל Google Assistant באמצעות Actions on Google
מה השלב הבא?
נהנית משיעור ה-Lab הזה של כתיבת קוד? בואו לראות את שיעורי ה-Lab המעולים האלה!
- איך יוצרים פעולה ממדריך הטלוויזיה באמצעות Dialogflow ו-Actions on Google
- יצירת פעולות ל-Google Assistant באמצעות Dialogflow (רמה 1)
- יצירת פעולות ל-Google Assistant באמצעות Dialogflow (רמה 2)
- יצירת פעולות ל-Google Assistant באמצעות Dialogflow (רמה 3)
- הסבר על מילוי ההזמנות באמצעות שילוב של Dialogflow עם יומן Google
- שילוב Google Cloud Vision API עם Dialogflow