

终止支持通知：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="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"
}
```