

支援終止通知：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.KendraSearchIntent
<a name="built-in-intent-kendra-search"></a>

若要搜尋您已使用 Amazon Kendra 編製索引的文件，請使用 `AMAZON.KendraSearchIntent`意圖。當 Amazon Lex 無法判斷與使用者對話中的下一個動作時，它會觸發搜尋意圖。

`AMAZON.KendraSearchIntent` 僅適用於英文 (US) (en-US) 地區設定和美國東部 （維吉尼亞北部）、美國西部 （奧勒岡） 和歐洲 （愛爾蘭） 區域。

Amazon Kendra 是以machine-learning-based搜尋服務，可將 PDF 文件或 Microsoft Word 檔案等自然語言文件編製索引。它可以搜尋已編製索引的文件，並傳回下列類型的問題回覆：
+ 解答 
+ 可能回答問題的常見問題項目
+ 與問題相關的文件

如需使用 `AMAZON.KendraSearchIntent` 的範例，請參閱[範例：為 Amazon Kendra 索引建立常見問答集機器人](faq-bot-kendra-search.md)。

如果您為機器人設定`AMAZON.KendraSearchIntent`意圖，Amazon Lex 會在無法判斷槽或意圖的使用者表達用語時呼叫意圖。例如，如果您的機器人針對名為「比薩填入」的槽類型發出回應，而使用者說「什麼是比薩？」，Amazon Lex 會呼叫 `AMAZON.KendraSearchIntent` 來處理問題。如果 Amazon Kendra 沒有回應，則對話會繼續如機器人中所設定。

當您在相同的機器人`AMAZON.FallbackIntent`中同時使用 `AMAZON.KendraSearchIntent`和 時，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 `AMAZON.KendraSearchIntent` 主控台或使用 AWS 開發套件或 AWS Command Line Interface () 建立AWS CLI。使用主控台時，您可以選擇將呼叫 Amazon Kendra 的許可新增至 Amazon Lex 服務連結角色，或使用專門用於呼叫 Amazon Kendra `Query`操作的角色。當您使用 AWS CLI 或 開發套件建立意圖時，您必須特別使用角色來呼叫 `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` 條件內容鍵來進一步限制許可的範圍。如需詳細資訊，請參閱[《 使用者指南》中的 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"
        }
    ]
}
```

------

Amazon Lex 呼叫 Amazon Kendra 所需的執行時間角色必須具有 `kendra:Query`許可。當您將現有的 IAM 角色用於呼叫 Amazon Kendra `Query`操作的許可時，該角色必須連接下列政策。

您可以使用 IAM 主控台、IAM API 或 AWS CLI 來建立政策，並將其連接至角色。這些指示會使用 AWS CLI 來建立角色和政策。

**注意**  
下列程式碼是針對 Linux 和 MacOS 格式化的。若為 Windows，請將接續字元 (\$1) 取代為插入符號 (^)。

**將查詢操作許可新增至角色**

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 角色。

**指定 AMAZON.KendraSearchIntent 的執行時間角色。**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)：// 開啟 Amazon Lex 主控台。

1. 選擇您要新增 `AMAZON.KendraSearchIntent` 的機器人。

1. 選擇 **Intents (意圖)** 旁邊的加號 (\$1)。

1. 在 **Add intent (新增意圖)** 中，選擇 **Search existing intents (搜尋現有的意圖)**。

1. 在 **Search intents (搜尋意圖)** 中，輸入 **AMAZON.KendraSearchIntent** 然後選擇 **Add (新增)**。

1. 在 **Copy built-in intent (複製內建意圖)** 中，輸入意圖的名稱，例如 **KendraSearchIntent**，然後選擇 **Add (新增)**。

1. 開啟 **Amazon Kendra query (Amazon Kendra 查詢)** 部分。

1. 在 **IAM role (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"}}}"
```

以下是 參數的範例，該`queryFilterString`參數使用名為 的工作階段屬性`"SourceURI"`來篩選 Amazon Kendra 查詢。

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

以下是 參數的範例，該`queryFilterString`參數使用名為 的請求屬性`"DepartmentName"`來篩選 Amazon Kendra 查詢。

```
"{"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)), and the answer is ((x-amz-lex:kendra-search-response-question\$1answer-answer-1))」
+ 「我找到了一份有用文件的摘錄：((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 開發人員指南*》中的 [ S3 儲存貯體 （主控台） 入門](https://docs.aws.amazon.com/kendra/latest/dg/gs-console.html)。

**建立常見問題機器人**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)：// 開啟 Amazon Lex 主控台。

1. 在導覽窗格中，選擇 **Bots (機器人)**。

1. 選擇**建立**。

1. 選擇 **Custom bot (自訂機器人)**。設定機器人，如下所示：
   + **機器人名稱** – 為機器人命名，指出其用途，例如 **KendraTestBot**。
   + **輸出語音** – 選擇**無**。
   + **工作階段逾時** – 輸入 **5**。
   + **情緒分析** – 選擇**否**。
   + **COPPA** – 選擇**否**。
   + **使用者表達用語儲存** – 選擇**不儲存**。

1. 選擇**建立**。

若要成功建置機器人，您必須至少建立一個意圖，此意圖具有至少一個範例表達用語。建置 Amazon Lex 機器人時需要此意圖，但不會用於常見問答集回應。意圖的表達用語不得套用至您的客戶所提出的任何問題。

**建立必要的意圖**

1. 在 **Getting started with your bot (開始使用您的機器人)** 頁面上，選擇 **Create intent (建立意圖)**。

1. 針對 **Add intent (新增意圖)**，選擇 **Create intent (建立意圖)**。

1. 在 **Create intent (建立意圖)** 對話方塊中，指定意圖名稱，例如 **RequiredIntent**。

1. 在 **Sample utterances (範例表達用語)** 中，輸入表達用語，例如 **Required utterance**。

1. 選擇**儲存意圖**。

現在，建立意圖來搜尋 Amazon Kendra 索引及其應傳回的回應訊息。

**建立 AMAZON.KendraSearchIntent 意圖和回應訊息**

1. 在導覽窗格中，選擇 **Intents (意圖)** 旁邊的加號 (\$1)。

1. 針對 **Add intent (新增意圖)**，選擇 **Search existing intents (搜尋現有的意圖)**。

1. 在**搜尋意圖**方塊中，輸入 **AMAZON.KendraSearchIntent**，然後從清單中選擇它。

1. 對於 **Copy built-in intent (複製內建意圖)**，提供意圖的名稱，例如 **KendraSearchIntent**，然後選擇 **Add (新增)**。

1. 在意圖編輯器中，選擇 **Amazon Kendra query (Amazon Kendra 查詢)** 以開啟查詢選項。

1. 從 **Amazon Kendra index (Amazon Kendra 索引)** 功能表中，選擇您想要搜尋意圖的索引。

1. 在 **Response (回應)** 區段中，新增下列三則訊息：

   ```
   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. 選擇 **Save intent (儲存意圖)**，然後選擇 **Build (建置)** 以建置機器人。

最後，使用主控台測試視窗來測試您的機器人的回應。您的問題應該位於索引支援的網域中。

**測試您的常見問題機器人**

1. 在主控台測試視窗中，輸入索引的問題。

1. 驗證測試視窗回應部分中的答案。

1. 若要重設其他問題的測試視窗，請選擇 **Clear chat history (清除聊天歷史記錄)**。