1. 總覽
上次更新時間:2023 年 8 月 7 日
建構項目
在本程式碼研究室中,您將在 Dialogflow CX 中建構、部署及設定簡單的虛擬服務專員,協助潛水員進行團體預訂和私人包船。虛擬代理程式會使用生成式 AI 和 Google 最新的生成式大型語言模型 (LLM),生成虛擬代理程式回覆。
課程內容
- 如何啟用相關 API
- Dialogflow 如何從意圖參數自動預先填入頁面表單參數值
- 如何在 Dialogflow 中設定事件處理常式
- 如何在流程和參數填寫期間,為無相符事件處理常式啟用生成式備用答覆
- 如何設定自己的文字提示,處理基本和代理程式專屬的對話情境
- 如何編寫優質的意圖和參數說明,為必要參數產生重新提示處理常式 (使用者定義的重新提示除外)
- 如何測試代理並模擬顧客問題,觸發生成式備案
軟硬體需求
- Google Cloud 專案
- 瀏覽器,例如 Chrome
2. 開始設定
如要在 Dialogflow CX 中使用生成式備援功能,必須先啟用 Dialogflow API。
使用 Cloud Console 啟用 Dialogflow API
- 在瀏覽器中開啟 Google Cloud 控制台。
- 前往 Google Cloud 控制台的 API 程式庫,瀏覽可啟用的 API 和服務。
- 在「API 程式庫」頁面頂端的搜尋列中搜尋
Dialogflow API,然後點選搜尋結果中的服務。 - 點選「啟用」按鈕,在 Google Cloud 專案中啟用 Dialogflow API。
使用 gcloud CLI (替代方法)
或者,您也能使用下列 gcloud 指令啟用 API:
gcloud services enable dialogflow.googleapis.com
如果 API 啟用成功,您應該會看到類似以下的訊息:
Operation "operations/..." finished successfully.
取得程式碼
您不必從頭建立虛擬服務專員,我們會提供代理程式,您只需從 Dialogflow CX 控制台還原,然後加以改善即可。
如要下載原始碼,請按照下列步驟操作:
- 開啟新的瀏覽器分頁,前往代理程式存放區,然後從指令列複製該存放區。
- 初始代理程式已匯出為 JSON 套件。解壓縮檔案、檢查代理程式設定、查看流程定義
Liveaboards.json,最後瀏覽流程頁面、意圖和實體。
3. 建立新代理程式
開啟 Dialogflow 主控台
您將使用 Dialogflow CX 控制台和 Google Cloud 專案,完成本程式碼研究室的其餘步驟。
- 在瀏覽器中前往 Dialogflow CX 主控台。
- 選取要使用的 Google Cloud 專案,或建立新的專案。
- Dialogflow CX 控制台會顯示代理程式清單。
如果這是您第一次使用 Dialogflow CX,請參閱 Dialogflow CX 說明文件,進一步瞭解如何根據需求設定專案和設定。
建立新的 Dialogflow CX 虛擬服務專員
- 如要還原從 GitHub 存放區下載的代理程式,請建立新的代理程式。在 Dialogflow CX 控制台,按一下頁面右上角的「建立新服務專員」。

- 選取「自行建立」代理程式的選項。

- 填寫表單,輸入下列代理程式設定,然後按一下「建立」建立代理程式。
- 選擇顯示名稱:
Divebooker - 選擇位置:
us-central1 - 選取偏好時區
- 選取「
en - English」做為預設語言
- Dialogflow 會自動開啟代理程式。我們還沒完成!
還原 Divebooker 代理程式
- 返回代理程式清單頁面,找出您剛建立的代理程式。按一下
選項,然後按一下「還原」按鈕。 - 選取「上傳」選項,然後拖曳或選取先前從 GitHub 存放區下載的 ZIP 檔案。
- 按一下「還原」按鈕,匯入我們提供的代理程式

非常好!您已完成建構潛水預訂虛擬代理,準備好協助顧客。在下一節中,您將測試這項功能,看看它在回答使用者問題和協助預訂要求方面的表現。
4. 測試代理
Dialogflow 提供內建模擬工具,可與代理程式對話並找出錯誤。在每個回合中,您可以驗證觸發的意圖、代理程式回應、有效網頁和工作階段參數的值是否正確。
我們會測試幾種情境,並針對每種情境探討代理程式給出特定回應的原因。我們先從第一個開始。
未解決的意圖
- 在 Dialogflow 主控台的代理程式中,按一下「測試代理程式」開啟模擬工具。

- 輸入問候語 (例如
Hello) 並提出問題what is a liveaboard?。如果問題與任何意圖都不相符,系統會顯示「抱歉,我不確定該如何協助你」等一般提示。您可以在模擬器中檢查原始回覆,確認系統是否已叫用 sys.no-match-default 內建事件。

向下捲動至 JSON 回應的結尾。請注意,搜尋相符意圖時,Dialogflow 會發現這是 NO_MATCH,並引發不相符事件。

- 切換至「Build」分頁,然後開啟「Liveaboards」流程的「Start Page」。

根據預設,每個流程都有無相符和無輸入內容內建事件的事件處理常式。建立流程時,系統會自動建立這些事件處理常式,且無法刪除。
- 按一下 sys.no-match-default 事件處理常式,然後向下捲動至「Agent responses」部分。Dialogflow 會提供替代回應清單,但您也可以定義不同類型的回應訊息,為使用者提供文字以外的回覆。

現在來看看順利的情況!
滿意路徑
在第二個案例中,假設您是潛水員,想為 12 人的團體預訂明年 7 月前往加拉巴哥群島的潛水遊輪行程。
- 在「模擬器」面板中,按一下「重設」圖示,即可與服務專員展開新對話。


- 告訴服務人員你想預訂前往加拉巴哥群島的包機,並提供旅遊詳細資料。您不一定要使用下列完全相同的提示,請盡情嘗試!

- 開啟「Start Page」,然後點選 head.send.group.request 路線。向下捲動到「Transition」(轉場) 區段,告訴 Dialogflow 比對出這個意圖時要轉場的頁面。

- 關閉「Route」定義,然後展開「Collect Further Info」頁面。請注意項目完成情況和參數清單。

您可以為 Dialogflow CX 中的每個頁面定義表單,也就是要從使用者收集的頁面參數清單。請注意,由於我們已將旅遊目的地做為初始輸入內容的一部分傳遞,且目的地也是意圖參數,因此代理程式並未詢問旅遊目的地。網頁一開始處於啟用狀態時,以及在啟用期間,系統會自動將任何與意圖參數同名的表單參數設為工作階段參數值,並略過對應的提示。
- 切換至「管理」分頁,然後點選「意圖」部分下方的「head.send group request」意圖。查看這個意圖的訓練詞組,以及訓練詞組中加上註解的部分。

- 假設訓練詞組為「I need to organize a trip to Costa Rica for 15 divers」(我需要為 15 位潛水員安排哥斯大黎加之旅)。「哥斯大黎加」會以 destination 註解,「15」則以 number-of-guests 註解。當您為訓練詞組的部分內容加註時,Dialogflow 會辨識這些部分只是使用者會在執行階段提供的實際值範例。因此,如果一開始輸入「Do you offer charters to the Galapagos Islands?」(你們提供加拉巴哥群島的包船服務嗎?)Dialogflow 從「加拉巴哥群島」擷取了目的地參數。
接下來,我們要看看如果要求填寫表單參數時,未提供有效輸入內容給代理程式,會發生什麼情況。
輸入內容無效
- 在「模擬器」面板中,按一下「重設」圖示,即可與服務專員展開新對話。
- 表達要預訂團體行程的意圖,但這次不要告訴服務專員目的地和時間,當服務專員詢問目的地時,請回覆隨機值,但不要是哥斯大黎加、加拉巴哥群島或墨西哥。

- 在「管理」分頁標籤中,按一下「資源」部分下方的「實體類型」。請注意兩個分頁:在「系統」分頁下方,您可以找到代理程式目前使用的系統實體。「自訂」分頁會列出為比對這個代理程式專屬資料而建立的自訂實體。

- 按一下「目的地」實體,即可查看實體相符的值。「歐洲」並非其中一個項目,也不是同義詞。
- 在流程圖中,展開包含表單參數的「收集其他資訊」頁面。按一下「目的地」參數。
- 在參數面板中,向下捲動至「重新提示事件處理常式」部分,然後點選「No-match default」事件處理常式。
這個參數層級的事件處理常式專門用於處理使用者填寫表單時的無效輸入內容。由於「歐洲」是預期外的輸入內容,因此系統會叫用 sys.no-match-default 事件,並呼叫為這個事件定義的對應重新提示處理常式。「代理人說」部分會列出兩個替代重新提示訊息。

真厲害!這些測試案例代表代理程式應妥善處理的常見情境。使用者經常會提出機器人無法回答的問題,或要求機器人完成無法執行的動作。為長尾設計非常複雜,也就是要為大多數使用者不會採取的路徑設計。請思考對話中可能發生的所有錯誤,以及使用者可能採取的非預期或不支援路徑。
自動語音辨識 (ASR) 技術的進步,代表我們幾乎都能準確瞭解使用者說了什麼。但要判斷使用者意圖仍是一大挑戰。語句通常無法單獨解讀,只能根據情境理解。在本程式碼研究室的下一節中,我們將探討如何運用 Google 最新的生成式大型語言模型 (LLM),讓對話重回正軌並繼續進行。
5. 啟用生成式備用答覆
什麼是生成式備用答覆功能?
生成式備援功能是 Dialogflow CX 的一項功能,可使用 Google 的大型語言模型 (LLM) 生成虛擬服務專員的回覆。
這項功能有什麼幫助?
在主要用途之間,還有一些較常見的使用者要求,例如重複代理程式說的內容 (如果使用者不瞭解)、在使用者要求時保留通話,以及總結對話。在第一次測試中,由於我們尚未建立意圖,並設計流程來處理與水肺潛水和船宿相關的這類一般問題,因此代理程式無法回答「什麼是船宿?」這個問題。
即使意圖健全,仍可能發生錯誤。使用者可能會保持沉默 (「沒有輸入內容」錯誤) 或說出非預期的內容 (「沒有相符項目」錯誤),導致對話中斷。雖然防患於未然勝過事後處理,但錯誤無法完全避免。「抱歉,我不確定該如何協助你」等一般提示,或類似的最低可行解決方案通常不夠好。錯誤提示應根據合作原則設計,也就是假設對話參與者之間存在合作關係,才能進行有效溝通。
在下一節中,我們將瞭解如何設定生成式備用功能,提高意圖涵蓋範圍並簡化錯誤處理程序,進而提升客戶體驗。
為整個流程的無相符事件啟用生成式備用答覆
您可以在流程、頁面或參數填寫期間使用的無相符事件處理常式中,啟用生成式備用答覆。如果為不相符事件啟用生成式備用功能,每當該事件觸發時,Dialogflow 就會嘗試生成回應,並回覆給使用者。如果無法生成回覆,系統會改為發出一般規定的代理程式回覆。
您可以在代理程式的無相符事件處理常式中啟用生成式備用答覆,並用於流程、頁面或參數執行要求。
我們將開始為整個「Liveaboards」流程的無相符預設事件啟用生成式備用答覆。
- 展開流程的「開始頁面」。
- 按一下「事件處理常式」下方的「sys.no-match-default」。
- 勾選「Agent responses」下方的「Enable generative fallback」,然後按一下「Save」。


針對特定無相符事件啟用生成式備用答覆
現在,我們希望在虛擬服務專員要求提供乘客人數時,啟用生成式備援來處理無效輸入:
- 開啟包含表單參數的「收集其他資訊」頁面。按一下「number-of-guests」參數。
- 前往目標「No-match」事件處理常式 (向下捲動至「Reprompt event handlers」部分,然後按一下「No-match default」事件處理常式)

- 勾選「代理程式回覆」下方的「啟用生成式備用答覆」

- 最後按一下「儲存」。
- 現在請重複上述步驟,為 destination 和 email-address 啟用生成式備援
真厲害!您已啟用生成式備援功能,可處理非預期的意圖和無效的參數值。接著,我們將瞭解如何使用文字提示設定生成式備援功能,指示 LLM 如何回應。
6. 設定生成式備用答覆
生成式備援功能會將要求傳送至大型語言模型,以生成回覆。要求的形式為文字提示,其中包含自然語言,以及代理程式和對話的目前狀態資訊。這項功能有多種設定方式:
- 選擇要用於生成回覆的特定 (已定義) 提示。
- 定義自訂提示。
選擇已定義的提示
- 在 Dialogflow CX 控制台上,按一下「代理程式設定」。

- 前往「機器學習」分頁,然後前往「生成式 AI」子分頁。

這項功能隨附兩個範本提示:「預設」範本 (不會顯示) 和「範例」範本,可引導您撰寫自己的提示。
- 選取「Example」範本,然後按一下下拉式選單右側的「Edit」按鈕進行檢查。
有了預先定義的提示,虛擬服務專員就能處理基本對話情境。例如:
- 向使用者問候及道別。
- 如果使用者不瞭解,請重複服務專員說的內容。
- 在使用者要求時保留通話。
- 總結對話內容。
我們來為 Divebooker 代理程式定義特定文字提示!
7. 自行定義提示
- 複製下列提示並貼到「文字提示」區域
You are a friendly agent that likes helping traveling divers.
You are under development and you can only help
$flow-description
At the moment you can't help customers with land-based diving and courses. You cannot recommend local dive shops and diving resorts.
Currently you can $route-descriptions
The conversation between the human and you so far was:
${conversation USER:"Human:" AGENT:"AI"}
Then the human asked:
$last-user-utterance
You say:
- 選取「另存為新範本」,將新提示儲存為新範本 (選擇新範本名稱),然後點選面板右下角的「儲存」。

- 如要將新建立的提示設為有效提示,您也必須儲存設定。

撰寫文字提示時,請務必清楚、簡潔且具體。提供給 LLM 的提示內容會大幅影響 LLM 回覆的品質。LLM 經過訓練,會遵循指令,因此提示越像精確的指令,就越可能獲得更好的結果。撰寫提示,然後根據結果反覆調整,讓提示更臻完善。
如要撰寫有效的提示,請遵循下列最佳做法:
- 以清楚明確的方式呈現您希望 LLM 執行的工作。內容完整且簡短。
- 此外,提示應具體且詳細,避免使用模糊或不明確的語言。
- 將複雜的工作細分為較小型且易於管理的單元。將工作拆解成較小的步驟,有助於模型一次專心處理一件事,並降低出錯或造成混淆的可能性。
- 如要提升回覆品質,請在提示中加入範例。LLM 會根據範例的語境脈絡,學習如何回覆。
建立提示時,除了以自然語言描述應產生的情境類型,也可以使用下列預留位置:
$conversation代理程式和使用者之間的對話,不包括使用者最後一句話。你可以調整回合前置字串 (例如:「人類」、「AI」或「你」、「代理程式」)$last-user-utterance使用者最後輸入的內容。$flow-description有效流程的流程說明。$route-descriptions有效意圖的意圖說明。
現在我們有了初步的文字提示,接下來要確保流程和意圖有良好的說明。
8. 新增流程和意圖說明
新增流程說明
- 如要為「Liveaboards」流程新增說明,請將滑鼠游標懸停在「流程」部分中的流程上,存取流程設定。

- 按一下選項
按鈕。 - 選取「流程設定」,然後新增下列說明 (或類似說明):
search, find and book liveaboards。

- 按一下「儲存」。
新增意圖說明
- 現在,讓我們為 head.send.group.request 意圖新增合適的說明。切換至「管理」分頁,在「資源」部分下方選擇「意圖」,然後選取「head.send.group.request」意圖。
- 新增下列說明:
assist users with group or full charter reservations. Initially collect travel details including departure period, destination, number of guests (min 4 max 15 people), contact details. The destination must be one of the following in the Pacific: Costa Rica, Mexico, Galapagos Islands
請注意,說明中包含重要資訊,例如船隻允許的乘客數下限和上限。請注意!
- 按一下「儲存」。
大功告成了!您已為流程和參數執行要求,在無相符事件處理常式中啟用生成式備用答覆。您也定義了自己的文字提示,生成式備援功能會將提示傳送至大型語言模型,產生生成式回覆。
在下一節中,您將重新測試代理程式,看看它如何回答先前同樣困難的問題。
9. 重新測試代理程式
您已在虛擬服務專員上設定並啟用生成式備援,現在可以提出類似的難題,看看系統如何處理回應。
按一下「測試代理程式」,再次開啟模擬器。

再次向服務專員詢問船宿和船宿潛水事宜。從現在起,請注意每個對話都有使用者定義的訊息,以及以紅色方框標示的生成回覆。

你是否收到實用且資訊豐富的回覆,而非一般重新提示?太好了!清楚簡潔地說明您希望代理程式執行的工作 (在文字提示和流程說明中),現在機器人回答詳細問題時會更加聰明,無須建立特定意圖。顧客會感謝服務專員提供更詳盡的回覆,而非無法採取行動的回覆。
請大膽向服務專員提出要求,詢問對方是否能協助你尋找潛水課程,因為你還沒有潛水執照。

沒錯,我們目前尚未設計可協助處理潛水課程的智慧助理。服務專員怎麼知道?在文字提示中,我們清楚列出服務專員可提供和無法提供的協助。「目前無法協助顧客預訂陸上潛水和課程。你無法推薦當地潛水商店和潛水度假村」
現在請重新測試順利的情況,並豐富對話內容。讓我們看看有哪些變化。


當 Dialogflow 比對出意圖,或嘗試根據流程設計收集參數時,就會顯示在設計階段定義的執行要求。如果使用者要求提供旅遊詳細資料摘要或主動提供電話號碼,就會觸發生成式備援功能。
太好了!您已重新測試順利情境,希望您與服務專員的對話盡可能自然流暢,就像與真人服務專員對話一樣。
很抱歉,對話中可能會發生錯誤。我們來進行另一項測試。這次系統詢問房客人數時,請輸入大於 15 的數字。


這裡有幾點要注意:
- 為什麼 20 不是有效數字?因為我們已在意圖說明中設定允許的房客人數上限:「The agent collects info such as departure period, destination, number of guests ***(min 4 max 15 people)****, contact details*」。大型語言模型回覆「抱歉,我們最多只能協助預訂 15 位房客的團體住宿」完全符合我們對房客人數的限制。為進一步強制執行這項規定,房客人數是自訂的 RegExp 實體,只會比對範圍在 4 到 15 之間的數字。
- 對話持續進行,因為使用者最終仍想取得 15 名潛水員的報價。在自然對話中,我們經常會改變心意!請注意,代理程式會配合使用者,並溫和地引導使用者回到正確路徑。
對話設計是指編寫對話的一半內容,希望內容夠豐富,讓任何人都能接手並演出另一半。設計長尾關鍵字時,開發人員必須專注於使用者在對話的每個步驟中可能會說的內容,以定義路徑、處理常式和參數。因此,我們在 Dialogflow CX 中新增了生成式備援功能,讓開發人員專注於對話設計原則,減少實作細節,為使用者提供穩健的對話體驗。
我們再進行一項測試,這次要再次挑戰機器人,輸入馬爾地夫等不在可用目的地清單中的地點。接著,我們會快速瞭解幕後發生的情況。

請注意,由於我們也為目的地參數的 no-match 事件啟用生成式備援功能,系統會將要求傳送至大型語言模型,以生成回覆。系統會忽略預先撰寫的回覆 (位於「Agent says」下方)。
下方的文字方塊有助於瞭解預留位置如何協助塑造傳送至大型語言模型的要求。
這是我們在 Dialogflow 中設定的自訂文字提示,預留位置以粗體顯示:
You are a friendly agent that likes helping traveling divers.
You are under development and you can only help
$flow-description
At the moment you can't help customers with land-based diving and courses. You cannot recommend local dive shops and diving resorts.
Currently you can $route-descriptions
The conversation between the human and you so far was:
${conversation USER:"Human:" AGENT:"AI"}
Then the human asked:
$last-user-utterance
You say:
下方的文字方塊包含大型語言模型收到的輸入內容,以及包含生成回覆的輸出內容,這些內容會回覆給使用者:
llm_input: You are a friendly agent that likes helping traveling divers. You are under development and you can only help search, find and book liveaboards. At the moment you can't help customers with land-based diving and courses. You cannot recommend local dive shops and diving resorts. Currently you can assist users who are looking for a group reservation or a full charter. Initially collect travel details including departure period, destination, number of guests (min 4 max 15 people), contact details. The destination must be one of the following in the Pacific: Costa Rica, Mexico, Galapagos Islands. The conversation between the human and you so far was: Human: Hi, my name's Alessia AI Hi Alessia, what can I help you with today? Human: Can you help me find a nice boat for myself and my family? AI To assist you with that I need to collect the details of your travel and then we'll get back to you with an offer shortly. Where would you like to go? We can organize a charter in Costa Rica, Galapagos Islands and several locations around Mexico Then the human asked: The kids want to go to the Maldives llm_output: You say: I'm sorry Alessia, we can only help you with liveaboards in Costa Rica, Galapagos Islands and several locations around Mexico.
與先前執行的測試類似,傳回給使用者的回覆是由模型生成,並依據我們在意圖說明中提供的資訊:「目的地必須是太平洋沿岸的下列地點之一:哥斯大黎加、墨西哥、加拉巴哥群島」。
修改禁用詞組清單
您可以透過下列方式設定生成式備用答覆功能:
- 選擇要用於生成回覆的特定 (已定義) 提示。
- 定義自訂提示。
- 變更禁用詞清單。
目前我們已探討前兩種方式。我們來看看第三個選項。
- 在「Agent Settings」中,依序前往「ML」分頁和「Generative AI」子分頁。
- 在「Banned phrases」(禁用詞組) 區段中,將下列句子新增至清單:
Dangerous countryHateful placeMedical assistance- 按一下 [儲存]。
- 按一下「重設」圖示,然後重新測試上一個情境。請輸入遭禁的詞組,而非提供世界各地的美麗潛水地點。

系統會根據禁用詞彙清單檢查提示和生成的回覆。禁用詞組是指生成式 AI 禁用的詞組。如果輸入內容包含禁用詞組或系統認為不安全的詞組,系統就會無法生成回覆,而是發出一般規定的回覆 (位於同一項履行的「代理人說」下方)。
太棒了!我們已介紹各種對話情境,說明生成式回覆如何發揮作用。歡迎繼續測試!
10. 恭喜
恭喜您完成本程式碼研究室!放鬆一下!

您已成功建立虛擬服務專員,並在流程中使用的 no-match 事件處理常式和參數填寫期間,啟用生成式備援。
生成式備援功能搭配良好的流程和意圖說明,可讓代理提供具體且合作的回覆,而非「抱歉,我不確定如何提供協助」或「抱歉,您輸入的選項無效」等一般提示。大型語言模型產生的錯誤提示可溫和地引導使用者回到正確路徑,或重新調整使用者對可行與不可行事項的期望。
歡迎測試其他對話情境,並探索 Dialogflow CX 和生成式 AI 的其他相關功能。
清除
如要避免系統向您的 Google Cloud 帳戶收取本程式碼研究室所用資源的費用,請執行下列清理作業:
- 前往 Dialogflow CX 控制台,刪除您建立的所有代理程式。
- 在 Google Cloud 控制台中,前往「API 和服務」頁面,然後停用 Dialogflow API。
其他資訊
歡迎參考下列指南和資源,進一步瞭解對話式 AI 和生成式 AI:
- Dialogflow CX 說明文件
- 生成式備用答覆的說明文件
- Google Cloud 中的生成式 AI
- PaLM 簡介
授權
這項內容採用的授權為 Creative Commons 姓名標示 2.0 通用授權。
