1. 總覽
上次更新時間:2023 年 8 月 7 日
建構項目
在本程式碼研究室中,您將在 Dialogflow CX 中建構、部署及設定簡單的虛擬服務專員,透過群組預約和私人包機服務協助旅行水肺潛水者。虛擬服務專員會使用生成式 AI 和 Google 最新的生成式大型語言模型 (LLM),生成虛擬服務專員的回應。
課程內容
- 如何啟用相關 API
- Dialogflow 如何從意圖參數中自動填入頁面表單參數值
- 如何在 Dialogflow 中設定事件處理常式
- 如何在流程和參數填入期間,針對不相符的事件處理常式啟用生成備用功能
- 如何設定自己的文字提示,以處理基本事務和服務專員特定對話情境
- 如何撰寫良好的意圖和參數說明,以產生必要參數的提醒處理常式 (除了使用者定義的要求之外)
- 如何測試代理程式及模擬會觸發生成式備用方案的客戶問題
軟硬體需求
- Google Cloud 專案
- 瀏覽器,例如 Chrome
2. 開始設定
您需要先啟用 Dialogflow API,才能開始使用 Dialogflow CX 的生成式備用功能。
使用 Cloud 控制台啟用 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 控制台中,按一下頁面右上角的「Create new agent」。
- 選取「Build your own」代理程式選項。
- 填妥表單並在下方完成代理程式設定,然後按一下「Create」(建立) 即可建立代理程式。
- 以顯示名稱的形式選擇:
Divebooker
- 選擇的位置如下:
us-central1
- 選取你偏好的時區
- 選取
en - English
做為預設語言
- Dialogflow 會自動為您開啟虛擬服務專員。尚未完成!
還原 Divebooker 代理程式
- 返回代理程式清單頁面,找出您剛剛建立的代理程式。依序點選 選項和「還原」按鈕。
- 選取「Upload」選項,然後捨棄或選取先前從 GitHub 存放區下載的 ZIP 檔案。
- 按一下 [Restore] (還原) 按鈕,匯入我們提供的代理程式
非常好!您已經完成建立潛水預約虛擬服務專員,可以為客戶提供協助。在下一節中,您將測試解答,瞭解回答使用者問題及協助處理預訂要求方面的成效。
4. 測試代理程式
Dialogflow 提供內建模擬器,方便您與虛擬服務專員進行即時通訊,並找出錯誤。針對每個回合,您可以驗證觸發的意圖、代理程式回應、有效網頁和工作階段參數的正確值。
我們會在幾個情境中進行測試,並從各個情境中瞭解服務專員提供特定回應的原因。先從第一個選項開始。
未解決的意圖
- 在 Dialogflow 控制台中,按一下代理程式中的「Test Agent」(測試代理程式) 開啟模擬器。
- 輸入要給虛擬服務專員的問候語 (例如
Hello
),然後詢問what is a liveaboard?
。問題未與任何意圖皆不相符,顯示一般提示,例如「很抱歉,我不確定如何提供協助」。您可以在模擬器中查看原始回應,確認已叫用 sys.no-match-default 內建事件。
向下捲動至 JSON 回應的結尾。請注意,搜尋相符的意圖時,Dialogflow 會發現此為 NO_MATCH 並引發不相符事件。
- 切換至「Build」分頁,然後開啟「Liveaboards」流程的「Start Page」。
根據預設,每個流程都有用於不相符和無輸入的內建事件的事件處理常式。這些事件處理常式會在建立流程時自動建立,且無法刪除。
- 按一下 sys.no-match-default 事件處理常式,然後向下捲動至「Agent response」部分。Dialogflow 提供替代回應清單,但您也可以定義不同類型的回應訊息,為使用者提供其他以外的回應。
現在我們來體驗愉快的旅程!
開心路徑
以第二例來說,假裝是潛水員,明年 7 月想預訂一組 12 人前往加拉巴哥群島。
- 在模擬工具面板中,按一下「Reset」圖示,即可與代理程式展開新的對話。
- 告知服務專員你想預約探員至加拉巴哥群島,並提供旅程的詳細資訊。你不必用到完全相同的提示,實際測試!
- 開啟起始網頁,然後按一下 head.send.group.request 路徑。向下捲動到「Transition」部分,在符合這項意圖時告知 Dialogflow 頁面要進行轉換。
- 關閉「路徑」定義,然後展開「收集其他資訊」頁面。請注意項目的執行要求和參數清單。
您可以替 Dialogflow CX 中的各個頁面定義表單,也就是由使用者針對網頁收集的參數清單。請注意,由於服務專員在初始輸入內容中傳遞了查詢目的地,而 destination 也是意圖參數,因此服務專員沒有要求提供旅遊目的地。網頁一開始成為有效狀態時,如果表單參數的名稱與意圖參數相同,就會自動設為工作階段參數值,並略過對應的提示。
- 切換至「Manage」分頁,然後點選「Intents」(意圖) 部分下方的 head.send group request 意圖。查看為此意圖提供的訓練詞組,以及訓練詞組的加註部分。
- 假設有以下這個訓練詞組:「我需要規劃 15 位潛水者前往哥斯大黎加之旅」。「哥斯大黎加」加註 destination 和 "15" 的註解以 Quest-of-guests 結尾。當您為訓練詞組的部分內容加註時,Dialogflow 會辨識這些部分只是使用者會在執行階段提供的實際值範例。正因如此,最初輸入內容「你們是否提供特許客運服務給加拉巴哥群島?」Dialogflow 從「Galapagos Island」中擷取目的地參數。
接著,我們會查看如果要求填入表單參數時,未提供有效的輸入內容給服務專員,會發生什麼事?
輸入值無效
- 在模擬工具面板中,按一下「Reset」圖示,即可與代理程式展開新的對話。
- 向服務專員說明預約群組預訂的意圖。此時,系統不會告知服務專員你的目的地,或在需要目的地回覆時輸入隨機值,而不是哥斯大黎加、加拉巴哥或墨西哥。
- 在「管理」分頁中,點選「資源」專區下方的「實體類型」。請注意兩個分頁:在「System」分頁中,您可以查看代理程式目前使用的系統實體。「Custom」分頁會列出專為比對此代理程式相關資料而建立的自訂實體清單。
- 按一下「目的地」實體,即可查看實體相符的值。「歐洲」不是項目之一,也不是同義詞。
- 在流程圖中,展開包含表單參數的「Collect 進一步資訊」頁面。按一下 destination 參數。
- 在參數面板向下捲動到「Reprompt event 處理常式」部分,按一下「No-match default」事件處理常式。
這個參數層級的事件處理常式專門用於處理表單填寫期間無效的使用者輸入內容。因為「歐洲」是非預期的輸入內容,系統會叫用 sys.no-match-default 事件,並呼叫為此事件定義的對應重新提示處理常式。「Agent 標註」部分會列出兩個替代重新提示訊息。
真厲害!這些測試案例代表代理程式應適當處理的常見情況。使用者經常提出問題,表示機器人無法回答,或是由機器人無法滿足的要求。長尾設計十分複雜,也就是說,大部分使用者會遵循的佩戴路徑。請想想使用者在對話中可能遇到的問題,以及使用者可能採取的所有非預期或不支援的路徑。
自動語音辨識 (ASR) 不斷進步,因此我們幾乎總是能確切掌握使用者說的話。然而,要判斷使用者的目標還是不容易。我們通常無法獨立理解大小寫;唯有使用情境才能理解其內容在本程式碼研究室的下一節中,我們將說明 Google 最新的生成式大型語言模型 (LLM) 如何協助您重新對話並推動對話。
5. 啟用生成式備用功能
什麼是生成式備用功能?
生成式備用功能是 Dialogflow CX 功能,可使用 Google 的大型語言模型 (LLM) 產生虛擬服務專員回應。
用途
在關鍵用途之間,有幾個常見的使用者要求,例如重複代理程式所說的內容,以防使用者不理解。在使用者提出要求時保留這一行,以及總結對話內容。我們在第一項測試中,服務專員未回答「什麼是即時白板?」這個問題因為我們還沒有建立意圖
即使有強大的意圖,也仍有空間發生錯誤。使用者可能會以靜音狀態 (「沒有輸入」錯誤) 或說出非預期的錯誤 (「沒有比對」錯誤) 來關閉指令碼。雖然防止錯誤發生優於在發生錯誤後加以處理,但還是無法完全避免錯誤。一般提示,例如「很抱歉,我不確定該如何提供協助」或類似的可行的解決方案通常不夠理想錯誤提示應該以合作原則來構建,而該原則上,高效率通訊的假設是假設對話參與者之間存在協作關係。
在下一節中,我們會說明如何設定生成式備用功能,以提高意圖涵蓋率並簡化錯誤處理機制,提供更優質的客戶體驗。
針對整個流程的「不相符」事件啟用生成備用功能
您可在流程、網頁或參數填入期間,針對不相符的事件處理常式啟用生成備用功能。為不相符的事件啟用生成式備用選項後,每當該事件觸發時,Dialogflow 就會嘗試產生生成的回應,並向使用者發出指令。如果回應產生失敗,就會改為發出一般預先設定好的服務專員回應。
您可以在流程、網頁或參數執行要求中,為不相符的事件處理常式啟用生成式備用功能。
我們將針對整個 Liveaboards 流程中的 no-match-default 事件啟用生成備用功能,
- 展開流程的「Start Page」(起始網頁)。
- 按一下「事件處理常式」sys.no-match-default下方的「sys.no-match-default」sys.no-match-default。
- 勾選「Agent response」下方的「Enable generative backback」(啟用生成式備用選項),然後按一下 [Save] (儲存)
為特定不相符的事件啟用生成輔助功能
我們現在希望在服務專員要求乘客人數時,啟用生成式備用服務來處理無效輸入內容:
- 開啟內含表單參數的「收集其他資訊」頁面。按一下 number-of-guests 參數。
- 前往目標「無比對」事件處理常式 (向下捲動至「Reprompt 事件處理常式」部分,然後按一下「No-match default」事件處理常式)。
- 在「Agent response」下方勾選「Enable generative backback」(啟用生成式備用選項)。
- 最後按一下「儲存」。
- 接著重複完整步驟,以便為目的地和電子郵件地址啟用產生備用選項
真厲害!您已啟用生成式備用功能,可處理非預期的意圖和無效參數值。接下來,我們會說明如何透過文字提示設定生成式備用功能,藉此指示 LLM 的回應方式。
6. 設定生成式備用功能
生成式備用功能會將要求傳遞至大型語言模型,以便產生回覆。要求採用文字提示的形式,包含自然語言,以及服務專員目前狀態和對話狀態的相關資訊。你可以透過多種方式設定這項功能:
- 選擇用於產生回應的特定 (已定義) 提示。
- 定義自訂提示。
選擇已定義的提示
- 在 Dialogflow CX 控制台中,按一下「Agent Settings」(代理程式設定)
- 依序前往「ML」ML分頁和「Generative AI」ML子分頁。
這個功能也包含兩個範本提示:「預設」範本 (未顯示) 和「範例」範本,後者可引導您自行撰寫提示。
- 選取「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」流程中加入說明,請將滑鼠遊標懸停在「Flows」部分的流程上,以存取流程設定。
- 按一下「選項」按鈕 。
- 選取「Flow settings」,並新增下列說明 (或類似說明):
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. 重新測試虛擬服務專員
在虛擬服務專員上設定及啟用生成式備用方案後,您可以提出類似的棘手問題,看看 Gemini 如何處理回應。
按一下「Test Agent」再次開啟模擬器。
再次詢問服務專員有關活體板和活體板潛水的相關資訊。現在我們特別留意,每個對話方塊對使用者定義訊息的方式,以及產生的回應會以紅色方塊醒目顯示。
你是否收到包含實用回覆的實用回覆,而非籠統的反提示?太好了!針對您希望代理程式執行的工作 (在文字提示和流程說明中提供清楚扼要的說明) 之後,機器人現在不必建立特定意圖,就能在不建立特定意圖的情況下回答詳細問題。客服專員會很滿意客服專員可以提供更詳盡的回覆,而非給予無回應。
別害羞並挑戰服務專員,由於你尚未成為認證潛水員,因此請詢問服務專員是否能協助尋找潛水課程。
沒錯,目前我們尚未設計服務專員來協助水肺潛水課程。服務專員如何得知這項資訊?我們在文字提示中清楚說明瞭服務專員可以和無法提供協助的內容。「目前您正無法協助客戶進行土地潛水和課程,不會推薦當地潛水用品店和潛水度假村。"
現在重新測試歡樂的情境,讓對話內容更豐富。我們來看看全新體驗有哪些改變。
Dialogflow 比對意圖或嘗試根據流程設計收集參數時,會顯示設計期間定義的執行要求。當使用者下游要求提供旅遊詳細資料的摘要,或提供電話號碼時,系統就會啟動生成式備用功能。
太好了!您已重新測試過這段愉快的情境,希望您已經在和服務專員討論過愉快、自然的對話中,盡可能接近真人服務專員的體驗。
很抱歉,對話可能發生問題。我們來做別的測試,這次要求您提供房客人數時,請說出大於 15 的數字。
請留意以下幾點:
- 為什麼 20 是無效的數字?由於我們針對意圖說明設定可容納的房客人數限制:「服務專員會收集出發期間、目的地、房客人數等資訊***(最少 4 人,最多 15 人)*** *,聯絡人詳細資料*」,直接在 Google Cloud 控制台實際操作。大型語言模型生成的生成回覆:「很抱歉,我們只能協助處理最多 15 位房客的群組預約」完全符合我們對房客人數的限制。為了進一步強制執行,訪客數是自訂的 RegExp 實體,且只會比對 4 到 15 之間的數字。
- 這樣就繼續對話,因為使用者依然很渴望獲得 15 位跳水客的優惠。這種情況經常發生在對話中,我們經常改變想法!請注意,代理程式是互通的,會緩緩地將使用者引導至成功的路徑。
對話設計涉及在對話方塊的一半中編寫指令碼,希望已經夠穩固,任何人都能參與其中。設計長尾時,開發人員需要關注使用者在對話方塊每個步驟可說的內容,以便定義路徑、處理常式和參數。因此,我們在 Dialogflow CX 中加入了生成式備用功能,讓開發人員不必費心處理對話設計原則,也減少了實作細節,為使用者提供完善的對話體驗。
再做一次測試,這次向機器人提出挑戰,尋找目的地不在馬爾地夫等可用目的地清單的地點。然後快速看看背後的運作原理。
請注意,由於我們也針對 destination 參數的 no-match
事件啟用生成備用功能,因此系統會將要求傳送至大型語言模型,以產生產生的回應。系統會忽略一般規定的回應 (在「服務專員」下方說明)。
下方的文字方塊可協助您進一步瞭解預留位置如何影響傳送至大型語言模型的要求。
這是我們在 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」子分頁。
- 在「遭停權的詞組」部分,將下列語句加入清單:
Dangerous country
Hateful place
Medical assistance
- 按一下 [儲存]。
- 按一下「重設」圖示,然後重新測試最後一個情境。與其提供世界各地美麗的潛水地點,不如輸入其中一項禁語。
系統會根據遭禁詞組清單檢查提示和產生的回覆。遭禁的詞組是指生成式 AI 遭禁的詞組。如果輸入內容包含遭禁的詞組或判定為不安全的詞組,系統就無法產生這些詞組,並改為發出一般要求的回應 (在「Agent 與相同執行要求中」之下表示)。
超棒!我們探討了多種對話情境,讓生成式回應能產生實質幫助。歡迎繼續測試!
10. 恭喜
恭喜您完成本程式碼研究室!放鬆一下!
您已成功建立虛擬服務專員,並在流程中使用的 no-match
事件處理常式和參數填入期間啟用生成式備用功能。
生成式備用功能結合良好的流程和意圖說明,可提供服務專員專屬的合作回應,與一般提示,例如「很抱歉,我不確定該如何提供協助」或「很抱歉,您輸入的選項無效」。大型語言模型產生的錯誤提示可能會輕緩引導使用者返回成功的路徑,或是重新設定期望和不可行的期望。
歡迎測試其他對話情境,並探索 Dialogflow CX 和生成式 AI 的其他可用功能。
清除
您可以執行以下清除作業,以免系統向您的 Google Cloud 帳戶收取這個程式碼研究室中所用資源的費用:
- 前往 Dialogflow CX 控制台,然後刪除您建立的所有代理程式。
- 在 Google Cloud 控制台中,前往「API 和服務」頁面,然後停用 Dialogflow API。
其他資訊
透過下列指南和資源,繼續瞭解對話式 AI 和生成式 AI:
- Dialogflow CX 的說明文件
- 生成式備用服務說明文件
- Google Cloud 的生成式 AI
- PaLM 簡介
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。