

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

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

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

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

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

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

如果您为机器人配置了 `AMAZON.KendraSearchIntent` 意图，则 Amazon Lex V2 在无法确定某个意图的用户言语时，会调用此意图。如果没有来自 Amazon Kendra 的响应，则对话将按照机器人中的配置继续进行。

**注意**  
 目前在槽位引发期间，Amazon Lex V2 不支持 `AMAZON.KendraSearchIntent`。如果 Amazon Lex V2 无法确定某个槽位的用户言语，即调用 `AMAZON.FallbackIntent`。

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

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

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

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

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

有三种方法可以使用 `AMAZON.KendraSearchIntent` 向 Amazon Kendra 发出请求：
+ 让搜索意图为您提出请求。Amazon Lex V2 以用户的言语作为搜索字符串调用 Amazon Kendra。在创建意图时，您可以定义限制 Amazon Kendra 返回的响应数的查询筛选条件字符串。Amazon Lex V2 使用查询请求中的筛选条件。
+ 使用您的 Lambda 函数向请求添加其他查询参数以缩小搜索结果范围。您将包含 Amazon Kendra 查询参数的 `kendraQueryFilterString` 字段添加到 `delegate` 对话框操作。使用 Lambda 函数向请求添加查询参数时，这些查询参数将优先于您在创建意图时定义的查询筛选条件。
+ 使用 Lambda 函数创建新查询。您可以创建 Amazon Lex V2 发送的完整 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 V2 发送到 Amazon Kendra 的查询，您可以在 Lambda 函数的 `kendraQueryRequestPayload` 字段中指定查询。如果查询无效，则 Amazon Lex V2 返回 `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 身份和访问管理 (IAM) 策略的角色，该策略允许 Amazon Lex V2 担任有权调用 Amazon `Query` Kendra 意图的运行时角色。您使用的 IAM 设置取决于您是使用 Amazon Lex V2 控制台创建，还是使用 AWS 开发工具包或 AWS Command Line Interface (AWS CLI) 创建。`AMAZON.KendraSearchIntent`使用控制台时，您可以选择向 Amazon Lex V2 服务相关角色添加调用 Amazon Kendra 的权限，或使用专门用于调用 Amazon Kendra `Query` 操作的角色。当您使用 AWS CLI 或软件开发工具包创建意图时，必须使用专门用于调用`Query`操作的角色。

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

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

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

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

****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "iam:AttachRolePolicy",
            "iam:PutRolePolicy",
            "iam:GetRolePolicy"
        ],
        "Resource": "arn:aws:iam::*:role/aws-service-role/lexv2.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` 条件上下文键进一步限制权限的范围。有关更多信息，请参阅 [A *WS 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 V2 调用 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 V2 服务相关角色或使用您在为机器人创建 `AMAZON.KendraSearchIntent` 时所创建的角色。以下过程演示如何选择要使用的 IAM 角色。

**为 AMAZON.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 V2 服务相关角色以便机器人能够查询 Amazon Kendra 索引，请选择**添加 Amazon Kendra 权限**。
   + 要使用有权调用 Amazon Kendra `Query` 操作的角色，请选择**使用现有角色**。

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

要从来自 Amazon Kendra 的响应中筛选出与当前对话相关的项目，请在创建机器人时添加 `queryFilterString` 参数以使用会话和请求属性作为筛选条件。您可以在创建意图时指定属性的占位符，以便 Amazon Lex V2 在调用 Amazon Kendra 之前将其替换为值。有关请求属性的更多信息，请参阅[设置 Lex V2 机器人的请求属性](context-mgmt-request-attribs.md)。有关会话属性的更多信息，请参阅 [设置 Lex V2 机器人的会话属性](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 在意图 `IntentClosingSetting` 语句的响应中返回对搜索的响应。除非 Lambda 函数生成结束响应消息，否则意图必须具有 `closingResponse` 语句。

Amazon Kendra 有五种类型的响应。
+ 以下两个响应需要您为 Amazon Kendra 索引设置常见问题。有关更多详细信息，请参阅[直接向索引添加问题和答案](https://docs.aws.amazon.com/kendra/latest/dg/in-creating-faq.html)。
  +  `x-amz-lex:kendra-search-response-question_answer-question-<N>`：与搜索匹配的常见问题中的问题。
  +  `x-amz-lex:kendra-search-response-question_answer-answer-<N>`：与搜索匹配的常见问题中的答案。
+ 以下三个响应需要您为 Amazon Kendra 索引设置数据来源。有关更多详细信息，请参阅[创建数据来源](https://docs.aws.amazon.com/kendra/latest/dg/data-source.html)。
  + `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)。

`closingResponse` 语句必须具有一个或多个消息组。每个消息组都包含一条或多条消息。每条消息均可以包含一个或多个占位符变量，这些变量替换为来自 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 V2 会根据用户言语来构造查询并使用您在配置意图时提供的 `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 V2，并将响应的 `dialogAction` 字段设置为 `delegate`。Amazon Lex V2 将查询发送到 Amazon Kendra，然后将查询响应返回给履行代码挂钩。

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

在 Amazon Lex V2 将查询发送到 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 V2 将对响应使用 `closingResponse` 语句。

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

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

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

1. 创建自定义意图。由于 `AMAZON.KendraSearchIntent` 和 `AMAZON.FallbackIntent` 是替代意图，因此您的机器人需要至少一个其他意图，该至少一个其他意图中必须包含至少一个言语。此意图使您能够构建自动程序，但不用于其他方面。因此，您的常见问题机器人将包含至少三个意图，如下图所示：  
![\[具有三个意图的 Kendra 常见问题机器人\]](http://docs.aws.amazon.com/zh_cn/lexv2/latest/dg/images/kendra-faqbot/kendra-intents.png)

1. 将 `AMAZON.KendraSearchIntent` 意图添加到机器人中，并将其配置为与 [Amazon Kendra 索引](https://docs.aws.amazon.com/kendra/latest/dg/create-index.html)配合使用。

1. 测试该机器人，即执行查询并验证您的 Amazon Kendra 索引的结果是否为回答查询的文档。

**先决条件**

在使用此示例之前，您需要创建 Amazon Kendra 索引。有关更多信息，请参阅《Amazon Kendra 开发人员指南》**中的 [Amazon Kendra 控制台入门](https://docs.aws.amazon.com/kendra/latest/dg/gs-console.html)。在本示例中，选择示例数据集（**AWS 示例文档**）作为您的数据来源。

**要创建常见问题机器人，请执行以下操作：**

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

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

1. 选择**创建机器人**。

   1.  对于**创建方法**，请选择**创建空白机器人**。

   1.  在**机器人配置**部分中，指定指示机器人用途的机器人名称（例如 **KendraTestBot**），并且指定描述（可选）。该名称在您的账户中必须是唯一的。

   1.  在 **IAM 权限**部分中，选择**使用基本 Amazon Lex 权限创建角色**。这将创建一个 [AWS 身份和访问管理 (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 角色，该角色具有 Amazon Lex V2 运行您的机器人所需的权限。

   1.  在**儿童在线隐私保护法（COPPA）**部分中，选择**否**。

   1.  在**空闲会话超时**和**高级设置**部分中，保留默认值并且选择**下一步**。

   1.  此时，系统将转至**为机器人添加语言**部分。在**语音交互**下的菜单中，选择**无。这只是一个基于文本的应用程序。**对于其余字段保留默认设置。

   1.  选择**完成**。Amazon Lex V2 会创建您的机器人和一个名为的默认意图 **NewIntent**，然后将您带到配置此意图的页面 

要成功构建机器人，您必须创建独立于 `AMAZON.FallbackIntent` 和 `AMAZON.KendraSearchIntent` 的至少一个意图。此意图是构建 Amazon Lex V2 机器人所必需的，但不用于常见问题响应。此意图必须包含至少一个示例言语，并且该言语不得适用于客户提出的任何问题。

**要创建所需的意图，请执行以下操作：**

1.  在**意图详细信息**部分中，指定意图的名称，例如 **RequiredIntent**。

1.  在**示例言语**部分，在**添加言语**旁边的框中键入言语，例如 **Required utterance**。然后选择**添加言语**。

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

创建搜索 Amazon Kendra 索引的意图以及此意图应返回的响应消息。

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

1.  在导航窗格中选择**返回意图列表**，以返回到机器人的**意图**页面。选择**添加意图**，然后从下拉菜单中选择**使用内置意图**。

1.  在弹出的框中，选择**内置意图**下的菜单。在搜索栏中输入 **AMAZON.KendraSearchIntent**，然后在列表中将其选中。

1.  指定此意图的名称，例如 **KendraSearchIntent**。

1.  从 **Amazon Kendra 索引**下拉菜单中，选择您需要通过此意图搜索的索引。您在**先决条件**部分中创建的索引应为可用状态。

1.  选择**添加**。

1. 在意图编辑器中，向下滚动至**履行**部分，选择向右箭头展开该部分，然后在**成功履行时**下的框中添加以下消息：

   ```
   I found a link to a document that could help you: ((x-amz-lex:kendra-search-response-document-link-1)).
   ```  
![\[添加履行响应\]](http://docs.aws.amazon.com/zh_cn/lexv2/latest/dg/images/kendra-faqbot/kendra-fulfillment-response.gif)

    有关 Amazon Kendra 搜索响应的更多信息，请参阅[使用搜索响应](https://docs.aws.amazon.com/lexv2/latest/dg/built-in-intent-kendra-search.html#kendra-search-response)。

1. 选择**保存意图**，然后选择**构建**以构建自动程序。机器人准备就绪后，屏幕顶部的横幅会变为绿色并显示成功消息。

最后，使用控制台测试窗口来测试来自自动程序的响应。

**要测试常见问题机器人，请执行以下操作：**

1.  成功构建机器人后，选择**测试**。

1.  在控制台测试窗口中输入 **What is Amazon Kendra?**。验证机器人是否使用链接进行响应。

1.  有关配置的更多信息`AMAZON.KendraSearchIntent`，请参阅[https://docs.aws.amazon.com/lexv2/latest/dg/built-in-intent-kendra-search.html](https://docs.aws.amazon.com/lexv2/latest/dg/built-in-intent-kendra-search.html)和[KendraConfiguration](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_KendraConfiguration.html)。