AMAZON.KendraSearchIntent
Amazon Kendra でインデックス付けしたドキュメントを検索するには、AMAZON.KendraSearchIntent
インテントを使用します。Amazon Lex V2 がユーザーとの会話の次のアクションを決定できない場合、検索インテントをトリガーします。
AMAZON.KendraSearchIntent
は、英語 (米国) (en-US)ロケール、および米国東部 (バージニア北部)、米国西部 (オレゴン)、欧州 (アイルランド) のリージョンでのみ使用できます。
Amazon Kendra は、PDF ドキュメントや Microsoft Word ファイルなどの自然言語ドキュメントにインデックス付けする機械学習ベースの検索サービスです。インデックス付けされたドキュメントを検索し、質問に対して以下のタイプのレスポンスを返すことができます。
-
回答
-
質問への回答になる可能性がある FAQ のエントリ
-
質問に関連するドキュメント
AMAZON.KendraSearchIntent
の使用例については、「例: Amazon Kendra インデックスを使用する FAQ ボットを作成する」を参照してください。
ボットに AMAZON.KendraSearchIntent
インテントを設定した場合、Amazon Lex V2 は、スロットまたはインテントのユーザー発話を判別できないときは常に、そのインテントを呼び出します。Amazon Kendra からのレスポンスがない場合、会話はボットで設定されたとおりに進みます。
注記
Amazon Lex V2 は現在、スロット誘発中の AMAZON.KendraSearchIntent
をサポートしていません。Amazon Lex V2 がスロットのユーザー発話を判別できない場合、AMAZON.FallbackIntent
を呼び出します。
同じボットで AMAZON.KendraSearchIntent
と AMAZON.FallbackIntent
の両方を使用する場合、Amazon Lex V2 は以下のようにインテントを使用します。
-
Amazon Lex V2 が
AMAZON.KendraSearchIntent
を呼び出します。インテントは Amazon KendraQuery
オペレーションを呼び出します。 -
Amazon Kendra がレスポンスを返す場合、Amazon Lex V2 はユーザーに結果を表示します。
-
Amazon Kendra からのレスポンスがない場合、Amazon Lex V2 はユーザーに再度プロンプトを表示します。以下のアクションは、ユーザーからのレスポンスによって異なります。
-
ユーザーからのレスポンスに、スロット値の入力やインテントの確認など、Amazon Lex V2 が認識する発話が含まれている場合、ユーザーとの会話はボットで設定されたとおりに進みます。
-
ユーザーからのレスポンスに Amazon Lex V2 が認識する発話が含まれていない場合、Amazon Lex V2 は
Query
オペレーションを再度呼び出します。
-
-
設定された再試行回数の後にレスポンスがない場合、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
インテントを使用するには、AWS Identity and Access Management (IAM) ポリシーがアタッチされたロールを使用して、Amazon Kendra Query
インテントを呼び出すアクセス許可を持つランタイムロールを Amazon Lex V2 が引き受けられるようにする必要があります。使用する IAM 設定は、AMAZON.KendraSearchIntent
の作成に Amazon Lex V2 コンソールを使用するか、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": "*" } ] }
ロールの指定
コンソール、AWS CLI、または API を使用して、Amazon Kendra Query
オペレーションを呼び出すときに使用するランタイムロールを指定できます。
ランタイムロールの指定に使用するユーザー、ロール、またはグループには、iam:PassRole
アクセス許可が必要です。以下のポリシーでは、このアクセス許可を定義しています。iam:AssociatedResourceArn
および iam:PassedToService
条件コンテキストキーを使用して、アクセス許可の範囲をさらに制限できます。詳細については、[AWS STS ユーザーガイド] で [IAM と AWS Identity and Access Management 条件コンテキストキー] を参照してください。
{ "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 オペレーションのアクセス許可をロールに追加するには
-
現在のディレクトリに
KendraQueryPolicy.json
という名前でドキュメントを作成し、以下のコードを追加して保存します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kendra:Query" ], "Resource": [ "arn:aws:kendra:
region
:account
:index/index ID
" ] } ] } -
AWS CLI で次のコマンドを実行して、Amazon Kendra
Query
オペレーションを実行するための IAM ポリシーを作成します。aws iam create-policy \ --policy-name
query-policy-name
\ --policy-document file://KendraQueryPolicy.json -
Query
オペレーションの呼び出しに使用している IAM ロールに、そのポリシーをアタッチします。aws iam attach-role-policy \ --policy-arn arn:aws:iam::
account-id
:policy/query-policy-name
--role-namerole-name
Amazon Lex V2 サービスにリンクされたロールを更新するか、ボット用に AMAZON.KendraSearchIntent
を作成したときに作成したロールを使用するかを選択できます。以下の手順は、使用する IAM ロール を選択する方法を示しています。
AMAZON.KendraSearchIntent のランタイムロールを指定するには
-
AWS Management Console にサインインし、Amazon Lex コンソール (https://console.aws.amazon.com/lex/
) を開きます。 -
AMAZON.KendraSearchIntent
を追加するボットを選択します。 -
[インテント] の横のプラス (+) を選択します。
-
[インテントの追加] で、[既存のインテントの検索] を選択します。
-
[インテントの検索] に「
AMAZON.KendraSearchIntent
」と入力し、[追加] を選択します。 -
[組み込みインテントのコピー] にインテントの名前 (「
KendraSearchIntent
」など) を入力し、[追加] を選択します。 -
[Amazon Kendra クエリ] セクションを開きます。
-
[IAM ロール] で、以下のいずれかのオプションを選択します。
-
ボットが Amazon Kendra インデックスをクエリできるように Amazon Lex V2 サービスにリンクされたロールを更新するには、[Amazon Kendra アクセス許可の追加] を選択します。
-
Amazon Kendra
Query
オペレーションを呼び出すアクセス許可を持つロールを使用するには、[既存のロールを使用] を選択します。
-
フィルタとしてのリクエスト属性とセッション属性の使用
Amazon Kendra から現在の会話に関連するアイテムへのレスポンスをフィルター処理するには、ボットの作成時に queryFilterString
パラメータを追加して、セッション属性とリクエスト属性をフィルターとして使用します。インテントを作成するときに属性のプレースホルダーを指定します。それにより、Amazon Lex V2 が Amazon Kendra を呼び出す前にプレースホルダーを値に置き換えます。リクエスト属性の詳細については、「Lex V2 ボットのリクエスト属性の設定」を参照してください。セッション属性の詳細については、「Lex V2 ボットのセッション属性の設定」を参照してください。
以下に示しているのは、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 からのレスポンスに一致します。
-
「FAQ の質問 ((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
ステートメントを使用します。