取り込み中のドキュメントの強化 - Amazon Kendra

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

取り込み中のドキュメントの強化

ドキュメントの取り込みプロセス中に、コンテンツおよびドキュメントのメタデータフィールドまたは属性を変更できます。Amazon Kendra の Custom Document Enrichment 機能を使用すると、Amazon Kendra にドキュメントを取り込むときに、ドキュメントの属性とコンテンツを作成、変更、または削除できます。つまり、必要に応じて、データを操作して取り込むことができます。

この機能を使用すると、ドキュメントをどのように処理し、Amazon Kendra に取り込むかを制御できます。例えば、Amazon Kendra にドキュメントを取り込むときに、ドキュメントのメタデータ内の個人を特定できる情報をスクラブできます。

この機能のもう 1 つの用途は、AWS Lambda で Lambda 関数を呼び出して、画像に対する光学文字認識 (OCR)、テキストの翻訳、および検索または分析のためのデータの準備に関するその他のタスクを実行します。例えば、関数を呼び出すと、画像上で OCR を実行できます。この関数は、画像のテキストを解釈し、各画像をテキスト文書として扱うことができます。郵送された顧客調査を受け取り、これらのアンケートを画像として保存する企業は、これらの画像をテキストドキュメントとして Amazon Kendra に取り込むことができます。その後、企業は Amazon Kendra で貴重な顧客調査情報を検索できます。

基本的な操作を使用してデータの最初の解析として適用し、次に、Lambda 関数を使用して、より複雑な操作をデータに適用できます。例えば、基本的な操作を使用してドキュメントメタデータフィールド 「Customer_ID」のすべての値を削除し、Lambda 関数を適用してドキュメント内のテキストの画像からテキストを抽出することができます。

Custom Document Enrichment の仕組み

Custom Document Enrichment の全体のプロセスは次のとおりです。

  1. Custom Document Enrichment は、データソースを作成または更新するとき、またはドキュメントを Amazon Kendra に直接インデックス作成するときに設定します。

  2. Amazon Kendra は、インライン構成または基本ロジックを適用してデータを変更します。詳細については、「メタデータを変更する基本操作」を参照してください。

  3. 高度なデータ操作を構成する場合、Amazon Kendra は、元の未加工のドキュメント、または構造化された解析済みドキュメントにこれを適用できます。詳細については、「Lambda 関数:メタデータまたはコンテンツの抽出と変更」を参照してください。

  4. 変更されたドキュメントは Amazon Kendra に取り込まれます。

このプロセスのどの時点でも、構成が有効でない場合、Amazon Kendra はエラーをスローします。

CreateDataSourceUpdateDataSource、または BatchPutDocument API を呼び出す場合、Custom Document Enrichment 構成を指定します。BatchPutDocument を呼び出すと、各リクエストで Custom Document Enrichment を設定する必要があります。コンソールを使用する場合は、インデックスを選択し、[Document enrichments] (ドキュメントのエンリッチメント) をクリックして、Custom Document Enrichment を構成します。

コンソールで[ドキュメントのエンリッチメント] を使用する場合、API を使用する場合と同様に、基本操作のみ、Lambda 関数のみ、あるいはその両方を設定できます。コンソールステップで [次へ] を選択して、基本操作を設定せず、Lambda 関数のみを設定するよう選択できます。これには、元の (抽出前) データに適用するか構造化データ (抽出後) に適用するかなどが含まれます。設定を保存するには、コンソールのすべてのステップを完了する必要があります。すべての手順を完了しないと、ドキュメントの設定は保存されません。

メタデータを変更する基本操作

基本ロジックを使用して、ドキュメントのフィールド、およびコンテンツを操作できます。これには、フィールド内の値の削除、条件を使用したフィールドの値の変更、またはフィールドの作成が含まれます。基本ロジックを使用して操作できる範囲を超える高度な操作については、Lambda 関数を呼び出します。詳細については、「Lambda 関数:メタデータまたはコンテンツの抽出と変更」を参照してください。

基本ロジックを適用するには、DocumentAttributeTarget オブジェクトを使用して操作するターゲットフィールドを指定します。属性キーを指定します。例えば、「Department」キーは、ドキュメントに関連付けられているすべての部門名を保持するフィールドまたは属性です。特定の条件が満たされた場合に、ターゲットフィールドで使用する値を指定することもできます。条件の設定は、DocumentAttributeCondition オブジェクトを使用します。例えば、「Source_URI」フィールドに URI 値に「financial」が含まれている場合に、ターゲットフィールド「Department」にドキュメントのターゲット値「Finance」を事前に入力するという条件を設定します。ターゲットドキュメント属性の値を削除することもできます。

コンソールを使用して基本ロジックを適用するには、インデックスを選択し、ナビゲーションメニューの [Document enrichments] (ドキュメントのエンリッチメント) を選択します。[基本的な演算の設定] をクリックして、ドキュメントのフィールドとコンテンツに基本的な演算を適用します。

次に、基本ロジックを使用して「Customer_ID」というドキュメントフィールドのすべての顧客識別番号を削除する例を示します。

例 1: ドキュメントに関連付けられている顧客識別番号の削除

基本操作が適用される前のデータ。

Document_ID Body_Text Customer_ID
1 Lorem Ipsum。 CID1234
2 Lorem Ipsum。 CID1235
3 Lorem Ipsum。 CID1236

基本操作が適用された後のデータ。

Document_ID Body_Text Customer_ID
1 Lorem Ipsum。
2 Lorem Ipsum。
3 Lorem Ipsum。

次に、基本ロジックを使用して「Department」というフィールドを作成し、「source_URI」フィールドの情報に基づいてこのフィールドに部門名を事前に入力する例を示します。これは、「Source_URI」フィールドに URI 値に「financial」が含まれている場合に、ターゲットフィールド「Department」にドキュメントのターゲット値「Finance」を事前に入力するという条件を使用します。

例 2:「Department」フィールドを作成し、条件を使用してドキュメントに関連付けられた部門名を事前に入力します。

基本操作が適用される前のデータ。

Document_ID Body_Text Source_URI
1 Lorem Ipsum。 financial/1
2 Lorem Ipsum。 financial/2
3 Lorem Ipsum。 financial/3

基本操作が適用された後のデータ。

Document_ID Body_Text Source_URI Department
1 Lorem Ipsum。 financial/1 財務
2 Lorem Ipsum。 financial/2 財務
3 Lorem Ipsum。 financial/3 財務
注記

Amazon Kendra では、ターゲットドキュメントフィールドがインデックスフィールドとしてまだ作成されていない場合、それを作成することはできません。インデックスフィールドを作成したら、DocumentAttributeTarget を使用してドキュメントフィールドを作成できます。Amazon Kendra はその後、新しく作成したドキュメントのメタデータフィールドをインデックスフィールドにマッピングします。

次のコードは、ドキュメントに関連付けられている顧客識別番号を削除するための基本的なデータ操作を設定する例です。

Console
顧客識別番号を削除するための基本的なデータ操作を構成するには
  1. 左側のナビゲーションペインの [Indexes] (インデックス) で、[Document enrichments] (ドキュメントのエンリッチメント) を選択して、[Add document enrichment] (ドキュメントのエンリッチメントを追加) を選択します。

  2. [基本的な操作の設定] ページで、ドキュメントのフィールドとコンテンツを変更するデータソースをドロップダウンから選択します。次に、ドロップダウンからドキュメントフィールド名「Customer_ID」を選択し、ドロップダウンからインデックスフィールド名「Customer_ID」を選択し、ドロップダウンからターゲットアクション [Delete] (削除) を選択します。次に、[Add basic operation] (基本的な演算の追加) を選択します。

CLI

顧客識別番号を削除するための基本的なデータ操作を構成するには

aws kendra create-data-source \ --name data-source-name \ --index-id index-id \ --role-arn arn:aws:iam::account-id:role/role-name \ --type S3 \ --configuration '{"S3Configuration":{"BucketName":"S3-bucket-name"}}' \ --custom-document-enrichment-configuration '{"InlineConfigurations":[{"Target":{"TargetDocumentAttributeKey":"Customer_ID", "TargetDocumentAttributeValueDeletion": true}}]}'
Python

顧客識別番号を削除するための基本的なデータ操作を構成するには

import boto3 from botocore.exceptions import ClientError import pprint import time kendra = boto3.client("kendra") print("Create a data source with customizations") # Provide the name of the data source name = "data-source-name" # Provide the index ID for the data source index_id = "index-id" # Provide the IAM role ARN required for data sources role_arn = "arn:aws:iam::${account-id}:role/${role-name}" # Provide the data source connection information data_source_type = "S3" S3_bucket_name = "S3-bucket-name" # Configure the data source with Custom Document Enrichment configuration = {"S3Configuration": { "BucketName": S3_bucket_name } } custom_document_enrichment_configuration = {"InlineConfigurations":[ { "Target":{"TargetDocumentAttributeKey":"Customer_ID", "TargetDocumentAttributeValueDeletion": True} }] } try: data_source_response = kendra.create_data_source( Name = name, IndexId = index_id, RoleArn = role_arn, Type = data_source_type Configuration = configuration CustomDocumentEnrichmentConfiguration = custom_document_enrichment_configuration ) pprint.pprint(data_source_response) data_source_id = data_source_response["Id"] print("Wait for Amazon Kendra to create the data source with your customizations.") while True: # Get the details of the data source, such as the status data_source_description = kendra.describe_data_source( Id = data_source_id, IndexId = index_id ) status = data_source_description["Status"] print(" Creating data source. Status: "+status) time.sleep(60) if status != "CREATING": break print("Synchronize the data source.") sync_response = kendra.start_data_source_sync_job( Id = data_source_id, IndexId = index_id ) pprint.pprint(sync_response) print("Wait for the data source to sync with the index.") while True: jobs = kendra.list_data_source_sync_jobs( Id= data_source_id, IndexId= index_id ) # For this example, there should be one job status = jobs["History"][0]["Status"] print(" Syncing data source. Status: "+status) time.sleep(60) if status != "SYNCING": break except ClientError as e: print("%s" % e) print("Program ends.")
Java

顧客識別番号を削除するための基本的なデータ操作を構成するには

package com.amazonaws.kendra; import java.util.concurrent.TimeUnit; import software.amazon.awssdk.services.kendra.KendraClient; import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest; import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse; import software.amazon.awssdk.services.kendra.model.CreateIndexRequest; import software.amazon.awssdk.services.kendra.model.CreateIndexResponse; import software.amazon.awssdk.services.kendra.model.DataSourceConfiguration; import software.amazon.awssdk.services.kendra.model.DataSourceStatus; import software.amazon.awssdk.services.kendra.model.DataSourceSyncJob; import software.amazon.awssdk.services.kendra.model.DataSourceSyncJobStatus; import software.amazon.awssdk.services.kendra.model.DataSourceType; import software.amazon.awssdk.services.kendra.model.DescribeDataSourceRequest; import software.amazon.awssdk.services.kendra.model.DescribeDataSourceResponse; import software.amazon.awssdk.services.kendra.model.DescribeIndexRequest; import software.amazon.awssdk.services.kendra.model.DescribeIndexResponse; import software.amazon.awssdk.services.kendra.model.IndexStatus; import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest; import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse; import software.amazon.awssdk.services.kendra.model.S3DataSourceConfiguration; import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest; import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse; public class CreateDataSourceWithCustomizationsExample { public static void main(String[] args) throws InterruptedException { System.out.println("Create a data source with customizations"); String dataSourceName = "data-source-name"; String indexId = "index-id"; String dataSourceRoleArn = "arn:aws:iam::account-id:role/role-name"; String s3BucketName = "S3-bucket-name" KendraClient kendra = KendraClient.builder().build(); CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest .builder() .name(dataSourceName) .description(experienceDescription) .roleArn(experienceRoleArn) .type(DataSourceType.S3) .configuration( DataSourceConfiguration .builder() .s3Configuration( S3DataSourceConfiguration .builder() .bucketName(s3BucketName) .build() ).build() ) .customDocumentEnrichmentConfiguration( CustomDocumentEnrichmentConfiguration .builder() .inlineConfigurations(Arrays.asList( InlineCustomDocumentEnrichmentConfiguration .builder() .target( DocumentAttributeTarget .builder() .targetDocumentAttributeKey("Customer_ID") .targetDocumentAttributeValueDeletion(true) .build()) .build() )).build(); CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest); System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse)); String dataSourceId = createDataSourceResponse.id(); System.out.println(String.format("Waiting for Kendra to create the data source %s", dataSourceId)); DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); while (true) { DescribeDataSourceResponse describeDataSourceResponse = kendra.describeDataSource(describeDataSourceRequest); DataSourceStatus status = describeDataSourceResponse.status(); System.out.println(String.format("Creating data source. Status: %s", status)); TimeUnit.SECONDS.sleep(60); if (status != DataSourceStatus.CREATING) { break; } } System.out.println(String.format("Synchronize the data source %s", dataSourceId)); StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest); System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId())); // For this example, there should be one job ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); while (true) { ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest); DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0); System.out.println(String.format("Syncing data source. Status: %s", job.status())); TimeUnit.SECONDS.sleep(60); if (job.status() != DataSourceSyncJobStatus.SYNCING) { break; } } System.out.println("Data source creation with customizations is complete"); } }

Lambda 関数:メタデータまたはコンテンツの抽出と変更

Lambda 関数を使用して、ドキュメントのフィールド、およびコンテンツを操作できます。これは、基本ロジックを超えて高度なデータ操作を適用する場合に便利です。例えば、画像上のテキストを解釈し、各画像をテキストドキュメントとして扱う、光学文字認識 (OCR) を使用します。または、特定のタイムゾーンで現在の日付/時間を取得し、日付フィールドに空の値がある日付/時刻を挿入します。

まず基本ロジックを適用し、Lambda 関数を使用してデータをさらに操作でき、その逆も可能です。Lambda 関数のみを適用することもできます。

Amazon Kendra は Lambda 関数を呼び出して、CustomDocumentEnrichmentConfiguration の一部として取り込みプロセス中に高度なデータ操作を適用します。Lambda 関数を実行し、Amazon S3 バケットにアクセスしてデータ操作の出力を保存する許可を含むロールを指定します。「IAM アクセスロール」を参照してください。

Amazon Kendra では、元のドキュメント、または構造化された解析済みドキュメントに Lambda 関数を適用できます。PreExtractionHookConfiguration を使用して、元のデータまたは raw データを受け取り、データ操作を適用する Lambda 関数を構成できます。また、PostExtractionHookConfiguration を使用して構造化ドキュメントを受け取り、データ操作を適用する Lambda 関数を設定することもできます。Amazon Kendra はドキュメントのメタデータとテキストを抽出してドキュメントを構造化します。Lambda 関数は、必須のリクエストとレスポンスの構造に従う必要があります。詳細については、「Lambda 関数のデータ制約」を参照してください。

コンソールで Lambda 関数を設定するには、インデックスを選択し、ナビゲーションメニューの [Document enrichments] (ドキュメントのエンリッチメント) を選択します。[Configure Lambda functions] (Lambda 関数の設定) をクリックして、Lambda 関数を設定します。

PreExtractionHookConfiguration に設定できる Lambda 関数は 1 つのみ、PostExtractionHookConfiguration に設定できる Lambda 関数も 1 つのみです。ただし、Lambda 関数は必要とする他の関数を呼び出すことができます。PreExtractionHookConfiguration および PostExtractionHookConfiguration の両方またはいずれか 1 つを設定できます。PreExtractionHookConfiguration の Lambda 関数の実行時間が 5 分を超えないよう、また、PostExtractionHookConfiguration の Lambda 関数の実行時間が 1 分を超えないようにしてください。Custom Document Enrichment の設定は、これを設定しない場合よりも、Amazon Kendra にドキュメントを取り込むのに時間がかかります。

条件が満たされた場合にのみ Lambda 関数を呼び出すように Amazon Kendra を設定できます。例えば、空の日付/時間値がある場合、Amazon Kendra は現在の日付/時間を挿入する関数を呼び出す必要があるという条件を指定できます。

次に、Lambda 関数を使用して OCR を実行して画像からテキストを解釈し、このテキストを「Document_Image_Text」というフィールドに保存する例を示します。

例 1: 画像からテキストを抽出してテキストドキュメントを作成する

高度な操作が適用される前のデータ。

Document_ID Document_Image
1 image_1.png
2 image_2.png
3 image_3.png

高度な操作が適用された後のデータ。

Document_ID Document_Image Document_Image_Text
1 image_1.png メールでのアンケートの回答
2 image_2.png メールでのアンケートの回答
3 image_3.png メールでのアンケートの回答

次に、Lambda 関数を使用して、空の日付値に対する現在の日付/時間を挿入する例を示します。これは、日付フィールドの値が「null」の場合、これを現在の日付/時刻に置き換えるという条件を使用します。

例 2: Last_Updated フィールドの空の値を、現在の日付/時間で置き換える。

高度な操作が適用される前のデータ。

Document_ID Body_Text Last_Updated
1 Lorem Ipsum。 2020 年 1 月 1 日
2 Lorem Ipsum。
3 Lorem Ipsum。 2020 年 7 月 1 日

高度な操作が適用された後のデータ。

Document_ID Body_Text Last_Updated
1 Lorem Ipsum。 2020 年 1 月 1 日
2 Lorem Ipsum。 2021 年 12 月 1 日
3 Lorem Ipsum。 2020 年 7 月 1 日

次のコードは、raw の元のデータに対して高度なデータ操作のための Lambda 関数を設定する例です。

Console
raw の元のデータに対して高度なデータ操作のための Lambda 関数を設定するには
  1. 左側のナビゲーションペインの [Indexes] (インデックス) で、[Document enrichments] (ドキュメントのエンリッチメント) を選択して、[Add document enrichment] (ドキュメントのエンリッチメントを追加) を選択します。

  2. [Lambda 関数の設定] ページの [事前抽出用の Lambda] セクションで、ドロップダウンから Lambda 関数 ARN と Amazon S3 バケットを選択します。ドロップダウンから、新しいロールを作成するオプションを選択して、IAM アクセスロールを追加します。これにより、Amazon Kendra ドキュメントエンリッチメントの作成に必要なアクセス許可が作成されます。

CLI

raw の元のデータに対して高度なデータ操作のための Lambda 関数を設定するには

aws kendra create-data-source \ --name data-source-name \ --index-id index-id \ --role-arn arn:aws:iam::account-id:role/role-name \ --type S3 \ --configuration '{"S3Configuration":{"BucketName":"S3-bucket-name"}}' \ --custom-document-enrichment-configuration '{"PreExtractionHookConfiguration":{"LambdaArn":"arn:aws:iam::account-id:function/function-name", "S3Bucket":"S3-bucket-name"}, "RoleArn": "arn:aws:iam:account-id:role/cde-role-name"}'
Python

raw の元のデータに対して高度なデータ操作のための Lambda 関数を設定するには

import boto3 from botocore.exceptions import ClientError import pprint import time kendra = boto3.client("kendra") print("Create a data source with customizations.") # Provide the name of the data source name = "data-source-name" # Provide the index ID for the data source index_id = "index-id" # Provide the IAM role ARN required for data sources role_arn = "arn:aws:iam::${account-id}:role/${role-name}" # Provide the data source connection information data_source_type = "S3" S3_bucket_name = "S3-bucket-name" # Configure the data source with Custom Document Enrichment configuration = {"S3Configuration": { "BucketName": S3_bucket_name } } custom_document_enrichment_configuration = {"PreExtractionHookConfiguration": { "LambdaArn":"arn:aws:iam::account-id:function/function-name", "S3Bucket":"S3-bucket-name" } "RoleArn":"arn:aws:iam::account-id:role/cde-role-name" } try: data_source_response = kendra.create_data_source( Name = name, IndexId = index_id, RoleArn = role_arn, Type = data_source_type Configuration = configuration CustomDocumentEnrichmentConfiguration = custom_document_enrichment_configuration ) pprint.pprint(data_source_response) data_source_id = data_source_response["Id"] print("Wait for Amazon Kendra to create the data source with your customizations.") while True: # Get the details of the data source, such as the status data_source_description = kendra.describe_data_source( Id = data_source_id, IndexId = index_id ) status = data_source_description["Status"] print(" Creating data source. Status: "+status) time.sleep(60) if status != "CREATING": break print("Synchronize the data source.") sync_response = kendra.start_data_source_sync_job( Id = data_source_id, IndexId = index_id ) pprint.pprint(sync_response) print("Wait for the data source to sync with the index.") while True: jobs = kendra.list_data_source_sync_jobs( Id = data_source_id, IndexId = index_id ) # For this example, there should be one job status = jobs["History"][0]["Status"] print(" Syncing data source. Status: "+status) time.sleep(60) if status != "SYNCING": break except ClientError as e: print("%s" % e) print("Program ends.")
Java

raw の元のデータに対して高度なデータ操作のための Lambda 関数を設定するには

package com.amazonaws.kendra; import java.util.concurrent.TimeUnit; import software.amazon.awssdk.services.kendra.KendraClient; import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest; import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse; import software.amazon.awssdk.services.kendra.model.CreateIndexRequest; import software.amazon.awssdk.services.kendra.model.CreateIndexResponse; import software.amazon.awssdk.services.kendra.model.DataSourceConfiguration; import software.amazon.awssdk.services.kendra.model.DataSourceStatus; import software.amazon.awssdk.services.kendra.model.DataSourceSyncJob; import software.amazon.awssdk.services.kendra.model.DataSourceSyncJobStatus; import software.amazon.awssdk.services.kendra.model.DataSourceType; import software.amazon.awssdk.services.kendra.model.DescribeDataSourceRequest; import software.amazon.awssdk.services.kendra.model.DescribeDataSourceResponse; import software.amazon.awssdk.services.kendra.model.DescribeIndexRequest; import software.amazon.awssdk.services.kendra.model.DescribeIndexResponse; import software.amazon.awssdk.services.kendra.model.IndexStatus; import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest; import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse; import software.amazon.awssdk.services.kendra.model.S3DataSourceConfiguration; import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest; import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse; public class CreateDataSourceWithCustomizationsExample { public static void main(String[] args) throws InterruptedException { System.out.println("Create a data source with customizations"); String dataSourceName = "data-source-name"; String indexId = "index-id"; String dataSourceRoleArn = "arn:aws:iam::account-id:role/role-name"; String s3BucketName = "S3-bucket-name" KendraClient kendra = KendraClient.builder().build(); CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest .builder() .name(dataSourceName) .description(experienceDescription) .roleArn(experienceRoleArn) .type(DataSourceType.S3) .configuration( DataSourceConfiguration .builder() .s3Configuration( S3DataSourceConfiguration .builder() .bucketName(s3BucketName) .build() ).build() ) .customDocumentEnrichmentConfiguration( CustomDocumentEnrichmentConfiguration .builder() .preExtractionHookConfiguration( HookConfiguration .builder() .lambdaArn("arn:aws:iam::account-id:function/function-name") .s3Bucket("S3-bucket-name") .build()) .roleArn("arn:aws:iam::account-id:role/cde-role-name") .build(); CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest); System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse)); String dataSourceId = createDataSourceResponse.id(); System.out.println(String.format("Waiting for Kendra to create the data source %s", dataSourceId)); DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); while (true) { DescribeDataSourceResponse describeDataSourceResponse = kendra.describeDataSource(describeDataSourceRequest); DataSourceStatus status = describeDataSourceResponse.status(); System.out.println(String.format("Creating data source. Status: %s", status)); TimeUnit.SECONDS.sleep(60); if (status != DataSourceStatus.CREATING) { break; } } System.out.println(String.format("Synchronize the data source %s", dataSourceId)); StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest); System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId())); // For this example, there should be one job ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest .builder() .indexId(indexId) .id(dataSourceId) .build(); while (true) { ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest); DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0); System.out.println(String.format("Syncing data source. Status: %s", job.status())); TimeUnit.SECONDS.sleep(60); if (job.status() != DataSourceSyncJobStatus.SYNCING) { break; } } System.out.println("Data source creation with customizations is complete"); } }

Lambda 関数のデータ制約

高度なデータ操作のための Lambda 関数は、Amazon Kendra データコントラクトと連携します。制約は、Lambda 関数の必須のリクエストとレスポンスの構造です。Lambda 関数がこれらの構造に従わない場合、Amazon Kendra はエラーをスローします。

PreExtractionHookConfiguration の Lambda 関数は、次のリクエスト構造を期待します。

{ "version": <str>, "dataBlobStringEncodedInBase64": <str>, //In the case of a data blob "s3Bucket": <str>, //In the case of an S3 bucket "s3ObjectKey": <str>, //In the case of an S3 bucket "metadata": <Metadata> }

metadata 構造。これには、つぎの CustomDocumentAttribute 構造を含みます。

{ "attributes": [<CustomDocumentAttribute<] } CustomDocumentAttribute { "name": <str>, "value": <CustomDocumentAttributeValue> } CustomDocumentAttributeValue { "stringValue": <str>, "integerValue": <int>, "longValue": <long>, "stringListValue": list<str>, "dateValue": <str> }

PreExtractionHookConfiguration の Lambda 関数は、以下のレスポンス構造に従う必要があります。

{ "version": <str>, "dataBlobStringEncodedInBase64": <str>, //In the case of a data blob "s3ObjectKey": <str>, //In the case of an S3 bucket "metadataUpdates": [<CustomDocumentAttribute>] }

PostExtractionHookConfiguration の Lambda 関数は、次のリクエスト構造を期待します。

{ "version": <str>, "s3Bucket": <str>, "s3ObjectKey": <str>, "metadata": <Metadata> }

PostExtractionHookConfiguration の Lambda 関数は、以下のレスポンス構造に従う必要があります。

PostExtractionHookConfiguration Lambda Response { "version": <str>, "s3ObjectKey": <str>, "metadataUpdates": [<CustomDocumentAttribute>] }

変更されたドキュメントが Amazon S3 バケットにアップロードされます。変更されたドキュメントは、構造化ドキュメントの形式 に示す形式に従う必要があります。

構造化ドキュメントの形式

Amazon Kendra は、構造化ドキュメントを指定された Amazon S3 バケットにアップロードします。構造化ドキュメントは、次の形式に従います。

Kendra document { "textContent": <TextContent> } TextContent { "documentBodyText": <str> }

データ制約に準拠する Lambda 関数の例

次の Python コードは、メタデータフィールド _authors_document_title および raw の元のドキュメントの本文の高度な操作を適用する Lambda 関数の例です。

本文が Amazon S3 バケットに存在する場合

import json import boto3 s3 = boto3.client("s3") # Lambda function for advanced data manipulation def lambda_handler(event, context): # Get the value of "S3Bucket" key name or item from the given event input s3_bucket = event.get("s3Bucket") # Get the value of "S3ObjectKey" key name or item from the given event input s3_object_key = event.get("s3ObjectKey") content_object_before_CDE = s3.get_object(Bucket = s3_bucket, Key = s3_object_key) content_before_CDE = content_object_before_CDE["Body"].read().decode("utf-8"); content_after_CDE = "CDEInvolved " + content_before_CDE # Get the value of "metadata" key name or item from the given event input metadata = event.get("metadata") # Get the document "attributes" from the metadata document_attributes = metadata.get("attributes") s3.put_object(Bucket = s3_bucket, Key = "dummy_updated_kendra_document", Body=json.dumps(content_after_CDE)) return { "version": "v0", "s3ObjectKey": "dummy_updated_kendra_document", "metadataUpdates": [ {"name":"_document_title", "value":{"stringValue":"title_from_pre_extraction_lambda"}}, {"name":"_authors", "value":{"stringListValue":["author1", "author2"]}} ] }

本文がデータ BLOB に存在する場合

import json import boto3 import base64 # Lambda function for advanced data manipulation def lambda_handler(event, context): # Get the value of "dataBlobStringEncodedInBase64" key name or item from the given event input data_blob_string_encoded_in_base64 = event.get("dataBlobStringEncodedInBase64") # Decode the data blob string in UTF-8 data_blob_string = base64.b64decode(data_blob_string_encoded_in_base64).decode("utf-8") # Get the value of "metadata" key name or item from the given event input metadata = event.get("metadata") # Get the document "attributes" from the metadata document_attributes = metadata.get("attributes") new_data_blob = "This should be the modified data in the document by pre processing lambda ".encode("utf-8") return { "version": "v0", "dataBlobStringEncodedInBase64": base64.b64encode(new_data_blob).decode("utf-8"), "metadataUpdates": [ {"name":"_document_title", "value":{"stringValue":"title_from_pre_extraction_lambda"}}, {"name":"_authors", "value":{"stringListValue":["author1", "author2"]}} ] }

次の Python コードは、メタデータフィールド _authors_document_title および構造化されたドキュメントまたは解析済みのドキュメントの本文の高度な操作を適用する Lambda 関数の例です。

import json import boto3 import time s3 = boto3.client("s3") # Lambda function for advanced data manipulation def lambda_handler(event, context): # Get the value of "S3Bucket" key name or item from the given event input s3_bucket = event.get("s3Bucket") # Get the value of "S3ObjectKey" key name or item from the given event input s3_key = event.get("s3ObjectKey") # Get the value of "metadata" key name or item from the given event input metadata = event.get("metadata") # Get the document "attributes" from the metadata document_attributes = metadata.get("attributes") kendra_document_object = s3.get_object(Bucket = s3_bucket, Key = s3_key) kendra_document_string = kendra_document_object['Body'].read().decode('utf-8') kendra_document = json.loads(kendra_document_string) kendra_document["textContent"]["documentBodyText"] = "Changing document body to a short sentence." s3.put_object(Bucket = s3_bucket, Key = "dummy_updated_kendra_document", Body=json.dumps(kendra_document)) return { "version" : "v0", "s3ObjectKey": "dummy_updated_kendra_document", "metadataUpdates": [ {"name": "_document_title", "value":{"stringValue": "title_from_post_extraction_lambda"}}, {"name": "_authors", "value":{"stringListValue":["author1", "author2"]}} ] }