

终止支持通知：2025年9月15日， AWS 我们将停止对Amazon Lex V1的支持。2025 年 9 月 15 日之后，您将无法再访问 Amazon Lex V1 控制台或 Amazon Lex V1 资源。如果您使用的是 Amazon Lex V2，请改为参阅 [Amazon Lex V2 指南](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html)。

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

# 使用 Amazon Lex API 管理会话
<a name="how-session-api"></a>

用户启动与您的机器人的对话时，Amazon Lex 会创建一个*会话*。您的应用程序与 Amazon Lex 之间交换的信息组成了对话的会话状态。当您发出请求时，由您指定的自动程序名称与用户标识符构成的组合会识别会话。有关用户标识符的更多信息，请参阅 [PostContent](API_runtime_PostContent.md) 或 [PostText](API_runtime_PostText.md) 操作中的 `userId` 字段。

来自会话操作的响应包括一个唯一的会话标识符，用于标识用户的特定会话。您可在测试期间或者在帮助对自动程序进行故障排查时使用此标识符。

您可以修改在应用程序和自动程序之间发送的会话状态。例如，您可以创建和修改其中包含会话自定义信息的会话属性，也可以通过设置对话上下文来更改对话流，以解释下一个表达。

您可以通过两种方式来更新会话状态。第一种方式是使用在每轮对话之后调用的 Lambda 函数和 `PostContent` 或 `PostText` 操作。有关更多信息，请参阅 [使用 Lambda 函数](using-lambda.md)。另一种方式是在应用程序中使用 Amazon Lex 运行时 API 来更改会话状态。

Amazon Lex 运行时 API 提供了若干操作，使您可以管理机器人对话的会话信息。这些操作包括 [PutSession](API_runtime_PutSession.md) 操作、[GetSession](API_runtime_GetSession.md) 操作和 [DeleteSession](API_runtime_DeleteSession.md) 操作。使用这些操作，您可以获取自动程序与用户会话的状态信息，还可以对状态执行更精细的控制。

如果您希望获取会话的当前状态，请使用 `GetSession` 操作。此操作会返回会话的当前状态，包括与用户进行的对话的状态、已经设置的任何会话属性，以及用户与之交互的最近三个目的的槽值。

`PutSession` 操作可让您直接操作当前会话状态。您可以设置自动程序接下来将执行的对话操作的类型。这让您可以控制与自动程序的对话流。将对话操作 `type` 字段设置为 `Delegate`，可以让 Amazon Lex 确定机器人的下一个操作。

您可以使用 `PutSession` 操作创建与自动程序的新会话，并设置自动程序在开始时应使用的目的。您还可以使用 `PutSession` 操作将一个目的更改为另一个。创建会话或更改目的时，您还可以设置会话状态，例如槽值和会话属性。新目的完成后，您可以选择重启之前的目的。您可以使用 `GetSession` 操作，从 Amazon Lex 获取以前意图的对话状态，然后使用该信息来设置意图的对话状态。

来自 `PutSession` 操作的响应包含与 `PostContent` 操作相同的信息。您可以使用此信息向用户提示信息的下一部分，就像您对待 `PostContent` 操作的响应一样。

使用 `DeleteSession` 操作以删除现有会话并使用新会话重新开始。例如，在您测试自动程序时，可以使用 `DeleteSession` 操作从自动程序删除测试会话。

会话操作可用于履行 Lambda 函数。例如，如果您的 Lambda 函数返回 `Failed` 作为履行状态，您可以通过 `PutSession` 操作将对话操作类型设置为 `close`，将 `fulfillmentState` 设置为 `ReadyForFulfillment` 以重试履行步骤。

您可以对会话操作采取下列措施：
+ 让自动程序启动对话而不是等待用户启动。
+ 在对话期间切换目的。
+ 返回到以前的目的。
+ 在交互过程中启动或重新启动对话。
+ 验证槽值并让自动程序重新提示无效的值。

下文分别详细介绍了这些操作。

## 切换目的
<a name="session-switch"></a>

您可以使用 `PutSession` 操作将一个目的切换为另一个。您还可以使用它切换回以前的目的。您可以使用 `PutSession` 操作为新目的设置会话属性值或槽值。
+ 调用 `PutSession` 操作。将目的名称设置为新目的的名称，并将对话操作设置为 `Delegate`。您还可以为新目的设置所需的任意槽值和会话属性。
+ Amazon Lex 使用新意图启动与用户的对话。

## 恢复以前的目的
<a name="session-return"></a>

要恢复以前的目的，可以使用 `GetSession` 操作获取目的的摘要，然后使用 `PutSession` 操作将目的设置回其之前的对话状态。
+ 调用 `GetSession` 操作。来自操作的响应包含用户与之交互的最近三个目的的对话状态摘要。
+ 使用目的摘要中的信息调用 `PutSession` 操作。这会将用户返回到对话中相同位置的上一个目的。

在某些情况下，可能需要恢复用户与自动程序的对话。例如，假设您创建了一个客户服务自动程序。您的应用程序确定用户需要与客户服务代表交谈。在与用户交谈之后，客户服务代表可以使用所收集的信息将对话引导回自动程序。

要恢复会话，请使用类似于下文的步骤：
+ 您的应用程序确定用户需要与客户服务代表交谈。
+ 使用 `GetSession` 操作获取目的的当前对话状态。
+ 客户服务代表与用户交谈并解决问题。
+ 使用 `PutSession` 操作设置目的的对话状态。这可能包括设置槽值、设置会话属性或者更改目的。
+ 自动程序恢复与用户的对话。

您可以使用 `PutSession` 操作 `checkpointLabel` 参数标注意图，以便稍后找到它。例如，要求客户提供信息的机器人可能会在客户收集信息时进入 `Waiting` 意图。机器人为当前意图创建检查点标签，然后启动 `Waiting` 意图。当客户返回时，机器人可以使用检查点标签找到以前的意图并切换回来。

意图必须存在于由 `GetSession` 操作返回的 `recentIntentSummaryView` 结构中。如果您在 `GetSession` 操作请求中指定了检查点标签，则最多将返回三个具有该检查点标签的意图。
+ 使用 `GetSession` 操作获取会话的当前状态。
+ 使用 `PutSession` 操作将检查点标签添加到最后一个意图。如有必要，您可以使用此 `PutSession` 调用切换到不同的意图。
+ 当要切换回标记的意图时，调用 `GetSession` 操作以返回最近的意图列表。您可以使用 `checkpointLabelFilter` 参数，以便 Amazon Lex 仅返回具有指定检查点标签的意图。

## 启动新会话
<a name="session-start"></a>

如果您希望自动程序开始与用户的对话，可以使用 `PutSession` 操作。
+ 创建没有槽的欢迎目的，并创建一条总结性消息向用户提示阐明目的。例如，“您希望订购什么？ 您可以说‘订一杯饮料’或‘订一个披萨’。”
+ 调用 `PutSession` 操作。将目的名称设置为欢迎目的的名称，并将对话操作设置为 `Delegate`。
+ Amazon Lex 将使用您的欢迎意图中的提示做出响应，以启动与用户的对话。

## 验证槽值
<a name="session-validation"></a>

您可以使用客户端应用程序验证对自动程序的响应。如果响应无效，您可以使用 `PutSession` 操作获取用户的新响应。例如，假设您的鲜花订购自动程序只能卖郁金香、玫瑰和百合。如果用户订购康乃馨，您的应用程序可以执行以下操作：
+ 检查 `PostText` 或 `PostContent` 响应返回的槽值。
+ 如果槽值无效，则调用 `PutSession` 操作。您的应用程序应清除槽值，设置 `slotToElicit` 字段，并将 `dialogAction.type` 值设置为 `elicitSlot`。（可选）如果您希望更改 Amazon Lex 用于引入插槽值的消息，可以设置 `message` 和 `messageFormat` 字段。