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

nota

O suporte a recursos varia de acordo com o tipo de índice e a pesquisa API usada. Para ver se esse recurso é compatível com o tipo de índice e a pesquisa API que você está usando, consulte Tipos de índice.

Você pode alterar os campos ou atributos de metadados do conteúdo e do documento durante o processo de absorção de documentos. Com Amazon Kendra o recurso de enriquecimento personalizado de documentos, você pode criar, modificar ou excluir atributos e conteúdo do documento ao ingerir seus 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 informações de identificação pessoal nos metadados do documento enquanto ingere seus documentos. Amazon Kendra

Outra forma de usar esse recurso é invocar uma função AWS Lambda 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 ser executada 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. Você configura o Enriquecimento Personalizado de Documentos ao criar ou atualizar sua fonte de dados ou ao indexar seus documentos diretamente no Amazon Kendra.

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

  3. Se você optar por configurar a manipulação avançada de dados, Amazon Kendra poderá aplicá-la em seus 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. Seus 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.

Quando você liga CreateDataSource, UpdateDataSourceBatchPutDocumentAPIs, ou fornece sua configuração de enriquecimento personalizado 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 enriquecimentos de documentos no console, poderá optar por configurar somente as operações básicas ou somente as funções do Lambda ou ambas, como você pode usar o. 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, você especifica o campo de destino que deseja manipular usando o DocumentAttributeTargetobjeto. 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. Você define a condição usando o DocumentAttributeConditionobjeto. Por exemplo, se o campo “Fonte_URI” contiver “financeiro” em seu URI valor, preencha previamente o campo de destino “Departamento” com o valor alvo “Finanças” do 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 'Fonte_ 'URI. Isso usa a condição de que, se o campo 'Origem_URI' contiver 'financeiro' em seu URI valor, preencha previamente o campo de destino 'Departamento' com o valor alvo 'Finanças' do 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 Fonte_ 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 Fonte_ URI Departamento
1 Lorem Ipsum. financeiro/1 Financeiro
2 Lorem Ipsum. financeiro/2 Financeiro
3 Lorem Ipsum. financeiro/3 Financeiro
nota

Amazon Kendra não é possível criar um campo do documento de destino se ele ainda não tiver sido criado como um campo de índice. Depois de criar seu campo de índice, você pode criar um campo de documento usando DocumentAttributeTarget o. Amazon Kendra em seguida, 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, usando o Reconhecimento Óptico de Caracteres (OCR), que interpreta texto de imagens e trata cada imagem como um documento textual. 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.

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

Amazon Kendra pode aplicar uma função Lambda em seus documentos originais brutos ou nos documentos estruturados e analisados. Você pode configurar uma função Lambda que pega seus dados originais ou brutos e aplica suas manipulações de dados usando. PreExtractionHookConfiguration Você também pode configurar uma função Lambda que pega seus documentos estruturados e aplica suas manipulações de dados usando. PostExtractionHookConfiguration Amazon Kendra extrai os metadados e o texto do documento para estruturar seus 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 ingerir seus documentos Amazon Kendra do que se você não configurasse isso.

Você pode configurar Amazon Kendra para invocar uma função Lambda somente se uma condição for atendida. Por exemplo, você pode especificar uma condição de que, se houver valores de data e hora vazios, invoque uma função que insira a data e hora atual. Amazon Kendra

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

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 sua função Lambda e seu bucket. ARN Amazon S3 Adicione sua função de IAM acesso selecionando a opção de criar uma nova função no menu suspenso. Isso cria as Amazon Kendra permissões necessárias 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 suas funções do Lambda não seguirem essas estruturas, 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>] }

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

Formato de documento estruturado

Amazon Kendra carrega seu documento estruturado em um determinado Amazon S3 bucket. 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 residir em um balde 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"]}} ] }