

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解 Amazon Lex V2 機器人對話
<a name="managing-conversations"></a>

建置機器人之後，您可以將用戶端應用程式與 Amazon Lex V2 執行時間操作整合，以與機器人進行對話。當使用者開始與您的機器人對話時，Amazon Lex V2 會建立*工作階段*。工作階段會封裝應用程式與機器人之間交換的資訊。如需詳細資訊，請參閱[了解 Amazon Lex V2 機器人工作階段](managing-sessions.md)。

典型的對話涉及使用者與機器人之間的來回流程。例如：

```
User : I'd like to make an appointment
Bot : What type of appointment would you like to schedule?
User : dental
Bot : When should I schedule your dental appointment?
User : Tomorrow
Bot : At what time do you want to schedule the dental appointment on 2021-01-01?
User : 9 am
Bot : 09:00 is available, should I go ahead and book your appointment?
User : Yes
Bot : Thank you. Your appointment has been set successfully.
```

使用 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) API 操作自行管理對話。使用 [StartConversation](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_StartConversation.html) API 操作，讓 Amazon Lex V2 為您管理對話。

若要管理對話，您必須將使用者表達用語傳送給機器人，直到對話達到邏輯結尾。目前對話會以工作階段狀態擷取。工作階段狀態會在每個使用者表達用語後更新。工作階段狀態包含對話的目前狀態，並由機器人在每個使用者表達用語的回應中傳回。

對話可以處於下列任何狀態：
+ **ElicitIntent** – 表示機器人尚未判斷使用者的意圖。
+ **ElicitSlot** – 表示機器人已偵測到使用者的意圖，並正在收集滿足意圖所需的資訊。
+ **ConfirmIntent** – 表示機器人正在等待使用者確認所收集的資訊正確無誤。
+ **關閉** – 表示使用者的意圖已完成，且與機器人的對話已達到邏輯結尾。

第一個意圖完成後，使用者可以指定新的意圖。如需詳細資訊，請參閱[與 Lex V2 機器人的對話內容](conversation-contexts.md)。

意圖可以具有下列其中一種狀態：
+ **InProgress** – 表示機器人正在收集完成意圖所需的資訊。這是與`ElicitSlot`對話狀態結合。
+ **等待**中 – 表示使用者在機器人要求特定插槽的資訊時，請求機器人等待。
+ **已履行** – 表示與意圖相關聯的 Lambda 函數中的業務邏輯已成功執行。
+ **ReadyForFulfillment** – 表示機器人收集實現意圖所需的所有資訊，且用戶端應用程式可以執行履行業務邏輯。
+ **失敗** – 表示意圖失敗。

請參閱下列主題，了解如何使用 Amazon Lex V2 APIs 來管理機器人和使用者之間的對話內容和工作階段。

**Topics**
+ [與 Lex V2 機器人的對話內容](conversation-contexts.md)
+ [了解 Amazon Lex V2 機器人工作階段](managing-sessions.md)

# 與 Lex V2 機器人的對話內容
<a name="conversation-contexts"></a>

*對話內容*是使用者、用戶端應用程式或 Lambda 函數提供給 Amazon Lex V2 機器人以滿足意圖的資訊。對話內容包括使用者提供的槽資料、用戶端應用程式設定的請求屬性，以及用戶端應用程式和 Lambda 函數建立的工作階段屬性。

**Topics**
+ [設定 Lex V2 機器人的意圖內容](context-mgmt-active-context.md)
+ [在 Lex V2 機器人的意圖中使用預設槽值](context-mgmt-default.md)
+ [設定 Lex V2 機器人的工作階段屬性](context-mgmt-session-attribs.md)
+ [設定 Lex V2 機器人的請求屬性](context-mgmt-request-attribs.md)
+ [設定工作階段逾時](context-mgmt-session-timeout.md)
+ [與您的 Lex V2 機器人在意圖之間共用資訊](context-mgmt-cross-intent.md)
+ [在 Lex V2 機器人中設定複雜的屬性](context-mgmt-complex-attributes.md)

# 設定 Lex V2 機器人的意圖內容
<a name="context-mgmt-active-context"></a>

您可以根據*內容*讓 Amazon Lex V2 觸發意圖。*內容*是狀態變數，可在您定義機器人時與意圖建立關聯。當您使用主控台或使用 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 操作建立意圖時，您可以設定意圖的內容。您只能在英文 (US) (en-US) 地區設定中使用內容。

內容、輸出內容和輸入內容有兩種關係類型。滿足相關聯的意圖時，*輸出內容*會變成作用中。在 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 操作的回應中，輸出內容會傳回至您的應用程式，並針對目前的工作階段進行設定。啟用內容後，它會在定義內容時設定的轉彎次數或時間限制內保持作用中狀態。

*輸入內容*會指定可辨識意圖的條件。只有當所有輸入內容都處於作用中狀態時，才能在對話期間辨識意圖。沒有輸入內容的意圖一律符合辨識資格。

Amazon Lex V2 會自動管理透過實現具有輸出內容的意圖而啟動的內容生命週期。您也可以在呼叫 `RecognizeText`或 `RecognizeUtterance`操作時設定作用中內容。

您也可以針對意圖使用 Lambda 函數來設定對話的內容。來自 Amazon Lex V2 的輸出內容會傳送至 Lambda 函數輸入事件。Lambda 函數可以在其回應中傳送內容。如需詳細資訊，請參閱[將 AWS Lambda函數整合到您的 Amazon Lex V2 機器人](lambda.md)。

例如，假設您有意預訂已設定為傳回名為 "book\$1car\$1fulfilled" 的輸出內容的租車。滿足意圖時，Amazon Lex V2 會設定輸出內容變數 "book\$1car\$1fulfilled"。由於 "book\$1car\$1fulfilled" 是作用中內容，只要使用者表達用語被識別為嘗試引出該意圖，則「book\$1car\$1fulfilled」內容集為輸入內容的意圖現在會被視為用於辨識。您可以將此用於預訂租車後才有意義的意圖，例如透過電子郵件傳送收據或修改保留。

## Lex V2 機器人意圖的輸出內容
<a name="context-output"></a>

Amazon Lex V2 會在滿足意圖時啟用意圖的輸出內容。您可以使用輸出內容來控制符合追蹤目前意圖資格的意圖。

每個內容都有在工作階段中維護的參數清單。這些參數是已實現意圖的槽值。您可以使用這些參數來預先填入其他意圖的槽值。如需詳細資訊，請參閱 [在 Lex V2 機器人的意圖中使用預設槽值](context-mgmt-default.md)。

當您使用主控台或 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 操作建立意圖時，您可以設定輸出內容。您可以使用多個輸出內容來設定意圖。滿足意圖時，所有輸出內容都會啟用並在 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 回應中傳回。

當您定義輸出內容時，您也會定義其*存留時間*，內容包含在 Amazon Lex V2 回應中的時間長度或周轉數。*轉*彎是從您的應用程式到 Amazon Lex V2 的一個請求。一旦輪換次數或時間過期，內容就不再處於作用中狀態。

您的應用程式可以視需要使用輸出內容。例如，您的應用程式可以使用輸出內容來：
+ 根據內容變更應用程式的行為。例如，旅遊應用程式的內容 "book\$1car\$1fulfilled" 可能具有與 "rental\$1function\$1fulfilled" 不同的動作。
+ 將輸出內容傳回 Amazon Lex V2，做為下一個表達式的輸入內容。如果 Amazon Lex V2 將表達用語辨識為嘗試引出意圖，則會使用內容來限制可以傳回給具有指定內容的意圖。

## Lex V2 機器人意圖的輸入內容
<a name="context-input"></a>

您可以設定輸入內容來限制對話中辨識意圖的點。沒有輸入內容的意圖一律符合辨識資格。

您可以使用主控台或 `CreateIntent`操作來設定意圖回應的輸入內容。意圖可以有多個輸入內容。

對於具有多個輸入內容的意圖，所有內容都必須處於作用中狀態，才能觸發意圖。您可以在呼叫 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html)、[RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 或 [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html) 操作時設定輸入內容。

您可以設定意圖中的槽，以從目前作用中內容取得預設值。當 Amazon Lex V2 辨識新意圖但未收到槽值時，會使用預設值。當您定義槽`#context-name.parameter-name`時，請以 形式指定內容名稱和槽名稱。如需詳細資訊，請參閱[在 Lex V2 機器人的意圖中使用預設槽值](context-mgmt-default.md)。

# 在 Lex V2 機器人的意圖中使用預設槽值
<a name="context-mgmt-default"></a>

當您使用預設值時，您可以指定當使用者輸入未提供槽時，要為新意圖填入的槽值來源。此來源可以是先前的對話方塊、請求或工作階段屬性，或是您在建置時間設定的固定值。

您可以使用下列 做為預設值的來源。
+ 上一個對話方塊 （內容） – \$1context-name.parameter-name
+ 工作階段屬性 – 【attribute-name】
+ 請求屬性 – <attribute-name>
+ 固定值 – 任何不符合先前值的值

當您使用 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 操作將插槽新增至意圖時，您可以新增預設值清單。預設值會依列出的順序使用。例如，假設您的意圖具有具有下列定義的槽：

```
"slots": [
    {
        "botId": "string",
        "defaultValueSpec": {
            "defaultValueList": [
                {
                    "defaultValue": "#book-car-fulfilled.startDate"
                },
                {
                    "defaultValue": "[reservationStartDate]"
                }
            ]
        },
        Other slot configuration settings
    }
]
```

辨識意圖時，名為 "reservation-start-date" 的槽的值會設定為下列其中一項。

1. 如果 "book-car-fulfilled" 內容處於作用中狀態，則會使用 "startDate" 參數的值做為預設值。

1. 如果「book-car-fulfilled」內容未啟用，或未設定「startDate」參數，則會使用「reservationStartDate」工作階段屬性的值做為預設值。

1. 如果前兩個預設值都未使用，則槽沒有預設值，Amazon Lex V2 會照常引出值。

如果槽使用預設值，即使需要，也不會引出槽。

# 設定 Lex V2 機器人的工作階段屬性
<a name="context-mgmt-session-attribs"></a>

*工作階段屬性*包含在工作階段期間在機器人和用戶端應用程式之間傳遞的應用程式特定資訊。Amazon Lex V2 會將工作階段屬性傳遞給為機器人設定的所有 Lambda 函數。如果 Lambda 函數新增或更新工作階段屬性，Amazon Lex V2 會將新資訊傳遞回用戶端應用程式。

在 Lambda 函數中使用工作階段屬性來初始化機器人，並自訂提示和回應卡。例如：
+ 初始化：在比薩訂購機器人中，用戶端應用程式會在第一次呼叫 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 操作時，將使用者的位置傳遞為工作階段屬性。例如 `"Location": "111 Maple Street"`。Lambda 函數會使用此資訊來尋找最接近的比薩來下訂單。
+ 個人化提示 — 設定提示和回應卡以參考工作階段屬性。例如，「[FirstName] 你好，想要什麼配料？」 如果您以工作階段屬性 (`{"FirstName": "Vivian"}`) 傳遞使用者的名字，Amazon Lex 會取代預留位置的名稱。然後，它會傳送個人化提示給使用者「嘿，Vivian，您想要哪些配料？」

工作階段屬性會在工作階段期間保留。Amazon Lex V2 會將它們存放在加密的資料存放區中，直到工作階段結束為止。用戶端可以透過呼叫 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 操作，將 `sessionAttributes` 欄位設定為 值，在請求中建立工作階段屬性。Lambda 函數可以在回應中建立工作階段屬性。在用戶端或 Lambda 函數建立工作階段屬性之後，只要用戶端應用程式在對 Amazon Lex V2 的請求中不包含 `sessionAttribute` 欄位，就會使用儲存的屬性值。

例如，假設您有兩個工作階段屬性，`{"x": "1", "y": "2"}`。如果用戶端在未指定 `sessionAttributes` 欄位的情況下呼叫 `RecognizeText`或 `RecognizeUtterance`操作，Amazon Lex V2 會使用儲存的工作階段屬性 () 呼叫 Lambda 函數`{"x": 1, "y": 2}`。如果 Lambda 函數未傳回工作階段屬性，Amazon Lex V2 會將儲存的工作階段屬性傳回至用戶端應用程式。

如果用戶端應用程式或 Lambda 函數傳遞工作階段屬性，Amazon Lex V2 會更新儲存的工作階段屬性。傳遞現有的值，例如 ` {"x": 2}`，會更新儲存的值。如果您傳送一組新的工作階段屬性，例如 `{"z": 3}`，現有的值會被移除，只保留新值。當傳遞空白對應 `{}` 時，會清除儲存的值。

若要將工作階段屬性傳送至 Amazon Lex V2，您可以建立屬性的string-to-string映射。以下說明如何對應工作階段屬性：

```
{
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

對於 `RecognizeText`操作，您可以使用 `sessionState`結構的 `sessionAttributes` 欄位將映射插入請求的內文，如下所示：

```
"sessionState": {
    "sessionAttributes": {
        "attributeName": "attributeValue",
        "attributeName": "attributeValue"
    }
}
```

對於 `RecognizeUtterance`操作，您可以對映射進行 base64 編碼，然後將其作為 `x-amz-lex-session-state` 標頭的一部分傳送。

如果您在工作階段屬性中傳送二進位或結構化資料，必須先將資料轉換為簡單的字串。如需詳細資訊，請參閱[在 Lex V2 機器人中設定複雜的屬性](context-mgmt-complex-attributes.md)。

# 設定 Lex V2 機器人的請求屬性
<a name="context-mgmt-request-attribs"></a>

*請求屬性*包含請求特定的資訊並且僅適用於目前的請求。用戶端應用程式會將此資訊傳送至 Amazon Lex V2。使用請求屬性來傳遞不需要在整個工作階段內保留的資訊。您可以建立自己的請求屬性，也可以使用預先定義的屬性。若要傳送請求屬性，請使用 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 中的 `x-amz-lex-request-attributes`標頭或 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 請求中的 `requestAttributes` 欄位。請求屬性並不像工作階段屬性會在請求之間保留，因此 `RecognizeUtterance` 或 `RecognizeText` 回應中不會傳回請求屬性。

**注意**  
若要傳送在請求之間保留的資訊，請使用工作階段屬性。

## 為每個 Lex V2 機器人請求設定使用者定義的請求屬性
<a name="context-mgmt-user"></a>

*使用者定義的請求屬性*是您在每個請求中傳送給機器人的資料。您在 `amz-lex-request-attributes` 請求中的 `RecognizeUtterance` 標頭，或在 `requestAttributes` 請求中 `RecognizeText` 欄位傳送資訊。

若要將請求屬性傳送至 Amazon Lex V2，您可以建立屬性的string-to-string映射。以下說明如何對應請求屬性：

```
{
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

對於 `PostText` 操作，您使用 `requestAttributes` 欄位將對應插入請求的本文，如下所示：

```
"requestAttributes": {
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

對於 `PostContent` 操作，您用 base64 來編碼對應，然後將其做為 `x-amz-lex-request-attributes` 標頭傳送。

如果您在請求屬性中傳送二進位或結構化資料，必須先將資料轉換為簡單的字串。如需詳細資訊，請參閱[在 Lex V2 機器人中設定複雜的屬性](context-mgmt-complex-attributes.md)。

Amazon Lex V2 提供預先定義的請求屬性，用於管理其處理傳送至機器人的資訊的方式。該屬性不會在整個工作階段內保留，因此您必須在每個請求中傳送預先定義的屬性。預先定義的屬性全都位於 `x-amz-lex:` 命名空間中。

除了下列預先定義的屬性之外，Amazon Lex 還提供訊息平台的預先定義屬性。如需這些屬性的清單，請參閱在傳訊平台上部署 Amazon Lex 機器人。

## 設定回應類型
<a name="response-type-context"></a>



如果您有兩個具有不同功能的用戶端應用程式，可能需要限制回應中的訊息格式。例如，您可能想要將傳送到 Web 用戶端的訊息限制為純文字，但是讓行動用戶端可以同時使用純文字和語音合成標記語言 (SSML)。若要設定 `PostContent`和 `PostText`操作傳回的訊息格式，請使用 x-amz-lex：accept-content-types" 請求屬性。

您可以將屬性設定為以下訊息類型的任何組合：
+ `PlainText` — 訊息包含純 UTF-8 文字。
+ `SSML` — 訊息包含語音輸出的文字格式。
+ `CustomPayload` — 訊息包含您為用戶端建立的自訂格式。您可以定義承載，以符合應用程式的需求。

Amazon Lex V2 只會在回應的訊息欄位中傳回具有指定類型的訊息。您可以用逗號分隔各值來設定多個值。如果您使用訊息群組，那麼每個訊息群組都必須至少包含一個指定類型的訊息。否則，您會收到 `NoUsableMessageException` 錯誤。如需詳細資訊，請參閱訊息群組。

## 在 Lex V2 機器人中設定預先定義的請求屬性
<a name="setting-predefined-request-attributes"></a>

Amazon Lex V2 提供預先定義的請求屬性，用於管理其處理傳送至機器人的資訊的方式。該屬性不會在整個工作階段內保留，因此您必須在每個請求中傳送預先定義的屬性。預先定義的屬性全都位於 `x-amz-lex:` 命名空間中。

## 在 Lex V2 機器人中停用意圖切換
<a name="disabling-intent-switches-attributes"></a>

若要控制使用者是否可以在意圖確認或槽引出期間切換意圖，請使用 `x-amz-lex:intent-switch`請求屬性。設定為 時`DISABLE`，此屬性可防止使用者在完成目前意圖流程時觸發不同的意圖。

例如，如果使用者正在預訂航班，並收到航班詳細資訊提示，則「檢查天氣」或「預訂飯店」等表達用語 - 這通常會觸發其他意圖 - 將被忽略，以確保對話專注於目前的預訂程序。

# 設定工作階段逾時
<a name="context-mgmt-session-timeout"></a>

Amazon Lex 會保留內容資訊 - 槽資料和工作階段屬性 - 直到對話工作階段結束為止。若要控制機器人的工作階段可持續多久的時間，請設定工作階段逾時。在預設情況下，工作階段持續時間為 5 分鐘，但是您可以指定介於 0 到 1,440 分鐘 (24 小時) 的任何持續時間。

例如，假設您建立一個 `ShoeOrdering` 機器人來支援如 `OrderShoes` 和 `GetOrderStatus` 的意圖。當 Amazon Lex 偵測到使用者的意圖是訂購鞋子時，它會要求槽資料。例如，它會要求鞋子尺寸、顏色、品牌等。如果使用者提供部分槽資料，但未完成購買鞋子，Amazon Lex 會記住整個工作階段的所有槽資料和工作階段屬性。如果使用者在工作階段過期之前返回工作階段，他們可以提供剩餘的槽資料，並完成購買。

在 Amazon Lex V2 主控台中，您可以在建立機器人時設定工作階段逾時。使用 AWS 命令列界面 (AWS CLI) 或 API，您可以透過設定 [idleSessionTTLInSeconds](https://docs.aws.amazon.com/lexv2/latest/dg/API_PutBot.html#API_CreateBot.html#lexv2-CreateBot-request-idleSessionTTLInSeconds) 欄位，在建立具有 [CreateBot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBot.html) 操作的機器人時設定逾時。

# 與您的 Lex V2 機器人在意圖之間共用資訊
<a name="context-mgmt-cross-intent"></a>

Amazon Lex V2 支援在意圖之間共用資訊。若要在意圖之間共用，請使用輸出內容或工作階段屬性。

若要使用輸出內容，您可以在建立或更新意圖時定義輸出內容。滿足意圖時，來自 Amazon Lex V2 的回應包含意圖的內容和槽值作為內容參數。您可以在後續意圖或應用程式程式碼或 Lambda 函數中使用這些參數做為預設值。

若要使用工作階段屬性，您可以在 Lambda 或應用程式程式碼中設定屬性。例如，`ShoeOrdering` 機器人的使用者開始訂購鞋子。機器人會與使用者進行對話，例如，收集鞋子尺寸、顏色和品牌等槽資料。當使用者下訂單時，履行訂單的 Lambda 函數會設定`orderNumber`工作階段屬性，其中包含訂單號碼。為了取得訂單狀態，使用者使用 `GetOrderStatus` 意圖。機器人可以要求使用者提供槽資料，例如訂單號碼和訂單日期。當機器人擁有所需的資訊時，便會傳回訂單狀態。

如果您認為使用者可能會在同一個工作階段期間切換意圖，可以設計機器人傳回最近的訂單狀態。與其再次要求使用者提供訂單資訊，您可以使用 `orderNumber` 工作階段屬性跨意圖共享資訊，並滿足 `GetOrderStatus` 意圖。機器人可傳回使用者最後一個訂單的狀態來達到此目的。

# 在 Lex V2 機器人中設定複雜的屬性
<a name="context-mgmt-complex-attributes"></a>

工作階段和請求屬性是屬性與值的字串至字串對應。在許多情況下，您可以使用字串對應在用戶端應用程式與機器人之間傳輸屬性值。不過，在某些情況下，您可能需要傳輸無法輕易轉換為字串對應的二進位資料或複雜架構。例如，以下 JSON 物件代表美國三個最熱門的城市陣列：

```
{
   "cities": [
      {
         "city": {
            "name": "New York",
            "state": "New York",
            "pop": "8537673"
         }
      },
      {
         "city": {
            "name": "Los Angeles",
            "state": "California",
            "pop": "3976322"
         }
      },
      {
         "city": {
            "name": "Chicago",
            "state": "Illinois",
            "pop": "2704958"
         }
      }
   ]
}
```

這個資料陣列不會妥當地轉譯為字串至字串對應。在這種情況下，您可以將物件轉換為簡單的字串，以便使用 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 和 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 操作將其傳送至機器人。

例如，如果您使用 JavaScript，可以使用 `JSON.stringify` 操作將物件轉換成 JSON，以及使用 `JSON.parse` 操作將 JSON 文字轉換成 JavaScript 物件：

```
// To convert an object to a string.
var jsonString = JSON.stringify(object, null, 2);
// To convert a string to an object.
var obj = JSON.parse(JSON string);
```

若要使用 `RecognizeUtterance`操作傳送屬性，您必須先對屬性進行 base64 編碼，才能將其新增至請求標頭，如下列 JavaScript 程式碼所示：

```
var encodedAttributes = new Buffer(attributeString).toString("base64");
```

您可以先將資料轉換成以 base64 編碼的字串，然後將該字串當做值在工作階段屬性中傳送，藉此將二進位資料傳送到 `RecognizeText` 和 `RecognizeUtterance` 操作：

```
"sessionAttributes" : {
   "binaryData": "base64 encoded data"
}
```

# 了解 Amazon Lex V2 機器人工作階段
<a name="managing-sessions"></a>

當使用者開始與您的機器人對話時，Amazon Lex V2 會建立*工作階段*。應用程式與 Amazon Lex V2 之間交換的資訊構成對話的工作階段狀態。當您提出請求時，工作階段會以您指定的識別符來識別。如需工作階段識別符的詳細資訊，請參閱 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 或 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 操作中的 `sessionId` 欄位。

您可以修改在應用程式與機器人之間傳送的工作階段。例如，您可以修改包含工作階段自訂資訊的工作階段屬性，也可以設定解釋下一個表達用語的對話方塊內容，來變更對話流程。

有三種方式可以更新工作階段狀態。
+ 在呼叫 `RecognizeText`或 操作的過程中，將工作階段資訊內嵌傳遞給 或 `RecognizeUtterance`操作。
+ 使用 Lambda 函數搭配每次對話後呼叫的 `RecognizeText`或 `RecognizeUtterance`操作。如需詳細資訊，請參閱[將 AWS Lambda函數整合到您的 Amazon Lex V2 機器人](lambda.md)。另一個是使用應用程式中的 Amazon Lex V2 執行時間 API 來變更工作階段狀態。
+ 使用可讓您管理工作階段資訊以與機器人對話的操作。操作包括 [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html) 操作、[GetSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_GetSession.html) 操作和 [DeleteSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_DeleteSession.html) 操作。您使用這些操作取得您使用者的機器人工作階段資訊，並對狀態進行細微控制。

當您想要取得工作階段目前的狀態時，請使用 `GetSession` 操作。操作會傳回工作階段的目前狀態，包括與使用者的對話方塊狀態、為目前意圖設定的任何工作階段屬性和槽值，以及 Amazon Lex V2 已識別為符合使用者表達用語之可能意圖的任何其他意圖。

此 `PutSession` 操作可讓您直接運用目前的工作階段狀態。您可以設定工作階段，包括機器人接下來將執行的對話方塊動作類型，以及 Amazon Lex V2 傳送給使用者的訊息。如此一來，您可以控制與機器人的對話流程。將對話方塊動作`type`欄位設定為 `Delegate`，讓 Amazon Lex V2 決定機器人的下一個動作。

您可以使用 `PutSession` 操作來建立包含機器人的新工作階段，並設定機器人開始時的意圖。您也可以使用 `PutSession` 操作，來將一種意圖變更成另一種意圖。建立工作階段或變更意圖時，您也可以設定工作階段狀態，例如槽值和工作階段屬性。完成新的意圖時，您可以選擇重新啟動先前的意圖。

來自 `PutSession` 操作的回應包含如 `RecognizeUtterance` 操作的相同資訊。正如您會對 `RecognizeUtterance` 操作的回應一樣，您可以使用此項資訊向使用者提示下一筆資訊。

使用 `DeleteSession` 操作移除現有工作階段，並重新啟動新的工作階段。例如，當您正在測試機器人時，您可以使用 `DeleteSession` 操作從機器人移除測試工作階段。

工作階段操作會與您的履行 Lambda 函數搭配使用。例如，如果您的 Lambda 函數傳回 `Failed`做為履行狀態，您可以使用 `PutSession`操作將對話方塊動作類型設定為 `close`，以及`fulfillmentState`將對話方塊動作類型設定為 `ReadyForFulfillment`，以重試履行步驟。

以下是您可以使用工作階段操作進行的一些動作：
+ 讓機器人開始對話，而非等候使用者。
+ 在對話期間切換意圖。
+ 回到先前的意圖。
+ 在互動的過程中間開始或重新開始對話。
+ 驗證槽值並讓機器人針對無效的值重新提示。

以下進一步說明上述各個動作。

## 啟動新的工作階段
<a name="session-start"></a>

如果您想要讓機器人開始與您的使用者對話，則可以使用 `PutSession` 操作。
+ 建立無槽的歡迎意圖及提示使用者的結論訊息，以陳述意圖。例如，「您想要訂購什麼？ 您可以說「訂購飲料」或「訂購披薩」。
+ 呼叫 `PutSession` 操作。將意圖名稱設為歡迎意圖的名稱，然後將對話方塊動作設為 `Delegate`。
+ Amazon Lex 將回應您的歡迎意圖提示，以開始與您的使用者對話。

## 切換意圖
<a name="session-switch"></a>

您可以使用 `PutSession` 操作，來將一種意圖切換成另一種意圖。您也可以使用它切回上一個意圖。您可以使用 `PutSession` 操作來設定工作階段屬性或新意圖的槽值。
+ 呼叫 `PutSession` 操作。將意圖名稱設為新意圖的名稱，然後將對話方塊動作設為 `Delegate`。您也可以設定新意圖所需的任何槽值或工作階段屬性。
+ Amazon Lex 將使用新意圖開始與使用者的對話。

## 恢復先前的意圖
<a name="session-return"></a>

若要繼續先前的意圖，您可以使用 `GetSession`操作來取得意圖的狀態，請執行所需的互動，然後使用 `PutSession`操作將意圖設定為其先前的對話方塊狀態。
+ 呼叫 `GetSession` 操作。儲存意圖的狀態。
+ 執行另一個互動，例如實現不同的意圖。
+ 使用先前意圖儲存的資訊，呼叫 `PutSession`操作。這將把在對話中同一處的先前意圖傳回給使用者。

在某些情況下，可能需要繼續您使用者與機器人的對話。例如，假設您已建立客服機器人。您的應用程式會判斷使用者是否需要與客服代表談話。與使用者交談後，客服代表可以連同收集到的資訊，將對話轉回機器人。

若要繼續工作階段，請使用與下列相似的步驟：
+ 您的應用程式會判斷使用者是否需要與客服代表交談。
+ 使用 `GetSession` 操作來取得意圖目前的對話方塊狀態。
+ 客服代表與使用者交談，並解決問題。
+ 使用 `PutSession` 操作來設定意圖的對話方塊狀態。這可能包括設定槽值、設定工作階段屬性或變更意圖。
+ 機器人繼續與使用者對話。

## 驗證槽值
<a name="session-validation"></a>

您可以使用用戶端應用程式驗證對您機器人所做的回應。如果回應無效，您可以使用 `PutSession` 操作來從您的使用者取得新的回應。例如，假設您的訂花機器人只能賣鬱金香、玫瑰花及水仙花。如果使用者訂購康乃馨，您的應用程式可以執行下列動作：
+ 檢查從 `PostText` 或 `PostContent` 回應傳回的槽值。
+ 如果槽值無效，則呼叫 `PutSession` 操作。您的應用程式應清除槽值，請設定 `slotToElicit` 欄位，然後將 `dialogAction.type` 值設為 `elicitSlot`。或者，如果您想要變更 Amazon Lex 用來引出槽值的訊息，您可以設定 `message`和 `messageFormat` 欄位。