

终止支持通知：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)。

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

# 管理消息
<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." 
```

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

```
\{{{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)。