

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解 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` 字段。