

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