在本程式碼研究室中,您將瞭解如何使用 Dialogflow 建立對話介面,為 RBM 代理程式提供支援。
在這個程式碼研究室中,您要建構什麼?
- 支援 RBM 服務專員對話的 Dialogflow 服務專員
- 虛構單車商店的對話式介面,可讓使用者瞭解單車店的相關資訊,以及安排維修或預約單車
教學內容
- 如何使用 Dialogflow 的三大建構項目 (意圖、實體和結構定義) 來建立對話介面
- 如何使用 Dialogflow 的出貨和內嵌編輯器 (透過 Cloud Functions for Firebase 技術) 將對話介面連結至您自己的服務和 API
- 如何透過 Dialogflow 建立 RBM 回應類型,以便為使用者提供豐富的 RBM 體驗
硬體與軟體需求
- 擁有 Google 帳戶
建立及查詢第一個代理程式
時間長度:10:00
建立您的第一個 Dialogflow 代理程式
如何建立 Dialogflow 代理程式:
- 開啟新分頁並登入 Dialogflow。
按一下左側導覽列中的 [建立代理程式]。
輸入「quolabRBMBikeShop"」做為代理程式的名稱,並使用「quot;English"」做為預設語言,並將預設時區設為時區。然後按一下 [建立]。
Dialogflow 控制台
您現在應該會看到 Dialogflow 控制台。如果您處理的是較小的螢幕,並隱藏左側導覽畫面,請按一下左上角的導覽按鈕。「設定」按鈕會將您導向目前的代理程式設定。
頁面中間會顯示代理程式的意圖清單。根據預設,Dialogflow 代理程式會從兩個意圖開頭。如果代理程式無法理解使用者所說的內容,系統就會比對預設備用意圖。預設歡迎意圖會歡迎使用者。您可以修改這些意圖以自訂體驗。
右側是 Dialogflow 模擬工具,如此一來,您就能透過語音或輸入訊息來試用代理程式。
查詢代理程式
Dialogflow 代理程式的最佳描述為 NLU (自然語言理解) 模組。您可以在應用程式、產品或服務中納入這些資訊,將自然使用者要求轉換成可採取行動的資料。
開始試用代理程式吧!在右側的模擬工具中,按一下「Try it now」(立即體驗) 的文字欄位,然後輸入「Hi」後再按下 Enter 鍵。
Dialogflow 可識別查詢、比對預設歡迎意圖,並回應一般問候語。這項功能的運作方式是,Dialogflow 會自動利用部分問候語來訓練預設歡迎意圖。
建立 RBM 代理程式
登入 Business Communications Developer Console,然後按一下 [Createagent]。
在「名稱」欄位中輸入「Your Name's Bike Shop」(例如「Sean's Bike Agent"」);選取區域,然後點選「Createagent」。
將 RBM 代理程式連結至 Dialogflow
建立 RBM 代理程式之後,按一下該代理程式即可查看總覽頁面。按一下左側導覽面板中的「整合」連結。
根據預設,RBM 代理程式會使用 Google Cloud Pub/Sub 處理使用者訊息。如要將 RBM 代理程式連結至您稍早建立的 Dialogflow 代理程式,請按一下 [Dialogflow] 整合。
在對話方塊中,按一下「連結現有模型」。按照操作說明授權 RBM 代理程式呼叫 Dialogflow 代理程式,然後點選「Next」(下一步)。
最後,您必須提供 Dialogflow 專案 ID,在「Business Communications Developer Console」以外的瀏覽器分頁中,前往「Dialogflow」,然後開啟您先前建立的 CodelabRBMBikeShop 代理程式。在左側導覽列中,按一下專案名稱附近的齒輪圖示。
點選該圖示,即可前往模型設定。在「GOOGLE PROJECT」下方,找出並複製專案 ID。
返回開啟 Business Communications Developer Console 的分頁,將專案 ID 貼到對話方塊中,然後按一下 [開始整合]。
此程序大約需要兩分鐘才能完成。完成後,您應該會看見 Dialogflow 整合選項,以及可用的「Viewagent」連結。
現在起,服務專員收發的所有訊息現在都會由 CodelabRBMBikeShop Dialogflow 代理程式處理。
邀請測試裝置並傳送訊息
開始使用 Dialogflow 之前,請先設定測試裝置。如果您還沒有可接收 RBM 訊息的裝置,請按照這份指南完成設定。
在 Business Communications Developer Console 中,按一下左側導覽面板中的「裝置」。在表單中,以 E.164 格式輸入裝置的完整電話號碼 (例如 +12223334444),然後按一下 [新增]。
在裝置上會收到測試邀請。輕觸 [讓我成為測試人員]。
在瀏覽器中的「裝置」清單尋找裝置,然後傳送測試訊息給裝置。如果在裝置上收到 RBM 代理程式的訊息,表示已完成本程式碼研究室的設定。
正在建立歡迎意圖
一般而言,透過採用 Dialogflow 的 RBM 虛擬服務專員進行對話,你需要指定 API 呼叫來指定使用者的電話號碼,以及用來啟動對話的 Dialogflow 意圖 (通常是代理程式的歡迎意圖)。在本程式碼研究室中,我們會略過這個步驟,並改用先前透過 Business Communications Developer Console 的測試裝置建立的對話串。不過,如要進一步瞭解這項 API 功能,請參閱這份指南。
請先在預設歡迎意圖中新增 RBM 回應,讓 Dialogflow 能與 RBM 代理程式搭配使用。首先,前往已開啟 Dialogflow 的瀏覽器分頁。按一下「Default 歡迎 Intent」(預設歡迎意圖),向下捲動至「Responses」(回應) 部分,點選回應類型清單中的「+」,然後選取「RCS Business Messaging (RBM)」。
按一下「Add Responses」,然後選取「Simple Response」。在「Simple Response」(簡易回應) 的文字欄位中輸入「quot;Hi, 歡迎加入 Hogarth's Bike Shop」。我可以提供哪些協助?(請將 Hogarth 換成您的名稱),然後按一下 [Save]。
發起對話
您已經設定歡迎意圖,請返回測試裝置並傳送訊息「quot;Hi"」。這則訊息會觸發預設歡迎意圖,您應該會看到與下圖相似的內容。
更新歡迎意圖
現在,Dialogflow 會傳送了簡單的訊息,接著更新訊息以提供更多實用資訊。我們不僅要歡迎使用者,也會引導他們採取行動。
我們建立的虛擬服務專員必須支援兩項主要功能:檢查營業時間,以及預約時間。讓我們用簡單的資訊卡取代歡迎訊息,以提供這類互動的建議回覆。
在「Default 歡迎 Intent」(預設歡迎意圖) 和「Responses」(回應) 專區中,選取「RCS Business Messaging (RBM)」(RCS 商家訊息 (RBM)) 分頁標籤。按一下現有的垃圾桶圖示,即可移除現有的 Simple Response。接著,按一下「Add Responses」,然後選取「Standalone Rich Card」。
在獨立複合式資訊卡中,輸入以下內容:
- 資訊卡標題:您好,歡迎光臨 Hogarth's 單車店。
- 資訊卡說明:我可以怎麼協助您呢?請從下方選取適當選項:
- 選取資訊卡方向:直向
- 圖片/影片網址:https://storage.googleapis.com/df-rbm-codelab/bike-shop.jpg
- 選取媒體高度:中等
按一下 [新增建議],然後輸入以下內容:
- 建議文字:您的營業時間為何?
- 建議回傳:回覆_小時
如要新增其他建議,請按一下「Add Suggested」(新增建議),然後輸入以下內容:
- 建議文字:預約
- 建議回傳:回覆_appointment
按一下「儲存」。
快來體驗看看吧!
如果模型顯示「Agent Training 完成」(Intut Training complete) 訊息,請返回裝置,並將訊息「Hello」傳送給代理程式。您應該會看到剛剛設計的獨立複合式資訊卡。
請輕觸 [你的營業時間是?]。請注意,系統會觸發預設備用廣告意圖。這是因為您的 Dialogflow 代理程式不知道如何處理您為這項建議設定的回傳資料,也就是「reply_hours"」。
讓我們修正這個問題,
建立營業時間意圖
Dialogflow 使用意圖將使用者的意圖分類,Intent 含有訓練詞組,例如使用者可能會向代理程式說出的內容。例如,如果有人想知道單車店的營業時間,"你的營業時間是多少?
這些查詢都不重複,但意圖相同:取得單車店開啟時間的資訊。
如要涵蓋這項查詢,請建立「小時」意圖:
- 在左側導覽面板中,按一下「意圖」旁的 +。
- 針對「意圖名稱」,輸入「Hours"」。
在「Training vocabularys」(訓練詞組) 下方,按一下「Add userexpression」(新增使用者運算式) 並輸入以下內容,然後在每個項目後方按下 Enter 鍵:
When do you open?
What are your hours?
How late can I come in?
reply_hours
。
這個最後一個訓練詞組會用來對應您在上一節設定的回傳資料,以便瞭解這項意圖。
按一下「Responses」(回應) 下方的「+」,然後選取「RCS Business Messaging (RBM)」。
按一下「Add Responses」,然後選取「Simple Response」。
在「Simple Response」文字欄位中,輸入「We'每週平日上午 9 點到下午 5 點 30 分」。
按一下「儲存」。
快來體驗看看吧!
現在,建議你向服務專員詢問營業時間。在您的裝置的 RBM 服務專員對話中,輸入「何時開放部署」,並將訊息傳送給代理程式。
您的代理程式現在可正確回應查詢。請注意,雖然您的查詢和訓練詞組稍有不同 (「&when is open openquot; versus " when when open openquot;);Dialogflow 仍會將查詢與正確的意圖進行比對。你也可以在複合式資訊卡中輕觸 [營業時間為何?]。
Dialogflow 會使用訓練詞組做為機器學習模型的範例,藉此比對使用者';查詢與正確的意圖相符。機器學習模型會根據代理程式中的每個意圖檢查查詢,為每項意圖評分,並符合最高分數的意圖。如果分數最高的意圖分數極低,則會比對備用意圖。
新增出貨資訊
正常運作時,我們打造的代理程式運作方式可能會有些不自然。當使用者問「你是公開開胃菜」時,代理程式會在每週早上 9 點至下午 5 點 30 分回覆。如果服務專員直接告訴我們商家是否營業,那就會更加自然實用。
為此,我們的服務專員必須檢查商店目前是否營業,並產生兩種不同的回應。在 Dialogflow 中,應該在出貨 Webhook 中實作這種複雜的邏輯。
出貨 Webhook 是 HTTP 伺服器所呼叫的 HTTP 伺服器,其中包含目前對話狀態的相關資訊。出貨代碼會採取任何必要動作,然後產生 Dialogflow 傳回給使用者的回應。
我們現在會逐步完成部署出貨 Webhook 程序,讓代理程式提供更實用的回應。
設定:部署及啟用執行要求
Dialogflow 內建 Cloud Functions for Firebase 編輯器,可讓您編寫及部署 JavaScript 程式碼來處理出貨要求。
在 Dialogflow 的左側導覽面板中,按一下「Fulfillment」(執行) 以開啟出貨頁面。按一下「內嵌編輯器」旁的切換按鈕,即可啟用 Cloud Functions for Firebase 編輯器。
您會發現編輯器包含兩個檔案:"index.js",其中包含出貨的主要程式碼,以及「quot;package.json"」,其中含有必要的依附元件。
接下來,我們要匯入一些可滿足您出貨要求的程式碼範例。
複製這個檔案的文字並貼到「index.js」中,並取代目前的所有內容:
https://storage.googleapis.com/df-rbm-codelab/index.js
現在捲動至頁面底部,然後按一下「DEPLOY」。大約一分鐘後,您的程式碼就會部署至 Cloud Functions for Firebase。
部署函式後,頁面底部會顯示部署的日期和時間:
請查看出貨代碼。hoursHandler
函式會呼叫 currentlyOpen
來確定商店目前是否營業,並根據條件新增不同的 RBM 回應。
function hoursHandler(agent) {
let responseText = 'We\'re currently closed, but we open every weekday at 9am!';
if (currentlyOpen()) {
responseText = 'We\'re open now!! We close at 5pm today.';
}
let payload = {
"fulfillmentMessages": [
{
"platform": "GOOGLE_RBM",
"rbmText": {
"text": responseText
}
}
]
};
return response.status(200).json(payload);
}
行 intentMap.set('Hours', hoursHandler);
會指示出貨程式庫,在符合「每小時」意圖時,hoursHandler
函式應執行。不過,我們也必須告知 Dialogflow 必須為「每小時」意圖啟用執行要求。
按一下左側導覽面板中的「意圖」,然後開啟「小時」意圖。開啟底部的「Fulfillment」(執行) 區段,然後選取「Enable Webhook call for this intent」(為這個意圖啟用 Webhook 呼叫),將此功能設為開啟狀態。
儲存意圖後,您可以再試一次。在右側的模擬工具中,輸入「? are are open Deploymentquot;」。如果按一下「Diagnostic Info」並檢查 API 回應,系統會顯示出貨回應。請注意,Cloud Functions for Firebase 伺服器使用的時區是世界標準時間,因此您目前的當地時間可能無法做出正確的回應。
如果執行要求發生錯誤,Dialogflow 會使用「Intent」(意圖) 頁面的「Responses」(回應) 部分中定義的任何回應,讓您的代理程式順利復原。
接下來,我們會使用實體擷取使用者查詢的相關部分。我們因此能讓使用者安排與單車店的預約時間,以便修正或騎單車。
使用實體擷取資料
時間:12:00
在本節中,我們將說明如何從使用者查詢中擷取資料,讓使用者預約我們的自行車店提供服務或修正單車。
新增參數至意圖
參數是使用者查詢中的相關字詞或詞組,Dialogflow 會擷取這個詞,以便您的代理程式提供適當的回應。您將使用參數建立新的意圖,並學習如何在回應中加入這些值。
- 按一下左側導覽面板中「Intents」(意圖) 旁的「+」即可建立新意圖。
- 如果使用的是意圖名稱,請在頁面頂端輸入「設為預約」。
- 將以下內容新增為訓練詞組:
reply_appointment
I'd like to schedule an appointment for next Thursday
I have a mountain bike that needs servicing
I'd like to get my bike fixed
My bike is broken
Can I schedule service for 4pm tomorrow?
Can you fix my road bike?
Can I set up an appointment for noon on Friday?
Dialogflow 會自動偵測訓練詞組中的已知參數,並為您建立參數。
在「Training vocabularys」(訓練詞組) 下方,Dialogflow 會自動在收集參數表格中填入收集到的資訊:
- 此為選用參數 (非必填)
- 名為 date 和 time
- 對應系統實體類型 @sys.date 和 @sys.time**
- 值為 $date 和 $time
- 非清單
使用參數資料
您可以在回應中使用參數值。在這種情況下,您可以在回應中使用 $date
和 $time
,然後將這些值替換成查詢中指定的查詢日期和時間。
在「Responses」(回應) 中新增 RCS Business Messaging 分頁,將以下內容新增至「Simple Response」(簡易回應),然後按一下「Save」(儲存):
Great! I've set up your appointment for $date at $time. See you then!
快來體驗看看吧!
現在,請在右側面板的模擬工具中,查詢「我可以在下午 2 點進行預約」的預約時段。
您可以在模擬工具的底部,瞭解 Dialogflow 從查詢正確擷取了「明天」參數和「下午 2 點」的參數,並以正確的方式剖析這些日期和時間。現在,請在測試裝置上嘗試相同內容,看看回應如何包含剖析的日期與時間。
需要參數
以單車店為例,我們需要知道日期和時間的值,才能預約。根據預設,所有 Dialogflow 參數都是選用項目。我們必須勾選每個所需參數旁邊的方塊,以規定這些需求。勾選「Make Appointment」意圖中每個參數旁的方塊。
現在,每個參數都是必要項目,我們必須為每個參數建立提示。針對使用者最初表示意圖 (在本例中預約) 提供的任何參數,提示會要求使用者提供一個值。按一下「Definition options」(定義提示) 來為參數建立提示,並為每個參數輸入下列提示:
參數 | 提示 |
日期 | 你希望哪一天相會? |
時間 | 你最方便的時間是? |
輸入提示後,按一下「儲存」。
快來體驗看看吧!
在裝置上輕觸「進行預約」建議或輸入「我想讓單車修理」。您會收到回應「您希望在哪一天參加活動」? 指定日期 (「明天」) 並得到回應,要求提供日期。為了回覆此次提醒,你會看到預約已設定完成。
初始要求中含有部分資訊的查詢 (即「我想設定明天的預約」) 填寫正確的參數 (日期),然後略過日期提示 (「預定的來到哪一天)」,再移至時間提示 (「做時間的工作時間」)。
我們只使用 Dialogflow 實體和參數來建立完全不重複的對話,而且無需程式碼且只需要少量設定!接下來,我們會探討如何利用執行要求,引導使用者回答問題,例如「預定的預約日期為何」。
設定:啟用出貨資訊
在左側導覽面板中,按一下「意圖」,然後開啟「Make Appointment」意圖。開啟 [Fulfillment],選取 [Enable Webhook call for this 意圖] 和 [Enable Webhook call for slot slots],將兩者設為開啟,然後按一下「Save」。
同時啟用上述兩項功能後,在觸發這項意圖時,Dialogflow 會使用出貨資訊來針對必要參數產生回應,以及針對意圖執行 RBM 回應。
實作出貨資訊
在 Dialogflow 的左側導覽面板中,按一下「Fulfillment」(執行) 以開啟出貨頁面。向下捲動頁面
intentMap.set('Hours', hoursHandler);
然後將下列程式碼新增到下一行:
intentMap.set('Make Appointment', makeAppointment);
這會指示出貨程式庫,在「Make Appointment」的意圖相符時,makeAppointment
函式應執行。
接著,請複製下方的程式碼並貼到 currentlyOpen
函式下方。這兩個函式 getSuggestedTimes
和 getSuggestedDates
會建立實用的方塊清單,以促進使用者回應。
function getSuggestedTimes() {
return [
{
"reply": {
"text": "9 am",
"postbackData": "9:00am"
}
},
{
"reply": {
"text": "10 am",
"postbackData": "10:00am"
}
},
{
"reply": {
"text": "1 pm",
"postbackData": "1:00pm"
}
},
{
"reply": {
"text": "2 pm",
"postbackData": "2:00pm"
}
}
];
}
function getSuggestedDates() {
return [
{
"reply": {
"text": "Tomorrow",
"postbackData": "Tomorrow"
}
},
{
"reply": {
"text": "A week from now",
"postbackData": "A week from now"
}
},
{
"reply": {
"text": "Two weeks from now",
"postbackData": "Two weeks from now"
}
}
];
}
接著,在 hoursHandler
下方複製及貼上下列程式碼,然後按一下「Deploy」(部署)。
function makeAppointment(agent) {
// extract required parameters
const appointmentDate = agent.parameters.date;
const appointmentTime = agent.parameters.time;
const gotAppointmentDate = appointmentDate.length > 0;
const gotAppointmentTime = appointmentTime.length > 0;
let responseText = '';
let suggestions = [];
if(gotAppointmentDate && gotAppointmentTime) {
// We have all required parameters, return success message
responseText = 'Great! I\'ve set up your appointment for ' +
appointmentDate + ' at ' + appointmentTime + '. See you then!';
}
else if(gotAppointmentDate) {
responseText = 'What time works for you?';
suggestions = getSuggestedTimes();
}
else if(gotAppointmentTime) {
responseText = 'What day do you want to come in?';
suggestions = getSuggestedDates();
}
else {
responseText = 'What day do you want to come in?';
suggestions = getSuggestedDates();
}
let payload = {
"fulfillmentMessages": [
{
"platform": "GOOGLE_RBM",
"rbmText": {
"text": responseText,
"rbmSuggestion": suggestions
}
}
]
};
return response.status(200).json(payload);
}
請稍候幾分鐘,以檢查程式碼。請注意,系統會檢查是否有必要參數;如果未設定,系統會向使用者顯示適當的訊息以及一組建議。
快來體驗看看吧!
在裝置上輕觸「進行預約」建議或輸入「我想讓單車修理」。您會收到回應:「您希望在哪一天來到這裡」,以及一些實用的建議:「明天」(Imorrow")、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回回應詢問一段時間,回應訊息後,你會看到預約已設定完成。
使用背景資訊管理狀態
時間長度:7:00
新增對話狀態背景資訊
使用者成功設定預約流程後,建議你向他們收集一些額外資訊。假設您的自行車店提供兩種類型的預約工具:維修或微調。我們想知道哪些使用者需求,
首先,讓我們更新「建立預約」的回覆,並向使用者詢問他們需要的預約類型。將 makeAppointment
出貨函式中的成功回應替換為下方文字,然後按一下「Deploy」。
responseText = 'Great! I\'ve set up your appointment for ' +
appointmentDate + ' at ' + appointmentTime + '. Do you need a repair for just a tune-up?';
為了收集這個問題的答案,我們必須建立其他意圖。 不過,請務必在回答這個問題後,才比對這個新意圖。為了強制執行,我們可以將其定義為後續意圖。
後續意圖是指只有在符合「父項」意圖 (在本案例中為「進行預約」) 的意圖後才能比對。按一下左側導覽中的「Intents」(意圖) (如果選單為隱藏狀態,請按一下左上角的選單 cloudbuild 按鈕)。然後將滑鼠遊標懸停在「提交預約」意圖上,然後按一下意圖名稱右側的「新增後續追蹤意圖」:
接著,點選下拉式選單中的 [自訂]。
Dialogflow 會自動將後續追蹤意圖的命名為「Make Appointment - custom,」,用於指定意圖之間的關係。
只有在符合父項意圖時,才能比對後續意圖。由於這個意圖只會在「製作預約」後比對,因此我們可以假設使用者剛剛提出了問題,「需要維修或僅調整微調設定」的提問。
如要回答這個問題,我們必須先定義部分實體。
建立您的第一個實體
Dialogflow 可讓您定義開發人員實體,其運作方式與 Dialogflow 的系統實體類似。讓我們先建立實體類型。我們希望使用者能自行選擇要和商店進行的預約類型,因此請呼叫實體類型 AppointmentType
。我們將為兩種不同的預約類型,在 AppointmentType
實體類型中新增兩個實體:service
和 fix
。
如何建立實體類型:
- 在左側導覽面板中,按一下「實體」旁的「+」。
- 針對實體類型名稱,請輸入「AppointmentType"」。
- 按一下文字欄位並新增下列項目:
- 服務
- 修正
- 輸入項目時,按下 Tab 鍵可將遊標移到同義詞欄位。為各個項目新增下列同義詞。請務必個別輸入每個字詞,而不要複製及貼上整個字串:
登入 | 同義詞 |
服務 |
|
修正 |
|
- 按一下「儲存」。
每個實體類型都必須具備:
- 用來定義類別的名稱 (&At;AppointmentType")
- 一或多個項目 (「服務」或「修正」)
- 一或多個同義詞 (「主要」、「微調」等)
Dialogflow 會處理複數和大小寫等簡單的情況,但請務必新增所有可能的同義詞。新增越多,代理程式就越能判定實體。
新增實體
我們定義了預約的實體類型,現在可以在「Make Appointment - custom"intent」的訓練詞組中使用它:
- 按一下左側導覽選單中的「Intents」(意圖),然後按一下「Make Appointment」的箭頭,以顯示其後續意圖。按一下「設為預約 - 自訂」意圖。
將下列內容新增為訓練詞組:
- 你可以幫我自行車嗎?
- 我需要維修。
您應該可以在輸入的訓練詞組中自動加註預約實體類型。這會將
AppointmentType
參數新增至資料表,該屬性位於「訓練詞組」部分下方。按一下核取方塊,將這個參數標示為 REQUIRED。按一下「定義提示」,然後輸入「我們可維修或維修你的單車」。 您希望哪一項設定?
在「Responses」(回應) 中,將回應變更為「quoay; OK, 我們安排 $AppointmentType."」,然後按一下 [Save] (儲存)。
快來體驗看看吧!
在裝置上輕觸「進行預約」建議或輸入「我想讓單車修理」。您會收到回應:「您希望在哪一天來到這裡」,以及一些實用的建議:「明天」(Imorrow")、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回一當天的回應時間。
選取時間,即可查看您建立的新回應,詢問這是針對服務還是微調。
接著,輸入「我需要維修」。您應該會看到回應「好」,我們會排定修正時間。」表示 Dialogflow 擷取了正確的 AppointmentType 做為實體。
目前,此意圖的回應 (好,我們會排定修正時間) 沒有幫助。如果回應已確認預約的日期和時間,這是不錯的選擇。如要這麼做,您需要日期和時間,但日期和時間參數只在「建立預約 - 意圖」中,而非在「建立預約 - 自訂」意圖中。
意圖和背景資訊
如要使用從「製作預約」意圖收集到的參數進行回應,您必須瞭解後續意圖的運作方式。後續意圖會使用結構定義來追蹤是否已觸發父項意圖。如果您檢查「Make Appointment」意圖,系統會顯示「MakeAppointment-followup」;輸出內容為輸出內容,前面加上數字「2」:
將「建立預約」條件配對後,Dialogflow 會將結構定義「MakeAppointment-後續追蹤」附加至對話兩下。因此,當使用者回應問題 (「您需要維修或只是微調微調設定」時),結構定義「MakeAppointment-後續追蹤」會處於有效狀態。假如 Dialogflow 比對意圖,就會具有相同輸入結構定義的任何意圖。
按一下左側導覽面板中的「Intents」(意圖),然後點選「quoA;MakeAppointment - custom"intent」。
您可以看到該意圖與輸入「Make Appointment&」的輸出結構定義具有相同的輸入結構定義 (「MakeAppointment-後續追蹤」)。因此,「MakeAppointment - custom」(等於) 僅與「Make Appointment」相符。
背景資訊和參數
結構定義會儲存參數值,也就是說,您可以在其他意圖中存取「Make Appointment"」中定義的參數值,例如「MakeAppointment - custom」。
在「MakeAppointment - custom"」意圖中新增以下回應,然後按一下「Save」(儲存):"OK,我們會安排在 #MakeAppointment-followup.time 進行 $AppointmentType、#MakeAppointment-followup.date。我們下次見!」
您現在可以再次向代理程式進行查詢,並取得適當的回應。首先請輸入「我可以在明天的上午 11 點預約自行車維修服務,然後使用「我需要維修」回應問題。
在確認預約的回應中,您應該會看到結構定義的日期與時間值。
改善回應格式
時間長度:5:00
使用執行要求設定日期和時間格式
您應該注意到,成功訊息中顯示的日期和時間並不容易用。如要修正這個問題,我們需要再次使用執行要求,以便使用 JavaScript 格式化日期和時間參數,以便使用者輕鬆讀取。
前往左側導覽中的「Make Appointment - custom"Intent」,然後按一下左側導覽面板的「Intents」,然後點選「MakeAppointment - custom"intent」。向下捲動到頁面底部,然後開啟「Enable Webhook call for thisintent」(為這個意圖啟用 Webhook 呼叫),然後按一下 [Save] (儲存)。
按一下左側導覽面板中的「出貨」連結,前往出貨資訊。
複製下方的程式碼並貼到 makeAppointment
函式下方。
function makeAppointmentFollowUp(agent) {
let context = agent.getContext('makeappointment-followup');
// extract required parameters
const appointmentDate = new Date(context.parameters.date);
const appointmentTime = new Date(context.parameters.time);
const appointmentType = agent.parameters.AppointmentType;
// format date and time to be human-readable
const dateAsString = appointmentDate.toLocaleDateString('en-US',
{ weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
const timeAsString = appointmentTime.toLocaleString('en-US',
{ hour: 'numeric', minute: 'numeric', hour12: true });
// compose response for user
let responseText = 'Okay, we'll schedule a ' + appointmentType + ', ' + dateAsString +
', at ' + timeAsString + '. We'll see you then.';
let payload = {
"fulfillmentMessages": [
{
"platform": "GOOGLE_RBM",
"rbmText": {
"text": responseText
}
}
]
};
return response.status(200).json(payload);
}
在這個函式下方,找出 intentMap.set('Make appointment',
makeAppointment);
行並新增 intentMap.set('Make appointment - custom',
makeAppointmentFollowUp);
,這樣當叫用後續意圖時,系統就會呼叫您貼上的函式。
請查看 makeAppointmentFollowUp
程式碼,瞭解系統如何從傳入結構定義和這項意圖擷取參數。在產生的 responseText
之前,程式碼現在會將日期和時間的格式設為使用者可理解。
快來體驗看看吧!
在裝置上輕觸「進行預約」建議或輸入「我想讓單車修理」。您會收到回應:「您希望在哪一天來到這裡」,以及一些實用的建議:「明天」(Imorrow")、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回一當天的回應時間。
選取時間,即可查看您建立的新回應,詢問這是針對服務還是微調。
接著,輸入「我需要維修」。您應該會看到的回應,以預約格式確認預約類型、日期和時間。
這樣就完成本教學課程了!
時間長度:1:00
做得好!
你已完成建構以 Dialogflow 為基礎的 RBM 代理程式的所有階段。
換上令人期待的這個全新平台!