Enriquecendo seus documentos durante a absorção - Amazon Kendra

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Enriquecendo seus documentos durante a absorção

Você pode alterar os campos ou atributos de metadados do conteúdo e do documento durante o processo de absorção de documentos. Com o atributo do Amazon Kendra de Enriquecimento personalizado de documentos, você pode criar, modificar ou excluir atributos e conteúdo do documento ao absorver os documentos. Amazon Kendra Isso significa que você pode manipular e absorver os dados conforme necessário.

Esse atributo oferece controle sobre como os documentos são tratados e absorvidos. Amazon Kendra Por exemplo, você pode limpar as informações de identificação pessoal nos metadados do documento ao absorver os documentos. Amazon Kendra

Outra forma de usar esse atributo é invocar uma função do Lambda no AWS Lambda para executar o reconhecimento óptico de caracteres (OCR) em imagens, tradução em texto e outras tarefas para preparar os dados para pesquisa ou análise. Por exemplo, você pode invocar uma função para executar o OCR em imagens. A função pode interpretar texto de imagens e tratar cada imagem como um documento textual. Uma empresa que recebe pesquisas de clientes enviadas por e-mail e as armazena como imagens pode gerar essas imagens como documentos de texto no Amazon Kendra. A empresa pode então pesquisar informações valiosas sobre pesquisas com clientes no Amazon Kendra.

Você pode usar operações básicas para aplicar como a primeira análise dos dados e, em seguida, usar uma função do Lambda para aplicar operações mais complexas nos dados. Por exemplo, use uma operação básica para simplesmente remover todos os valores no campo de metadados do documento 'Customer_ID' e depois aplicar uma função do Lambda para extrair texto das imagens do texto nos documentos.

Como funciona o enriquecimento personalizado de documentos

O processo geral de enriquecimento personalizado de documentos é o seguinte:

  1. Configure o enriquecimento personalizado de documentos ao criar ou atualizar a fonte de dados ou ao indexar os documentos diretamente no Amazon Kendra.

  2. O Amazon Kendra aplica configurações em linha ou lógica básica para alterar os dados. Para obter mais informações, consulte Operações básicas para alterar metadados.

  3. Se optar por configurar a manipulação avançada de dados, Amazon Kendra poderá aplicá-la nos documentos originais brutos ou nos documentos estruturados e analisados. Para obter mais informações, consulte Funções do Lambda: extrair e alterar metadados ou conteúdo.

  4. Os documentos alterados são inseridos em Amazon Kendra

Em qualquer momento desse processo, se a configuração não for válida, Amazon Kendra gerará um erro.

Ao escolher as APIs CreateDataSource, UpdateDataSource ou BatchputDocument, você fornece a configuração personalizada de enriquecimento de documentos. Se escolher BatchPutDocument, deverá configurar o enriquecimento personalizado de documentos com cada solicitação. Se você usa o console, seleciona o índice e, em seguida, selecione Enriquecimentos de documentos para configurar o enriquecimento personalizado de documentos.

Se você usar o enriquecimentos de documentos no console, poderá optar por configurar somente as operações básicas, somente as funções do Lambda ou as duas, como ao usar a API. Selecione Avançar nas etapas do console para optar por não configurar operações básicas e somente as funções do Lambda, incluindo se deseja aplicar aos dados originais (pré-extração) ou estruturados (pós-extração). Você só pode salvar as configurações ao concluir todas as etapas no console. As configurações do documento não serão salvas se você não concluir todas as etapas.

Operações básicas para alterar metadados

Você pode manipular os campos e o conteúdo do documento usando a lógica básica. Isso inclui remover valores em um campo, modificar valores em um campo usando uma condição ou criar um campo. Para manipulações avançadas que vão além do que você pode manipular usando a lógica básica, invoque uma função do Lambda. Para obter mais informações, consulte Funções do Lambda: extrair e alterar metadados ou conteúdo.

Para aplicar a lógica básica, especifique o campo de destino que deseja manipular usando o objeto DocumentAttributeTarget. Forneça a chave de atributo. Por exemplo, a chave “Departamento” é um campo ou atributo que contém todos os nomes de departamentos associados aos documentos. Você também pode especificar um valor a ser usado no campo de destino se uma determinada condição for atendida. Defina a condição usando o objeto DocumentAttributeCondition. por exemplo, se o campo “Source_URI” contiver “financeiro” como valor de URI, o campo de destino “Departmento” será preenchido previamente com o valor de destino “Financeiro” para o documento. Você também pode excluir os valores do atributo do documento de destino.

Para aplicar a lógica básica usando o console, selecione o índice e, em seguida, selecione Enriquecimentos de documentos no menu de navegação. Acesse Configurar operações básicas para aplicar manipulações básicas aos campos e ao conteúdo do documento.

O exemplo a seguir é do uso da lógica básica para remover todos os números de identificação do cliente no campo “Customer_ID”.

Exemplo 1: remoção dos números de identificação do cliente associados aos documentos

Dados antes da aplicação da manipulação básica.

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

Dados antes da aplicação da manipulação básica.

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

Veja a seguir um exemplo do uso da lógica básica para criar um campo chamado “Departamento” e preencher previamente esse campo com os nomes dos departamentos com base nas informações do campo do “Source_URI”. Isso define a condição estabelecendo que, se o campo “Source_URI” contiver “financial” (financeiro) como valor de URI, o campo de destino “Department” (Departamento) será preenchido previamente com o valor de destino “Financeiro” para o documento.

Exemplo 2: criar o campo “Departamento” e preenchê-lo previamente com os nomes dos departamentos associados aos documentos usando uma condição.

Dados antes da aplicação da manipulação básica.

Document_ID Body_Text Source_URI
1 Lorem Ipsum. financeiro/1
2 Lorem Ipsum. financeiro/2
3 Lorem Ipsum. financeiro/3

Dados antes da aplicação da manipulação básica.

Document_ID Body_Text Source_URI Departamento
1 Lorem Ipsum. financeiro/1 Financeiro
2 Lorem Ipsum. financeiro/2 Financeiro
3 Lorem Ipsum. financeiro/3 Financeiro
nota

O Amazon Kendra não poderá criar um campo de documento de destino se ele ainda não tiver sido criado como um campo de índice. Depois de criar o campo de índice, você poderá criar um campo de documento usandoDocumentAttributeTarget. Em seguida, o Amazon Kendra mapeia o campo de metadados do documento recém-criado para o campo de índice.

O código a seguir é um exemplo de como configurar a manipulação básica de dados para remover os números de identificação do cliente associados aos documentos.

Console
Para configurar a manipulação básica de dados para remover números de identificação do cliente
  1. No painel de navegação esquerdo, em Índices, selecione Enriquecimentos de documentos e, em seguida, selecione Adicionar enriquecimento de documentos.

  2. Na página Configurar operações básicas, escolha na lista suspensa a fonte de dados que você deseja alterar os campos e o conteúdo do documento. Em seguida, escolha no menu suspenso o nome do campo do documento “Customer_ID”, selecione no menu suspenso o nome do campo do índice “Customer_ID” e selecione no menu suspenso a ação de destino Excluir. Em seguida, selecione Adicionar operação básica.

CLI

Para configurar a manipulação básica de dados para remover números de identificação do cliente

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

Para configurar a manipulação básica de dados para remover números de identificação do cliente

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

Para configurar a manipulação básica de dados para remover números de identificação do cliente

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"); } }

Funções do Lambda: extrair e alterar metadados ou conteúdo

Você pode manipular os campos e o conteúdo do documento usando as funções do Lambda. Isso é útil se você quiser ir além da lógica básica e aplicar manipulações avançadas de dados. Por exemplo, ao usar o reconhecimento óptico de caracteres (OCR), que interpreta texto de imagens e trata cada imagem como um documento de texto. Ou recuperando a data e hora atual em um determinado fuso horário e inserindo a data e hora em que há um valor vazio para um campo de data.

Você pode aplicar a lógica básica primeiro e depois usar uma função do Lambda para manipular ainda mais os dados, ou vice-versa. Você também pode optar por aplicar somente uma função do Lambda.

O Amazon Kendra pode invocar uma função do Lambda para aplicar manipulações avançadas de dados durante o processo de absorção como parte do CustomDocumentEnrichmentConfiguration. Você pode especificar uma função que inclui permissão para executar a função do Lambda e acessar o bucket do Amazon S3 para armazenar a saída de suas manipulações de dados: consulte funções de acesso do IAM.

O Amazon Kendra pode aplicar uma função do Lambda em seus documentos originais ou brutos ou nos documentos estruturados e analisados. Você pode configurar uma função do Lambda que pegue os dados originais ou brutos e aplique as manipulações de dados usando o PreExtractionHookConfiguration. Você também pode configurar uma função do Lambda que usa os documentos estruturados e aplica suas manipulações de dados usando o PostExtractionHookConfiguration. O Amazon Kendra extrai os metadados e o texto do documento para estruturar os documentos. As funções do Lambda devem seguir as estruturas obrigatórias de solicitação e resposta. Para obter mais informações, consulte Contratos de dados para funções do Lambda.

Para aplicar a função do Lambda usando o console, selecione o índice e, em seguida, selecione Enriquecimentos de documentos no menu de navegação. Acesse Configurar funções do Lambda para configurar uma função do Lambda.

Você pode configurar somente uma função do Lambda para PreExtractionHookConfiguration e somente mais uma função do Lambda para PostExtractionHookConfiguration. No entanto, essa função do Lambda pode invocar outras funções necessárias. Você pode configurar PreExtractionHookConfiguration e PostExtractionHookConfiguration e/ou um só deles. A função do Lambda para PreExtractionHookConfiguration não deve exceder um tempo de execução de 5 minutos e a função do Lambda para PostExtractionHookConfiguration não deve exceder o tempo de execução de 1 minuto. A configuração do enriquecimento personalizado de documentos naturalmente leva mais tempo para absorver os documentos no Amazon Kendra do que se a opção não estiver configurada.

Você pode configurar o Amazon Kendra para invocar uma função do Lambda somente se uma condição for atendida. Por exemplo, você pode especificar uma condição determinando que, se houver valores de data e hora vazios, o Amazon Kendra deverá invocar uma função para inserir a data e hora atuais.

Veja a seguir um exemplo do uso de uma função do Lambda para executar o OCR para interpretar texto de imagens e armazenar esse texto em um campo chamado “Document_Image_Text”.

Exemplo 1: extraindo texto de imagens para criar documentos textuais

Dados antes da aplicação da manipulação avançada.

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

Dados depois da aplicação da manipulação avançada.

Document_ID Document_Image Document_Image_Text
1 image_1.png Resposta de pesquisa enviada por e-mail
2 image_2.png Resposta de pesquisa enviada por e-mail
3 image_3.png Resposta de pesquisa enviada por e-mail

Veja a seguir um exemplo do uso de uma função do Lambda para inserir a data e hora atual para valores de data vazios. Isso usa a condição de que, se o valor do campo de data for “nulo”, ele deve ser substituído pela data e hora atual.

Exemplo 2: substituindo valores vazios no campo Last_Updated pela data e hora atual.

Dados antes da aplicação da manipulação avançada.

Document_ID Body_Text Last_Updated
1 Lorem Ipsum. 1º de janeiro de 2020
2 Lorem Ipsum.
3 Lorem Ipsum. 1.º de julho de 2020

Dados depois da aplicação da manipulação avançada.

Document_ID Body_Text Last_Updated
1 Lorem Ipsum. 1º de janeiro de 2020
2 Lorem Ipsum. 1.º de dezembro de 2021
3 Lorem Ipsum. 1.º de julho de 2020

O código a seguir é um exemplo de configuração de uma função do Lambda para manipulação avançada de dados nos dados originais brutos.

Console
Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos
  1. No painel de navegação esquerdo, em Índices, selecione Enriquecimentos de documentos e, em seguida, selecione Adicionar enriquecimento de documentos.

  2. Na página Configurar funções do Lambda, na seção Lambda para pré-extração, selecione nos menus suspensos o ARN da função do Lambda e o bucket do Amazon S3. Adicione a função de acesso do IAM ao selecionar a opção de criar uma nova função no menu suspenso. Isso cria as permissões necessárias do Amazon Kendra para criar o enriquecimento do documento.

CLI

Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos

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

Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos

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

Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos

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"); } }

Contratos de dados para funções do Lambda

As funções do Lambda para manipulação avançada de dados interagem com os contratos de dados do Amazon Kendra. Os contratos são as estruturas obrigatórias de solicitação e resposta das funções do Lambda. Se as funções do Lambda não seguirem essas estruturas, o Amazon Kendra gerará um erro.

A função do Lambda para PreExtractionHookConfiguration deve esperar a seguinte estrutura de solicitação:

{ "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> }

A estrutura metadata, que inclui a estrutura CustomDocumentAttribute, é a seguinte:

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

A função do Lambda para PreExtractionHookConfiguration deve seguir a seguinte estrutura de resposta:

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

A função do Lambda para PostExtractionHookConfiguration deve esperar a seguinte estrutura de solicitação:

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

A função do Lambda para PostExtractionHookConfiguration deve seguir a seguinte estrutura de resposta:

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

O documento alterado é enviado para o bucket do Amazon S3. O documento alterado deve seguir o formato mostrado em Formato de documento estruturado.

Formato de documento estruturado

O Amazon Kendra carrega o documento estruturado em um determinado bucket do Amazon S3. O documento estruturado segue esse formato:

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

Exemplo de uma função do Lambda que adere aos contratos de dados

O código Python a seguir é um exemplo de uma função do Lambda que aplica manipulação avançada dos campos de metadados _authors, _document_title e do conteúdo do corpo nos documentos brutos ou originais.

No caso do conteúdo corporal estiver em um bucket do 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"]}} ] }

No caso do conteúdo corporal estiver em um bucket do blob de dados

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"]}} ] }

O código Python a seguir é um exemplo de uma função do Lambda que aplica manipulação avançada dos campos de metadados _authors, _document_title e do conteúdo do corpo nos documentos estruturados ou analisados.

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"]}} ] }