1. 事前準備
在本程式碼研究室中,您將瞭解如何運用 Dialogflow CX 建構零售聊天機器人,這是對話式 AI 平台 (CAIP),可用來建構對話式使用者介面。Dialogflow CX 可導入虛擬服務專員,例如聊天機器人、語音機器人、電話網關,並支援 50 多種語言的多個管道。
本程式碼研究室將引導您建構零售商網站聊天機器人。我們為虛構公司 G-Records 建立的聊天機器人,G-Records 是一家位於加州的搖滾唱片公司。這個標籤上標示了 4 個岩石錶帶,包括 Alice Googler、G's N' Roses、The Goo Fighters 和 The Google Dolls。G-Records 向所有搖滾樂迷販售樂團周邊商品。
完成本程式碼研究室後,您可以使用聊天機器人訂購 T 恤或音樂,也可以詢問訂單相關問題。
課程內容
您將透過實際操作,瞭解 Dialogflow CX 相較於 Dialogflow ES 的優勢。其中包含下列概念:
- 如何在 Google Cloud 中建立 Dialogflow CX 虛擬服務專員
- 瞭解如何建立流程
- 瞭解如何建立實體
- 瞭解如何建立意圖
- 瞭解如何使用狀態處理常式建立網頁和轉場網頁
- 瞭解如何使用意圖路徑轉換網頁
- 瞭解如何使用參數和條件路徑轉換網頁
- 瞭解如何使用系統函式傳回條件式回應
- 瞭解如何建立備用訊息
- 瞭解如何使用模擬工具
- 瞭解如何建立測試案例和測試涵蓋率
最終的 Dialogflow CX 服務專員設計如下所示:
軟硬體需求
- 您必須擁有 Google 身分 / Gmail 地址,才能建立 Dialogflow CX 虛擬服務專員。
- 存取 Google Cloud。
2. 環境設定
建立 Google Cloud 專案
由於 Dialogflow CX 會在 Google Cloud 中執行,因此您必須建立 Google Cloud 專案。您可以使用專案來整理所有 Google Cloud 資源。該工具由一組協作者、已啟用的 API (和其他資源)、監控工具、帳單資訊,以及驗證和存取權控管機制組成。
建立新專案時,您必須輸入專案名稱。並連結至現有的帳單帳戶和機構。
帳單帳戶可用來定義特定資源組合費用的支付者,其可連結至一或多個專案。專案的使用費會從相連結的帳單帳戶中扣除。在大多數情況下,您會在建立專案時設定帳單。詳情請參閱帳單說明文件。確認 Cloud 專案已啟用計費功能。
啟用 Dialogflow API
如要使用 Dialogflow,您必須為專案啟用 Dialogflow API。
- 選取您要啟用 API 的專案,然後按一下「繼續」。
- 收合「API 和服務」選單,然後點選「建立憑證」
- 按一下「應用程式資料」
- 您目前未使用 Kubernetes Engine、App Engine 或 Cloud Functions,因此請回答「否,我沒有使用這些功能」。
- 然後按一下 [完成]。
建立新的 Dialogflow CX 服務專員
如要建立新的 Dialogflow CX 虛擬服務專員,請先開啟 Dialogflow CX 控制台:
- 選擇先前建立的 Google Cloud 專案。
- 按一下「Create agent」。
填寫基本代理程式設定表單:
- 你可以選擇任何顯示名稱。
- 選擇位置:us-central1
- 選取所需時區。
- 選取「en - 英文」做為預設語言
按一下「建立」。
好的,一切都準備就緒了。我們終於可以開始建立虛擬代理人的模型了。
3. 流程
複雜的對話方塊通常會涉及多個對話主題。以我們為 G-Records 建立的聊天機器人為例,該機器人用於銷售樂團商品,因此會提供有關產品目錄、付款、訂單狀態和客戶服務問題的對話。我們可以將這些對話主題分成流程。
流程可讓團隊處理個別對話路徑。建議做法是簡化流程,讓流程能輕鬆顯示在螢幕上,並且更具模組化。
流程是 Dialogflow CX 的新概念。Dialogflow Essentials 採用 Mega Agents 的概念,與 Flows 類似。不過,您更常使用 Flows。
在這個研究室的後續部分,我們會使用狀態處理常式來結束流程 (以便跳回下一個或上一個流程),也可以結束完整的代理程式工作階段。
我們來建立一些流程。
建立流程
- 在 Dialogflow CX 中,依序點選「+」圖示 >「建立流程」。
- 指定
Catalog
名稱,然後按 Enter 鍵。
第一個流程「目錄」已建立。現在請建立其他流程:
Order Process
My Order
Customer Care
在本研究室的後續部分,我們會設定頁面狀態處理常式,確保視覺呈現最終會像這樣:
模擬工具
您可以在 Dialogflow CX 主控台的右側,使用內建模擬工具測試虛擬服務專員。您可以從對話的開頭或特定流程測試對話。
- 按一下畫面右上方的「測試服務代理」按鈕。
- 在「與服務專員交談」欄位中輸入:
Hello
虛擬服務專員會回覆預設的歡迎文字:Greetings!我可以提供哪些協助?
我們可以修改這個預設歡迎文字。
預設啟動流程
首先,請建立意圖路徑,這樣一來,只要您向虛擬代理程式打招呼,就會觸發這個路徑。
- 在左側的「Build」>「Flows」側欄中,按一下「Default Start Flow」,然後選取「Start」樹狀節點。
系統隨即會開啟「開始」頁面。系統會自動在「Build」>「Pages」側欄部分選取「Start」頁面。
- 依序點選「開始」>「路線」,然後點選「預設歡迎意圖」。
意圖可將使用者在一個對話回合中的意圖歸類。在 Dialogflow CX 中,意圖可做為狀態處理常式的一部分,用於將下一個有效頁面或執行要求進行路由
- 移除所有「Agent says」項目,並新增以下文字:
Welcome, I am the virtual agent of G-Records, a fictional rock label. You can order artists merchandise, ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?
為了讓對話更流暢,我們也需要一些快速回覆按鈕/建議方塊。
- 依序點選「新增對話方塊選項」>「自訂酬載」,並使用下列程式碼片段。
- 使用下列程式碼片段做為自訂酬載,然後按一下「Save」。
如要進一步瞭解自訂酬載,請參閱說明文件。
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- 請在模擬器中測試歡迎意圖。
您可能會好奇為何無法看到任何複合式內容。這是因為建議方塊等多媒體內容需要整合。下列步驟需要帳單帳戶,但如果您沒有帳單帳戶,可以略過這些步驟。
- 在左側邊欄中,依序點選「管理」>「整合」。
- 選擇「Dialogflow Messenger」,然後點按「連線」。
- 在彈出式視窗中,按一下「啟用」。
畫面上會顯示另一個彈出式視窗,這次會顯示整合 JavaScript 程式碼,您可以將程式碼貼到網站上,在網站上整合 Dialogflow Messenger 元件。由於目前還沒有網站,我們會直接在工具中測試虛擬服務專員。
- 按一下「Try Now」連結。
- 按一下右下方的聊天機器人圖示,即可開啟即時通訊視窗。輸入
Hello
即可開始對話。
目前,當你點選建議方塊時,虛擬助理不會瞭解你的意思。這是因為我們的虛擬服務專員尚未在狀態之間切換。我們可以在 Dialogflow CX 中使用頁面來執行這項操作。讓我們繼續進行實驗室,首先建立一些實體和意圖。
4. 實體類型
實體類型可用於控制從使用者輸入內容中擷取資料的方式。Dialogflow CX 實體類型與 Dialogflow ES 實體類型非常相似。Dialogflow 提供預先定義的系統實體,可比對許多常見的資料類型。舉例來說,您可以使用系統實體來比對日期、時間、顏色、電子郵件地址等。您也可以自行建立自訂實體,用於比對自訂資料。
首先,請準備所有自訂實體,然後再設計流程中的頁面。我們會建立下列實體:
建立實體
我們來建立藝人實體。
- 依序點選「管理」>「實體類型」
- 按一下「+ 建立」
- 顯示名稱:
Artist
- 實體:
The Google Dolls
(含同義詞:Google Dolls
)The Goo Fighters
(同義詞:Goo Fighters
)G's N' Roses
(同義詞:Gs and Roses
)Alice Googler
- 按一下「進階選項」,然後勾選「模糊比對」。(即使拼錯錶帶名稱有誤,仍能對應至正確的實體)。
- 在「進階選項」中,也請勾選「在記錄中刪除」。(如果拼寫錯誤,系統會在記錄中修正名稱)。
- 點選「儲存」。
我們也須提供商品項目的實體:
- 依序按一下「管理」>「實體類型」。
- 點選「+ 建立」。
- 顯示名稱:
Merch
- 實體:
T-shirt
Longsleeve
(含同義詞:Longsleeve shirt
)Tour Movie
Digital Album
(同義詞:MP3 Album
、MP3
)CD
(同義詞為Disc
、Physical CD
)
- 點選「儲存」。
我們也需要專輯的實體:
- 依序按一下「管理」>「實體類型」。
- 按一下「+ 建立」
- 顯示名稱:
Album
- 實體:
Live
Greatest Hits
(含同義詞:Hits
)
- 點選「儲存」。
我們也需要服裝尺寸的實體:
- 依序點選「管理」>「實體類型」
- 按一下「+ 建立」
- 顯示名稱:
ShirtSize
- 實體:
XS
(同義詞:Extra Small
)S
(同義詞:Small
)M
(同義詞:Medium
)L
(同義詞:Large
)XL
(同義詞:Extra Large
)2XL
(同義詞:Extra Extra Large
)3XL
- 點選「儲存」。
以及訂單號碼實體,通常由 4 個英數字元和 3 個數字組成。(例如 ABCD123)
- 依序按一下「管理」>「實體類型」。
- 按一下「+ 建立」
- 顯示名稱:
OrderNumber
- 規則運算式實體
- 實體:[A-Z]{4}[0-9]{3}
- 點選「儲存」。
實體設定應類似以下內容:
@Artist:
@Merch:
@Album:
@ShirtSize:
@OrderNumber:
準備好自訂實體後,我們就可以準備意圖。讓我們繼續實驗室。
5. 意圖
意圖:將使用者在一個對話回合中的意圖歸類。因此在 Dialogflow CX 中經過大幅簡化,不再成為對話控制的構成要素。Dialogflow CX 只會使用意圖比對使用者所說的內容。在 Dialogflow ES 中,您必須將所有內容與意圖 (參數、事件、執行結果等) 建立關聯。Dialogflow CX 中的意圖只包含訓練詞組,因此可重複使用。不再控管對話。因此,建立意圖的程序相當簡單:
意圖中的訓練字詞可使用實體來擷取「變數」輸入內容,因此建議您預先建立實體類型,這也是我們在實驗室步驟的前一頁所做的事。
建立意圖
首先,請準備所有意圖,然後再設計流程中的頁面。
- 依序點選「管理」>「意圖」。
- 按一下「+ 建立」
請使用下列詳細資料:
- 顯示名稱
redirect.artists.overview
- 說明
Artists overview: The bands supported by the label
向下捲動並建立下列訓練詞組:
Which bands are signed?
Which bands
Which artists
Which artists are part of the record label
Who is part of the label
From which bands can I buy merchandise
Band merchandise
Which music do you have?
I would like to know who are signed to the label
Who are supported by the label
From who can I buy shirts
What music can I order
Can I get an overview of all the artists
- 按一下 [儲存]。
- 接著,我們來建立其他意圖。你可以發揮想像力,想出更多訓練詞組。最佳做法是為每個意圖提供至少 10 個訓練詞組,涵蓋使用者可能觸發該意圖的各種方式。但為了配合本研究室的學習目標,少一點也沒關係。
請留意以下幾點:
- 請注意,當您輸入訓練詞組時,Dialogflow CX 會自動為實體加註。如果系統無法判斷,您可能需要更新實體 (新增同義字),或手動為訓練詞組加註。
- 較短的訓練詞組:Dialogflow 的 NLU 系統也能使用較短的訓練詞組,我們在此提供幾個範例。
- 過度訓練:意圖的訓練詞組過多可能會導致過度訓練,導致結果不如預期。最佳做法是使用迭代式和漸進式測試,並在沒有相符意圖的情況下新增訓練詞組。
顯示名稱 | 訓練詞組 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可重複使用的元素 (流程、實體和意圖) 都已準備就緒,現在我們可以建立頁面和狀態處理常式,將這些元素整合在一起。
6. 頁面和狀態處理常式
您可以透過有限狀態機器來說明 Dialogflow CX 對話 (工作階段) 並以視覺化方式呈現。以自動販賣機為例,模型可以建模為有限狀態機器。它具有以下狀態:等待硬幣、選取糖果、給予糖果,並在收到一組輸入內容後,在這些狀態之間移動。舉例來說,插入硬幣後,自動販賣機的狀態就會從「等待硬幣」變更為「選取糖果」。頁面是我們為 Dialogflow CX 虛擬服務專員模擬這些狀態的方式。
使用者在對話中與 Dialogflow CX 互動時,對話會隨頁面移動至不同頁面,因此每次僅有一個頁面代表目前頁面、目前的頁面視為有效,而與該頁面相關聯的流程也會視為有效。
您可以為每個流程定義多個頁面,這些頁面組合可處理流程所設計主題的完整對話。每個流程都有專屬的開始頁面。當流程首次啟用時,開始頁面會成為目前的頁面。每次對話回合時,目前的頁面會維持不變,或是轉換至其他頁面。這個概念可讓您建立包含許多頁面和對話輪次的大型對話方塊。
頁面包含執行內容 (靜態輸入對話方塊和/或 webhook)、參數和狀態處理常式。對話控制功能會透過狀態處理常式執行,讓您建立各種轉換路徑,以便轉換至其他 Dialogflow CX 頁面,包括設定條件 (用於分支對話)。
對話的狀態是由處理包含三種路徑類型頁面之間的轉換,藉此控制。
- 意圖路徑:應比對意圖的時間點 (例如根據使用者說的內容變更頁面)。(影像圖表中的藍色線條)。
- 條件路徑:應檢查條件時 (例如根據工作階段中儲存的特定參數變更頁面) (視覺圖中的橘色線條)。
- 事件處理常式:當要處理特定備用事件時 (例如處理不輸入、沒有相符項目,是為了區分使用者與意圖或條件路徑,這屬於視覺圖表中的綠線)。
對話語音內容 (也就是傳回給使用者的內容或回應) 是由執行階段定義,可分為靜態和動態:
- 靜態執行要求:提供靜態執行要求回應
- 動態執行要求:當系統為動態回應呼叫執行要求 Webhook 時
針對零售機器人,我們會建立一些意圖路徑,並提供一些靜態輸入內容回應,這些回應會在網頁啟用後立即顯示給使用者。稍後,我們會使用條件路由建立參數,收集製作商品訂單所需的資訊。
網頁意圖路徑
在預設啟動流程中建立頁面
以下是預設開始流程的流程圖:
讓我們一起看看以下程式碼:
- 依序點選「Build」>「Default Start Flow」。
- 按一下「Start Page」
- 按一下「路線」旁的「+」圖示
- 新增 redirect.artists.overview
- 向下捲動至「Transition」,然後轉換至「Catalog」流程。
- 按一下「儲存」
- 針對
redirect.product.overview
和這個資料表的其他 11 列重複上述步驟:
網頁 (在流程中) | 路徑 > 意圖 | Routes > Transition To |
開始 |
| - |
開始 |
| 流程:目錄 |
開始 |
| 流程:目錄 |
開始 |
| 流程:目錄 |
開始 |
| 流程:目錄 |
開始 |
| 流程:目錄 |
開始 |
| 流程:目錄 |
開始 |
| 流程:客戶服務 |
開始 |
| 流程:客戶服務 |
開始 |
| 流程:客戶服務 |
開始 |
| 流程:我的訂單 |
開始 |
| 流程:我的訂單 |
開始 |
| 流程:我的訂單 |
開始 |
| 頁面:結束工作階段 |
預設啟動流程的運作方式與選項選單在呼叫客服中心時的運作方式相同。不過,在這個虛擬服務專員中,系統會使用自然語言進行訓練,並在意圖中加入訓練詞組。因此,互動內容是由對話驅動,而非由 DTMF 選項驅動,因此更自然、更人性化。
在 Catalog 流程中建立頁面
以下即時通訊記錄屬於目錄流程:
> "Hi"
"Welcome, I am the virtual agent of G-Records, a fictional rock label.
You can order artists merchandise, ask questions about your order or shipping,
and I can tell you more which artists are currently signed with us. How can I help?"
> "Which bands are signed with this record label?"
"The following bands are signed with G-Records:
Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
From which of these artists would you like to order merchandise?"
> "Alice Googler"
"You want to rock with Alice Googler merchandise. Awesome!
We sell shirts, music or the tour movie.
Which merchandise item do you want?"
"(Suggestion chips: [Shirts] [Music] [Tour Movie])"
> "I would like to buy a Shirt"
"Do you want a longsleeve or a t-shirt?"
"(Suggestion chips: [T-shirt, Longsleeve, Price?])"
> "What's the price difference?"
"A t-shirt costs $25 and a longsleeve costs $30.
Do you want a longsleeve or a t-shirt?"
> "A t-shirt",
"What shirt size do you want?"
"(Suggestion chips: [XS, S, M, L, XL, 2XL, 3XL])"
> "M"
"A T-shirt of Alice Googler size: M costs $25. Shall I continue to order?"
選擇「音樂」或「觀看電影」時,對話會有所不同:如果選擇「音樂」,對話會如下所示:
> "Music"
"We have a Greatest Hits Album or the Live Album. Which one do you want?"
"(Suggestion chips: [Greatest Hits, Live, Price?])"
> "The Live Album"
"Do you want this album on CD or MP3?"
"(Suggestion chips: [CD, MP3])"
> "What's the price difference?"
"A CD costs $15. The digital album on MP3 costs $10.
Do you want this album on CD or MP3?"
> "Digital Album",
"The Digital Album: Alice Googler - Live costs $10. Shall I continue to order?"
在導覽影片中,對話會如下所示:
> "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
以下是目錄流程中所有頁面的流程圖:
請注意這個流程的複雜度:
- 我可以跳過「哪位藝人的問題」,直接詢問「哪些商品可供購買」。
- 在預設的開始流程中,我可以詢問:「我想購買 Google Dolls 的 T 恤」,或是「我想購買某樣東西」。也就是說,虛擬服務專員會詢問後續問題,填入這些必要參數的空格。直接跳轉至產品頁面。
- 「Price」對話方塊來自將重複使用的「Price」頁面。
- 雖然導覽影片的對話看起來很簡單,但我們其實會做一些特別的處理。我們會重複使用這部分的對話,因此如果使用者一次提供所有專屬資訊,也可以直接將這些資訊輸入其他產品:
> "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
首先,我們來連結網頁。
- 依序按一下「Build」>「Catalog」
- 按一下「Start Page」
- 按一下「路線」旁的「+」圖示
- 新增 redirect.artists.overview
- 向下捲動至「轉場效果」,選取「頁面」,然後選擇「+ 新增頁面」。
- 使用頁面名稱:
Artist Overview
,然後按一下「儲存」
接下來,我們來完成流程的其餘部分:
- 您可以重複執行上述步驟,並使用下列頁面、意圖和執行項目。接管這個表格。「Page」是指您在流程中選取的頁面,「Routes > Transition To」則是指您要建立並轉換到的全新流程或頁面。
網頁 (在流程中) | 路徑 > 意圖 | Routes > Transition To |
目錄開始 |
| 藝人總覽 |
目錄開始 |
| 產品 |
目錄開始 |
| 產品總覽 |
目錄開始 |
| 產品總覽 |
目錄開始 |
| 襯衫 |
目錄開始 |
| 音樂 |
目錄開始 |
| 結束工作階段 |
目錄開始 |
| 結束流程 |
藝人總覽 |
| 產品總覽 |
接著,我們來新增更多靜態執行結果。
- 在目錄流程中,按一下「藝人總覽」頁面。
- 按一下「輸入執行要求」部分中的「編輯執行要求」。
- 請使用下列靜態回應 (Agent says):
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- 點選「儲存」。
- 在 Catalog 流程中,按一下「Product Overview」(產品總覽) 頁面。
- 按一下「輸入執行要求」部分中的「編輯執行要求」。
- 請使用以下靜態執行要求 (服務專員說):
We sell shirts, music or the tour movie.
- 按一下 [儲存]。
網頁參數
參數可用來擷取及參照使用者在工作階段期間提供的值。每個參數都有名稱和實體類型。@Artist
和 @Merch
是我們需要收集的最低參數,才能建立商品訂單。如果是 T 恤或長袖上衣,你也需要收集 @ShirtSize
,如果要訂購音樂,還需要 @Carrier
和 @Album
名稱。
這些參數必須標示為「必要」。依需求採用後,建議您提供自訂提示來記住使用者,並提供正確答案,以便收集這些參數。Dialogflow CX 中有一些機制可協助您完成這項作業。
舉例來說,您可以在「參數」部分提供自訂靜態執行訊息。如果參數為必要參數,系統就會顯示這些參數的執行要求。這些回應訊息會新增至回應佇列。在服務機器人輪到時,可以 (有時也建議) 呼叫多個執行結果,每個執行結果都可能產生回應訊息。Dialogflow 會在回應佇列中保留這些回應。如要進一步瞭解頁面生命週期,以及這些執行要求加入回應佇列的順序,請參閱 Dialogflow CX 頁面文件。
在「藝人總覽」頁面上建立參數
我們來定義一些網頁參數:
- 在「目錄」流程中,按一下「藝人總覽」頁面。
- 按一下「Parameters」區塊中的「+」,新增 artist 參數:
- 顯示名稱:
artist
- 實體類型:
@Artist
- 是否為必要項目:勾選
- 記錄中的遮蓋:勾選
- 接下來,我們將新增一些自訂參數執行訊息。如果虛擬服務專員尚未收集到 artist 參數,使用者就會收到這則代理程式回應,並加入回應佇列:
From which of these artists would you like to order merchandise?
- 新增第二個對話方塊選項,提供豐富的建議方塊。按一下「新增對話方塊選項」,然後使用以下程式碼 (以 JSON 格式表示):
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
您可以根據使用者嘗試回答這些問題的次數,處理不同的備用執行要求提示。您可以使用參數事件處理常式執行這項操作。您可以選擇各種內建事件處理常式,例如「參數無效」、「語音指令過長」、「無輸入」、「第 1 次嘗試無輸入」、「第 2 次嘗試」或「無相符項目」。「沒有輸入內容」和「沒有相符結果」的差別在於,如果沒有任何輸入內容,使用者從未提供任何答案,那麼使用者確實沒有相符的答案,但 Dialogflow CX 無法將這點與網頁配對。
- 向下捲動至「Reprompt event handlers」部分。
- 按一下「新增事件處理常式」,然後選取事件:
No-match default
- 請使用以下事件靜態文字執行要求:
I missed that. Please, specify the artist. You can choose between: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- 點選「儲存」。
- 按一下「新增事件處理常式」,然後選取所需事件:
No-input default
- 使用下列事件靜態文字回應:
I am sorry, I could understand the artist's name. You can choose between Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- 點選「儲存」。
網頁條件路徑
參數與網頁條件式路徑搭配使用時,可發揮強大的效用。如果條件評估為 true,系統就會呼叫相關聯的網頁路徑。條件可以是「參數等於特定值」、「參數不能缺少參數」、「已經完成的表單」等等。如要進一步瞭解「參數」和「條件」,請參閱 Dialogflow CX 說明文件。
零售虛擬助理需要收集一連串參數,因此我們需要建立條件,檢查是否已完成「表單」。表單是指應向網頁的使用者收集的參數清單。虛擬服務專員會與使用者進行多次對話,直到收集到所有必要的表單參數 (也稱為網頁參數) 為止。
Dialogflow CX 會自動設定使用者在填寫表單時提供的參數值。如要檢查目前網頁是否已填妥完整表單,請使用下列條件:$page.params.status = "FINAL"
在「藝人總覽」頁面上建立條件式路徑
我們要建立一個條件式路徑,在知道藝人身分後,就會前往下一頁:
- 在「藝人總覽」頁面中,按一下「路線」部分中的 + 圖示。
- 向下捲動至「狀況」部分。
- 選取「至少一個」 (或)
- 接下來,我們將編寫一個運算式,
- 參數:
$page.params.status
- 運算子:
=
- 值:
"FINAL"
- 接下來,我們會在路徑中建立特定的靜態提交訊息,確認使用者的選擇。向下捲動至「Fulfillment」區塊,然後編寫以下執行要求訊息:
$session.params.artist, great choice! Rock on!
You want to rock with $session.params.artist merchandise. Awesome!
- 條件為 True 時,應轉到「產品總覽」頁面。向下捲動至「Transition」部分,並使用以下頁面:
Product Overview
- 按一下 [儲存]。
在「產品總覽」頁面上建立路徑
瞭解如何建立參數和條件式路徑後,我們來為下列頁面建立更多參數:
產品總覽
- 在「Product Overview」(產品總覽) 頁面中建立
artist
參數:
- 顯示名稱:
artist
- 實體類型:
@Artist
- 是否為必要項目:勾選
- 記錄中的遮蓋:勾選
- 初始提示完成:
From which of these artists would you like to order merchandise?
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- 事件處理常式 >
No-match default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- 自訂酬載:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- 事件處理常式 >
No-input default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist were you trying to mention?
- 自訂酬載:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- 建立
merch
參數:
- 顯示名稱:
merch
- 實體類型:
@Merch
- 是否為必要項目:勾選
- 記錄中的遮蓋:勾選
- 執行:
Which merchandise item do you want?
- 依序點選「新增對話方塊選項」>「自訂酬載」:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- 事件處理常式 >
No-match default
- 事件處理常式執行結果:
We sell Shirts, Music or the Tour movie. Which of these items do you want?
- 自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- 事件處理常式 >
No-input default
- 事件處理常式執行結果:
I couldn't understand which merchandise item you wanted to buy. You can choose between: Shirts, Music or the Tour movie. Which item do you want?
- 自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- 建立路徑,在提供
artist
和merch
項目時,轉換至「Product」頁面。
- 條件:
- 符合所有規則 (和)
- 運算式:
$session.params.artist != null
- 運算式:
$session.params.merch != null
- 執行:
Alright! $session.params.merch of $session.params.artist, let's go!
- 轉場效果:頁面:
Product
- 建立使用者說出「Shirts」時的路徑
- 意圖:redirect.shirts
- 轉換:頁面:
Shirts
- 建立使用者說出「Music」時的路徑
- 意圖:redirect.music
- 轉場效果:頁面:
Music
- 建立使用者要求價格資訊時的路線
- 意圖:redirect.price
- 轉場效果:建立新頁面:
Price
完成上述設定後,您會看到類似下圖的視覺呈現。請注意,意圖路徑在圖表中為藍色,條件路徑則為橘色。雖然未顯示,但事件處理常式會以綠色顯示,而當多個路線類型轉換至網頁時,線條會變成灰色。
現在,您已瞭解如何使用狀態處理常式建立流程、實體、意圖和網頁,例如:根據參數建立意圖路徑和條件式路徑。在本實驗室的後續部分,我們會在執行時使用條件式分支,根據輸入內容提供不同的對話。
您可以使用下列設定,完成虛擬助理的設定。
襯衫頁面:
- 在「Shirts」頁面中建立下列設定:
- 項目填入:
Do you want a longsleeve or a t-shirt?
- 項目執行要求自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
},
{
"text": "Price?"
}
]
}
]
]
}
- 建立意圖路徑:
redirect.price
搭配轉換至Price
頁面 - 建立下列參數:
- 參數:
merch
- 實體類型:@Merch
、Required
和Redact in log
- 參數 > 事件處理常式 >
No-match default
- 參數 > 事件處理常式執行:
You can choose between a t-shirt or a longsleeve. Which of these do you want?
- 參數 > 事件處理常式執行自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- 參數 > 事件處理常式 >
No-input default
- 參數 > 事件處理常式執行:
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want?
- 參數 > 事件處理常式執行要求自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- 按一下項目執行,然後向下捲動至「參數預設值」,每次「T-Shirt」頁面啟用時,類別參數都會設為「T-Shirt」:
參數 | 值 |
|
|
- 新增條件式路徑:
- 至少比對一項規則 (OR)
- 運算式:
$session.params.merch = "T-shirt"
- 運算式:
$session.params.merch = "Longsleeve"
- 轉換至新頁面:
Shirt Size
價格頁面:
由於價格訊息會根據所選商品或類別 (音樂或 T 恤) 而有所不同,我們會在本實驗室的後續部分修正這部分。目前只要輸入預留位置即可。
- 在「Price」頁面中建立下列設定:
- 項目執行要求:
PRICE TODO
由於你可以向對話中的多個位置要求價格,因此應一律提供解答,並將你轉回對話中的上半部,以繼續下單。對話方塊樹狀結構中有 5 個地方,您可以分支以取得價格資訊。(上衣、上衣尺寸、音樂、電信業者,以及直接透過意圖路徑),因此我們需要一些條件式路徑來返回:
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$session.params.category = "shirts"
- 運算式:
$session.params.merch = "null"
- 轉換至新頁面:
Shirts
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$session.params.category = "shirts"
- 運算式:
$session.params.size = "null"
- 轉換至新頁面:
Shirt Size
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$session.params.category = "music"
- 運算式:
$session.params.album = "null"
- 轉換至新頁面:
Music
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$session.params.category = "music"
- 運算式:
$session.params.merch = "null"
- 轉換至新頁面:
Carrier
- 新增條件式路徑:
- 符合所有規則 (和)
- 運算式:
$session.params.category = "null"
- 轉換至新頁面:
Product Overview
襯衫尺寸頁面:
- 在「Shirt Size」頁面中建立下列設定:
- 項目填入:
What shirt size do you want?
- 項目執行要求自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- 建立意圖路徑:
redirect.price
,並轉換至Price
頁面。 - 建立下列參數:
- 參數:
shirtsize
- 實體類型:@ShirtSize
-Required
,Redact In Log
- 參數 > 事件處理常式 >
No-match default
- 參數 > 事件處理常式執行要求:
Please tell me the shirt size, such as XL.
- 參數 > 事件處理常式執行自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- 參數 > 事件處理常式 >
No-input default
- 參數 > 事件處理常式執行:
I couldn't understand the shirt size. What size do you want?
- 參數 > 事件處理常式執行自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$page.params.shirtsize != "null"
- 轉換至頁面:
Product
音樂頁面:
- 在「音樂」頁面中建立下列設定:
- 項目填入:
We have a Greatest Hits Album or the Live Album. Which one do you want?
- 項目執行要求自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
},
{
"text": "Price?"
}
]
}
]
]
}
- 建立意圖路徑 (也就是
redirect.price
轉換至頁面):Price
。 - 建立下列參數:
- 參數:
album
- 實體類型:@Album
-Required
,Redact In Log
- 參數 > 事件處理常式 >
No-match default
- 參數 > 事件處理常式執行:
You can choose between Greatest Hits and Live Album. Which of these do you want?
- 參數 > 事件處理常式執行自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- 參數 > 事件處理常式 >
No-input default
- 參數 > 事件處理常式執行要求:
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want?
- 參數 > 事件處理常式執行自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- 按一下項目執行,然後向下捲動至「參數預設值」,每次音樂頁面啟用時,類別參數都會設為 music:
參數 | 值 |
|
|
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$page.params.album != "null"
- 轉換至頁面:
Carrier
電信業者網頁:
- 在「Carrier」頁面中建立下列設定:
- 項目填入:
Do you want this album on CD or MP3?
- 項目執行要求自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
},
{
"text": "Price?"
}
]
}
]
]
}
- 建立意圖路徑:
redirect.price
,可轉換至Price
頁面。 - 建立下列參數:
- 參數:
merch
- 實體類型:@Merch
-Required
、Redact In Log
- 參數 > 事件處理常式 >
No-match default
- 參數 > 事件處理常式執行:
Do you want a physical CD or the digital album?
- 參數 > 事件處理常式執行:自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "Digital Album"
}
]
}
]
]
}
- 參數 > 事件處理常式 >
No-input default
- 參數 > 事件處理常式執行:
I couldn't understand if you mean CD or MP3. Which one do you want?
- 參數 > 事件處理常式執行:自訂酬載:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
}
]
}
]
]
}
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$page.params.merch != "null"
- 轉換至頁面:
Product
產品頁面:
- 建立下列參數:
參數顯示名稱 | 參數實體類型 | 檢查 |
|
| 必要,在記錄中遮蓋 |
|
| 必要,在記錄中遮蓋 |
- artist 參數需要下列初始提示執行要求,系統將在藝人不明時顯示。
You didn't mention which artist you are interested in. You can ask me to buy the $session.params.merch of the artist you like or ask which artists we signed. How can I help?
{
"richContent": [
[
{
"options": [
{
"text": "Which artists?"
}
],
"type": "chips"
}
]
]
}
- 另外也新增含有執行要求的
No-input default
事件處理常式:I couldn't understand what you just said. Ask me which artists are signed.
- 以及含有執行要求的
No-match default
事件處理常式:I missed that. Please ask me which artists are signed.
- merch 參數也需要重新提示事件處理常式。
- 新增含有服務的
No-input default
事件處理常式:I couldn't understand what you just said. Which merchandise item do you want?
- 以及含有執行要求的
No-match default
事件處理常式:I missed that. Which merchandise item do you want?
當系統知道藝人身分,且使用者選擇「Tour Movie」時,系統會轉換至確認頁面。
- 新增條件式路徑:
- 符合所有規則 (AND)
- 運算式:
$session.params.artist != null
- 運算式:
$session.params.merch = "Tour Movie"
- 參數預設值新增參數 >
price = 25
- 轉換至新頁面:
Confirmation
當系統得知藝人後,使用者選擇「T-shirt」並選取上衣尺寸時,系統會切換至下一個路徑,並轉到確認頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null
- 參數預設值新增參數 >
price = 25
- 轉換至網頁:
Confirmation
下一個路線會在已知藝術家且使用者選擇「長袖完成」及襯衫尺寸時,會導向確認頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null
- 參數預設值新增參數 >
price = 30
- 轉換至網頁:
Confirmation
當系統知道藝人名稱,且使用者選擇「CD」和專輯名稱時,系統會切換至確認頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null
- 參數預設「新增參數」>
price = 15
- 轉換至網頁:
Confirmation
當系統知道藝人名稱,使用者選擇「數位專輯」並選擇專輯名稱時,系統會切換至確認頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null
- 參數預設值新增參數 >
price = 10
- 移至頁面:
Confirmation
接下來,我們將建立一些進階條件,並透過提示偵測缺少的資訊。如果看到下一條路線,當知道藝人身分時,使用者選擇「CD」或「數位專輯」,卻未選擇專輯名稱,系統就會回到音樂頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null
- 執行:
I would also need to know which album you would like to buy!
- 轉換至網頁:
Music
當已知藝術家且使用者選擇「T 恤」或「長袖」,但使用者未選擇 T 恤尺寸時,最後一條路徑會轉換為確認頁面。
- 新增條件式路徑:
- 自訂運算式:
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null
- 出貨:
I would also need to know which shirt size you need!
- 轉換至網頁:
Shirt Size
在研究室的下一部分,我們將使用條件執行要求,根據輸入內容提供不同的執行要求訊息。
7. 條件式回應
部分回應會根據輸入內容傳回不同的對話,這些對話會分支,我們稱之為條件式回應。如果您未使用 webhook 執行要求 (在後端決定條件回應),這可能會變得有趣。範例如下:
if [condition]
[response]
elif [condition]
[response]
elif [condition]
[response]
else
[response]
endif
- [condition] 的範例如下:
$session.params.user-age >= 21
。其格式與路徑中的條件相似。 - [回應] 採用靜態文字回應
- 條件式回應一律以
if
開頭 elif
和else
區塊為選用區塊
Dialogflow CX 也可以使用內建的系統功能。例如,設定日期或時間格式,或顯示目前時間 ($sys.func.NOW()
)
讓我們修正「確認」和「價格」頁面,完成「目錄」流程。
確認頁面:
接下來,我們將建立確認頁面。相關規定如下:
- 如果「商品」是「CD」或「數位專輯」。確認畫面會顯示下列欄位:artist、merch、album 和 price。
- 如果商品是T 恤或長袖,確認畫面會顯示下列欄位:藝人、商品、尺寸和價格。
- 其他 (如果 merch 為「Tour Movie」)。確認畫面會顯示下列欄位:藝人、商品和價格。
- 按一下「確認」頁面。
- 依序點選「Edit Fulfillment」>「Agent Responses」>「AddDialogue」選項 >「Conditional Response」。
if ($session.params.merch = "CD" OR $session.params.merch = "Digital Album")
The $session.params.merch: $session.params.artist - $session.params.album costs $$session.params.price. Shall I continue to order?
elif ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve")
A $session.params.merch of $session.params.artist size: $session.params.shirtsize costs $$session.params.price. Shall I continue to order?
elif $session.params.merch = "Tour Movie"
The $session.params.merch of $session.params.artist costs $$session.params.price. Shall I continue to order?
else
It looks like something went wrong with your order. You can say "Reset", to restart the order process.
endif
- Create the following Custom payload:
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Yes, confirm"
}
],
"type": "chips"
}
]
]
}
Next, create two intent routes:
confirm.proceed.order
transitions to:Order Process
Flow.decline.proceed.order
transitions toEnd Flow
When the user declines the order, and does not want to proceed the order process, we will have to transition back to the welcome page, but all the parameters have to be cleared. We can do this by specifically setting null to all the possible parameters. You can do this with Parameter presets.
- In the decline.proceed.order intent route, scroll down to Parameter presets and add the following parameters:
Parameter | Value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notice that we have created an additional parameter called restart
. If this parameter is present, the Default Start Flow, should know to continue the conversation by showing a customized message.
- Click on the Default Start Flow, Start Page, and create another Conditional Route:
$session.params.restart = "true"
- Fulfillment:
"Welcome back, as the virtual agent of G-Records, I can help you order artists merchandise, you can ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?"
- Custom payload:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
Price Page:
Let's also fix the Price TODOs. The price information will be static for now. Click on the Price Page in the Catalog Flow, and use the following entry fulfillment:
- Delete the Agent Says entry fulfillment.
- Create a new Conditional Response:
if $session.params.category = "shirts"
A t-shirt costs $25 and a longsleeve costs $30.
elif $session.params.category = "music"
A CD costs $15. The digital album on MP3 costs $10.
else
A t-shirt costs $25 and a longsleeve costs $30. A CD costs $15 and a digital album on MP3 $10. In case you are interested in the Tour Movie, that one is $25.
endif
Well done, by now you completed the Catalog flow. Your flow should look similar to this diagram:
8. Wrapping up the agent
We are almost at the end of this lab. Let's configure the last flows together, and take in practice all the new things that we have learned.
Creating the My Order Flow
- Go to the My Order Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
My Order Start |
| My Order |
My Order Start |
| My Order Status |
My Order Start |
| My Order Cancellation |
My Order Start |
| End Session |
My Order Start |
| End Flow |
My Order |
| My Order Status |
My Order |
| My Order Cancellation |
Default Start Flow |
| Flow: My Order |
Default Start Flow |
| Flow: My Order |
- Let's create the following entry fulfillment for the My Order Page:
- Entry fulfillment:
I can look up the status of your order, or I can cancel an order.
- In the My Order Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required: checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Fulfillment:
And do you want to Cancel your order, or should I look up the status?
- Click on Add state handler > Event Handlers and create the Event Handler:
No-input default
- Fulfillment:
I'm sorry, what was that? Would you like me to cancel an order or look up the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- Create the Event Handler:
No-match default
- Fulfillment:
Would you like me to cancel an order or lookup the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- In the My Order Status Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Status Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been shipped, it can take up to approx 2 weeks before you will receive your items.
- Add dialogue option > Text:
Is there anything else I can help you with?
- In the My Order Cancelation Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Cancelation Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been canceled.
- Add dialogue option > Text:
Is there anything else I can help you with?
- Test the flow and create the following two test scenarios:
>"About my order"
>"ABCD123"
>"Status"
And:
>"What's the status of order DEFG222"
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
- Select the Start Page and click on the
redirect.home
intent. Create the following parameter preset:restart = true
Default Negative intents (Fallback)
When you create a virtual agent, a default negative intent is created for you. You can add training phrases to this intent that act as negative examples that will trigger a No-match event. There may be cases where end-user input has a slight resemblance to training phrases in normal intents, but you do not want these inputs to match any normal intents.
- Try in the simulator:
I don't like Alice Googler
.
You will see that the virtual agent answers with the Product Overview Page, to continue ordering Alice Googler merchandise. However, your end user does not like that artist. Let's use the Default Negative Intent for this.
- Go to Manage > Intents and select the Default Negative Intent.
- Add the following training phrases that will trigger the No-match event.
I don't like Alice Googler
I am not a fan of G's N' Roses
I can't stand the music of the Google Dolls
- Hit Save and test the following sentence in the simulator:
I am really not a fan of the Goo Fighters
This time the No-match
event was triggered, you stayed on the Start Page.
Default Fallback Messages
- Click the Default Start Flow, select the
sys.no-input-default
event handler.
The No-input fallback basically means: No text or speech answers were detected. Likely no answers were given, or the system couldn't hear it. Therefore, let's make the fallback messages more specific. Use the tab key, to create alternative dialogues:
- Remove all answers, and add these text dialogues:
I'm sorry, I didn't receive an answer. Can you say it again?
I missed your answer, can you say it again?
Sorry, I didn't hear anything. Can you say it again?
I couldn't hear what you were saying, what was that?
I'm sorry, I missed your answer. What were you trying to say?
Don't forget to click Save.
- Click the Default Start Flow, select the
sys.no-match-default
event handler.
The No Match fallback basically means: Text or speech answers were detected but nothing in Dialogflow CX got matched.
- Remove all answers, and add these text dialogues:
Sorry, I didn't get that. Can you please rephrase?
I'm sorry, I don't understand. Can you please rephrase?
I don't understand, please rephrase.
Sorry, I didn't get that. What was that?
I didn't get that, can you please rephrase?
Don't forget to click Save.
- It's advised to repeat these steps for the Catalog, My Order, Order Process and Customer Care flows.
Here's a tip: when creating fallback messages, make them more explicit, by rephrasing the previous question or by mentioning an example. You could create these type of No-match and No-input events on Page level when creating parameters. In our labs, we have already done this.
Creating the Order Process Flow
- Go to the Order Process Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
Order Process Start |
| End Session |
Order Process Start |
| End Flow |
Order Process Start |
| New Page: Shipping Details |
- Let's create the following entry fulfillment for the Shipping Details Page:
- Entry fulfillment:
To complete your order I will first need to collect your shipping details.
- Create the following parameters:
These parameters will make use of built-in system entities. System entity support differs for each language. See the docs for more information.
Parameter Display name | Entity | Required? | Initial prompt fulfillment | No-match default | No-input default |
| @sys.person | Required |
|
|
|
| @sys.person | Required |
|
|
|
| @sys.address | Required |
|
|
|
| @sys.any | Required |
|
|
|
| @sys.geo-city | Required |
|
|
|
| @sys.geo-country | Required |
|
|
|
| @sys.email | Required |
|
|
|
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Transition to new Page:
Payment Details
- Create the following entry fulfillment.
Let's fake it that this virtual agent makes use of Google Pay. Don't worry this tutorial won't make real transactions. Create the following entry dialogues:
- Agent Says:
Alright $session.params.firstname! We will make use of Google Pay, that's connected to your email account: $session.params.email.
- Conditional Response
if $session.params.merch != "Digital Album"
Shipping costs an additional 5 dollars. This will make the total price $$sys.func.TO_TEXT($sys.func.ADD($session.params.price, 5)).
Your merchandise will be shipped to:
$session.params.firstname $session.params.lastname
$session.params.address
$session.params.zipcode $session.params.city
$session.params.country
To continue the order process please explicitly say "I confirm". Do you want to confirm your $session.params.artist $session.params.merch order?
else
The total costs will be: $$session.params.price.
After purchasing the digital album, you will receive an email with the download link.
To continue the order process please explicitly say "I confirm".
Do you want to confirm your $session.params.artist $session.params.merch order?
endif
- 建立以下意圖路徑
- 意圖:
confirm.proceed.order
- 虛擬服務專員說:
Thank you for your order! Your merchandise will be shipped today!
- 新增對話選項 > 文字:
Here's the order number: ABCD123
。 - 新增對話選項 > 文字:
Have a good day!
- 轉場效果:
End Session
- 選取「Start」頁面,然後按一下
redirect.end
意圖。建立以下服務:Thank you for contacting G-Records! Have a nice day!
- 選取「Start」頁面,然後按一下
redirect.home
意圖。建立以下參數預設:restart = true
太棒了!我們目前已開發出可正常運作的實體零售商聊天機器人!在下一堂實驗室課程中,我們將測試虛擬代理人的表現!
9. 測試虛擬服務專員
您可以使用內建模擬工具測試虛擬代理程式的對話。在模擬器中測試流程的好處,就是您可以看到流程、頁面、參數和 (DTMF) 事件的概略資料,這些資料是模擬器在瀏覽流程時收集到的。比起直接在整合作業中直接測試,這種做法會讓測試更加簡單,因為使用者不會看到這類資訊。您甚至可以建立測試案例,並儲存及重複使用這些測試案例。因此,當您隨時間維護或編輯流程時,這種做法顯然很合理,而您想確保任何變更都不會影響您先前的工作。
您也可以將測試儲存在 Google Cloud Storage 或本機,然後匯出及匯入先前建立的測試案例。匯出測試時,系統會下載 blob 檔案。如要進一步瞭解模擬器和測試案例,請參閱模擬器/測試案例說明文件。
在建立一些測試案例之前,讓我們先完成其餘的虛擬服務專員作業:
建立客戶服務流程
- 前往「Customer Care」流程,並建立下列意圖轉換:
網頁 (在流程中) | 路徑 > 意圖 | Routes > Transition To |
客戶服務開始 |
| 運費 |
客戶服務啟動 |
| 退款 |
客戶服務啟動 |
| 交換 |
客戶服務啟動 |
| 結束流程 |
客戶服務啟動 |
| 結束工作階段 |
- 請在「運送」頁面建立下列項目執行要求:
Shipping physical merchandise items can take up to 2 weeks.
Is there anything else I can help you with?
- 請為「退款」頁面建立下列項目:
We offer free returns and refunds. We provide one free return label for each order. You can use it within 30 days from receiving your order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- 為「Swapping」頁面建立下列項目執行要求:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- 選取「Start」頁面,然後按一下
redirect.end
意圖。建立下列執行要求:Thank you for contacting G-Records! Have a nice day!
- 選取「Start」頁面,然後按一下
redirect.home
意圖。建立下列參數預設值:restart = true
建立測試案例
- 按一下畫面右側的「測試代理程式」按鈕。
初次開啟模擬工具時,您必須選取代理程式環境和啟用流程。在大部分情況下,您應使用草稿環境和預設的開始流程。
- 類型:
Hi
- 提問:
Which artists are signed with your label?
- 請說出:
The Google Dolls
- 請說出:
I am interested in buying a shirt
- 請說出:
A t-shirt
- 請說出:
Medium
- 接著,請按一下「Save Test Case」(儲存測試案例) 按鈕。您可以在模擬器頂端找到該圖示 (位於重做箭頭和重設垃圾桶圖示旁邊)
- 請提供下列詳細資料:
- 測試案例名稱:
Buy Google Dolls t-shirt size M
- 標記:#catalog、#shirts、#t-shirt、#TheGoogleDolls
- 點選「儲存」。
我們來建立更多測試案例。
- 請先按一下「重設」(垃圾桶) 圖示,清除目前的對話方塊。
- 建立下列測試案例:
購買 Alice Googler T 恤:
>"Buy the Alice Googler t-shirt."
>"XL"
- 測試案例名稱:
Buy the Alice Googler t-shirt
- 標記:
#catalog, #shirts, #t-shirt, #AliceGoogler
購買 M 號的 T 恤:(請注意,藝人名稱並未提及,但你確實想略過樂團總覽、產品總覽、上衣和上衣尺寸頁面)
>"Buy a t-shirt size M"
>"The Google Fighters"
- 測試案例名稱:
Buy a t-shirt size M
- 標記:
#catalog, #shirts, #t-shirt, #TheGoogleFighters
- 說明:(請注意,藝人名稱並未提及,但您可以略過樂團總覽、產品總覽、上衣和上衣尺寸頁面)
購買 G's N' Roses 的音樂 (請注意,這會略過樂團總覽和產品總覽頁面)
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- 測試案例名稱:
Purchase music of G's N' Roses
- 標記:
#catalog, #music, #CD, #GsNRoses, #live
- 說明:(請注意,這樣會略過錶帶總覽和產品總覽頁面)
查看價格資訊:
>"Which products"
>"Shirts"
>"What's the price difference?"
>"Longsleeve"
>"What does it cost?"
>"M"
>"The Google Dolls"
>"No"
>"Which bands"
>"The Gooo Fighters"
>"Music"
>"How much does it cost?"
>"Greatest Hits"
>"What's the price difference?"
>"Mp3"
>"No"
>"I want to buy the tour movie"
>"Alice Googler"
>"Yes"
- 測試案例名稱:
Price info
- 標記:
#catalog, #music, #tourmovie, #shirts
- 說明:測試對話中的各種價格資訊
測試預錄的測試案例
- 在左側的 Dialogflow 主選單中,依序選取「Manage」>「Test Cases」。
- 選取所有測試案例,然後按一下表格上方的「Run」按鈕。
Dialogflow CX 會針對儲存為「黃金測試案例」的錄音檔執行所有所選測試案例,如果結果與儲存的內容相同,則表示測試通過。- 流程中是否有變動,例如網頁未正確設定,或意圖將您導向錯誤的網頁,則測試會失敗。
- 在模擬工具中提出下列問題:
How long will shipping take?
- 記下結果,並將測試案例儲存為
Shipping
,並加上以下標記:#shipping
。 - 前往「管理」>「測試案例」面板,然後按下格線右上方的「執行」按鈕,即可只執行
Shipping
測試案例。
這項測試應會通過。
- 返回客戶服務流程,選取「Start」頁面,然後按一下「Routes」標頭。
系統隨即會顯示格線畫面,其中列出所有路線。
- 移除
redirect.shipping.info route
- 前往「管理」>「測試案例」面板,然後按下格線右上方的「執行」按鈕,即可只執行
Shipping
測試案例。
這項測試應會失敗。
- 您可以點選失敗的測試,查看失敗的詳細資料。
在這種情況下,測試失敗並顯示以下錯誤訊息:
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
這是因為該頁面已從流程中移除。我們預期會看到 Shipping
頁面,但實際上從未離開 Start
頁面。(或是您的使用者收到備用訊息)。
也就是說,這是錯過的要求,也就是偽陰性測試結果。測試失敗。我們預期會看到「Shipping」頁面,但沒有任何反應,或顯示備用訊息。
- 返回客戶服務流程,並將
redirect.shipping.info
新增為意圖路徑,並加入至「開始」頁面。別忘了切換至「運送」頁面,然後按一下「儲存」。 - 在模擬工具中記錄下列測試案例:
I want to swap my item
。請將這個測試案例儲存為Swapping
#swapping
。 - 開啟「管理」>「意圖」>「redirect.refund.info」,然後新增下列訓練詞組:
I want to swap this item for a refund
如果沒有這類訓練字詞,當使用者要求更換商品以便申請退款時,系統會觸發 redirect.swapping.info 意圖,但我們不想提供有關更換商品的資訊,而是想提供退款資訊。
- 在模擬工具中建立下列黃金測試案例:
I want to swap this item for a refund
,並將此測試案例儲存為Swap for Refund
#refund
- 返回「管理」>「意圖」>「redirect.refund.info」意圖,然後移除
I want to swap this item for a refund
行。 - 返回「管理」>「測試案例」,選取「換貨退款」測試案例,然後點選「執行」。
最近一次的測試失敗,錯誤訊息如下:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.`
Is there anything else I can help you with?
Page: Page mismatch:
Expected: Refund
Actual: Swapping
也就是說,這是錯過理解的要求,也就是偽陽性測試結果。測試失敗。我們預期會看到「Refund」頁面,但「Swapping」頁面已啟用。
涵蓋範圍
在 Dialogflow CX 中,測試涵蓋率是用來描述在特定測試套件執行時,虛擬服務專員 (頁面和意圖) 對話執行程度的評估指標。測試涵蓋率越高的虛擬代理人 (以百分比表示),在測試期間執行的對話會越多,因此相較於測試涵蓋率較低的虛擬代理人,虛擬代理人發生未偵測到的錯誤 (例如錯過的理解請求) 的機率較低。
- 如要查看所有測試案例的測試涵蓋率報告,請按一下「涵蓋率」。
- 按一下「轉場效果」分頁標籤。
這會顯示所有頁面轉場的測試涵蓋率。
- 按一下「Intents」分頁標籤。
這會顯示所有意圖的測試涵蓋率。
恭喜,您已建構並測試零售商機器人實際範例!接下來,我們將前往下一頁,閱讀結論並查看實用參考資料!
10. 結語
Dialogflow CX 是一種對話式 AI 平台 (CAIP),可用於建立即時通訊或語音機器人等虛擬服務專員。Dialogflow CX 可讓您的團隊透過視覺化機器人建構工具、可重複使用意圖,以及處理多回合對話的能力,加快打造企業級對話式體驗。
在本程式碼研究室中,您已瞭解如何建構實際的零售虛擬服務專員。我們討論了以下概念:
- 流量數
- 參數、自訂和系統實體
- Pages
- 狀態處理常式,例如意圖路徑和條件路徑
- 靜態執行要求訊息和條件式回應
- 備用意圖
- 模擬器、測試案例和涵蓋率
參考資料
如要進一步瞭解 Dialogflow CX,請參閱下列文章和說明文件!