

终止支持通知：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：工作原理
<a name="how-it-works"></a>

借助 Amazon Lex，您能够使用由支持 Amazon Alexa 的相同技术提供支持的语音或文本界面构建应用程序。下面是您在使用 Amazon Lex 时执行的典型步骤：

1. 创建自动程序，并为其配置您想要支持的一个或多个目的。配置自动程序，使其了解用户的目标 (目的)，与用户进行对话以引出信息，并实现用户的目的。

1. 测试自动程序。您可以使用由 Amazon Lex 控制台提供的测试窗口客户端。

1. 发布版本和创建别名

1. 部署机器人。您可以在移动应用程序或消息收发等平台 (如 Facebook Messenger) 上部署自动程序。

开始之前，请熟悉以下 Amazon Lex 核心概念和术语：
+ **机器人** — 机器人执行自动化任务，如订购披萨、预定酒店、订花等。Amazon Lex 机器人由自动语音识别 (ASR) 和自然语言理解 (NLU) 功能提供支持。在您的账户中，每个机器人都应具有唯一的名称。

   

  Amazon Lex 机器人可理解通过文本或语音提供的用户输入并支持自然语言交流。您可以创建 Lambda 函数，然后将其作为代码挂钩添加到您的意图配置中，从而执行用户数据验证以及完成任务。

   
+ **意图** — 意图表示用户要执行的操作。您创建机器人以支持一个或多个相关意图。例如，您可以创建一个用于订购披萨和饮料的自动程序。对于每个目的，您需要提供以下必要信息：

   
  + **意图名称** — 意图的描述性名称。例如 **OrderPizza**。意图名称在您的账户内必须是唯一的。
  + **示例言语** — 用户表达意图的可能方式。例如，用户可能会说“我能订购披萨吗”和“我想订购披萨”。
  + **如何完成意图** — 在用户提供必要的信息后，您希望如何履行意图（例如，向当地披萨店下达订单）。我们建议您创建一个 Lambda 函数来履行意图。

     

     您可以选择对意图进行配置，使 Amazon Lex 只将履行意图所需的必要信息返回客户端应用程序。

     

  除了订购披萨等自定义意图之外，Amazon Lex 还提供内置意图来快速设置您的机器人。有关更多信息，请参阅 [内置目的和槽类型](howitworks-builtins.md)。

   
+ **插槽** — 一个意图可能需要零个或零个以上的插槽（参数）。您可以添加槽，作为意图配置的一部分。在运行时，Amazon Lex 提示用户提供特定的插槽值。用户必须为所有*必需*插槽提供值，然后 Amazon Lex 才能履行意图。

   

  例如，`OrderPizza` 目的需要诸如披萨尺寸、饼皮类型和披萨数量等槽。在目的配置中，您将添加这些槽。对于每个插槽，您需要提供插槽类型和提示，以便 Amazon Lex 发送到客户端来从用户那里引发数据。用户可以回复包含额外词语的插槽值，如“请来一张大号披萨”或“我还是吃小号的吧”。Amazon Lex 仍然可以理解预期的插槽值。

   
+ **插槽类型** – 每个插槽都具有一种类型。您可创建自定义槽类型或使用内置槽类型。在您的账户中，每个插槽类型都应具有唯一的名称。例如，您可针对 `OrderPizza` 目的创建并使用以下槽类型：

   
  + 大小：使用枚举值 `Small`、`Medium` 和 `Large`。
  + 馅饼皮：使用枚举值 `Thick` 和 `Thin`。

   

  

  Amazon Lex 还提供了内置插槽类型。例如，`AMAZON.NUMBER` 是可用于订购披萨数量的内置槽类型。有关更多信息，请参阅 [内置目的和槽类型](howitworks-builtins.md)。

有关提供了 Amazon Lex 的 AWS 区域的列表，请参阅**《Amazon Web Services 一般参考》中的 [AWS 区域和端点](https://docs.aws.amazon.com/general/latest/gr/rande.html#lex_region)。

下列主题提供了其他信息。我们建议您按顺序检查它们，然后探索 [Amazon Lex 入门](getting-started.md) 练习。

**Topics**
+ [Amazon Lex 支持的语言](how-it-works-language.md)
+ [编程模型](programming-model.md)
+ [管理消息](howitworks-manage-prompts.md)
+ [管理对话上下文](context-mgmt.md)
+ [使用置信度分数](confidence-scores.md)
+ [对话日志](conversation-logs.md)
+ [使用 Amazon Lex API 管理会话](how-session-api.md)
+ [自动程序部署选项](chatbot-service.md)
+ [内置目的和槽类型](howitworks-builtins.md)
+ [自定义槽位类型](howitworks-custom-slots.md)
+ [槽混淆处理](how-obfuscate.md)
+ [情绪分析](sentiment-analysis.md)
+ [为您的 Amazon Lex 资源添加标签](how-it-works-tags.md)

# Amazon Lex 支持的语言
<a name="how-it-works-language"></a>

Amazon Lex V1 支持多种语言和区域设置。下表列出了支持的语言和支持这些语言的功能。

Amazon Lex V2 支持额外的语言。请参阅 [Amazon Lex V2 支持的语言](https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html)

<a name="topiclist"></a>

## 支持的语言和区域设置
<a name="supported-languages-and-locales"></a>

Amazon Lex V1 支持以下语言和区域设置。


| 代码 | 语言和区域设置 | 
| --- | --- | 
| de-DE | 德语（德国） | 
| en-AU | 英语（澳大利亚） | 
| en-GB | 英语（英国） | 
| en-IN | 英语（印度） | 
| en-US | 英语（美国） | 
| es-419 | 西班牙语（拉丁美洲） | 
| es-ES | 西班牙语（西班牙） | 
| es-US | 西班牙语（美国） | 
| fr-CA | 法语（加拿大） | 
| fr-FR | 法语（法国） | 
| it-IT | 意大利语（意大利） | 
| ja-JP | 日语（日本） | 
| ko-KR | 韩语（韩国） | 

## Amazon Lex 功能支持的语言和区域设置
<a name="supported-languages-features"></a>

除了下表中列出的语言和区域设置之外，所有 Amazon Lex 功能在所有语言和区域设置中均支持。


| 功能 | 支持的语言和区域设置 | 
| --- | --- | 
| [设置意图上下文](context-mgmt-active-context.md) | 英语（美国）(en-US) | 

# 编程模型
<a name="programming-model"></a>

*机器人* 是 Amazon Lex 中的主要资源类型。Amazon Lex 中的其他资源类型包括*意图*、*插槽类型*、*别名* 和*机器人通道关联*。

您可以使用 Amazon Lex 控制台或建模 API 创建机器人。该控制台提供了图形用户界面，您可以通过它为您的应用构建生产就绪自动程序。如果你愿意，你可以通过 AWS CLI 或你自己的自定义程序使用模型构建 API 来创建机器人。

创建自动程序后，您需要将其部署到一个[支持的平台](https://docs.aws.amazon.com/lex/latest/dg/chatbot-service.html)上或将其集成到您自己的应用程序中。当用户与该机器人交互时，客户端应用程序会使用 Amazon Lex 运行时 API 向机器人发送请求。例如，当用户说：“我想订披萨”时，您的客户端会使用某个运行时 API 操作将此输入发送到 Amazon Lex。用户可以语音或文本形式提供输入。

您还可以创建 Lambda 函数并在意图中使用它们。使用这些 Lambda 函数代码挂钩可执行诸如初始化、验证用户输入和完成意图等运行时活动。以下各节提供了更多信息。

**Topics**
+ [建模 API 操作](#programming-model-build-time-api)
+ [运行时 API 操作](#programming-model-runtime-api)
+ [Lambda 函数作为代码挂钩](#prog-model-lambda)

## 建模 API 操作
<a name="programming-model-build-time-api"></a>

要以编程方式创建自动程序、目的和槽类型，请使用建模 API 操作。您也可以使用建模 API 管理、更新和删除自动程序的资源。建模 API 操作包括：
+ [PutBot](API_PutBot.md)、[PutBotAlias](API_PutBotAlias.md)、[PutIntent](API_PutIntent.md) 和 [PutSlotType](API_PutSlotType.md)，分别用于创建和更新自动程序、自动程序别名、目的和槽类型。
+ [CreateBotVersion](API_CreateBotVersion.md)、[CreateIntentVersion](API_CreateIntentVersion.md) 和 [CreateSlotTypeVersion](API_CreateSlotTypeVersion.md)，分别用于创建和发布自动程序、目的和槽类型版本。
+ [GetBot](API_GetBot.md) 和 [GetBots](API_GetBots.md)，分别用于获取您创建的特定自动程序或自动程序列表。
+ [GetIntent](API_GetIntent.md) 和 [GetIntents](API_GetIntents.md)，分别用于获取您创建的特定目的或目的列表。
+ [GetSlotType](API_GetSlotType.md) 和 [GetSlotTypes](API_GetSlotTypes.md)，分别用于获取您创建的特定槽类型或槽类型列表。
+ [GetBuiltinIntent](API_GetBuiltinIntent.md)、[GetBuiltinIntents](API_GetBuiltinIntents.md) 和 [GetBuiltinSlotTypes](API_GetBuiltinSlotTypes.md)，分别用于获取您可以在机器人中使用的 Amazon Lex 内置意图、Amazon Lex 内置意图列表或内置插槽类型列表。
+ [GetBotChannelAssociation](API_GetBotChannelAssociation.md) 和 [GetBotChannelAssociations](API_GetBotChannelAssociations.md)，分别用于获取您的自动程序与消息收发平台之间的关联，或您的自动程序与消息收发平台之间的关联列表。
+ [DeleteBot](API_DeleteBot.md)、[DeleteBotAlias](API_DeleteBotAlias.md)、[DeleteBotChannelAssociation](API_DeleteBotChannelAssociation.md)、[DeleteIntent](API_DeleteIntent.md) 和 [DeleteSlotType](API_DeleteSlotType.md)，用于删除您账户中不需要的资源。

您可以使用建模 API 创建自定义工具来管理您的 Amazon Lex 资源。例如，自动程序、目的和槽类型各自都有 100 个版本的限制。您可以使用建模 API 构建一个工具，当自动程序接近版本数限制时自动删除旧版本。

为确保一次只有一个操作更新资源，Amazon Lex 使用了校验和。当您使用 `Put` API 操作 [PutBot](API_PutBot.md)、[PutBotAlias](API_PutBotAlias.md)、[PutIntent](API_PutIntent.md) 或 [PutSlotType](API_PutSlotType.md) 更新某个资源时，必须在请求中传递该资源的当前校验和。如果两个工具同时尝试更新一个资源，它们会提供相同的当前校验和。第一个到达 Amazon Lex 的请求与该资源的当前校验和相符。当第二个请求达到时，校验和已经不同了。第二个工具会收到 `PreconditionFailedException` 异常，更新终止。

`Get` 操作 [GetBot](API_GetBot.md)、[GetIntent](API_GetIntent.md) 和 [GetSlotType](API_GetSlotType.md) 具有最终一致性。如果您在使用某个 `Put` 操作创建或修改资源后立即使用 `Get` 操作，可能不会返回更改。在 `Get` 操作返回最近的更新之后，它始终返回这一更新的资源，直到资源再次修改。您可以通过查看校验和确定是否返回了更新的资源。

## 运行时 API 操作
<a name="programming-model-runtime-api"></a>

 客户端应用程序使用以下运行时 API 操作与 Amazon Lex 通信：
+ [PostContent](API_runtime_PostContent.md) — 采用语音或文本输入并返回意图信息和要传达给用户的文本或语音消息。目前，Amazon Lex 支持以下音频格式：

   

  输入音频格式 – LPCM 和 Opus 

  输出音频格式 – MPEG、OGG 和 PCM

   

  `PostContent` 操作支持 8kHz 和 16kHz 的音频输入。最终用户通过电话与 Amazon Lex 交流的应用程序（如自动呼叫中心）可以直接传递 8kHz 音频。

   
+ [PostText](API_runtime_PostText.md) – 采用文本作为输入并返回目的信息和要传达给用户的文本消息。

您的客户端应用程序使用运行时 API 调用特定 Amazon Lex 机器人来处理言语（用户文本或语音输入）。例如，假设用户说“我想订披萨”。客户端会使用其中一个 Amazon Lex 运行时 API 操作将此用户输入发送给机器人。Amazon Lex 从用户输入识别出用户请求针对的是机器人中定义的 `OrderPizza` 意图。Amazon Lex 与用户进行对话以收集所需信息（即插槽数据），如披萨尺寸、配料和披萨数量等。在用户提供所有必要的插槽数据后，Amazon Lex 根据意图的配置方式调用 Lambda 函数代码挂钩来履行意图或将意图数据返回给客户端。

当您的自动程序使用语音输入时，请使用 [PostContent](API_runtime_PostContent.md) 操作。例如，自动呼叫中心应用程序可以将语音发送给 Amazon Lex 机器人而非代理来解决客户查询。您可以使用 8kHz 音频格式将音频直接从电话发送给 Amazon Lex。

Amazon Lex 控制台中的测试窗口使用 [PostContent](API_runtime_PostContent.md) API 向 Amazon Lex 发送文本和语音请求。您可以在 [Amazon Lex 入门](getting-started.md) 练习中使用此测试窗口。

## Lambda 函数作为代码挂钩
<a name="prog-model-lambda"></a>

您可以将 Amazon Lex 机器人配置为调用 Lambda 函数作为代码挂钩。代码挂钩有多个用途：
+ 自定义用户交互 — 例如，当 Joe 询问有什么披萨配料时，您可以使用之前对 Joe 的选择的了解来显示一组配料。
+ 验证用户的输入 — 假设 Jen 想在几小时后取花。您可以验证 Jen 输入的时间，并发送适当的响应。
+ 履行用户意图 — 在 Joe 提供所有披萨订购信息后，Amazon Lex 可以调用 Lambda 函数向附近披萨店下达订单。

在您配置意图时，您可以在以下位置指定 Lambda 函数作为代码挂钩：
+ 用于初始化和验证的对话代码挂钩 — 对于每个用户输入，都将调用此 Lambda 函数（假设 Amazon Lex 理解用户意图）。
+ 履行代码挂钩 — 在用户提供所有需要的插槽数据后将调用此 Lambda 函数来履行意图。

您可以在 Amazon Lex 控制台中选择意图并设置这些代码挂钩，如下面的屏幕截图所示：

![\[显示 Lambda 函数代码挂钩的 Amazon Lex 控制台。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/how-works-10.png)


您也可以在 [PutIntent](API_PutIntent.md) 操作中使用 `dialogCodeHook` 和 `fulfillmentActivity` 字段设置代码挂钩。

一个 Lambda 函数就可以执行初始化、验证和履行操作。Lambda 函数收到的事件数据有一个标识调用方为对话或履行代码挂钩的字段。您可以使用此信息运行相应部分的代码。

您可以使用 Lambda 函数构建能够引领复杂对话的机器人。可以在 Lambda 函数响应中使用 `dialogAction` 字段指示 Amazon Lex 采取特定操作。例如，您可以使用 `ElicitSlot` 对话操作指示 Amazon Lex 向用户询问非必需的插槽值。如果您定义了澄清提示，则可以使用 `ElicitIntent` 对话操作在用户完成上一目的时引出一个新目的。

有关更多信息，请参阅 [使用 Lambda 函数](using-lambda.md)。

# 管理消息
<a name="howitworks-manage-prompts"></a>

**Topics**
+ [消息类型](#msg-prompts-msg-types)
+ [配置消息的上下文](#msg-prompts-context-for-msgs)
+ [受支持的消息格式](#msg-prompts-formats)
+ [消息组](#message-groups)
+ [响应卡](#msg-prompts-resp-card)

当您创建自动程序时，您可以配置您希望自动程序发送给客户端的说明性或信息性消息。考虑以下示例：
+ 您可以为自动程序配置以下说明提示：

  ```
  I don't understand. What would you like to do?
  ```

  Amazon Lex 在不理解用户意图时会将此消息发送到客户端。

   
+ 假设您要创建自动程序来支持名为 `OrderPizza` 的目的。对于披萨订单，您希望用户提供信息，如披萨尺寸、配料和馅饼皮类型。您可以配置以下提示：

  ```
  What size pizza do you want?
  What toppings do you want?
  Do you want thick or thin crust?
  ```

  在 Amazon Lex 确定用户订购披萨的意图后，它会向客户端发送这些消息，从而从用户那里获取信息。

本节介绍如何在自动程序配置中设计用户交互。

## 消息类型
<a name="msg-prompts-msg-types"></a>

消息可以是提示或声明。
+ *提示*通常是一个问题，并且需要用户响应。
+ *声明*是信息性的。它不需要响应。

消息可以包括对槽、会话属性和请求属性的引用。在运行时，Amazon Lex 将这些引用替换为实际值。

要引用已设置的槽值，请使用以下语法：

```
{SlotName} 
```

要引用会话属性，请使用以下语法：

```
[SessionAttributeName] 
```

要引用请求属性，请使用以下语法：

```
((RequestAttributeName)) 
```

消息可以同时包括槽值、会话属性和请求属性。

例如，假设您根据机器人的 OrderPizza 意图配置了以下消息：

```
"Hey [FirstName], your {PizzaTopping} pizza will arrive in [DeliveryTime] minutes." 
```

此消息同时引用槽 (`PizzaTopping`) 和会话属性 (`FirstName` 和 `DeliveryTime`)。在运行时，Amazon Lex 将这些占位符替换为值，并且向客户端返回以下消息：

```
"Hey John, your cheese pizza will arrive in 30 minutes." 
```

要在消息中包括方括号 ([]) 或大括号 (\$1\$1)，请使用反斜杠 (\$1) 转义字符。例如，以下消息包括大括号和方括号：

```
\{Text\} \[Text\]
```

返回到客户端应用程序的文本如下所示：

```
{Text} [Text]
```

有关会话属性的信息，请参阅运行时 API 操作 [PostText](API_runtime_PostText.md) 和 [PostContent](API_runtime_PostContent.md)。有关示例，请参阅[预订旅程](ex-book-trip.md)。

Lambda 函数还可以生成消息并将它们返回到 Amazon Lex 以发送给用户。如果您在配置意图时添加 Lambda 函数，则可以动态创建消息。通过在配置机器人时提供消息，您无需在 Lambda 函数中构造提示。

## 配置消息的上下文
<a name="msg-prompts-context-for-msgs"></a>

在创建机器人时，您可以在不同的上下文中创建消息，如机器人中的说明提示、有关插槽值的提示以及来自意图的消息。Amazon Lex 在每个上下文中选择适当的消息来返回给您的用户。您可以为每个上下文提供一组消息。如果您这样做，Amazon Lex 会从组中随机选择一条消息。您也可以指定消息的格式或将消息组合在一起。有关更多信息，请参阅 [受支持的消息格式](#msg-prompts-formats)。

如果您具有与意图关联的 Lambda 函数，则可以覆盖您在构建时配置的任何消息。但使用其中任何消息无需 Lambda 函数。

### 自动程序消息
<a name="msg-prompts-bot"></a>

您可以使用说明提示和会话结束消息配置您的机器人。在运行时，如果 Amazon Lex 不了解用户的意图，则会使用说明提示 **。您可以配置 Amazon Lex 在发送会话结束消息之前请求澄清的次数。您可以在 Amazon Lex 控制台的**错误处理**部分配置机器人级别消息，如下图所示：

![\[控制台编辑器选项卡中的错误处理部分。可以指定澄清提示和挂断短语。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/how-works-20.png)


借助 API，您可以通过设置 [PutBot](API_PutBot.md) 操作中的 `clarificationPrompt` 和 `abortStatement` 字段来配置消息。

如果您将 Lambda 函数与意图结合使用，则 Lambda 函数可能会返回指示 Amazon Lex 询问用户意图的响应。如果 Lambda 函数没有提供此类消息，则 Amazon Lex 会使用说明提示。

### 槽提示
<a name="msg-prompts-slots"></a>

您必须为目的中所需的每个槽指定至少一条提示消息。在运行时，Amazon Lex 将使用其中一条消息来提示用户为此插槽提供值。例如，对于 `cityName` 槽，下面是有效的提示：

```
Which city would you like to fly to?
```

您可以使用控制台为每个槽设置一个或多个提示。您还可以使用 [PutIntent](API_PutIntent.md) 操作创建多组提示。有关更多信息，请参阅 [消息组](#message-groups)。

### 响应
<a name="msg-prompts-response"></a>

在控制台中，使用 **Responses (响应)** 部分为您的自动程序构建令人愉快的动态对话。您可以为响应创建一个或多个消息组。在运行时，Amazon Lex 通过从每个消息组选择一条消息来构建响应。有关消息组的更多信息，请参阅[消息组](#message-groups)。

例如，您的第一个消息组可能包含不同的问候语：“Hello”(您好)、“Hi”(嗨) 和“Greetings”(问候)。第二个消息组可能包含不同形式的介绍：“I am the reservation bot”(我是预订自动程序) 和“This is the reservation bot”(这是预订自动程序)。第三个消息组可能传达自动程序的功能：“I can help with car rentals and hotel reservations”(我可以帮忙租车和预订宾馆)、“You can make car rentals and hotel reservations”(您可以租车和预订宾馆) 和“I can help you rent a car and book a hotel”(我可以帮您租车和预订宾馆)。

Lex 使用每个消息组中的消息在对话中动态构建响应。例如，一种交互可能如下所示：

![\[与机器人的一种可能对话。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/default-response-10b.png)


另一种交互可能如下所示：

![\[与机器人的另一种可能对话。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/default-response-20c.png)


在任一情况下，用户都可以使用新目的进行响应，如 `BookCar` 或 `BookHotel` 目的。

您可以将自动程序设置为在响应中询问后续问题。例如，对于前面的交互，您可以使用以下问题创建第四个消息组：“Can I help with a car or a hotel?”(我可以帮忙租车或预订宾馆吗？)、“Would you like to make a reservation now?”(您是否要立即预订？) 和“Is there anything that I can do for you?”(我能为您做些什么吗？)。对于包括“No”(不) 作为响应的消息，您可以创建跟进提示。下图提供了一个示例。

![\[与机器人对话中的后续提示。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/default-response-25a.png)


要创建跟进提示，请选择 **Wait for user reply** (等待用户回复)。然后键入在用户说“No”(不) 时要发送的一条或多条消息。当您创建响应以用作跟进提示时，还必须指定对语句的回答是“No”(不) 时的适当语句。有关示例，请参阅下图：

![\[用户说“否”时的消息配置。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/default-response-30b.png)


要使用 API 将响应添加到目的，请使用 `PutIntent` 操作。要指定响应，请设置 `PutIntent` 请求中的 `conclusionStatement` 字段。要设置跟进提示，请设置 `followUpPrompt` 字段并包括要在用户说“No”(不) 时发送的语句。您不能对同一目的同时设置 `conclusionStatement` 字段和 `followUpPrompt` 字段。

## 受支持的消息格式
<a name="msg-prompts-formats"></a>

当您使用 [PostText](API_runtime_PostText.md) 操作时，或当您将 [PostContent](API_runtime_PostContent.md) 操作与设置为 `text/plain;charset=utf8` 的 `Accept` 标头结合使用时，Amazon Lex 支持以下格式的消息：
+ `PlainText` — 消息包含 UTF-8 纯文本。
+ `SSML` — 消息包含为语音输出设置格式的文本。
+ `CustomPayload` — 消息包含为您的客户端创建的自定义格式。您可以定义负载以满足应用程序的需要。
+ `Composite` — 消息是来自每个消息组的消息的集合。有关消息组的更多信息，请参阅[消息组](#message-groups)。

默认情况下，Amazon Lex 返回为特定提示定义的任一个消息。例如，如果您定义五个消息来引发插槽值，则 Amazon Lex 会随机选择其中一个消息并将其返回给客户端。

如果您希望 Amazon Lex 在运行时请求中向客户端返回特定类型的消息，请设置 `x-amzn-lex:accept-content-types` 请求参数。响应局限于所请求的一种或多种类型。如果有多个指定类型的消息，则 Amazon Lex 会随机返回一个消息。有关 `x-amz-lex:accept-content-types` 标头的更多信息，请参阅[设置响应类型](context-mgmt-request-attribs.md#special-response)。

## 消息组
<a name="message-groups"></a>

*消息组* 是一组对特定提示的合适响应。如果您希望机器人动态生成对话中的响应，请使用消息组。当 Amazon Lex 向客户端应用程序返回响应时，它会从每个组中随机选择一个消息。您最多可以为每个响应创建五个消息组。每个组最多可以包含五个消息。有关在控制台中创建消息组的示例，请参阅[响应](#msg-prompts-response)。

要创建消息组，您可以使用控制台，也可以使用 [PutBot](API_PutBot.md)、[PutIntent](API_PutIntent.md) 或 [PutSlotType](API_PutSlotType.md) 操作来将组号分配给消息。如果您未创建消息组，或者仅创建了一个消息组，则 Amazon Lex 在 `Message` 字段中发送单个消息。仅当您在控制台中创建了多个消息组时，或当您使用 [PutIntent](API_PutIntent.md) 操作创建或更新目的时创建了多个消息组时，客户端应用程序才会在响应中获取多个消息。

在 Amazon Lex 发送组中的消息时，响应的 `Message` 字段包含一个包含消息的转义的 JSON 对象。以下示例显示包含多个消息的 `Message` 字段的内容。

**注意**  
为方便阅读，为此示例设置了格式。响应不包含回车符 (CR)。

```
{\"messages\":[
   {\"type\":\"PlainText\",\"group\":0,\"value\":\"Plain text\"},
   {\"type\":\"SSML\",\"group\":1,\"value\":\"SSML text\"},
   {\"type\":\"CustomPayload\",\"group\":2,\"value\":\"Custom payload\"}
]}
```

您可以设置消息的格式。格式可以是以下格式之一：
+ PlainText— 消息采用纯文本 UTF-8 文本。
+ SSML – 消息是语音合成标记语言 (SSML)。
+ CustomPayload— 消息采用您指定的自定义格式。

要控制 `PostContent` 和 `PostText` 操作在 `Message` 字段中返回的消息的格式，请设置 `x-amz-lex:accept-content-types` 请求属性。例如，如果您将标头设置为以下内容，您将在响应中仅收到纯文本和 SSML 消息：

```
x-amz-lex:accept-content-types: PlainText,SSML
```

如果您请求特定消息格式，但消息组没有包含该格式的消息，则会出现 `NoUsableMessageException` 异常。当您使用消息组按类型对消息进行分组时，请勿使用 `x-amz-lex:accept-content-types` 标头。

有关 `x-amz-lex:accept-content-types` 标头的更多信息，请参阅[设置响应类型](context-mgmt-request-attribs.md#special-response)。

## 响应卡
<a name="msg-prompts-resp-card"></a>

**注意**  
响应卡不适用于 Amazon Connect 聊天。但是，有关类似功能，请参阅[在聊天中添加交互式消息](https://docs.aws.amazon.com/connect/latest/adminguide/interactive-messages.html)。

*响应卡* 包含一组对提示的适当响应。使用响应卡可为您的用户简化交互，并通过减少文本交互中的拼写错误来提高自动程序的准确度。您可以为 Amazon Lex 向客户端应用程序发送的每个提示发送一张响应卡。你可以在 Facebook Messenger、Slack、Twilio 和你自己的客户端应用程序中使用响应卡。

例如，在出租车应用程序中，您可以在响应卡中配置一个“家”选项，并将值设置为用户的家庭地址。当用户选择此选项时，Amazon Lex 会收到输入文本形式的完整地址。参见下图：

![\[响应卡示例。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/resp-console-5.png)


您可以为以下提示定义响应卡：
+ 结论语句
+ 确认提示
+ 跟进提示
+ 拒绝语句
+ 槽类型表达

您只能为每个提示定义一张响应卡。

可以在创建目的时配置响应卡，可以在构建时使用控制台或 [PutIntent](API_PutIntent.md) 操作定义静态响应卡。或者，也可以在运行时在 Lambda 函数中定义动态响应卡。如果同时定义了静态和动态响应卡，动态响应卡优先。

Amazon Lex 以客户端可以理解的格式发送响应卡。它可以针对 Facebook Messenger、Slack 和 Twilio 转换响应卡。对于其他客户端，Amazon Lex 会在 [PostText](API_runtime_PostText.md) 响应中发送一个 JSON 结构。例如，如果客户端是 Facebook Messenger，Amazon Lex 会将响应卡转换为通用模板。有关 Facebook Messenger 通用模板的更多信息，请参阅 Facebook 网站上的 [Generic Template](https://developers.facebook.com/docs/messenger-platform/send-api-reference/generic-template)。有关 JSON 结构的示例，请参阅[动态生成响应卡](#msg-prompts-resp-card-dynamic)。

响应卡只能配合 [PostText](API_runtime_PostText.md) 操作使用，不适用于 [PostContent](API_runtime_PostContent.md) 操作。

### 定义静态响应卡
<a name="msg-prompts-resp-card-static"></a>

您可以在创建意图时使用 [PutBot](API_PutBot.md) 操作或 Amazon Lex 控制台定义静态响应卡。静态响应卡与目的同时定义。当响应固定不变时，可以使用静态响应卡。假设您正在创建一个自动程序，它的一个目的包含与口味对应的槽。在定义这个口味槽时，您指定了提示，如下面的控制台屏幕截图所示：

![\[控制台中的目的编辑器。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/resp-console-10a.png)


在定义提示时，您可以选择关联一张响应卡并用 [PutBot](API_PutBot.md) 操作或在 Amazon Lex 控制台中定义详细信息，如下例所示：

![\[显示响应卡编辑器的控制台。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/resp-console-20a.png)


现在假设您已将自动程序与 Facebook Messenger 集成。用户可以单击按钮来选择口味，如下图所示：

![\[Facebook Messenger 中的响应卡。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/resp-fb-exampleA.png)


要自定义响应卡的内容，您可以引用会话属性。在运行时，Amazon Lex 将这些引用替换为会话属性中合适的值。有关更多信息，请参阅 [设置会话属性](context-mgmt-session-attribs.md)。有关示例，请参阅[使用响应卡](ex-resp-card.md)。

### 动态生成响应卡
<a name="msg-prompts-resp-card-dynamic"></a>

要在运行时动态生成响应卡，请使用针对意图的初始化和验证 Lambda 函数。当响应是在运行时在 Lambda 函数中确定时，可以使用动态响应卡。响应用户输入时，Lambda 函数会生成一张响应卡并在响应的 `dialogAction` 部分返回它。有关更多信息，请参阅 [响应格式](lambda-input-response-format.md#using-lambda-response-format)。

下面是 Lambda 函数中显示 `responseCard` 元素的部分响应。它会生成类似上一部分示例所示的用户体验。

```
responseCard: {
  "version": 1,
  "contentType": "application/vnd.amazonaws.card.generic",
  "genericAttachments": [
    {
      "title": "What Flavor?",
      "subtitle": "What flavor do you want?",
      "imageUrl": "Link to image",
      "attachmentLinkUrl": "Link to attachment",
      "buttons": [
        {
          "text": "Lemon",
          "value": "lemon"
        },
        {
          "text": "Raspberry",
          "value": "raspberry"
        },
        {
          "text": "Plain",
          "value": "plain"
        }
      ]
    }
  ]
}
```

有关示例，请参阅[安排预约](ex1-sch-appt.md)。

# 管理对话上下文
<a name="context-mgmt"></a>

*对话上下文*是用户、您的应用程序或 Lambda 函数向 Amazon Lex 机器人提供的用于履行意图的信息。对话上下文包括用户提供的插槽数据、客户端应用程序设置的请求属性以及客户端应用程序和 Lambda 函数创建的会话属性。

**Topics**
+ [设置意图上下文](context-mgmt-active-context.md)
+ [使用默认插槽值](context-mgmt-default.md)
+ [设置会话属性](context-mgmt-session-attribs.md)
+ [设置请求属性](context-mgmt-request-attribs.md)
+ [设置超时会话](context-mgmt-session-timeout.md)
+ [在目的之间共享信息](context-mgmt-cross-intent.md)
+ [设置复杂属性](context-mgmt-complex-attributes.md)

# 设置意图上下文
<a name="context-mgmt-active-context"></a>

您可以让 Amazon Lex 根据*上下文*触发意图。*上下文*是一个在定义机器人时与意图相关联的状态变量。

通过控制台或 [PutIntent](API_PutIntent.md) 操作创建意图时，您可以为该意图配置上下文。您只能在英语（美国）(en-US) 区域设置中使用上下文，并且前提是您在使用 [PutBot](API_PutBot.md) 操作创建机器人时将 `enableModelImprovements` 参数设置为 `true`。

上下文有两种类型的关系，即输出上下文和输入上下文。当履行关联的意图时，*输出上下文*就会变为活动状态。在 [PostText](API_runtime_PostText.md) 或 [PostContent](API_runtime_PostContent.md) 操作的响应中，会将输出上下文返回到您的应用程序，并为当前会话设置上下文。上下文被激活后，会保持活动状态，直到定义上下文时配置的回合数或时间限制。

*输入上下文*指定了可以识别意图的条件。只有当对话的所有输入上下文都处于活动状态时，才能识别出意图。没有输入上下文的意图始终可以被识别。

Amazon Lex 自动管理通过使用输出上下文履行意图而激活的上下文的生命周期。您还可以在调用 `PostContent` 或 `PostText` 操作时设置活动上下文。

您也可以通过 Lambda 函数为意图设置对话上下文。将 Amazon Lex 的输出上下文发送到 Lambda 函数输入事件。Lambda 函数可以在其响应中发送上下文。有关更多信息，请参阅 [Lambda 函数输入事件和响应格式](lambda-input-response-format.md)。

例如，假设您打算预订一辆配置返回名为“book\$1car\$1fulfilled”的输出上下文的租车。履行意图时，Amazon Lex 会将输出上下文变量设置为“book\$1car\$1fulfilled”。由于“book\$1car\$1fulfilled”上下文处于活动状态，因此，只要用户的言语被识别为试图引发该意图，就可以考虑将“book\$1car\$1fulfilled”上下文设置为输入上下文的意图进行识别。您可以将其用于只有在预订车辆后才有意义的意图，例如，通过电子邮件发送收据或修改预订。

## 输出上下文
<a name="context-output"></a>

履行意图时，Amazon Lex 会激活意图的输出上下文。您可以通过输出上下文来控制哪些意图符合跟随当前意图的条件。

每个上下文都有一个在会话中维护的参数列表。这些参数是已履行意图的插槽值。您可以使用这些参数为其他意图预填充插槽值。有关更多信息，请参阅[使用默认插槽值](context-mgmt-default.md)。

当您通过控制台或 [PutIntent](API_PutIntent.md) 操作创建意图时，您可以配置输出上下文。您可以为一个意图配置多个输出上下文。履行意图时，所有输出上下文都将被激活，并在 [PostText](API_runtime_PostText.md) 或 [PostContent](API_runtime_PostContent.md) 响应中返回。

以下是使用控制台为意图分配输出上下文的示例。

![\[标有 order_complete 的输出标签，生存时间为 5 个回合或 90 秒。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/context-output.png)


在定义输出上下文时，还要定义其*生存时间*以及该上下文包含在 Amazon Lex 的响应中的时长或回合数。一个*回合*是指从您的应用程序向 Amazon Lex 发出的一个请求。一旦回合数或时间到期，上下文将不再处于活动状态。

您的应用程序可以根据需要使用输出上下文。例如，您的应用程序可以通过输出上下文来：
+ 根据上下文更改应用程序的行为。例如，旅行应用程序对上下文“book\$1car\$1fulfilled”的操作可能与对“rental\$1hotel\$1fulfilled”的操作不同。
+ 将输出上下文作为下一句话的输入上下文返回给 Amazon Lex。如果 Amazon Lex 将言语识别为尝试引发意图，则会通过上下文将可以返回的意图限制为具有指定上下文的意图。

## 输入上下文
<a name="context-input"></a>

您可以设置输入上下文来限制对话中识别意图的点。没有输入上下文的意图始终可以被识别。

您可以通过控制台或 `PutIntent` 操作设置意图响应的输入上下文。一个意图可以包含多个输入上下文。以下是使用控制台为意图分配输入上下文的示例。

![\[标有 order_complete 的输入标签。\]](http://docs.aws.amazon.com/zh_cn/lex/latest/dg/images/context-input.png)


对于具有多个输入上下文的意图，所有上下文都必须处于活动状态才能触发该意图。您可以在调用 [PostText](API_runtime_PostText.md)、[PostContent](API_runtime_PostContent.md) 或 [PutSession](API_runtime_PutSession.md) 操作时设置输入上下文。

您可以将意图中的插槽配置为采用当前活动上下文中的默认值。当 Amazon Lex 识别出新的意图但未收到插槽值时，使用默认值。定义插槽时，可以在表单 `#context-name.parameter-name` 中指定上下文名称和插槽名称。有关更多信息，请参阅 [使用默认插槽值](context-mgmt-default.md)。

# 使用默认插槽值
<a name="context-mgmt-default"></a>

使用默认值时，如果用户输入中未提供插槽，您可以指定一个源用于为新意图填充的插槽值。此来源可以是之前的对话、请求或会话属性，也可以是您在构建时设置的固定值。

您可以将以下内容作为默认值来源。
+ 之前的对话（上下文）— \$1context-name.parameter-name
+ 会话属性 — [attribute-name]
+ 请求属性 — <attribute-name>
+ 固定值 — 任何与先前值不匹配的值

通过 [PutIntent](API_PutIntent.md) 操作向意图添加插槽时，可以添加默认值列表。将按这些默认值列出的顺序对其进行排列。例如，假设您有一个带插槽的意图，其插槽定义如下：

```
"slots": [
    {
        "name": "reservation-start-date",
        "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 将照常引发一个值。

如果使用插槽的默认值，则即使需要该插槽，也不会引发该插槽。

# 设置会话属性
<a name="context-mgmt-session-attribs"></a>

*会话属性*包含特定于应用程序的信息，于会话期间在机器人与客户端应用程序之间传递。Amazon Lex 向为机器人配置的所有 Lambda 函数传递会话属性。如果 Lambda 函数添加或更新会话属性，Amazon Lex 会将新信息返回给客户端应用程序。例如：
+ 在[练习 1：使用蓝图创建 Amazon Lex 机器人（控制台）](gs-bp.md)中，示例自动程序使用 `price` 会话属性维护鲜花价格。Lambda 函数根据所订购鲜花的类型设置此属性。有关更多信息，请参阅 [步骤 5 (可选)：查看信息流的详细信息 (控制台)](gs-bp-details-after-lambda.md)。
+ 在[预订旅程](ex-book-trip.md)中，示例自动程序使用 `currentReservation` 会话属性，在预订酒店或预订租车的对话中维护槽类型数据的副本。有关更多信息，请参阅 [信息流的详细信息](book-trip-detail-flow.md)。

在 Lambda 函数中使用会话属性来初始化机器人并自定义提示和响应卡。例如：
+ 初始化 — 在订购披萨机器人中，客户端应用程序在第一次调用 [PostContent](API_runtime_PostContent.md) 或 [PostText](API_runtime_PostText.md) 操作时传递用户位置作为会话属性。例如 `"Location": "111 Maple Street"`。Lambda 函数根据该信息查找最近的披萨店下订单。
+ 个性化提示 — 配置提示和响应卡，以引用会话属性。例如，“嘿 [FirstName]，你想要什么浇头？” 如果您传递该用户的名字作为会话属性 (`{"FirstName": "Jo"}`)，Amazon Lex 将用该名字替换占位符。然后，它会向该用户发送个性化提示，“Jo 您好，您想要什么配料？”

会话属性在会话持续时间内一直存在。Amazon Lex 将其存储在加密数据存储中，直到会话结束。客户端可以通过调用 [PostContent](API_runtime_PostContent.md) 或 [PostText](API_runtime_PostText.md) 操作同时为 `sessionAttributes` 字段设置值来创建会话属性。Lambda 函数可以在响应中创建会话属性。在客户端或 Lambda 函数创建会话属性后，每当客户端应用程序在发给 Amazon Lex 的请求中不包括 `sessionAttribute` 字段时，都会使用存储的属性值。

例如，假设您有两个会话属性 `{"x": "1", "y": "2"}`。如果客户端调用 `PostContent` 或 `PostText` 操作而未指定 `sessionAttributes` 字段，Amazon Lex 通过存储的会话属性 (`{"x": 1, "y": 2}`) 调用 Lambda 函数。如果 Lambda 函数未返回会话属性，Amazon Lex 会将存储的会话属性返回给客户端应用程序。

如果客户端应用程序或 Lambda 函数传递会话属性，Amazon Lex 将更新存储的会话属性。传递现有值（例如 ` {"x": 2}`）将更新存储的值。如果您传递一组新的会话属性（如 `{"z": 3}`），将删除现有值而只保留新值。当传递空映射 `{}` 时，将擦除存储的值。

要向 Amazon Lex 发送会话属性，您需要创建属性 string-to-string映射。下面显示了如何映射会话属性：

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

对于 `PostText` 操作，您可以使用 `sessionAttributes` 字段将映射插入请求正文中，如下所示：

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

对于 `PostContent` 操作，您对映射进行 base64 编码，然后将其作为 `x-amz-lex-session-attributes` 标头发送。

如果要在会话属性中发送二进制或结构化数据，则必须先将该数据转换为简单字符串。有关更多信息，请参阅 [设置复杂属性](context-mgmt-complex-attributes.md)。

# 设置请求属性
<a name="context-mgmt-request-attribs"></a>

*请求属性*包含请求特定的信息，并仅应用于当前请求。客户端应用程序会将此信息发送给 Amazon Lex。可以使用请求属性传递不需要在整个会话中保留的信息。您可以创建自己的请求属性，也可以使用预定义属性。要发送请求属性，请在 [PostText](API_runtime_PostText.md) 请求的 [PostContent](API_runtime_PostContent.md) 或 `requestAttributes` 字段中使用 `x-amz-lex-request-attributes` 标头。由于请求属性不像会话属性那样在不同请求间保留，因此不会在 `PostContent` 或 `PostText` 响应中返回。

**注意**  
要发送在请求间保留的信息，请使用会话属性。

命名空间 `x-amz-lex:` 是为预定义请求属性预留的。请勿创建带有 `x-amz-lex:` 前缀的请求属性。

## 设置预定义请求属性
<a name="context-mgmt-special"></a>

Amazon Lex 提供预定义请求属性，用于管理它对发送至机器人的信息的处理方式。这些属性不会在整个会话中保留，因此必须在每个请求中发送预定义属性。所有预定义属性都在 `x-amz-lex:` 命名空间中。

除了以下预定义属性之外，Amazon Lex 还提供消息收发平台的预定义属性。有关这些属性的列表，请参阅[在消息收发平台上部署 Amazon Lex 机器人](example1.md)。

### 设置响应类型
<a name="special-response"></a>

如果您有两个具有不同功能的客户端应用程序，则可能需要限制响应中的消息的格式。例如，您可能希望将发送到 Web 客户端的消息限制为纯文本，但使移动客户端能够同时使用纯文本和语音合成标记语言（SSML）。要设置 [PostContent](API_runtime_PostContent.md) 和 [PostText](API_runtime_PostText.md) 操作返回的消息的格式，请使用 `x-amz-lex:accept-content-types"` 请求属性。

您可以将此属性设置为以下消息类型的任意组合：
+ `PlainText` — 消息包含 UTF-8 纯文本。
+ `SSML` — 消息包含为语音输出设置格式的文本。
+ `CustomPayload` — 消息包含为您的客户端创建的自定义格式。您可以定义负载以满足应用程序的需要。

Amazon Lex 仅返回具有响应的 `Message` 字段中指定的类型的消息。您可以设置多个值，以逗号分隔这些值。如果您使用消息组，则每个消息组必须至少包含一个指定类型的消息。否则，您将收到 `NoUsableMessageException` 错误。有关更多信息，请参阅 [消息组](howitworks-manage-prompts.md#message-groups)。

**注意**  
`x-amz-lex:accept-content-types` 请求属性不会影响 HTML 正文的内容。`PostText` 操作响应的内容始终为纯 UTF-8 文本。`PostContent` 操作响应的正文包含请求中 `Accept` 标头中设置的格式的数据。

### 设置首选时区
<a name="special-time-zone"></a>

要设置用于解析日期的时区，以使其与用户的时区相关，请使用 `x-amz-lex:time-zone` 请求属性。如果您未在 `x-amz-lex:time-zone` 属性中指定时区，则默认值取决于您用于自动程序的区域。


| Region | 默认时区 | 
| --- | --- | 
| 美国东部（弗吉尼亚州北部） |  America/New\$1York  | 
| 美国西部（俄勒冈州） |  America/Los\$1Angeles  | 
| 亚太地区（新加坡） |  Asia/Singapore  | 
| 亚太地区（悉尼） |  Australia/Sydney  | 
| 亚太地区（东京） |  Asia/Tokyo  | 
| 欧洲地区（法兰克福） |  Europe/Berlin  | 
| 欧洲地区（爱尔兰） |  Europe/Dublin  | 
| 欧洲地区（伦敦） |  Europe/London  | 

例如，如果用户在对“您希望您的包裹哪天送达？”提示的响应中回复 `tomorrow`，则包裹送达的实际*日期*依据用户的时区确定。例如，纽约时间 9 月 16 日 01:00 时相当于洛杉矶时间 9 月 15 日 22:00。如果您的服务在美国东部（弗吉尼亚州北部）区域中运行，洛杉矶的一位用户使用默认时区要求包裹于“明天”送达，那么该包裹将于 17 日送达，而不是 16 日。但是，如果您将 `x-amz-lex:time-zone` 请求属性设置为 `America/Los_Angeles`，该包裹将于 16 日送达。

您可以将该属性设置为任何互联网编号分配机构 (IANA) 时区名称。有关时区名称的列表，请参阅维基百科上的 [tz 数据库时区的列表](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)。

## 设置用户定义的请求属性
<a name="context-mgmt-user"></a>

*用户定义的请求属性*是您在每个请求中发送给自动程序的数据。可在 `PostContent` 请求的 `amz-lex-request-attributes` 标头或 `PostText` 请求的 `requestAttributes` 字段中发送信息。

要向 Amazon Lex 发送请求属性，您需要创建属性 string-to-string映射。下面显示了如何映射请求属性：

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

对于 `PostText` 操作，您可以使用 `requestAttributes` 字段将映射插入请求正文中，如下所示：

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

对于 `PostContent` 操作，您对映射进行 base64 编码，然后将其作为 `x-amz-lex-request-attributes` 标头发送。

如果您要在请求属性中发送二进制或结构化数据，必须先将该数据转换为简单字符串。有关更多信息，请参阅 [设置复杂属性](context-mgmt-complex-attributes.md)。

# 设置超时会话
<a name="context-mgmt-session-timeout"></a>

Amazon Lex 保留上下文信息（插槽数据和会话属性），直到对话会话结束。要控制会话在自动程序中的持续时间，请设置会话超时。默认情况下，会话持续时间为 5 分钟，但您可以指定介于 0 到 1440 分钟（24 小时）之间的任何持续时间。

例如，假设您创建一个支持 `OrderShoes` 和 `GetOrderStatus` 等意图的 `ShoeOrdering` 机器人。当 Amazon Lex 检测到用户的意图是订购鞋子时，它会要求提供插槽数据。例如，要求提供鞋子尺码、颜色、品牌等。如果用户提供了一些插槽数据，但未完成鞋子的购买，Amazon Lex 将在整个会话中记住所有插槽数据和会话属性。如果用户在会话到期之前返回到会话，该用户可以提供其余槽数据并完成购买。

在 Amazon Lex 控制台中，您应在创建机器人时设置会话超时。使用 AWS 命令行界面 (AWS CLI) 或 API，您可以通过设置 IdleS [ession Seconds 字段来设置使用[PutBot](API_PutBot.md)操作创建机器人或更新机器人时的超时TTLIn时间](https://docs.aws.amazon.com/lex/latest/dg/API_PutBot.html#lex-PutBot-request-idleSessionTTLInSeconds)。

# 在目的之间共享信息
<a name="context-mgmt-cross-intent"></a>

Amazon Lex 支持在意图之间共享信息。要在目的之间共享信息，请使用会话属性。

例如，`ShoeOrdering` 自动程序的用户从订购鞋子开始。该自动程序将与用户进行对话，收集槽数据，如鞋子尺寸、颜色和品牌。当用户下单时，履行订单的 Lambda 函数将设置 `orderNumber` 会话属性，其中包含订单号。要获取订单状态，用户可使用 `GetOrderStatus` 目的。自动程序可向用户询问槽数据，如订单号和订购日期。自动程序在获得所需的信息以后将返回订单状态。

如果您认为您的用户可能会在同一会话期间改换目的，则可将自动程序设计为返回最新订单的状态。您不必再向用户询问订单信息，而是使用 `orderNumber` 会话属性在不同目的间共享信息并实现 `GetOrderStatus` 目的。自动程序通过返回用户最后所下订单的状态完成此操作。

有关跨目的信息共享的示例，请参阅[预订旅程](ex-book-trip.md)。

# 设置复杂属性
<a name="context-mgmt-complex-attributes"></a>

会话和请求属性是属性和值的 string-to-string映射。在许多情况下，您可以使用字符串映射在客户端应用程序与自动程序之间传输属性值。但在某些情况下，您可能需要传输无法轻易转换为字符串映射的二进制数据或复杂结构。例如，以下 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"
         }
      }
   ]
}
```

这个数据数组不能很好地转换为 string-to-string地图。在这种情况下，您可以将对象转换为一个简单字符串，以便通过 [PostContent](API_runtime_PostContent.md) 和 [PostText](API_runtime_PostText.md) 操作将其发送给自动程序。

例如，如果您正在使用 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);
```

要通过`PostContent`操作发送会话属性，在将属性添加到请求标头之前，必须对这些属性进行 base64 编码，如以下 JavaScript代码所示：

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

您可以通过先将二进制数据转换为 base64 编码字符串、然后将该字符串作为会话属性中的值发送，来向 `PostContent` 和 `PostText` 操作发送二进制数据：

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

# 使用置信度分数
<a name="confidence-scores"></a>

当用户说话时，Amazon Lex 会使用自然语言理解 (NLU) 来理解用户的请求并返回正确的意图。默认情况下，Amazon Lex 会返回您的机器人定义的最可能的意图。

在某些情况下，Amazon Lex 可能很难确定最可能的意图。例如，用户可能会说出模棱两可的言语，或者可能有两个相似的意图。为了帮助确定正确的意图，您可以将自己的领域知识与替代意图列表的*置信度分数*相结合。置信度分数是 Amazon Lex 提供的评级，它表明其对意图是正确意图的信心程度。

要确定两个替代意图之间的差异，您可以比较它们的置信度分数。例如，如果一个意图的置信度分数为 0.95，而另一个意图的置信度分数为 0.65，则第一个意图可能是正确的。但是，如果一个意图的分数为 0.75，而另一个意图的分数为 0.72，则这两个意图之间存在歧义，您可以在应用程序中使用领域知识来区分。

您还可以使用置信度分数来创建测试应用程序，以确定对意图言语的更改是否会影响机器人的行为。例如，您可以使用一组言语来获取机器人意图的置信度分数，然后用新的言语更新意图。然后，您可以查看置信度分数，以确定是否有所改善。

Amazon Lex 返回的置信度分数是比较值。请避免将其视作绝对分数进行信任。根据对 Amazon Lex 的改进，这些值可能会发生变化。

当您使用置信度分数时，Amazon Lex 会在每个响应中返回最有可能的意图和最多 4 个替代意图及其相关分数。如果所有置信度分数都低于阈值，Amazon Lex 将包括 `AMAZON.FallbackIntent` 和/或 `AMAZON.KendraSearchIntent`（如果您已配置它们）。您可以使用默认阈值，也可以设置您自己的阈值。

以下 JSON 代码显示了 [PostText](API_runtime_PostText.md) 操作的响应中的 `alternativeIntents` 字段。

```
   "alternativeIntents": [ 
      { 
         "intentName": "string",
         "nluIntentConfidence": { 
            "score": number
         },
         "slots": { 
            "string" : "string" 
         }
      }
   ],
```

设置您创建或更新机器人时的阈值。您可以使用 API 或 Amazon Lex 控制台。对于下面列出的区域，您需要选择加入才能提高准确性和置信度分数。在控制台中，在**高级选项**部分选择置信度分数。使用 API 时，在调用 [PutBot](API_PutBot.md) 操作时设置 `enableModelImprovements` 参数。
+ 美国东部（弗吉尼亚州北部）(us-east-1)
+ 美国西部（俄勒冈州）(us-west-2)
+ 亚太地区（悉尼）(ap-southeast-2)
+ 欧洲地区（爱尔兰）(eu-west-1)

在所有其他区域中，默认情况下都提供精度改进和置信度分数支持。

要更改置信度阈值，请在控制台中或使用 [PutBot](API_PutBot.md) 操作进行设置。阈值必须是介于 1.00 和 0.00 之间的数字。

要使用控制台，请在创建或更新机器人时设置置信度阈值。

**在创建机器人时设置置信度阈值（控制台）**
+ 在**创建您的机器人**上，在**置信度分数阈值**字段中输入一个值。

**更新置信度阈值（控制台）**

1. 从机器人列表中，选择要更新的机器人。

1. 选择**设置**选项卡。

1. 在左侧导航窗格中，选择**常规**。

1. 更新**置信度分数阈值**字段中的值。

**设置或更新置信度阈值 (SDK)**
+ 设置 [PutBot](API_PutBot.md) 操作的 `nluIntentConfidenceThreshold` 参数。以下 JSON 代码显示了正在设置的参数。

  ```
     "nluIntentConfidenceThreshold": 0.75,
  ```

## 会话管理
<a name="confidence-scores-session-management"></a>

要更改 Amazon Lex 在与用户对话中使用的意图，您可以使用对话代码挂钩 Lambda 函数中的响应，也可以在自定义应用程序 APIs中使用会话管理。

### 使用 Lambda 函数 URL
<a name="session-management-lambda"></a>

当您使用 Lambda 函数时，Amazon Lex 会使用包含该函数输入的 JSON 结构对其进行调用。JSON 结构包含一个名为 `currentIntent` 的字段，该字段包含 Amazon Lex 已确定为最有可能的用户言语意图的意图。JSON 结构还包括一个 `alternativeIntents` 字段，该字段包含最多四个可能满足用户意图的额外意图。每个意图都包含一个名为 `nluIntentConfidenceScore` 的字段，其中包含 Amazon Lex 为该意图分配的置信度分数。

要使用替代意图，您可以在 Lambda 函数的 `ConfirmIntent` 或 `ElicitSlot` 对话操作中指定该意图。

有关更多信息，请参阅 [使用 Lambda 函数](using-lambda.md)。

### 使用会话管理 API
<a name="session-management-API"></a>

要使用与当前意图不同的意图，请使用 [PutSession](API_runtime_PutSession.md) 操作。例如，如果您认为第一个替代意图比 Amazon Lex 选择的意图更可取，则可以使用 `PutSession` 操作来更改意图，以便用户与之交互的下一个意图就是您选择的意图。

有关更多信息，请参阅 [使用 Amazon Lex API 管理会话](how-session-api.md)。

# 对话日志
<a name="conversation-logs"></a>

您可以启用*对话日志* 来存储自动程序的交互。您可以使用这些日志查看机器人的性能，并解决与对话相关的问题。您可以记录 [PostText](API_runtime_PostText.md) 操作的文本。您可以记录 [PostContent](API_runtime_PostContent.md) 操作的文本和音频。通过启用对话日志，您可以获得用户与自动程序所进行对话的详细视图。

例如，与您的自动程序开展的会话具有会话 ID。您可以使用此 ID 获取对话的记录，包括用户话语和相应的自动程序响应。您还可以获取元数据，例如话语的意图名称和槽位值。

**注意**  
您不能将对话日志用于受儿童在线隐私保护法案（COPPA）约束的自动程序。

对话日志是为别名配置的。每个别名的文本日志和音频日志都可以有不同的设置。您可以为每个别名启用文本日志和/或音频日志。文本日志在 CloudWatch 日志中存储文本输入、音频输入脚本和相关元数据。音频日志将音频输入存储在 Amazon S3 中。您可以使用 AWS KMS 客户管理功能启用文本和音频日志的加密 CMKs。

要配置日志记录，请使用控制台或 [PutBotAlias](API_PutBotAlias.md) 操作。对于您的机器人或在 Amazon Lex 控制台中提供的测试机器人，您无法记录 `$LATEST` 别名的对话。为别名启用对话日志[PostContent](API_runtime_PostContent.md)或对该别名的[PostText](API_runtime_PostText.md)操作后，将在配置的日志 CloudWatch 日志组或 S3 存储桶中记录文本或音频语句。

**Topics**
+ [用于对话日志的 IAM 策略](conversation-logs-policies.md)
+ [配置对话日志](conversation-logs-configure.md)
+ [加密对话日志](conversation-logs-encrypting.md)
+ [在 Amazon 日志中查看文本 CloudWatch 日志](conversation-logs-cw.md)
+ [在 Amazon S3 中访问音频日志](conversation-logs-s3.md)
+ [使用 CloudWatch 指标监控对话日志状态](conversation-logs-monitoring.md)

# 用于对话日志的 IAM 策略
<a name="conversation-logs-policies"></a>

根据您选择的日志类型，Amazon Lex 需要权限才能使用亚马逊 CloudWatch 日志和亚马逊简单存储服务 (S3) 存储桶来存储您的日志。您必须创建 AWS Identity and Access Management 角色和权限才能让 Amazon Lex 访问这些资源。

## 为对话日志创建 IAM 角色和策略
<a name="conversation-logs-role-and-policy"></a>

要启用对话日志，您必须授予 CloudWatch 日志和 Amazon S3 的写入权限。如果您为 S3 对象启用对象加密，则需要向用于加密对象的 AWS KMS 密钥授予访问权限。

您可以使用 IAM AWS 管理控制台、IAM API 或 AWS Command Line Interface 来创建角色和策略。这些说明使用 AWS CLI 来创建角色和策略。有关使用控制台创建策略的更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[在 JSON 选项卡上创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。

**注意**  
以下代码针对 Linux 和 macOS 编排了格式。对于 Windows，将 Linux 行继续符（\$1）替换为脱字号（^）。



**为对话日志创建 IAM 角色**

1. 在名为 **LexConversationLogsAssumeRolePolicyDocument.json** 的当前目录中创建一个文档，向其中添加以下代码并保存。此策略文档将 Amazon Lex 作为受信任实体添加到角色中。这允许 Lex 代入将日志传送到为对话日志配置的资源的角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lex.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. 在中 AWS CLI，运行以下命令为对话日志创建 IAM 角色。

   ```
   aws iam create-role \
       --role-name role-name \
       --assume-role-policy-document file://LexConversationLogsAssumeRolePolicyDocument.json
   ```

接下来，创建策略并将其附加到该角色以允许 Amazon Lex 写入 CloudWatch 日志。

**创建用于将对话文本记录到 Log CloudWatch s 的 IAM 策略**

1. 在名为 **LexConversationLogsCloudWatchLogsPolicy.json** 的当前目录中创建一个文档，向其中添加 IAM 策略并保存。

1. 在中 AWS CLI，创建向 CloudWatch 日志组授予写入权限的 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name cloudwatch-policy-name \
       --policy-document file://LexConversationLogsCloudWatchLogsPolicy.json
   ```

1. 将该策略附加到您为对话日志创建的 IAM 角色中。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::account-id:policy/cloudwatch-policy-name \
       --role-name role-name
   ```

如果要将音频日志记录到 S3 存储桶，请创建允许 Amazon Lex 写入存储桶的策略。

**创建用于将音频日志记录到 S3 存储桶中的 IAM 策略**

1. 在名为 **LexConversationLogsS3Policy.json** 的当前目录中创建一个文档，向其中添加以下策略并保存。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "s3:PutObject"
             ],
             "Resource": "arn:aws:s3:::bucket-name/*"
         }
     ]
   }
   ```

------

1. 在中 AWS CLI，创建授予您的 S3 存储桶写入权限的 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name s3-policy-name \
       --policy-document file://LexConversationLogsS3Policy.json
   ```

1. 将该策略附加到您为对话日志创建的角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::account-id:policy/s3-policy-name \
       --role-name role-name
   ```

## 授予传递 IAM 角色的权限
<a name="conversation-logs-pass-role"></a>

当您使用控制台 AWS Command Line Interface、或 AWS 软件开发工具包指定用于对话日志的 IAM 角色时，指定对话日志 IAM 角色的用户必须有权将该角色传递给 Amazon Lex。要允许用户将角色传递给 Amazon Lex，您必须向用户、角色或组授予 `PassRole` 权限。

以下策略定义要授予用户、角色或组的权限。您可以使用 `iam:AssociatedResourceArn` 和 `iam:PassedToService` 条件键来限制权限的范围。有关更多信息，请参阅用户*指南*中的[授予用户将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)以及 [IAM 和 AWS STS 条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html)。AWS Identity and Access Management 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/role-name",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "lex.amazonaws.com"
                },
                "StringLike": {
                    "iam:AssociatedResourceARN": "arn:aws:lex:region:123456789012:bot:bot-name:bot-alias"
                }
            }
        }
    ]
}
```

------

# 配置对话日志
<a name="conversation-logs-configure"></a>

您可以使用控制台或 `PutBotAlias` 操作的 `conversationLogs` 字段来启用和禁用对话日志。您可以启用或禁用音频日志和/或文本日志。日志记录将在新自动程序会话上启动。对日志设置的更改不会体现在活动会话中。

要存储文本日志，请在您的 AWS 账户中使用一个 Amazon Log CloudWatch s 日志组。您可以使用任何有效的日志组。日志组必须与 Amazon Lex 机器人位于同一区域中。有关创建 CloudWatch 日志组的更多信息，请参阅 *Amazon Logs 用户指南中的使用日志组和 CloudWatch 日志*[流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

要存储音频日志，请在您的 AWS 账户中使用 Amazon S3 存储桶。您可以使用任何有效的 S3 存储桶。该存储桶必须与 Amazon Lex 存储桶位于同一区域。有关创建 S3 存储桶的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)。

您必须为 IAM 角色提供策略，使 Amazon Lex 能够写入配置的日志组或存储桶。有关更多信息，请参阅 [为对话日志创建 IAM 角色和策略](conversation-logs-policies.md#conversation-logs-role-and-policy)。

如果您使用创建服务相关角色 AWS Command Line Interface，则必须使用`custom-suffix`选项为角色添加自定义后缀，如下所示：

```
aws iam create-service-linked-role \
    --aws-service-name lex.amazon.aws.com \
    --custom-suffix suffix
```

您用于启用对话日志的 IAM 角色必须具有 `iam:PassRole` 权限。应将以下策略附加到角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/role"
        }
    ]
}
```

------

## 启用对话日志
<a name="conversation-logs-enable"></a>

**使用控制台启用日志**

1. 打开 Amazon Lex 控制台 [https://console.aws.amazon.com/lex](https://console.aws.amazon.com/lex)。

1. 从列表中，选择一个机器人。

1. 选择 **Settings (设置)** 选项卡，然后从左侧菜单中选择 **Conversation logs (对话日志)**。

1. 在别名列表中，选择要配置对话日志的别名的设置图标。

1. 选择是记录文本、音频还是两者。

1. 要进行文本记录，请输入 Amazon Log CloudWatch s 日志组名称。

1. 对于音频日志记录，请输入 S3 存储桶信息。

1. 可选。要加密音频日志，请选择用于加密的密 AWS KMS 钥。

1. 选择具有所需权限的 IAM 角色。

1. 选择 **Save（保存）**以开始记录对话。

**使用 API 启用文本日志**

1. 使用 `conversationLogs` 字段中 `logSettings` 成员的条目调用 [PutBotAlias](API_PutBotAlias.md) 操作
   + 将 `destination` 成员设置为 `CLOUDWATCH_LOGS`
   + 将 `logType` 成员设置为 `TEXT`
   + 将`resourceArn`成员设置为日志日志组的 Amazon 资源名称 (ARN)，该组是 CloudWatch 日志的目标

1. 将 `conversationLogs` 字段的 `iamRoleArn` 成员设置为 IAM 角色的 Amazon 资源名称 (ARN)，该角色应具有在指定资源上启用对话日志所需的权限。

**使用 API 启用音频日志**

1. 使用 `conversationLogs` 字段中 `logSettings` 成员的条目调用 [PutBotAlias](API_PutBotAlias.md) 操作
   + 将 `destination` 成员设置为 `S3`
   + 将 `logType` 成员设置为 `AUDIO`
   + 将 `resourceArn` 成员设置为存储音频日志的 Amazon S3 存储桶的 ARN
   + 可选。要使用特定 AWS KMS 密钥加密音频日志，请设置用于加密的密钥的 ARN `kmsKeyArn` 成员。

1. 将 `conversationLogs` 字段的 `iamRoleArn` 成员设置为 IAM 角色的 Amazon 资源名称 (ARN)，该角色应具有在指定资源上启用对话日志所需的权限。

## 禁用对话日志
<a name="conversation-logs-disable"></a>

**使用控制台禁用日志**

1. 打开 Amazon Lex 控制台 [https://console.aws.amazon.com/lex](https://console.aws.amazon.com/lex)。

1. 从列表中，选择一个机器人。

1. 选择 **Settings (设置)** 选项卡，然后从左侧菜单中选择 **Conversation logs (对话日志)**。

1. 在别名列表中，选择要配置对话日志的别名的设置图标。

1. 清除文本日志和/或音频日志的复选框以禁用日志记录。

1. 选择 **Save（保存）**以停止记录对话。

**使用 API 禁用日志**
+ 不带 `conversationLogs` 字段调用 `PutBotAlias` 操作。

**使用 API 禁用文本日志**
+ 
  + 正在记录音频时
    + 仅对于 `AUDIO`，使用 `logSettings` 条目调用 [PutBotAlias](API_PutBotAlias.md) 操作。
    + 对 `PutBotAlias` 操作的调用不得包括针对 `TEXT` 的条目 `logSettings`。
  + 没有记录音频时
    + 不带 `conversationLogs` 字段调用 [PutBotAlias](API_PutBotAlias.md) 操作。

**使用 API 禁用音频日志**
+ 
  + 正在记录文本时
    + 仅对于 `TEXT`，使用 `logSettings` 条目调用 [PutBotAlias](API_PutBotAlias.md) 操作。
    + 对 `PutBotAlias` 操作的调用不得包括针对 `AUDIO` 的条目 `logSettings`。
  + 没有记录文本时
    + 不带 `conversationLogs` 字段调用 [PutBotAlias](API_PutBotAlias.md) 操作。

# 加密对话日志
<a name="conversation-logs-encrypting"></a>

您可以使用加密来帮助保护对话日志的内容。对于文本和音频日志，您可以使用 AWS KMS 客户管理 CMKs 来加密 CloudWatch 日志组和 S3 存储桶中的数据。

**注意**  
Amazon Lex 仅支持对称 CMKs。不能使用非对称 CMK 来加密数据。

您可以使用 Amazon Lex 用于文本 CloudWatch 日志的日志组上的 AWS KMS 密钥启用加密。您无法在日志设置中提供 AWS KMS 密钥来启用对日志组的 AWS KMS 加密。有关更多信息，请参阅 *Amazon Lo CloudWatch gs 用户指南 AWS KMS中的使用加密 CloudWatch 日志*[数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)。

对于音频日志，您可以在 S3 存储桶上使用默认加密或指定 AWS KMS 密钥来加密您的音频对象。即使您的 S3 存储桶使用默认加密，您仍然可以指定不同的 AWS KMS 密钥来加密您的音频对象。有关更多信息，请参阅**《Amazon Simple Storage Service 开发人员指南》中的 [Amazon Lex 默认 S3 存储桶加密](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html)。

如果您选择加密音频日志，Amazon Lex 需要 AWS KMS 权限。您需要将其他策略附加到用于对话日志的 IAM 角色。如果您对 S3 存储桶使用默认加密，则您的策略必须授予对该存储桶配置的 AWS KMS 密钥的访问权限。如果您在音频日志设置中指定了 AWS KMS 密钥，则必须授予对该密钥的访问权限。

如果您还没有为对话日志创建角色，请参阅[用于对话日志的 IAM 策略](conversation-logs-policies.md)。

**创建用于使用 AWS KMS 密钥加密音频日志的 IAM 策略**

1. 在名为 **LexConversationLogsKMSPolicy.json** 的当前目录中创建一个文档，向其中添加以下策略并保存。

1. 在中 AWS CLI，创建授予使用 AWS KMS 密钥加密音频日志的权限的 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name kms-policy-name \
       --policy-document file://LexConversationLogsKMSPolicy.json
   ```

1. 将该策略附加到您为对话日志创建的角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::account-id:policy/kms-policy-name \
       --role-name role-name
   ```

# 在 Amazon 日志中查看文本 CloudWatch 日志
<a name="conversation-logs-cw"></a>

Amazon Lex 将您的对话文本日志存储在亚马逊 CloudWatch 日志中。要查看日志，您可以使用 CloudWatch 日志控制台或 API。有关更多信息，请参阅 *Amazon Logs 用户指南中的[使用筛选模式搜索CloudWatch 日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SearchDataFilterPattern.html)和 CloudWatch 日志*[见解查询语法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html)。

**使用 Amazon Lex 控制台查看日志**

1. 打开 Amazon Lex 控制台 [https://console.aws.amazon.com/lex](https://console.aws.amazon.com/lex)。

1. 从列表中，选择一个机器人。

1. 选择 **Settings (设置)** 选项卡，然后从左侧菜单中选择 **Conversation logs (对话日志)**。

1. 选择 “**文本日志**” 下的链接，在 CloudWatch 控制台中查看别名的日志。

您也可以使用 CloudWatch 控制台或 API 来查看日志条目。要查找日志条目，请导航到为该别名配置的日志组。您可以在 Amazon Lex 控制台中或使用 [GetBotAlias](API_GetBotAlias.md) 操作查找日志的日志流前缀。

用户话语的日志条目位于多个日志流中。对话中的一个话语在一个日志流中具有一个带指定前缀的条目。日志流中的条目包含以下信息。

```
{
   "messageVersion": "1.0",
   "botName": "bot name",
   "botAlias": "bot alias",
   "botVersion": "bot version",
   "inputTranscript": "text used to process the request",
   "botResponse": "response from the bot",
   "intent": "matched intent",
   "nluIntentConfidence": "number",
   "slots": {
       "slot name": "slot value",
       "slot name": null,
       "slot name": "slot value"
       ...
   },
   "alternativeIntents": [
       {
           "name": "intent name",
           "nluIntentConfidence": "number",
           "slots": {
               "slot name": slot value,
               "slot name": null,
               "slot name": slot value
               ...
           }
       },
       {
           "name": "intent name",
           "nluIntentConfidence": number,
           "slots": {}
       }
   ],
   "developerOverride": "true" | "false",
   "missedUtterance": true | false,
   "inputDialogMode": "Text" | "Speech",
   "requestId": "request ID",
   "s3PathForAudio": "S3 path to audio file",
   "userId": "user ID",
   "sessionId": "session ID",
   "sentimentResponse": {
       "sentimentScore": "{Positive: number, Negative: number, Neutral: number, Mixed: number}",
       "sentimentLabel": "Positive" | "Negative" | "Neutral" | "Mixed"
   },
   "slotToElicit": "slot name",
   "dialogState": "ElicitIntent" | "ConfirmIntent" | "ElicitSlot" | "Fulfilled" | "ReadyForFulfillment" | "Failed",
   "responseCard": {
       "genericAttachments": [
           ...
       ],
       "contentType": "application/vnd.amazonaws.card.generic",
       "version": 1
    },
   "locale": "locale",
   "timestamp": "ISO 8601 UTC timestamp",
   "kendraResponse": {
      "totalNumberOfResults": number,
      "resultItems": [
          {
              "id": "query ID",
              "type": "DOCUMENT" | "QUESTION_ANSWER" | "ANSWER",
              "additionalAttributes": [
                  {
                     ...
                  }
              ],
              "documentId": "document ID",
              "documentTitle": {
                  "text": "title",
                  "highlights": null
              },
              "documentExcerpt": {
                  "text": "text",
                  "highlights": [
                      {
                          "beginOffset": number,
                          "endOffset": number,
                          "topAnswer": true | false
                      }
                  ]
              },
              "documentURI": "URI",
              "documentAttributes": []
          }  
      ],
      "facetResults": [],
      "sdkResponseMetadata": {
          "requestId": "request ID"
      },
      "sdkHttpMetadata": {
          "httpHeaders": {
              "Content-Length": "number",
              "Content-Type": "application/x-amz-json-1.1",
              "Date": "date and time",
              "x-amzn-RequestId": "request ID"
          },
          "httpStatusCode": 200
      },
      "queryId": "query ID"
   },
   "sessionAttributes": {
       "attribute name": "attribute value"
       ...
    },
   "requestAttributes": {
       "attribute name": "attribute value"
       ...
    }
}
```

日志条目的内容取决于事务的结果以及自动程序和请求的配置。
+ 如果 `missedUtterance` 字段为 `true`，则 `intent`、`slots` 和 `slotToElicit` 字段不会显示在条目中。
+ 如果音频日志已禁用或者 `inputDialogMode` 字段为 `Text`，则不显示 `s3PathForAudio` 字段。
+ 仅当您为自动程序定义了响应卡时，才会显示 `responseCard` 字段。
+ 仅当您在请求中指定了请求属性时，才会显示 `requestAttributes` 映射。
+ 只有在 `AMAZON.KendraSearchIntent` 请求搜索 Amazon Kendra 索引时，`kendraResponse` 字段才会出现。
+ 当在机器人的 Lambda 函数中指定了替代意图时，`developerOverride` 字段的值为 True。
+ 仅当在请求中指定了会话属性时，才会显示 `sessionAttributes` 映射。
+ 仅当将自动程序配置为返回情绪值时，才会显示 `sentimentResponse` 映射。

**注意**  
输入格式可以更改，但不必对 `messageVersion` 做出相应更改。您的代码不应在有新字段时引发错误。

您必须设置角色和策略才能允许 Amazon Lex 写入 CloudWatch 日志。有关更多信息，请参阅 [用于对话日志的 IAM 策略](conversation-logs-policies.md)。

# 在 Amazon S3 中访问音频日志
<a name="conversation-logs-s3"></a>

Amazon Lex 将对话的音频日志存储在 S3 存储桶中。

**使用控制台访问音频日志**

1. 打开 Amazon Lex 控制台 [https://console.aws.amazon.com/lex](https://console.aws.amazon.com/lex)。

1. 从列表中，选择一个机器人。

1. 选择 **Settings (设置)** 选项卡，然后从左侧菜单中选择 **Conversation logs (对话日志)**。

1. 选择**音频日志**下的链接以在 Amazon S3 控制台中访问该别名的日志。

您也可以使用 Amazon S3 控制台或 API 来访问音频日志。您可以在 Amazon Lex 控制台或 `GetBotAlias` 操作响应的 `resourcePrefix` 字段中查看音频文件的 S3 对象键前缀。

# 使用 CloudWatch 指标监控对话日志状态
<a name="conversation-logs-monitoring"></a>

使用 Amazon CloudWatch 监控您的对话日志的交付指标。您可以在指标上设置警报，以便在日志记录发生问题时获取通知。

Amazon Lex 在 `AWS/Lex` 命名空间中为对话日志提供了四个指标：
+ `ConversationLogsAudioDeliverySuccess`
+ `ConversationLogsAudioDeliveryFailure`
+ `ConversationLogsTextDeliverySuccess`
+ `ConversationLogsTextDeliveryFailure`

有关更多信息，请参阅 [CloudWatch 对话日志的指标](monitoring-aws-lex-cloudwatch.md#cloudwatch-metrics-for-logging)。

成功指标表明 Amazon Lex 已成功将音频或文本日志写入其目标。

失败指标表明 Amazon Lex 无法将音频或文本日志传输到指定目标。这通常是配置错误。当您的失败指标大于零时，请检查以下内容：
+ 确保 Amazon Lex 是 IAM 角色的可信实体。
+ 对于文本记录，请确保 CloudWatch 日志组存在。对于音频日志记录，请确保 S3 存储桶存在。
+ 确保 Amazon Lex 用于访问 CloudWatch 日志日志组或 S3 存储桶的 IAM 角色具有日志组或存储桶的写入权限。
+ 确保 S3 存储桶与 Amazon Lex 机器人位于相同的区域，并且属于您的账户。
+ 如果您使用 AWS KMS 密钥进行 S3 加密，请确保没有任何策略阻止 Amazon Lex 使用您的密钥，并确保您提供的 IAM 角色具有必要的 AWS KMS 权限。有关更多信息，请参阅 [用于对话日志的 IAM 策略](conversation-logs-policies.md)。

# 使用 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` 字段。

# 自动程序部署选项
<a name="chatbot-service"></a>

目前，Amazon Lex 提供以下机器人部署选项：
+ [AWS 移动软件开发工具包](https://aws.amazon.com/mobile/sdk/) — 您可以使用 AWS 移动设备构建与 Amazon Lex 通信的移动应用程序 SDKs。
+ Facebook Messenger — 您可将 Facebook Messenger 页面与 Amazon Lex 机器人集成，以便 Facebook 上的最终用户能够与机器人通信。在当前实现中，此集成仅支持文本输入消息。
+ Slack — 您可以将 Amazon Lex 机器人与 Slack 消息收发应用程序集成。
+ Twilio — 您可以将 Amazon Lex 机器人与 Twilio Simple Messaging Service (SMS) 集成。

有关示例，请参阅 [部署 Amazon Lex 机器人](examples.md)。

# 内置目的和槽类型
<a name="howitworks-builtins"></a>

为了更方便地创建机器人，Amazon Lex 支持使用标准内置意图和插槽类型。

**Topics**
+ [内置目的](howitworks-builtins-intents.md)
+ [内置槽类型](howitworks-builtins-slots.md)

# 内置目的
<a name="howitworks-builtins-intents"></a>

对于常见操作，您可以使用标准内置意图库。要基于内置意图创建意图，请在控制台中选择一个内置意图，为其指定新名称。新意图将具有基础意图的配置，例如示例言语。

在当前实现中，不能执行以下操作：
+ 向基础意图添加示例言语，或从基础意图中删除示例言语
+ 为内置意图配置槽

**向机器人添加内置意图**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择要向其添加内置意图的机器人。

1. 在导航窗格中，选择**目的**旁边的加号 (\$1)。

1. 对于**添加目的**，选择**搜索现有目的**。

1. 在**搜索意图**框中，键入要添加到您的机器人的内置意图的名称。

1. 对于**复制内置意图**，为意图提供名称，然后选择**添加**。

1. 根据需要为您的机器人配置意图。

**Topics**
+ [AMAZON.CancelIntent](built-in-intent-cancel.md)
+ [AMAZON.FallbackIntent](built-in-intent-fallback.md)
+ [AMAZON.HelpIntent](built-in-intent-help.md)
+ [AMAZON.KendraSearchIntent](built-in-intent-kendra-search.md)
+ [AMAZON.PauseIntent](built-in-intent-pause.md)
+ [AMAZON.RepeatIntent](built-in-intent-repeat.md)
+ [AMAZON.ResumeIntent](built-in-intent-resume.md)
+ [AMAZON.StartOverIntent](built-in-intent-start-over.md)
+ [AMAZON.StopIntent](built-in-intent-stop.md)

**注意**  
对于英语（美国）(en-US) 区域设置，Amazon Lex 支持 Alexa 标准内置意图中的意图。有关内置目的的列表，请参阅 [Alexa Skills Kit](https://developer.amazon.com/docs/custom-skills/standard-built-in-intents.html) 中的*标准内置目的*。  
Amazon Lex 不支持以下意图：  
`AMAZON.YesIntent`
`AMAZON.NoIntent` 
[Alexa Skills Kit](https://developer.amazon.com/docs/custom-skills/built-in-intent-library.html) 中的*内置目的库*中的目的 

# AMAZON.CancelIntent
<a name="built-in-intent-cancel"></a>

对表示用户要取消当前交互的词语和短语的响应。在结束与用户的交互之前，您的应用程序可以使用此意图来删除插槽类型值和其他属性。

常见言语：
+ 取消
+ 没关系
+ 算了

# AMAZON.FallbackIntent
<a name="built-in-intent-fallback"></a>

当意图的用户输入与机器人的预期不符时，您可以配置 Amazon Lex 以调用*回退意图*。例如，如果用户输入“我想要订购糖果”，与 `OrderFlowers` 机器人中的意图不匹配，Amazon Lex 会调用回退意图来处理该响应。

您可以通过向自动程序添加内置 `AMAZON.FallbackIntent` 目的类型来添加回退目的。您可以使用 [PutBot](API_PutBot.md) 操作指定目的，也可以从控制台的内置目的列表中选择目的。

调用回退意图分两步。在第一步中，基于用户的输入来匹配回退意图。匹配回退意图时，自动程序的行为方式取决于为提示配置的重试次数。例如，如果确定目的的最大尝试次数为 2，则自动程序会在调用回退目的之前两次返回自动程序的澄清提示。

在以下情况下，Amazon Lex 与回退意图匹配：
+ 用户输入到意图的内容不符合自动程序的预期
+ 音频输入为噪声，或文本输入未被识别为单词。
+ 用户的输入不明确且 Amazon Lex 无法确定要调用的意图。

在以下情况下调用回退意图：
+ 对话开始后，经过配置的澄清尝试次数后，自动程序无法将用户输入识别为目的。
+ 经过配置的尝试次数后，意图无法将用户输入识别为槽位值。
+ 经过配置的尝试次数后，意图无法将用户输入识别为对确认提示的响应。

您可以将以下各项与回退目的结合使用：
+ 履行 Lambda 函数
+ 结论语句
+ 跟进提示

您不能将以下内容添加到回退意图：
+ 言语
+ 槽值
+ 初始化和验证 Lambda 函数 
+ 确认提示

如果您同时为机器人配置了取消语句和回退意图，Amazon Lex 将使用回退意图。如果您需要机器人具有取消语句，则可以将履行功能用于回退意图，以提供与取消语句相同的行为。有关更多信息，请参阅 [PutBot](API_PutBot.md) 操作的 `abortStatement` 参数。

## 使用澄清提示
<a name="fallback-clarification"></a>

如果您向自动程序提供了一个澄清提示，则该提示将用于向用户征求有效目的。该澄清提示将重复您配置的次数。此后，将调用回退目的。

如果您在创建机器人时未设置澄清提示，并且用户未使用有效意图开始对话，则 Amazon Lex 会立即调用您的回退意图。

当您在没有澄清提示的情况下使用回退意图时，Amazon Lex 在以下情况下不会调用回退意图：
+ 当用户响应跟进提示但不提供目的时。例如，在响应后续提示（“您今天还想要其他东西吗？”）时，用户说“是”。由于 Amazon Lex 没有发送给用户以获取用户意图的澄清提示，因此它会返回“400 错误请求”异常。
+ 使用 AWS Lambda 函数时，会返回`ElicitIntent`对话框类型。由于 Amazon Lex 没有用于获取用户意图的澄清提示，因此它会返回“400 错误请求”异常。
+ 当使用 `PutSession` 操作时，您发送一个 `ElicitIntent` 对话类型。由于 Amazon Lex 没有用于获取用户意图的澄清提示，因此它会返回“400 错误请求”异常。

## 使用具有回退意图的 Lambda 函数
<a name="invoke-fallback"></a>

调用回退目的时，响应取决于 [PutIntent](API_PutIntent.md) 操作的 `fulfillmentActivity` 参数设置。自动程序执行下列操作之一：
+ 将意图信息返回给客户端应用程序。
+ 调用履行 Lambda 函数。它通过为会话设置的会话变量调用该函数。

有关设置在调用回退目的时的响应的更多信息，请参见 [PutIntent](API_PutIntent.md) 操作的 `fulfillmentActivity` 参数。

如果在回退意图中使用履行 Lambda 函数，则可以使用此函数来调用另一个意图或与用户进行某种形式的通信，例如收集回叫号码或与客户服务代表进行会话。

您可以在回退意图 Lambda 函数中执行任何您可以在任何其他意图的履行函数中执行的操作。有关使用创建发货功能的更多信息 AWS Lambda，请参阅[使用 Lambda 函数](using-lambda.md)。

回退意图可以在同一会话中多次调用。例如，假设您的 Lambda 函数使用 `ElicitIntent` 对话操作来提示用户输入一个不同的意图。如果 Amazon Lex 在配置的尝试次数后无法推断用户的意图，将再次调用回退意图。当用户在配置的尝试次数后未使用有效的槽位值进行响应时，它也会调用回退意图。

您可以配置一个 Lambda 函数来跟踪使用会话变量调用回退意图的次数。如果该意图的调用次数超过了 Lambda 函数中设置的阈值，则该函数可以采取不同的操作。有关会话变量的更多信息，请参阅[设置会话属性](context-mgmt-session-attribs.md)。

# AMAZON.HelpIntent
<a name="built-in-intent-help"></a>

对表示用户在与机器人交互时需要帮助的词语或短语的响应。调用此意图时，您可以对您的 Lambda 函数或应用程序进行配置，以便提供有关机器人功能的信息、询问有关需要帮助的方面的后续问题，或者将交互移交给人工客服。

常见言语：
+ help
+ 我需要帮助
+ 可以帮帮我吗

# AMAZON.KendraSearchIntent
<a name="built-in-intent-kendra-search"></a>

要搜索已使用 Amazon Kendra 编制索引的文档，请使用 `AMAZON.KendraSearchIntent` 意图。在与用户进行的对话中，如果 Amazon Lex 无法确定下一个操作，则会触发搜索意图。

`AMAZON.KendraSearchIntent` 仅适用于英语（美国）(en-US) 区域设置以及美国东部（弗吉尼亚州北部）、美国西部（俄勒冈州）和欧洲地区（爱尔兰）区域。

Amazon Kendra 是一项 machine-learning-based搜索服务，用于索引 PDF 文档或微软 Word 文件等自然语言文档。它可以搜索已编制索引的文档并为问题返回以下类型的响应：
+ 答案 
+ 可能是问题答案的常见问题解答条目
+ 与问题相关的文档

有关使用 `AMAZON.KendraSearchIntent` 的示例，请参阅[示例：为 Amazon Kendra 索引创建常见问题机器人](faq-bot-kendra-search.md)。

如果您为机器人配置了 `AMAZON.KendraSearchIntent` 意图，则 Amazon Lex 在无法确定插槽或意图的用户言语时，会调用该意图。例如，如果您的机器人引发名为“披萨配料”的插槽类型的响应，而用户问的是“什么是披萨？”，Amazon Lex 将调用 `AMAZON.KendraSearchIntent` 来处理此问题。如果没有来自 Amazon Kendra 的响应，则对话将按照机器人中的配置继续进行。

当您在同一机器人中同时使用 `AMAZON.KendraSearchIntent` 和 `AMAZON.FallbackIntent` 时，Amazon Lex 将按照以下方式使用意图：

1. Amazon Lex 调用 `AMAZON.KendraSearchIntent`。该意图调用 Amazon Kendra `Query` 操作。

1. 如果 Amazon Kendra 返回响应，则 Amazon Lex 向用户显示该结果。

1. 如果没有来自 Amazon Kendra 的响应，则 Amazon Lex 将重新提示用户。下一个操作取决于用户的响应。
   + 如果用户的响应包含 Amazon Lex 可识别的言语（例如填充插槽值或确认意图），则与用户的对话将按照机器人的配置继续进行。
   + 如果用户的响应未包含 Amazon Lex 可识别的言语，则 Amazon Lex 将再次调用 `Query` 操作。

1. 如果在配置的重试次数之后没有响应，Amazon Lex 将调用 `AMAZON.FallbackIntent` 并结束与用户的对话。

有三种方法可以使用 `AMAZON.KendraSearchIntent` 向 Amazon Kendra 发出请求：
+ 让搜索意图为您提出请求。Amazon Lex 以用户的言语作为搜索字符串调用 Amazon Kendra。在创建意图时，您可以定义限制 Amazon Kendra 返回的响应数的查询筛选条件字符串。Amazon Lex 使用查询请求中的筛选条件。
+ 使用您的对话 Lambda 函数向请求添加其他查询参数以缩小搜索结果范围。您将包含 Amazon Kendra 查询参数的 `kendraQueryFilterString` 字段添加到 `delegate` 对话操作。使用 Lambda 函数向请求添加查询参数时，这些查询参数将优先于您在创建意图时定义的查询筛选条件。
+ 使用对话 Lambda 函数创建新查询。您可以创建 Amazon Lex 发送的完整 Amazon Kendra 查询请求。您可以在 `delegate` 对话操作的 `kendraQueryRequestPayload` 字段中指定查询。`kendraQueryRequestPayload` 字段优先于 `kendraQueryFilterString` 字段。

要在创建机器人时指定 `queryFilterString` 参数，或者在对话 Lambda 函数中调用 `delegate` 操作时指定 `kendraQueryFilterString` 字段，请指定用作 Amazon Kendra 查询的属性筛选条件的字符串。如果字符串不是有效的属性筛选器，您将在运行时收到 `InvalidBotConfigException` 异常。有关属性筛选条件的更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[使用文档属性筛选查询](https://docs.aws.amazon.com/kendra/latest/dg/filtering.html#search-filtering)。

要控制 Amazon Lex 发送到 Amazon Kendra 的查询，您可以在对话 Lambda 函数的 `kendraQueryRequestPayload` 字段中指定查询。如果查询无效，则 Amazon Lex 返回 `InvalidLambdaResponseException` 异常。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[查询操作](https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html)。

有关如何使用 `AMAZON.KendraSearchIntent` 的示例，请参阅[示例：为 Amazon Kendra 索引创建常见问题机器人](faq-bot-kendra-search.md)。

## Amazon Kendra 搜索的 IAM 策略
<a name="kendra-search-iam"></a>

要使用该`AMAZON.KendraSearchIntent`意图，您必须使用能够提供 AWS Identity and Access Management (IAM) 策略的角色，这些策略允许 Amazon Lex 担任有权调用 Amazon Kendra `Query` 意图的运行时角色。您使用的 IAM 设置取决于您是使用 Amazon Lex 控制台创建，还是使用 AWS 开发工具包或 AWS Command Line Interface (AWS CLI) 创建。`AMAZON.KendraSearchIntent`使用控制台时，您可以选择向 Amazon Lex 服务相关角色添加调用 Amazon Kendra 的权限，或使用专门用于调用 Amazon Kendra `Query` 操作的角色。使用 AWS CLI 或 SDK 创建 Intent 时，必须使用专门用于调用`Query`操作的角色。

### 附加权限
<a name="kendra-iam-attach"></a>

您可以使用控制台将访问 Amazon Kendra `Query` 操作的权限附加到默认 Amazon Lex 服务相关角色。当您将权限附加到服务相关角色时，无需专门创建和管理运行时角色即可连接到 Amazon Kendra 索引。

用于访问 Amazon Lex 控制台的用户、角色或组必须有权限管理角色策略。将以下 IAM 策略附加到控制台访问角色。当您授予这些权限时，角色将有权更改现有服务相关角色策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:GetRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots"
        },
        {
            "Effect": "Allow",
            "Action": "iam:ListRoles",
            "Resource": "*"
        }
    ]
}
```

------

### 指定角色
<a name="kendra-iam-role"></a>

您可以使用控制台 AWS CLI、或 API 来指定在调用 Amazon Kendra `Query` 操作时要使用的运行时角色。

用于指定运行时角色的用户、角色或组必须具有 `iam:PassRole` 权限。以下策略定义权限。您可以使用 `iam:AssociatedResourceArn` 和 `iam:PassedToService` 条件上下文键进一步限制权限的范围。有关更多信息，请参阅*AWS Identity and Access Management 用户指南*[中的 IAM 和 AWS STS 条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/role"
        }
    ]
}
```

------

Amazon Lex 调用 Amazon Kendra 时所需使用的运行时角色必须具有 `kendra:Query` 权限。当您使用现有 IAM 角色获取调用 Amazon Kendra `Query` 操作的权限时，该角色必须附加以下策略。

您可以使用 IAM 控制台、IAM API 或 AWS CLI 创建策略并将其附加到角色。这些说明使用 AWS CLI 创建角色和策略。

**注意**  
以下代码针对 Linux 和 macOS 编排了格式。对于 Windows，将 Linux 行继续符（\$1）替换为脱字号（^）。

**向角色添加 Query 操作权限**

1. 在当前目录中创建一个名为 **KendraQueryPolicy.json** 的文档，向其中添加以下代码并保存

1. 在中 AWS CLI，运行以下命令来创建用于运行 Amazon Kendra `Query` 操作的 IAM 策略。

   ```
   aws iam create-policy \
       --policy-name query-policy-name \
       --policy-document file://KendraQueryPolicy.json
   ```

1. 将该策略附加到用于调用 `Query` 操作的 IAM 角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::account-id:policy/query-policy-name
       --role-name role-name
   ```

您可以选择更新 Amazon Lex 服务相关角色或使用您在为机器人创建 `AMAZON.KendraSearchIntent` 时所创建的角色。以下过程演示如何选择要使用的 IAM 角色。

**为亚马逊指定运行时角色。 KendraSearchIntent**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择要向其添加 `AMAZON.KendraSearchIntent` 的自动程序。

1. 选择**意图**旁边的加号（\$1）。

1. 在**添加意图**中，选择**搜索现有意图**。

1. 在**搜索意图**中，输入 **AMAZON.KendraSearchIntent**，然后选择**添加**。

1. 在**复制内置意图**中，输入意图的名称，如 **KendraSearchIntent**，然后选择**添加**。

1. 打开 **Amazon Kendra 查询**部分。

1. 对于 **IAM 角色**，选择下列选项之一：
   + 要更新 Amazon Lex 服务相关角色以便机器人能够查询 Amazon Kendra 索引，请选择**添加 Amazon Kendra 权限**。
   + 要使用有权调用 Amazon Kendra `Query` 操作的角色，请选择**使用现有角色**。

## 使用请求和会话属性作为筛选器
<a name="kendra-search-filter"></a>

要从来自 Amazon Kendra 的响应中筛选出与当前对话相关的项目，请在创建机器人时添加 `queryFilterString` 参数以使用会话和请求属性作为筛选条件。您可以在创建意图时指定属性的占位符，以便 Amazon Lex V2 在调用 Amazon Kendra 之前将其替换为值。有关请求属性的更多信息，请参阅[设置请求属性](context-mgmt-request-attribs.md)。有关会话属性的更多信息，请参阅 [设置会话属性](context-mgmt-session-attribs.md)。

以下是使用字符串来筛选 Amazon Kendra 查询的 `queryFilterString` 参数示例。

```
"{"equalsTo": {"key": "City", "value": {"stringValue": "Seattle"}}}"
```

以下是使用名为 `"SourceURI"` 的会话属性来筛选 Amazon Kendra 查询的 `queryFilterString` 参数示例。

```
"{"equalsTo": {"key": "SourceURI","value": {"stringValue": "[FileURL]"}}}"
```

以下是使用名为 `"DepartmentName"` 的请求属性来筛选 Amazon Kendra 查询的 `queryFilterString` 参数示例。

```
"{"equalsTo": {"key": "Department","value": {"stringValue": "((DepartmentName))"}}}"
```

`AMAZON.KendraSearchInteng` 筛选条件使用的格式与 Amazon Kendra 搜索筛选条件的格式相同。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[使用文档属性筛选搜索结果](https://docs.aws.amazon.com/kendra/latest/dg/filtering.html#search-filtering)。

与 `AMAZON.KendraSearchIntent` 一起使用的查询筛选条件字符串必须确保每个筛选条件的首字母为小写字母。例如，以下是 `AMAZON.KendraSearchIntent` 的有效查询筛选条件。

```
{
    "andAllFilters": [
        {
            "equalsTo": {
                "key": "City",
                "value": {
                    "stringValue": "Seattle"
                }
            }
        },
        {
            "equalsTo": {
                "key": "State",
                "value": {
                    "stringValue": "Washington"
                }
            }
        }
    ]
}
```

## 使用搜索响应
<a name="kendra-search-response"></a>

Amazon Kendra 在意图的 `conclusion` 语句中返回搜索的响应。除非履行 Lambda 函数生成结论消息，否则意图必须具有 `conclusion` 语句。

Amazon Kendra 有四种类型的响应。
+ `x-amz-lex:kendra-search-response-question_answer-question-<N>` — 与搜索匹配的常见问题中的问题。
+ `x-amz-lex:kendra-search-response-question_answer-answer-<N>` — 与搜索匹配的常见问题中的答案。
+ `x-amz-lex:kendra-search-response-document-<N>` — 索引中与言语文本相关的文档摘录。
+ `x-amz-lex:kendra-search-response-document-link-<N>` — 索引中与言语文本相关的文档的 URL。
+ `x-amz-lex:kendra-search-response-answer-<N>` — 索引中能作为问题答案的文档摘录。

在 `request` 属性中返回响应。每个属性最多可以具有五个响应，编号为 1 到 5。有关响应的更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[响应类型](https://docs.aws.amazon.com/kendra/latest/dg/response-types.html)。

`conclusion` 语句必须具有一个或多个消息组。每个消息组都包含一条或多条消息。每条消息均可以包含一个或多个占位符变量，这些变量替换为来自 Amazon Kendra 的响应中的请求属性。消息组中必须至少有一条消息的所有变量都由运行时响应中的请求属性值替换，或者组中必须有一条没有占位符变量的消息。请求属性使用双括号（“（（”“））”）进行设置。以下消息组消息与来自 Amazon Kendra 的任何响应匹配：
+ “我为你找到了一个常见问题解答问题：((x-amz-lex: kendra-search-response-question \$1answer-question-1))，答案是 ((: \$1answer-answer-answer-1))” x-amz-lex kendra-search-response-question
+ “我找到了一份有用的文档的摘录：((x-amz-lex: kendra-search-response-document -1))”
+ “我想你的问题的答案是 ((x-amz-lex: kendra-search-response-answer -1))”

## 使用 Lambda 函数管理请求和响应
<a name="kendra-search-lambda"></a>

`AMAZON.KendraSearchIntent` 意图可以使用您的对话代码挂钩和履行代码挂钩来管理对 Amazon Kendra 的请求和响应。当您想要修改发送到 Amazon Kendra 的查询时，请使用对话代码挂钩 Lambda 函数；当您想要修改响应时，请使用履行代码挂钩 Lambda 函数。

### 使用对话代码挂钩创建查询
<a name="kendra-search-lambda-dialog"></a>

您可以使用对话代码挂钩创建要发送到 Amazon Kendra 的查询。使用对话代码挂钩是可选的。如果您未指定对话代码挂钩，则 Amazon Lex 会根据用户言语来构造查询并使用您在配置意图时提供的 `queryFilterString`（如有）。

您可以在对话代码挂钩响应中使用两个字段来修改对 Amazon Kendra 的请求：
+ `kendraQueryFilterString` — 使用此字符串为 Amazon Kendra 请求指定属性筛选条件。您可以使用索引中定义的任何索引字段筛选查询。有关筛选字符串的结构，请参阅《Amazon Kendra 开发人员指南》**中的[使用文档属性筛选查询](https://docs.aws.amazon.com/kendra/latest/dg/filtering.html#search-filtering)。如果指定的筛选器字符串无效，则会出现 `InvalidLambdaResponseException` 异常。`kendraQueryFilterString` 字符串将覆盖为意图配置的 `queryFilterString` 中指定的任何查询字符串。
+ `kendraQueryRequestPayload` — 使用此字符串指定 Amazon Kendra 查询。您的查询可以使用 Amazon Kendra 的任何功能。如果您没有指定有效的查询，则会出现 `InvalidLambdaResponseException` 异常。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[查询](https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html)。

创建筛选条件或查询字符串后，将响应发送到 Amazon Lex，并将响应的 `dialogAction` 字段设置为 `delegate`。Amazon Lex 将查询发送到 Amazon Kendra，然后将查询响应返回给履行代码挂钩。

### 对响应使用实现代码挂钩
<a name="kendra-search-lambda-fulfillment"></a>

在 Amazon Lex 将查询发送到 Amazon Kendra 后，查询响应将返回到 `AMAZON.KendraSearchIntent` 履行 Lambda 函数。代码挂钩的输入事件包含来自 Amazon Kendra 的完整响应。查询数据与 Amazon Kendra `Query` 操作返回的结构相同。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的[查询响应语法](https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html#API_Query_ResponseSyntax)。

实现代码挂钩是可选的。如果代码挂钩不存在，或者代码挂钩未在响应中返回消息，则 Amazon Lex 将对响应使用 `conclusion` 语句。

# 示例：为 Amazon Kendra 索引创建常见问题机器人
<a name="faq-bot-kendra-search"></a>

此示例创建一个使用 Amazon Kendra 索引为用户的问题提供答案的 Amazon Lex 机器人。常见问题解答自动程序为用户管理对话。它使用 `AMAZON.KendraSearchIntent` 意图查询索引并向用户提供响应。创建自动程序：

1. 创建一个自动程序，您的客户将与其交互以从其获取答案。

1. 创建自定义意图。您的自动程序至少需要一个至少具有一种表达的目的。此意图使您能够构建自动程序，但不用于其他方面。

1. 将 `KendraSearchIntent` 意图添加到机器人中，并将其配置为与 Amazon Kendra 索引配合使用。

1. 通过询问可用存储在 Amazon Kendra 索引中的文档回答的问题来测试机器人。

在使用此示例之前，您需要创建 Amazon Kendra 索引。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的 [Getting started with an S3 bucket (console)](https://docs.aws.amazon.com/kendra/latest/dg/gs-console.html)。

**创建常见问题解答自动程序**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 在导航窗格中，选择**自动程序**。

1. 选择**创建**。

1. 选择 **Custom bot (自定义自动工具)**。按下面所示配置自动程序：
   + **机器人名称** — 为机器人提供一个指示其用途的名称，例如 **KendraTestBot**。
   + **输出语音** — 选择**无**。
   + **会话超时** — 输入 **5**。
   + **情绪分析** — 选择**否**。
   + **COPPA** — 选择**否**。
   + **用户言语存储** — 选择**不存储**。

1. 选择**创建**。

要成功构建自动程序，您必须至少创建一个至少具有一种示例表达的目的。该意图是构建 Amazon Lex 机器人所必需的，但不用于常见问题响应。目的的表达不得应用于客户询问的任何问题。

**创建所需的目的**

1. 在**自动程序入门**页面上，选择**创建目的**。

1. 对于**添加目的**，选择**创建目的**。

1. 在**创建目的**对话框中，为该目的提供一个名称，例如 **RequiredIntent**。

1. 对于**示例表达**，键入一种表达，例如 **Required utterance**。

1. 选择**保存意图**。

现在，创建搜索 Amazon Kendra 索引的意图以及它应返回的响应消息。

**创建亚马逊。 KendraSearchIntent 意图和响应消息**

1. 在导航窗格中，选择**目的**旁边的加号 (\$1)。

1. 对于**添加目的**，选择**搜索现有目的**。

1. 在**搜索意图**框中，输入 **AMAZON.KendraSearchIntent**，然后从列表中选择它。

1. 对于**复制内置目的**，为目的提供名称，如 **KendraSearchIntent**，然后选择**添加**。

1. 在目的编辑器中，选择 **Amazon Kendra 查询**以打开查询选项。

1. 从 **Amazon Kendra 索引**菜单中，选择您希望目的搜索的索引。

1. 在**响应**部分中，添加以下三条消息：

   ```
   I found a FAQ question for you: ((x-amz-lex:kendra-search-response-question_answer-question-1)) and the answer is ((x-amz-lex:kendra-search-response-question_answer-answer-1)).
   I found an excerpt from a helpful document: ((x-amz-lex:kendra-search-response-document-1)).
   I think the answer to your questions is ((x-amz-lex:kendra-search-response-answer-1)).
   ```

1. 选择**保存意图**，然后选择**构建**以构建自动程序。

最后，使用控制台测试窗口来测试来自自动程序的响应。您的问题应位于索引支持的域中。

**测试常见问题解答自动程序**

1. 在控制台测试窗口中，为您的索引键入一个问题。

1. 验证测试窗口的响应部分中的答案。

1. 要为其他问题重置测试窗口，请选择**清除聊天历史记录**。

# AMAZON.PauseIntent
<a name="built-in-intent-pause"></a>

对允许用户暂停与机器人的交互以便稍后返回到该交互的词语和短语的响应。您的 Lambda 函数或应用程序需要将意图数据保存在会话变量中，或者在恢复当前意图时，您需要使用 [GetSession](API_runtime_GetSession.md) 操作来检索意图数据。

常见言语：
+ 暂停
+ 暂停一下

# AMAZON.RepeatIntent
<a name="built-in-intent-repeat"></a>

对允许用户重复上一条消息的词语和短语的响应。您的应用程序需要使用 Lambda 函数将之前的意图信息保存在会话变量中，或者您需要使用 [GetSession](API_runtime_GetSession.md) 操作来获取之前的意图信息。

常见言语：
+ 重复
+ 再说一遍
+ 重复一遍

# AMAZON.ResumeIntent
<a name="built-in-intent-resume"></a>

对允许用户恢复上一个已暂停意图的词语和短语的响应。您的 Lambda 函数或应用程序必须管理恢复上一个意图所需的信息。

常见言语：
+ 继续
+ 继续
+ 继续下去

# AMAZON.StartOverIntent
<a name="built-in-intent-start-over"></a>

对允许用户停止处理当前意图并从头开始的词语和短语的响应。您可以使用 Lambda 函数或 `PutSession` 操作再次引发第一个插槽。

常见言语：
+ 从头开始
+ 重新开始
+ 再次开始

# AMAZON.StopIntent
<a name="built-in-intent-stop"></a>

对表示用户想要停止处理当前意图并结束与机器人的交互的词语和短语的响应。您的 Lambda 函数或应用程序应清除所有现有属性和插槽类型值，然后结束该交互。

常见言语：
+ stop
+ off
+ 不要说了

# 内置槽类型
<a name="howitworks-builtins-slots"></a>

Amazon Lex 支持内置插槽类型，用于定义如何识别和处理插槽中的数据。您可以在您的意图中创建这些类型的槽。因此，无需为常用槽数据（如日期、时间和位置）创建枚举值。内置槽类型没有版本。


| 槽位类型 | 简短描述 | 支持的区域设置 | 
| --- | --- | --- | 
| [AMAZON.Airport](built-in-slot-airport.md) | 识别代表机场的词语。 | 所有区域设置 | 
| [亚马逊。 AlphaNumeric](built-in-slot-alphanumeric.md) | 识别由字母和数字组成的单词。 | 除韩语 (ko-KR) 之外的所有区域设置 | 
| [AMAZON.City](built-in-slot-city.md) | 识别代表城市的词语。 | 所有区域设置 | 
| [AMAZON.Country](built-in-slot-country.md) | 识别代表国家/地区的词语。 | 所有区域设置 | 
| [AMAZON.DATE](built-in-slot-date.md) | 识别代表日期的词语并将其转换为标准格式。 | 所有区域设置 | 
| [AMAZON.DURATION](built-in-slot-duration.md) | 识别代表持续时间的词语并将其转换为标准格式。 | 所有区域设置 | 
| [亚马逊。 EmailAddress](built-in-slot-email.md) | 识别表示电子邮件地址的词语并将其转换为标准电子邮件地址。 | 所有区域设置 | 
| [亚马逊。 FirstName](built-in-slot-first-name.md) | 识别代表名字的词语。 | 所有区域设置 | 
| [亚马逊。 LastName](built-in-slot-last-name.md) | 识别代表姓氏的词语。 | 所有区域设置 | 
| [AMAZON.NUMBER](built-in-slot-number.md) | 识别数字词语并将其转换为数字。 | 所有区域设置 | 
| [AMAZON.Percentage](built-in-slot-percent.md) | 识别表示百分比的词语并将其转换为一个数字和一个百分比符号（%）。 | 所有区域设置 | 
| [亚马逊。 PhoneNumber](built-in-slot-phone.md) | 识别表示电话号码的词语并将其转换为数字字符串。 | 所有区域设置 | 
| [亚马逊。 SpeedUnit](built-in-slot-speed.md) | 识别表示速度单位的词语并将其转换为标准缩写。 | 英语（美国）(en-US) | 
| [AMAZON.State](built-in-slot-state.md) | 识别代表省/市/自治区的词语。 | 所有区域设置 | 
| [亚马逊。 StreetName](built-in-slot-street-name.md) | 识别代表街道名称的词语。 | 除英语（美国）(en-US) 之外的所有区域设置 | 
| [AMAZON.TIME](built-in-slot-time.md) | 识别指示时间的词语并将其转换为时间格式。 | 所有区域设置 | 
| [亚马逊。 WeightUnit](built-in-slot-weight.md) | 识别表示重量单位的词语并将其转换为标准缩写  | 英语（美国）(en-US) | 

**注意**  
对于英语（美国）(en-US) 区域设置，Amazon Lex 支持 Alexa Skills Kit 中的插槽类型。有关可用内置槽类型的列表，请参阅 Alexa Skills Kit 文档中的[槽类型参考](https://developer.amazon.com/docs/custom-skills/slot-type-reference.html)。  
Amazon Lex 不支持 `AMAZON.LITERAL` 或 `AMAZON.SearchQuery` 内置插槽类型。

# AMAZON.Airport
<a name="built-in-slot-airport"></a>

提供机场列表。示例包括：
+ 约翰·菲茨杰拉德·肯尼迪国际机场
+ 墨尔本机场

# 亚马逊。 AlphaNumeric
<a name="built-in-slot-alphanumeric"></a>

识别由字母和数字组成的字符串，例如 **APQ123**。

此插槽类型在韩语 (ko-KR) 区域设置中不可用。

您可以对包含以下内容的字符串使用 `AMAZON.AlphaNumeric` 槽类型：
+ 字母字符，例如 **ABC**
+ 数字字符，例如 **123**
+ 字母数字字符的组合，例如 **ABC123**

您可以向 `AMAZON.AlphaNumeric` 槽类型添加正则表达式以验证为槽输入的值。例如，您可以使用正则表达式来验证：
+ 英国或加拿大邮政编码
+ 驾照编号
+ 车辆识别号码

使用标准正则表达式。Amazon Lex 支持在正则表达式中使用以下字符：
+ A-Z, a-z
+ 0-9

Amazon Lex 在正则表达式中也支持 Unicode 字符。格式为 `\uUnicode`。使用四位数表示 Unicode 字符。例如，`[\u0041-\u005A]` 等同于 [A-Z]。

不支持以下正则表达式运算符：
+ 无限重复符：\$1、\$1 或 \$1x,\$1，无上限。
+ 通配符（.）

正则表达式的最大长度为 300 个字符。存储在 AMAZON 中的字符串的最大长度。 AlphaNumeric 使用正则表达式的插槽类型为 30 个字符。

以下是一些示例正则表达式。
+ 字母数字字符串，例如 **APQ123** 或 **APQ1**：`[A-Z]{3}[0-9]{1,3}` 或更受约束的 `[A-DP-T]{3} [1-5]{1,3}`
+ 美国邮政服务优先邮件国际格式，例如 **CP123456789US**：`CP[0-9]{9}US`
+ 银行汇款路径号码，例如 **123456789**：`[0-9]{9}`

要为槽类型设置正则表达式，请使用控制台或 [PutSlotType](API_PutSlotType.md) 操作。保存槽类型时验证正则表达式。如果表达式无效，Amazon Lex 将返回错误消息。

在插槽类型中使用正则表达式时，Amazon Lex 会根据正则表达式检查该类型的插槽的输入。如果输入与表达式匹配，则接受槽的值。如果输入不匹配，Amazon Lex 提示用户重复输入。

# AMAZON.City
<a name="built-in-slot-city"></a>

提供本地和世界城市列表。插槽类型可以识别城市名称的常见变体。Amazon Lex 不会从变体转换为官方名称。

示例：
+ New York
+ 雷克雅未克
+ 东京
+ 凡尔赛

# AMAZON.Country
<a name="built-in-slot-country"></a>

世界各个国家/地区的名字。示例：
+ 澳大利亚
+ 德国
+ 日本
+ 美国
+ 乌拉圭

# AMAZON.DATE
<a name="built-in-slot-date"></a>

将表示日期的词语转换为日期格式。

日期以 ISO-8601 日期格式提供给您的意图。您的意图在插槽中收到的日期可能会有所不同，具体取决于用户说出的特定短语。
+ 映射到特定日期的言语（例如“今天”、“现在”或“11 月 25 日”）会转换为完整的日期：`2020-11-25`。默认为当前日期*当天或之后*的日期。
+ 映射到特定星期的言语（例如“本周”或“下周”）会转换为一周的第一天的日期。在 ISO-8601 格式中，一周从星期一开始，到星期日结束。例如，如果今天是 2020 年 11 月 25 日，则“下周”会转换为 `2020-11-30`。
+ 映射到月但不是特定日期（例如“下个月”）的言语会转换为该月的最后一天。例如，如果今天是 2020 年 11 月 25 日，则“下个月”会转换为 `2020-12-31`。
+ 映射到年但不是特定月份或日期（例如“下一年”）的言语会转换为下一年的最后一天。例如，如果今天是 2020 年 11 月 25 日，则“下一年”会转换为 `2021-12-31`。

# AMAZON.DURATION
<a name="built-in-slot-duration"></a>

将表示持续时间的词语转换为数字持续时间。

持续时间被解析为基于 [ISO-8601 持续时间格式](https://en.wikipedia.org/wiki/ISO_8601#Durations)的格式 `PnYnMnWnDTnHnMnS`。`P` 表示这是持续时间，`n` 是数值，`n` 后面的大写字母是特定的日期或时间元素。例如，`P3D` 表示 3 天。`T` 用于表示其余值代表时间元素而不是日期元素。

示例：
+ “十分钟”：`PT10M`
+ “五个小时”：`PT5H`
+ “三天”：`P3D`
+ “四十五秒”：`PT45S`
+ “八周”：`P8W`
+ “七年”：`P7Y`
+ “五小时十分钟”：`PT5H10M`
+ “两年三小时十分钟”：`P2YT3H10M`

# 亚马逊。 EmailAddress
<a name="built-in-slot-email"></a>

识别表示以 username@domain 形式提供的电子邮件地址的单词。地址中的用户名可以包括下列特殊字符：下划线（\$1）、连字符（-）、句点（.）和加号（\$1）。

# 亚马逊。 FirstName
<a name="built-in-slot-first-name"></a>

常用的名字。这种插槽类型可以识别正式名字和非正式昵称。发送给您的意图的名字是用户发送的值。Amazon Lex 不会将昵称转换为正式名字。

对于听起来相似但拼写不同的名字，Amazon Lex 会向您的意图发送一个通用格式。

在英语（美国）(en-US) 区域设置中，使用插槽名称 AMAZON.US\$1First\$1Name。

示例：
+ Emily
+ John
+ Sophie

# 亚马逊。 LastName
<a name="built-in-slot-last-name"></a>

常用的姓氏。对于听起来相似但拼写不同的姓氏，Amazon Lex 会向您的意图发送一份通用格式。

在英语（美国）(en-US) 区域设置中，使用插槽名称 AMAZON.US\$1Last\$1Name。

示例：
+ 布罗斯基
+ 达舍
+ 埃弗斯
+ 帕雷斯
+ 威尔特

# AMAZON.NUMBER
<a name="built-in-slot-number"></a>

将表示数值的词语或数字转换为数字，包括十进制数字。下表介绍 `AMAZON.NUMBER` 槽类型如何捕获数字词汇。


| Input | 响应 | 
| --- | --- | 
| 一百二十三点四五 | 123.45 | 
| 一二三点四五 | 123.45 | 
| 零点四二 | 0.42 | 
| 点四二 | 0.42 | 
| 232.998 | 232.998 | 
| 50 | 50 | 

# AMAZON.Percentage
<a name="built-in-slot-percent"></a>

将表示百分比的词汇和符号转换为一个带百分比符号（%）的数字值。

如果用户输入不带百分号或“百分之”这个词的数字，则槽值将设置为该数字。下表介绍 `AMAZON.Percentage` 槽类型如何捕获百分比。


| Input | 响应 | 
| --- | --- | 
| 百分之 50 | 50% | 
| 百分之 0.4 | 0.4% | 
| 23.5% | 23.5% | 
| 百分之二十五 | 25% | 

# 亚马逊。 PhoneNumber
<a name="built-in-slot-phone"></a>

如下将表示电话号码的数字或词转换为不含标点符号的字符串格式。


| Type | 说明 | Input | 结果 | 
| --- | --- | --- | --- | 
| 前面带加号（\$1）的国际号码 | 前面带加号（\$1）的 11 位数字。 | \$161 7 4445 1061 \$11 （509） 555-1212 | `+61744431061` `+15095551212` | 
| 前面不带加号（\$1）的国际号码 | 前面不带加号（\$1）的 11 位数字 | 1 （509） 555-1212 61 7 4445 1061 | `15095551212` `61744451061` | 
| 国家/地区代码 | 不带国际代码的 10 位数字 | （03） 5115 4444 （509） 555-1212 | `0351154444` `5095551212` | 
| 本地号码 | 不带国际代码或区号的 7 位数电话号码 | 555-1212 | 5551212 | 

# 亚马逊。 SpeedUnit
<a name="built-in-slot-speed"></a>

将表示速度单位的词转换为相应的缩写。例如，“每小时英里数”将转换为 `mph`。

此插槽类型仅在英语（美国）(en-US) 区域设置中可用。

以下示例说明 `AMAZON.SpeedUnit` 槽类型如何捕获速度单位。


| 速度单位 | 缩写 | 
| --- | --- | 
|  miles per hour、mph、MPH、m/h  | mph | 
|  kilometers per hour、km per hour、kmph、KMPH、km/h  | kmph | 
|  meters per second、mps、MPS、m/s  | mps | 
| nautical miles per hour、knots、knot | knot | 

# AMAZON.State
<a name="built-in-slot-state"></a>

国家/地区内部的地理和政治区域的名称。

示例：
+ 巴伐利亚
+ 福岛县
+ 太平洋西北地区
+ 昆士兰
+ 威尔士

# 亚马逊。 StreetName
<a name="built-in-slot-street-name"></a>

典型街道地址内的街道名称。这只包括街道名称，不包括门牌号码。

此插槽类型在英语（美国）(en-US) 区域设置中不可用。

示例：
+ 堪培拉大道
+ 前街
+ 市场路

# AMAZON.TIME
<a name="built-in-slot-time"></a>

将表示时间的词转换为时间值。包括针对不确定的时间的决议。当用户输入不明确的时间时，Amazon Lex 使用 Lambda 事件的 `slotDetails` 属性将不确定的时间的解析传递给 Lambda 函数。例如，如果自动程序提示用户输入交付时间，用户可能以“10 点钟”作为响应。这样的时间是不明确的。它可能指上午 10:00 或晚上 10:00。这种情况下，`slots` 图中值为 `null`，而 `slotDetails` 实体包含对该时间的两种可能的解析。Amazon Lex 将以下内容输入 Lambda 函数：

```
"slots": {
   "deliveryTime": null
},
"slotDetails": {
   "deliveryTime": {
      "resolutions": [
         {
            "value": "10:00"
         },
         {
            "value": "22:00"
         }
      ]
   }
}
```

当用户以不明确的时间作为响应时，Amazon Lex 将该时间发送到 Lambda 事件的 `slots` 属性中的 Lambda 函数，且 `slotDetails` 属性为空。例如，如果用户在收到输入交付时间的提示时，以“晚上 10:00”作为响应，则 Amazon Lex 将以下内容输入 Lambda 函数：

```
"slots": {
   "deliveryTime": "22:00"
}
```

有关 Amazon Lex 发送到 Lambda 函数的数据的更多信息，请参阅[输入事件格式](lambda-input-response-format.md#using-lambda-input-event-format)。

# 亚马逊。 WeightUnit
<a name="built-in-slot-weight"></a>

将表示重量单位的词转换为相应的缩写。例如，“kilogram”将转换为 `kg`。

此插槽类型仅在英语（美国）(en-US) 区域设置中可用。

以下示例说明 `AMAZON.WeightUnit` 槽类型如何捕获重量单位：


| 重量单位 | 缩写 | 
| --- | --- | 
| kilograms、kilos、kgs、KGS | kg | 
| grams、gms、gm、GMS、g | g | 
| milligrams、mg、mgs | mg | 
| pounds、lbs、LBS | lbs | 
| ounces、oz、OZ | oz | 
| tonne、ton、t | t | 
| kiloton、kt | kt | 

# 自定义槽位类型
<a name="howitworks-custom-slots"></a>

对于每个目的，您都可以指定参数来指示目的要完成用户请求所需的信息。这些参数，或者说槽，都有一个类型。一个*插槽类型*就是一个值列表，Amazon Lex 用它来训练机器学习模型识别插槽的值。例如，您可以定义一个名为“`Genres.`”的槽类型，该槽类型中的每个值都是一个体裁的名称：“comedy”、“adventure”、“documentary”等等。您可以为槽类型值定义同义词。例如，可以为“comedy”值定义同义词“funny”和“humorous”。

您可以通过配置槽类型来限制对槽值的解析。槽值将用作枚举，仅当用户输入的值与一个槽值或同义词相同时才会解析为槽值。同义词会解析为相应的槽值。例如，如果用户输入“funny”，会解析为槽值“comedy”。

或者，您可以通过配置槽类型来扩展值。槽值将用作训练数据，当用户提供的值与槽值和同义词相似时，该槽将解析为用户提供的值。这是默认行为。

Amazon Lex 为插槽维护一个可能解析值的列表。列表中的每个条目都提供一个*解析值*，Amazon Lex 将其识别为插槽的更多可能值。解析值是与槽值的尽可能匹配。该列表最多包含五个值。

当用户输入的值是同义词时，解析值列表中的第一个条目就是槽类型值。例如，如果用户输入“funny”，则 `slots` 字段包含“funny”，而 `slotDetails` 字段中的第一个条目是“comedy”。您可以在使用 [PutSlotType](API_PutSlotType.md) 操作创建或更新槽类型时配置 `valueSelectionStrategy`，以便使用解析列表中的第一个值填充槽值。

 如果您使用 Lambda 函数，该函数的输入事件中会包含一个名为 `slotDetails` 的解析列表。以下示例显示了 Lambda 函数的输入的插槽和插槽详细信息部分：

```
   "slots": {
      "MovieGenre": "funny";
   },
   "slotDetails": {
      "Movie": {
         "resolutions": [
            "value": "comedy"
         ]
      }
   }
```

对于每个槽类型，最多可定义 10000 个值和同义词。每个自动程序的槽类型值和同义词的总数最多为 50000。例如，您可以拥有 5 种插槽类型，每种类型包含 5,000 个值和 5,000 个同义词，或者您可以拥有 10 种插槽类型，每种类型包含 2,500 个值和 2,500 个同义词。如果超过这些限制，在调用 [PutBot](API_PutBot.md) 操作时，您将获得一个 `LimitExceededException`。

# 槽混淆处理
<a name="how-obfuscate"></a>

Amazon Lex 能够混淆处理（即隐藏）插槽的内容，使其内容不可见。为了保护作为插槽值捕获的敏感数据，可以启用插槽混淆处理，为对话记录掩蔽这些值。

当您选择混淆处理插槽值时，Amazon Lex 在对话日志中将插槽的值替换为插槽的名称。对于名为 `full_name` 的槽，该槽的值将被模糊处理，如下所示：

```
Before obfuscation:
    My name is John Stiles
After obfuscation:
    My name is {full_name}
```

如果言语中包含括号字符 (\$1\$1)，Amazon Lex 将用两个反斜杠 (\$1\$1) 转义括号字符。例如，文本 `{John Stiles}` 的模糊处理如下所示：

```
Before obfuscation:
    My name is {John Stiles}
After obfuscation:
    My name is \\{{full_name}\\}
```

对话日志中的槽值会被模糊处理。槽位值在 `PostContent` 和 `PostText` 操作的响应中仍然可用，并且槽位值可用于验证和实现 Lambda 函数。如果您在提示或响应中使用槽值，则对话日志中不会对这些槽值进行模糊处理。

在第一轮对话中，如果 Amazon Lex 能够识别出言语中的插槽和插槽值，则会对插槽值进行混淆处理。如果没有识别出插槽值，Amazon Lex 不对言语进行混淆处理。

在第二轮和接下来的轮次中，Amazon Lex 知晓要引发的插槽以及是否需要对插槽值进行混淆处理。如果 Amazon Lex 识别到该插槽值，则会对该值进行混淆处理。如果 Amazon Lex 未识别出值，则对整个言语进行混淆处理。无法理解的话语中的任何槽值都不会被模糊处理。

Amazon Lex 也不会对您存储在请求或会话属性中的插槽值进行混淆处理。如果您将应模糊处理的槽值作为属性存储，则必须加密该值，或者以其他方式对该值进行模糊处理。

Amazon Lex 不会对音频中的插槽值进行混淆处理。它会对音频转录中的槽值进行模糊处理。

您不需要在自动程序中对所有槽进行混淆处理。您可以使用控制台或使用 Amazon Lex API 选择需要对哪些插槽进行混淆处理。在控制台中，在槽的设置中选择 **Slot obfuscation (槽模糊处理)**。如果您使用的是 API，请在调用 [PutIntent](API_PutIntent.md) 操作时，将槽的 `obfuscationSetting` 字段设置为 `DEFAULT_OBFUSCATION`。

# 情绪分析
<a name="sentiment-analysis"></a>

您可以使用情绪分析来确定用户语句中表达的情绪。通过情绪信息，您可以管理对话流或执行呼叫后分析。例如，如果用户情绪是消极的，您可以创建一个流，将对话交给人工代理。

Amazon Lex 与 Amazon Comprehend 集成以检测用户情绪。来自 Amazon Comprehend 的响应可表示文本的整体情绪是积极、中性、消极还是混杂。响应包含用户语句最可能传达的情绪以及每个情绪类别的分数。分数表示正确检测到情绪的可能性。

 您可以使用控制台或使用 Amazon Lex API 为机器人启用情绪分析。在 Amazon Lex 控制台上，选择机器人的**设置**选项卡，然后将**情绪分析**选项设置为**是**。如果您使用的是 API，请将 `detectSentiment` 字段设置为 `true`，然后调用 [PutBot](API_PutBot.md) 操作。

启用情绪分析后，来自 [PostContent](API_runtime_PostContent.md) 和 [PostText](API_runtime_PostText.md) 操作的响应将在自动程序响应中返回 `sentimentResponse` 字段和其他元数据。`sentimentResponse` 字段具有 `SentimentLabel` 和 `SentimentScore` 两个字段，包含情绪分析的结果。如果您使用的是 Lambda 函数，则 `sentimentResponse` 字段将包含在发送到函数的事件数据中。

以下是 `sentimentResponse` 字段作为 `PostText` 或 `PostContent` 响应的一部分返回的示例。`SentimentScore` 字段是包含响应分数的字符串。

```
{
    "SentimentScore": 
        "{
        Mixed: 0.030585512690246105,
        Positive: 0.94992071056365967,
        Neutral: 0.0141543131828308,
        Negative: 0.00893945890665054
        }",
    "SentimentLabel": "POSITIVE"
}
```

Amazon Lex 代表您调用 Amazon Comprehend，以确定机器人处理的每个语句中的情绪。启用情绪分析即表示您同意 Amazon Comprehend 的服务条款和协议。有关 Amazon Comprehend 定价的更多信息，请参阅 [Amazon Comprehend 定价](https://aws.amazon.com/comprehend/pricing/)。

有关 Amazon Comprehend 情绪分析工作原理的更多信息，请参阅**《Amazon Comprehend 开发人员指南》中的[确定情绪](https://docs.aws.amazon.com/comprehend/latest/dg/how-sentiment.html)。

# 为您的 Amazon Lex 资源添加标签
<a name="how-it-works-tags"></a>

为了帮助您管理 Amazon Lex 机器人、机器人别名和机器人通道，您可以将元数据作为*标签*分配给每个资源。标签是您分配给 AWS 资源的标签。每个标签均包含一个键和一个值。

标签可让您按各种标准（例如用途、所有者或应用程序）对 AWS 资源进行分类。标签帮助您：
+ 识别和整理您的 AWS 资源。许多 AWS 资源都支持标记，因此您可以为不同服务中的资源分配相同的标签，以表明这些资源是相关的。例如，您可以使用相同标签标记机器人及其使用的 Lambda 函数。
+ 分配成本。您可以在 AWS 账单与成本管理 控制面板上激活标签。 AWS 使用标签对您的成本进行分类，并向您提供每月成本分配报告。对于 Amazon Lex，您可以使用别名特定的标签（`$LATEST` 别名除外）为每个别名分配成本。您可以通过对 Amazon Lex 机器人使用标签来为 `$LATEST` 别名分配成本。有关更多信息，请参阅《AWS 账单与成本管理 用户指南》**中的[使用成本分配标签](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。
+ 控制对资源的访问。您可以对 Amazon Lex 使用标签来创建策略以控制对 Amazon Lex 资源的访问。这些策略可以附加到 IAM 角色或用户，以启用基于标签的访问控制。有关更多信息，请参阅 [ABAC 与 Amazon Lex](security_iam_service-with-iam.md#security_iam_service-with-iam-tags)。要查看基于身份的策略（用于根据资源上的标签来限制对该资源的访问）的示例，请参阅[使用标签访问资源](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-tag)。

您可以使用 AWS 管理控制台、或 Amazon Lex API 来处理标签。 AWS Command Line Interface



## 为资源添加标签
<a name="tagging-resources"></a>

如果您使用的是 Amazon Lex 控制台，则可以在创建资源时标记资源，也可以稍后添加标记。您还可以使用控制台来更新或删除现有标签。

如果您使用的是 AWS CLI 或 Amazon Lex API，则可以使用以下操作来管理资源的标签：
+  [ListTagsForResource](API_ListTagsForResource.md) — 查看与资源关联的标签。
+ [PutBot](API_PutBot.md) 和 [PutBotAlias](API_PutBotAlias.md) — 在创建机器人或机器人别名时应用标签。
+  [TagResource](API_TagResource.md) — 添加和修改现有资源上的标签。
+  [UntagResource](API_UntagResource.md) — 从资源中删除标签。

Amazon Lex 中支持贴标签的资源如下：
+ 自动程序 - 使用如下所示的 Amazon 资源名称 (ARN)：
  + `arn:${partition}:lex:${region}:${account}:bot:${bot-name}`
+ 自动程序别名 - 使用如下所示的 ARN：
  + `arn:${partition}:lex:${region}:${account}:bot:${bot-name}:${bot-alias}`
+ 自动程序通道 - 使用如下所示的 ARN：
  + `arn:${partition}:lex:${region}:${account}:bot-channel:${bot-name}:${bot-alias}:${channel-name}`

## 标签限制
<a name="tags-restrictions"></a>

以下基本限制适用于 Amazon Lex 资源上的标签：
+ 最大标签数量为 50
+ 最大键长度为 128 个字符
+ 最大值长度为 256 个字符
+ 键和值的有效字符包括 a–z、A–Z、0–9、空格和以下字符：\$1 . : / = \$1 - 和 @
+ 键和值区分大小写。
+ 不要将 `aws:` 用作键的前缀；这是留给 AWS 使用的。

# 标记资源（控制台）
<a name="tags-console"></a>

您可以使用控制台管理自动程序、自动程序别名或自动程序通道资源上的标签。您可以在创建资源时添加标签，也可以从现有资源中添加、修改或删除标签。

**在创建机器人时添加标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择 **Create (创建)** 以创建新的自动程序。

1. 在 **Create your bot (创建您的自动程序)** 页面的底部，选择 **Tags (标签)**。

1. 选择 **Add tag (添加标签)** 并向自动程序添加一个或多个标签。最多可以添加 50 个标签。

**在创建机器人别名时添加标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择想要为其添加机器人别名的机器人。

1. 选择**设置**。

1. 添加别名，选择自动程序版本，然后选择 **Add tags (添加标签)**。

1. 选择 **Add tag (添加标签)** 并向自动程序别名添加一个或多个标签。最多可以添加 50 个标签。

**在创建自动程序通道时添加标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择要向其添加自动程序通道的自动程序。

1. 选择 **Channels (通道)**，然后选择要添加的通道。

1. 添加自动程序通道的详细信息，然后选择 **Tags (标签)**。

1. 选择 **Add tag (添加标签)** 并向自动程序通道添加一个或多个标签。最多可以添加 50 个标签。

**在导入自动程序时添加标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 选择 **Actions (操作)**，然后选择 **Import (导入)**。

1. 选择用于导入自动程序的 zip 文件。

1. 选择 **Tags (标签)**，然后选择 **Add tag (添加标签)** 以向自动程序添加一个或多个标签。最多可以添加 50 个标签。

**添加、删除或修改现有机器人上的标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 从左侧菜单中，选择 **Bots (自动程序)**，然后选择要修改的自动程序。

1. 选择 **Settings (设置)**，然后从左侧菜单中选择 **General (常规)**。

1. 选择 **Tags (标签)**，然后添加、修改或删除自动程序的标签。

**添加、删除或修改自动程序别名上的标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 从左侧菜单中，选择 **Bots (自动程序)**，然后选择要修改的自动程序。

1. 选择 **Settings (设置)**，然后从左侧菜单中选择 **Aliases (别名)**。

1. 选择要修改的别名的 **Manage tags (管理标签)**，然后添加、修改或删除自动程序别名的标签。

**添加、删除或修改现有自动程序通道上的标签**

1. 登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。

1. 从左侧菜单中，选择 **Bots (自动程序)**，然后选择要修改的自动程序。

1. 选择 **Channels**。

1. 选择 **Tags (标签)** ，然后添加、修改或删除自动程序通道的标签。

# 标记资源 (AWS CLI)
<a name="tags-cli"></a>

您可以使用 AWS CLI 来管理机器人、机器人别名或机器人频道资源上的标签。您可以在创建自动程序或自动程序别名时添加标签，也可以从自动程序、自动程序别名或自动程序通道中添加、修改或删除标签。

所有示例都是针对 Linux 和 macOS 进行格式设置的。要在 Windows 中使用该命令，请将 Linux 继续符 (\$1) 替换为脱字号 (^)。

**在创建机器人时添加标签**
+ 以下缩写`put-bot` AWS CLI 命令显示了在创建机器人时添加标签时必须使用的参数。要实际创建自动程序，您必须提供其他参数。有关更多信息，请参阅 [步骤 4：入门 (AWS CLI)](gs-cli.md)。

  ```
  aws lex-models put-bot \
      --tags '[{"key": "key1", "value": "value1"}, \
               {"key": "key2", "value": "value2"}]'
  ```

**在创建机器人别名时添加标签**
+ 以下缩写`put-bot-alias` AWS CLI 命令显示了在创建机器人别名时添加标签时必须使用的参数。要实际创建自动程序别名，您必须提供其他参数。有关更多信息，请参阅 [练习 5：创建别名 (AWS CLI)](gs-cli-create-alias.md)。

  ```
  aws lex-models put-bot \
      --tags '[{"key": "key1", "value": "value1"}, \
               {"key": "key2", "value": "value2"}]"
  ```

**列出资源上的标签**
+ 使用`list-tags-for-resource` AWS CLI 命令显示与机器人、机器人别名、机器人频道关联的资源。

  ```
  aws lex-models list-tags-for-resource \
      --resource-arn bot, bot alias, or bot channel ARN
  ```

**添加或修改资源上的标签**
+ 使用`tag-resource` AWS CLI 命令添加或修改机器人、机器人别名或机器人频道。

  ```
  aws lex-models tag-resource \
      --resource-arn bot, bot alias, or bot channel ARN \
      --tags '[{"key": "key1", "value": "value1"}, \
               {"key": "key2", "value": "value2"}]'
  ```

**从资源中删除标签**
+ 使用`untag-resource` AWS CLI 命令从机器人、机器人别名或机器人频道中移除标签。

  ```
  aws lex-models untag-resource \
      --resource-arn bot, bot alias, or bot channel ARN \
      --tag-keys '["key1", "key2"]'
  ```