建立採用 Dialogflow 的 RBM 代理程式 (進階)

在本程式碼研究室中,您將瞭解如何使用 Dialogflow 建立對話介面,為 RBM 代理程式提供支援。

在這個程式碼研究室中,您要建構什麼?

  • 支援 RBM 服務專員對話的 Dialogflow 服務專員
  • 虛構單車商店的對話式介面,可讓使用者瞭解單車店的相關資訊,以及安排維修或預約單車

教學內容

  • 如何使用 Dialogflow 的三大建構項目 (意圖、實體和結構定義) 來建立對話介面
  • 如何使用 Dialogflow 的出貨和內嵌編輯器 (透過 Cloud Functions for Firebase 技術) 將對話介面連結至您自己的服務和 API
  • 如何透過 Dialogflow 建立 RBM 回應類型,以便為使用者提供豐富的 RBM 體驗

硬體與軟體需求

  • 擁有 Google 帳戶

建立及查詢第一個代理程式

時間長度:10:00

建立您的第一個 Dialogflow 代理程式

如何建立 Dialogflow 代理程式:

  1. 開啟新分頁並登入 Dialogflow
  2. 按一下左側導覽列中的 [建立代理程式]

  3. 輸入「quolabRBMBikeShop&quot」做為代理程式的名稱,並使用「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&quot」);選取區域,然後點選「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&quot」。

讓我們修正這個問題,

建立營業時間意圖

Dialogflow 使用意圖將使用者的意圖分類,Intent 含有訓練詞組,例如使用者可能會向代理程式說出的內容。例如,如果有人想知道單車店的營業時間,"你的營業時間是多少?

這些查詢都不重複,但意圖相同:取得單車店開啟時間的資訊。

如要涵蓋這項查詢,請建立「小時」意圖:

  1. 在左側導覽面板中,按一下「意圖」旁的 +
  2. 針對「意圖名稱」,輸入「Hours"」。
  3. 在「Training vocabularys」(訓練詞組) 下方,按一下「Add userexpression」(新增使用者運算式) 並輸入以下內容,然後在每個項目後方按下 Enter 鍵:

    • When do you open?
    • What are your hours?
    • How late can I come in?
    • reply_hours

    這個最後一個訓練詞組會用來對應您在上一節設定的回傳資料,以便瞭解這項意圖。

  4. 按一下「Responses」(回應) 下方的「+」,然後選取「RCS Business Messaging (RBM)」

  5. 按一下「Add Responses」,然後選取「Simple Response」

  6. 在「Simple Response」文字欄位中,輸入「We'每週平日上午 9 點到下午 5 點 30 分」。

  7. 按一下「儲存」

快來體驗看看吧!

現在,建議你向服務專員詢問營業時間。在您的裝置的 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 會擷取這個詞,以便您的代理程式提供適當的回應。您將使用參數建立新的意圖,並學習如何在回應中加入這些值。

  1. 按一下左側導覽面板中「Intents」(意圖) 旁的「+」即可建立新意圖。
  2. 如果使用的是意圖名稱,請在頁面頂端輸入「設為預約」。
  3. 將以下內容新增為訓練詞組:
    • reply_appointment
    • I'd like to schedule an appointment for next Thursday
    • I have a mountain bike that needs servicingI'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 會自動在收集參數表格中填入收集到的資訊:

  • 此為選用參數 (非必填)
  • 名為 datetime
  • 對應系統實體類型 @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 函式下方。這兩個函式 getSuggestedTimesgetSuggestedDates 會建立實用的方塊清單,以促進使用者回應。

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&quot)、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回回應詢問一段時間,回應訊息後,你會看到預約已設定完成。

使用背景資訊管理狀態

時間長度: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 實體類型中新增兩個實體:servicefix

如何建立實體類型:

  1. 在左側導覽面板中,按一下「實體」旁的「+」
  2. 針對實體類型名稱,請輸入「AppointmentType&quot」。
  3. 按一下文字欄位並新增下列項目:
    • 服務
    • 修正
  4. 輸入項目時,按下 Tab 鍵可將遊標移到同義詞欄位。為各個項目新增下列同義詞。請務必個別輸入每個字詞,而不要複製及貼上整個字串:
登入 同義詞
服務
  • 服務
  • 改造
  • 維護
  • 微調
  • 微調
修正
  • 修正
  • 維修
  • mend
  • 毀損
  • 輪胎
  • 固定
  1. 按一下「儲存」

每個實體類型都必須具備:

  • 用來定義類別的名稱 (&At;AppointmentType&quot)
  • 一或多個項目 (「服務」或「修正」)
  • 一或多個同義詞 (「主要」、「微調」等)

Dialogflow 會處理複數和大小寫等簡單的情況,但請務必新增所有可能的同義詞。新增越多,代理程式就越能判定實體。

新增實體

我們定義了預約的實體類型,現在可以在「Make Appointment - custom"intent」的訓練詞組中使用它:

  1. 按一下左側導覽選單中的「Intents」(意圖),然後按一下「Make Appointment」的箭頭,以顯示其後續意圖。按一下「設為預約 - 自訂」意圖。
  2. 將下列內容新增為訓練詞組:

    • 你可以幫我自行車嗎?
    • 我需要維修。

  3. 您應該可以在輸入的訓練詞組中自動加註預約實體類型。這會將 AppointmentType 參數新增至資料表,該屬性位於「訓練詞組」部分下方。按一下核取方塊,將這個參數標示為 REQUIRED

  4. 按一下「定義提示」,然後輸入「我們可維修或維修你的單車」。 您希望哪一項設定?

  5. 在「Responses」(回應) 中,將回應變更為「quoay; OK, 我們安排 $AppointmentType."」,然後按一下 [Save] (儲存)。

快來體驗看看吧!

在裝置上輕觸「進行預約」建議或輸入「我想讓單車修理」。您會收到回應:「您希望在哪一天來到這裡」,以及一些實用的建議:「明天」(Imorrow&quot)、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回一當天的回應時間。

選取時間,即可查看您建立的新回應,詢問這是針對服務還是微調。

接著,輸入「我需要維修」。您應該會看到回應「好」,我們會排定修正時間。」表示 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&quot」中定義的參數值,例如「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&quot)、「從現在起的一週」和「現在兩週」。指定日期 (「明天」) 後,系統會傳回一當天的回應時間。

選取時間,即可查看您建立的新回應,詢問這是針對服務還是微調。

接著,輸入「我需要維修」。您應該會看到的回應,以預約格式確認預約類型、日期和時間。

這樣就完成本教學課程了!

時間長度:1:00

做得好!

你已完成建構以 Dialogflow 為基礎的 RBM 代理程式的所有階段。

換上令人期待的這個全新平台!