在開發 Alexa 技能時,有效管理對話流程和資料儲存至關重要。本文將深入探討如何利用插槽和對話方塊來收集、儲存和運用使用者資訊,打造更個人化且自然的互動體驗。我們將以一個記錄使用者姓名和生日的技能為例,示範如何使用內建插槽型別,例如 AMAZON.FirstNameAMAZON.Date,以及如何根據需求建立自訂插槽型別。同時,我們也會探討如何利用 userId 識別個別使用者,並在不同會話之間儲存其資訊,讓技能更具備個人化和記憶功能。程式碼範例將涵蓋 Python 和 Node.js 兩種常用的開發語言,方便開發者參考和應用。

3.10 Node.js 除錯

Node.js程式碼在SessionEndedRequestHandler中有一個console.log()命令。

console.log(`~~~~ 會話結束: ${JSON.stringify(handlerInput.requestEnvelope)}`);

這可以擴充套件,您可以看到請求封套:這與我們之前看到的相同。

第4章 • 插槽和對話方塊,儲存會話資料

4.1 簡介

在這一章中,我們將討論對話、插槽及其型別、新增意圖和建立互動模型。我們將看到如何將插槽值傳遞給我們的程式碼、讀取該資料並在會話期間儲存它。我們將撰寫一個技能,要求使用者的名字和生日,並在回應中使用它。

4.2 插槽實踐

我們討論瞭如何使用插槽從陳述式傳遞資訊給技能。有9種內建的插槽型別,例如數字、日期和時間,以及46種內建的清單型別,例如演員、顏色、名字等。您也可以生成自己的自訂插槽型別,並新增預期的插槽值。例如,您可能想要一個包含程式設計語言的插槽。您建立一個自訂插槽並新增插槽值:‘c’、‘python’、‘ada’、‘javascript’等。 讓我們建立一個使用這些型別的技能。它將是一個詢問使用者名字和生日並記錄使用者存取次數的技能。您已經可以看到,我們可以使用一些內建的插槽型別。

4.3 插槽技能

建立一個新的Alexa主機技能。我將其命名為「我的插槽技能」。 建立一個新的技能,輸入技能名稱,選擇Python(或Node.js),然後繼續使用刮痕範本。

4.3.1 呼叫名稱

在做任何其他事情之前,請檢查您的呼叫名稱。有時候它可能沒有更改為您的技能名稱,而是保持為「更改我」,但您可能想要其他東西。點選「呼叫」>「技能呼叫名稱」,然後更改名稱:

4.4 技能流程

讓我們思考一下對話可能的流程。這就是技能流程。有許多程式可以使設計流程變得容易,但這裡不會涉及。如果您感興趣,可以檢視相關資源。

對話可能會像這樣進行: 使用者:開啟我的技能。 Alexa:你好,請告訴我你的名字。 使用者:我的名字是 Joe。 Alexa:歡迎,Joe。 稍後我們會新增: Alexa:你能告訴我你的生日是哪一天和哪個月嗎? 使用者:我的生日是 4 月 1 日。 Alexa:好,Joe,你的生日是 4 月 1 日。我會記住這個資訊以便下次使用,現在先暫別。

我們稍後會看到如何記住使用者的名字和生日。這樣,資料就會在會話之間儲存,您不需要每次都詢問它。

下一次: 使用者:開啟我的技能。 Alexa:你好,Joe,歡迎回來。你出生於 4 月 1 日。 您可以看到,我們需要意圖來詢問使用者的名字和生日,並且需要槽位來儲存這些資訊。

我們將這些意圖稱為 getNameIntent(具有名字槽位)和 getBirthdayIntent(具有生日槽位)。

首先,我們將詢問使用者的名字,然後讀取該槽位並以使用者的名字作為回應。稍後我們會詢問他們的生日。

您需要思考使用者可能如何表達他們的名字和生日。對於名字,他們可能會說:

  • 我的名字是 {name}
  • 我被稱為 {name}
  • {name}
  • 是 {name}
  • 等等

對於生日,他們可能會說:

  • 1 月 1 日
  • 一月一日
  • 一月一日是我生日
  • 我出生於一月一日
  • 等等

我們將使用 userId 來記錄該使用者的資訊。userId是在使用者啟用技能時自動生成的,並且特定於該使用者和技能。它在不同技能之間不是相同的值。

請記住,userId 資訊在 JSON 請求中傳遞,位於 session > user > userId 下,但我們不知道他們的名字。如第 3.4.1 節所示。

4.5 將意圖新增到技能中

首先,點選「程式碼」標籤並修改啟動請求,以提示使用者輸入他們的名字。

在 Python 中,大約在第 30 行,修改為:

speak_output = "你好,請告訴我你的名字"

在 Node.js 中,大約在第 13 行,修改為:

const speakOutput = '你好,請告訴我你的名字';

現在,我們將新增一個意圖來詢問使用者的名字,並將其新增到語音模型中。

點選「建置」標籤,然後點選「技能建置清單 2:意圖、樣本和槽位」,或使用「互動模型」>「意圖」>「新增意圖」。

新增一個自訂意圖,並輸入您的意圖名稱 - 我使用的是 GetNameIntent

現在,您需要輸入樣本陳述式。要新增一個槽位,只需在大括號內輸入即可。輸入「我的名字是 {name}」。{name} 將被識別為一個槽位值,並傳遞給您的程式。

點選「+」或「新增」以新增此槽位。

這只增加了它作為一個槽位名稱 - 我們尚未定義其型別。

當您點選加號以新增陳述式時,您可以選擇一個槽位型別給您的 {name} 槽位。

點選下拉式方塊以顯示所有可用的槽位型別。我使用的是 AMAZON.GB_FIRST_NAME,它是一個常見的英國名字列表,但也可以使用 AMAZON.FirstName

當您在此螢幕上時,請注意:

  • 對話委派 - 我們稍後會檢視。
  • 多值選項 - 如果您的槽位可以有多個值,例如「將雞蛋、麵粉、牛奶、糖新增到購物清單中」。
  • 意圖確認 - 您是否希望 Alexa 確認此選擇?請小心 - 這可能對使用者非常煩人。

新增其他陳述式。輸入 {name} 在大括號內:

您也可以在新增陳述式之前新增槽位型別。點選「槽位型別」,然後點選「新增槽位型別」,並選擇您的槽位型別。

點選「儲存模型」和「建置模型」按鈕,以儲存和建置模型。每次您修改模型時,都必須執行此操作。

注意:如果您需要之前版本的模型,您可以透過玄貓:…(省略)

玄貓觀點:從使用者經驗視角分析插槽與對話方塊的應用

深入剖析Alexa技能開發中插槽和對話方塊的應用後,可以發現,其核心價值在於提升使用者與技能的互動體驗。本篇以實作「我的插槽技能」為例,逐步講解了如何運用內建插槽型別和自訂插槽型別來取得使用者資訊,例如姓名和生日。從技術架構視角來看,插槽機制有效簡化了開發流程,開發者無需自行處理自然語言理解的複雜性,即可輕鬆提取使用者陳述式中的關鍵資訊。

然而,插槽機制也存在一些技術限制。例如,內建插槽型別可能無法完全覆寫所有應用場景,而自訂插槽型別則需要開發者投入額外精力進行維護和更新。此外,過度使用意圖確認可能會降低使用者經驗,使互動過程顯得繁瑣。因此,在設計技能流程時,需要權衡資訊取得的完整性和使用者互動的流暢性。

展望未來,隨著自然語言處理技術的持續發展,預計插槽機制將更加智慧化,例如支援更複雜的語義理解和上下文感知。同時,開發工具也將提供更便捷的插槽管理功能,降低開發者的工作負擔。從商業價值視角來看,更智慧的插槽機制將有助於打造更自然、更流暢的使用者互動體驗,進而提升技能的市場競爭力。

對於開發者而言,建議優先熟悉內建插槽型別,並根據實際需求謹慎選擇是否使用自訂插槽型別。同時,應仔細設計技能流程,避免過度使用意圖確認,以確保最佳的使用者經驗。 玄貓認為,精細化的插槽設計和流程最佳化是打造高品質Alexa技能的關鍵所在。