AMAZON.KendraSearchIntent - Amazon Lex

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AMAZON.KendraSearchIntent

Amazon Kendra でインデックス付けしたドキュメントを検索するには、AMAZON.KendraSearchIntent インテントを使用します。Amazon Lex V2 がユーザーとの会話の次のアクションを決定できない場合、検索インテントをトリガーします。

AMAZON.KendraSearchIntent は、英語 (米国) (en-US)ロケール、および米国東部 (バージニア北部)、米国西部 (オレゴン)、欧州 (アイルランド) のリージョンでのみ使用できます。

Amazon Kendra は、PDF ドキュメントや Microsoft Word ファイルなどの自然言語ドキュメントのインデックスを作成する machine-learning-based 検索サービスです。インデックス付けされたドキュメントを検索し、質問に対して以下のタイプのレスポンスを返すことができます。

  • 回答

  • 質問への回答になる可能性がある FAQ のエントリ

  • 質問に関連するドキュメント

AMAZON.KendraSearchIntent の使用例については、「例: Amazon Kendra インデックスを使用する FAQ ボットを作成する」を参照してください。

ボットに AMAZON.KendraSearchIntent インテントを設定した場合、Amazon Lex V2 は、スロットまたはインテントのユーザー発話を判別できないときは常に、そのインテントを呼び出します。Amazon Kendra からのレスポンスがない場合、会話はボットで設定されたとおりに進みます。

注記

Amazon Lex V2 は現在、スロット誘発中の AMAZON.KendraSearchIntent をサポートしていません。Amazon Lex V2 がスロットのユーザー発話を判別できない場合、AMAZON.FallbackIntent を呼び出します。

同じボットで AMAZON.KendraSearchIntentAMAZON.FallbackIntent の両方を使用する場合、Amazon Lex V2 は以下のようにインテントを使用します。

  1. Amazon Lex V2 が AMAZON.KendraSearchIntent を呼び出します。インテントは Amazon Kendra Query オペレーションを呼び出します。

  2. Amazon Kendra がレスポンスを返す場合、Amazon Lex V2 はユーザーに結果を表示します。

  3. Amazon Kendra からのレスポンスがない場合、Amazon Lex V2 はユーザーに再度プロンプトを表示します。以下のアクションは、ユーザーからのレスポンスによって異なります。

    • ユーザーからのレスポンスに、スロット値の入力やインテントの確認など、Amazon Lex V2 が認識する発話が含まれている場合、ユーザーとの会話はボットで設定されたとおりに進みます。

    • ユーザーからのレスポンスに Amazon Lex V2 が認識する発話が含まれていない場合、Amazon Lex V2 は Query オペレーションを再度呼び出します。

  4. 設定された再試行回数の後にレスポンスがない場合、Amazon Lex V2 は AMAZON.FallbackIntent を呼び出し、ユーザーとの会話を終了します。

Amazon Kendra を使用して AMAZON.KendraSearchIntent へのリクエストを作成するには、3 つの方法があります。

  • 検索インテントにリクエストを作成させます。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 デベロッパーガイド] の [ドキュメント属性を使用してクエリをフィルタリングする] を参照してください。

Amazon Lex V2 が Amazon Kendra に送信するクエリを制御するには、ダイアログ Lambda 関数の kendraQueryRequestPayload フィールドでクエリを指定できます。クエリが有効でない場合、Amazon Lex V2 は InvalidLambdaResponseException 例外を返します。詳細については、[Amazon Kendra デベロッパーガイド] の [クエリ操作] を参照してください。

AMAZON.KendraSearchIntent の使用方法の例については、「例: Amazon Kendra インデックスを使用する FAQ ボットを作成する」を参照してください。

Amazon Kendra 検索の IAM ポリシー

インAMAZON.KendraSearchIntentテントを使用するには、Amazon Kendra Queryインテントを呼び出すアクセス許可を持つランタイムロールを Amazon Lex V2 が引き受けることを有効にする AWS Identity and Access Management (IAM) ポリシーを提供するロールを使用する必要があります。使用する IAM 設定は、Amazon Lex V2 コンソールAMAZON.KendraSearchIntentを使用して を作成するか、AWS SDK または AWS Command Line Interface () を使用するかによって異なりますAWS CLI。コンソールを使用する場合、Amazon Lex V2 サービスにリンクされたロールに Amazon Kendra を呼び出すアクセス許可を追加するか、Amazon Kendra Query オペレーションを呼び出すための専用のロールを使用するかを選択できます。 AWS CLI または SDK を使用してインテントを作成する場合は、 Queryオペレーションの呼び出し専用のロールを使用する必要があります。

アクセス許可のアタッチ

コンソールを使用して、Amazon Kendra Query オペレーションに対するアクセス許可をデフォルトの Amazon Lex V2 サービスにリンクされたロールにアタッチできます。サービスにリンクされたロールにアクセス許可をアタッチする場合は、Amazon Kendra インデックスに接続するための専用のランタイムロールを作成して管理する必要はありません。

Amazon Lex V2 コンソールへのアクセスに使用するユーザー、ロール、またはグループには、ロールポリシーを管理するアクセス許可が必要です。以下の IAM ポリシーをコンソールのアクセスロールにアタッチします。これらのアクセス許可を付与すると、既存のサービスにリンクされたロールポリシーを変更するアクセス許可がロールに付与されます。

{ "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": "*" } ] }

ロールの指定

コンソール、、または API を使用して AWS CLI、Amazon Kendra Queryオペレーションを呼び出すときに使用するランタイムロールを指定できます。

ランタイムロールの指定に使用する ユーザー、ロール、またはグループには、iam:PassRole アクセス許可が必要です。以下のポリシーでは、このアクセス許可を定義しています。iam:AssociatedResourceArn および iam:PassedToService 条件コンテキストキーを使用して、アクセス許可の範囲をさらに制限できます。詳細については、「 AWS Identity and Access Management ユーザーガイド」の「IAM および AWS STS 条件コンテキストキー」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account:role/role" } ] }

Amazon Lex V2 が Amazon Kendra の呼び出しに使用する必要があるランタイムロールには、kendra:Query アクセス許可が必要です。Amazon Kendra Query オペレーションを呼び出すアクセス許可に既存の IAM ロールを使用する場合、そのロールには以下のポリシーがアタッチされている必要があります。

IAM コンソール、IAM API、または AWS CLI を使用して、ポリシーを作成し、ロールにアタッチすることができます。以下の手順では、AWS CLI を使用してロールとポリシーを作成します。

注記

次のコードは、Linux と MacOS 用にフォーマットされています。Windows の場合、Linux 行連結記号 (\) をキャレット (^) に置き換えます。

Query オペレーションのアクセス許可をロールに追加するには
  1. 現在のディレクトリに KendraQueryPolicy.json という名前でドキュメントを作成し、以下のコードを追加して保存します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kendra:Query" ], "Resource": [ "arn:aws:kendra:region:account:index/index ID" ] } ] }
  2. で AWS CLI、次のコマンドを実行して、Amazon Kendra Queryオペレーションを実行するための IAM ポリシーを作成します。

    aws iam create-policy \ --policy-name query-policy-name \ --policy-document file://KendraQueryPolicy.json
  3. 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 Management Console し、https://console.aws.amazon.com/lex/ で Amazon Lex コンソールを開きます。

  2. AMAZON.KendraSearchIntent を追加するボットを選択します。

  3. [インテント] の横のプラス (+) を選択します。

  4. [インテントの追加] で、[既存のインテントの検索] を選択します。

  5. [インテントの検索] に「AMAZON.KendraSearchIntent」と入力し、[追加] を選択します。

  6. [組み込みインテントのコピー] にインテントの名前 (「KendraSearchIntent」など) を入力し、[追加] を選択します。

  7. [Amazon Kendra クエリ] セクションを開きます。

  8. [IAM ロール] で、以下のいずれかのオプションを選択します。

    • ボットが Amazon Kendra インデックスをクエリできるように Amazon Lex V2 サービスにリンクされたロールを更新するには、[Amazon Kendra アクセス許可の追加] を選択します。

    • Amazon Kendra Query オペレーションを呼び出すアクセス許可を持つロールを使用するには、[既存のロールを使用] を選択します。

フィルタとしてのリクエスト属性とセッション属性の使用

Amazon Kendra から現在の会話に関連するアイテムへのレスポンスをフィルター処理するには、ボットの作成時に queryFilterString パラメータを追加して、セッション属性とリクエスト属性をフィルターとして使用します。インテントを作成するときに属性のプレースホルダーを指定します。それにより、Amazon Lex V2 が Amazon Kendra を呼び出す前にプレースホルダーを値に置き換えます。リクエスト属性の詳細については、「リクエスト属性を設定する」を参照してください。セッション属性の詳細については、「セッション属性を設定する」を参照してください。

以下に示しているのは、string to filter というリクエスト属性を使用して 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 デベロッパーガイド] の [ドキュメント属性を使用して検索結果をフィルターする] を参照してください。

AMAZON.KendraSearchIntent で使用されるクエリフィルタ文字列は、各フィルターの最初の文字には小文字を使用する必要があります。例えば、次は AMAZON.KendraSearchIntent の有効なクエリフィルターです。

{ "andAllFilters": [ { "equalsTo": { "key": "City", "value": { "stringValue": "Seattle" } } }, { "equalsTo": { "key": "State", "value": { "stringValue": "Washington" } } } ] }

検索レスポンスの使用

Amazon Kendra は、インテントの IntentClosingSetting ステートメントから、検索に対するレスポンスを返します。Lambda 関数が終了応答メッセージを生成しない限り、インテントには closingResponse ステートメントが必要です。

Amazon Kendra には 5 タイプのレスポンスがあります。

  • 次の 2 つの応答では、Amazon Kendra インデックスに関するよくある質問を設定する必要があります。詳細については、「質問と回答をインデックスに直接追加する」を参照してください。

    • x-amz-lex:kendra-search-response-question_answer-question-<N> - 検索に一致する FAQ からの質問。

    • x-amz-lex:kendra-search-response-question_answer-answer-<N> - 検索に一致する FAQ からの回答。

  • 次の 3 つの応答では、Amazon Kendra インデックスに対してデータソースを設定する必要があります。詳細については、「データソースの作成」を参照してください。

    • x-amz-lex:kendra-search-response-document-<N> - 発話のテキストに関連するインデックス内のドキュメントからの抜粋。

    • x-amz-lex:kendra-search-response-document-link-<N> - 発話のテキストに関連するインデックス内のドキュメントからの抜粋。

    • x-amz-lex:kendra-search-response-answer-<N> - 質問への回答があるインデックス内のドキュメントからの抜粋。

レスポンスは request 属性で返されます。各属性には、最大 5 つのレスポンスがあり 1~5 の番号が付けられます。レスポンスの詳細については、[Amazon Kendra デベロッパーガイド] の [レスポンスのタイプ] を参照してください。

closingResponse ステートメントには、1 つ以上のメッセージグループが必要です。各メッセージグループには、1 つ以上のメッセージが含まれます。各メッセージには、Amazon Kendra からのレスポンスでリクエスト属性によって置き換えられる 1 つ以上のプレースホルダー変数を含めることができます。メッセージ内のすべての変数がランタイムレスポンスのリクエスト属性値で置き換えられるメッセージグループには、1 つ以上のメッセージが必要です。プレースホルダー変数のないメッセージグループには、1 つのメッセージが必要です。リクエスト属性は二重かっこ (( )) で囲みます。以下のメッセージグループのメッセージは Amazon Kendra からのレスポンスに一致します。

  • 「よくある質問の質問を見つけました: ((x-amz-lex:kendra-search-response-question_answer-question-1))、回答は (x-amz-lex:kendra-search-response-question_answer-answer-1)) です。」

  • 「役立つドキュメントから抜粋を見つけました: ((x-amz-lex:kendra-search-response-document-1)」

  • 「質問に対する回答は ((x-amz-lex:kendra-search-response-answer-1))」と考えてください。

Lambda 関数を使用したリクエストとレスポンスの管理

AMAZON.KendraSearchIntent インテントでは、ダイアログコードフックとフルフィルメントコードフックを使用して、Amazon Kendra へのリクエストとレスポンスを管理できます。Amazon Kendra に送信するクエリを変更する場合はダイアログコードフック Lambda 関数を使用し、レスポンスを変更する場合はフルフィルメントコードフック Lambda 関数を使用します。

ダイアログコードフックを使用したクエリの作成

ダイアログコードフックを使用して、Amazon Kendra に送信するクエリを作成できます。ダイアログコードフックを使用するかどうかはオプションです。ダイアログコードフックを指定しない場合、Amazon Lex V2 によってユーザー発話からクエリが作成され、queryFilterString が使用されます (インテントの設定時に指定した場合)。

ダイアログコードフックレスポンスで 2 つのフィールドを使用して、Amazon Kendra へのリクエストを変更できます。

  • kendraQueryFilterString - この文字列を使用して、Amazon Kendra リクエストの属性フィルタを指定します。インデックスで定義されたインデックスフィールドのいずれかを使用して、クエリをフィルタ処理できます。フィルター文字列の構造については、「Amazon Kendra Developer Guide」(Amazon Kendra デベロッパーガイド) の「Using document attributes to filter queries」(ドキュメント属性を使用してクエリをフィルタリングする) を参照してください。指定したフィルタ文字列が有効でないと、InvalidLambdaResponseException 例外が発生します。kendraQueryFilterString 文字列は、インテント用に設定された queryFilterString で指定されたクエリ文字列を上書きします。

  • kendraQueryRequestPayload - この文字列を使用して、Amazon Kendra クエリを指定します。クエリでは、Amazon Kendra の任意の機能を使用できます。有効なクエリを指定しないと、InvalidLambdaResponseException 例外が発生します。これらの制限の詳細については、「Amazon Kendra デベロッパーガイド」の「クエリ」を参照してください。

フィルターまたはクエリ文字列を作成したら、レスポンスの dialogAction フィールドを delegate に設定してAmazon Lex V2 にレスポンスを送信します。Amazon Lex V2 は、クエリを Amazon Kendra に送信し、クエリレスポンスをフルフィルメントコードフックに返します。

レスポンスでのフルフィルメントコードフックの使用

Amazon Lex V2 がクエリを Amazon Kendra に送信した後、クエリレスポンスが AMAZON.KendraSearchIntent フルフィルメント Lambda 関数に返されます。コードフックへの入力イベントには、Amazon Kendra からの完全なレスポンスが含まれます。クエリデータは、Amazon Kendra Query オペレーションによって返されるものと同じ構造になります。詳細については、[Amazon Kendra デベロッパーガイド] の [クエリレスポンス構文] を参照してください。

フルフィルメントコードフックはオプションです。フルフィルメントコードフックがない場合、またはレスポンスでメッセージを返さない場合、Amazon Lex V2 はレスポンスに closingResponse ステートメントを使用します。