O blog da AWS

Implementando uma aplicação de geração de histórias serverless baseado em eventos com ChatGPT e DALL-E

Por David Boyne, Senior Developer Advocate especializado em Serverless
Este post foi escrito por David Boyne, um Senior Developer Advocate especializado em Serverless e adaptado para Português por Rodrigo Prado, arquiteto de soluções sênior.Esta publicação demonstra como integrar os serviços serverless da AWS com tecnologias de inteligência artificial (IA), ChatGPT e DALL-E. Essa aplicação totalmente baseada em eventos apresenta um método de gerar histórias exclusivas para dormir para crianças usando personagens e cenas predeterminados como um prompt para o ChatGPT.

Todas as noites, na hora de dormir, o agendador serverless aciona o aplicativo, iniciando um fluxo de trabalho orientado por eventos para criar e armazenar novas histórias exclusivas geradas por IA com imagens e áudios geradas por IA.

Esses conjuntos de dados são usados para mostrar a história em um site customizado criado com o Next.js hospedado com o AWS App Runner. Depois que a história é criada, uma notificação é enviada ao usuário contendo uma URL para visualizar e ler a história para as crianças.

Example notification of a story hosted with Next.js and App RunnerExemplo de notificação de uma história hospedada com Next.js e App Runner

O aplicativo mencionado nesta postagem do blog demonstra exemplos de mensagens ponto a ponto com Amazon EventBridge Pipes, padrões de publicação/subscrição com o Amazon EventBridge e reação a eventos de captura de dados alterados com o DynamoDB Streams.

Entendendo a arquitetura

A imagem a seguir mostra a arquitetura serverless usada para gerar histórias:

Architecture diagram for Serverless bed time story generation with ChatGPT and DALL-EDiagrama de arquitetura para geração de histórias de hora de dormir serverless com ChatGPT e DALL-E

Uma nova história infantil é gerada todos os dias no horário configurado usando o Amazon EventBridge Scheduler (Etapa 1). O EventBridge Scheduler é um serviço capaz de escalar milhões de agendamentos com mais de 200 destinos e mais de 6000 chamadas de API. Este aplicativo de exemplo usa o EventBridge Scheduler para acionar uma função do AWS Lambda todas as noites no mesmo horário (19h15). A função Lambda é acionada para iniciar a geração da história.

EventBridge scheduler triggers Lambda function every day at 7:15pm (bed time)O agendador do EventBridge aciona a função Lambda todos os dias às 19h15 (hora de dormir)

As tabelas “Scenes” e “Characters” do Amazon DynamoDB contêm os personagens envolvidos na história e uma cena que é selecionada aleatoriamente durante sua criação. Como resultado, o ChatGPT recebe uma solicitação exclusiva a cada vez. Um exemplo do prompt pode ter a seguinte aparência:

“`
Escreva um título e uma história rimada sobre dois personagens principais chamados Parker e Jackson. A história precisa ser ambientada em uma cena de floresta assombrada e ter pelo menos 200 palavras

“`

Depois que a história é criada, ela é salva na tabela “Histórias” do DynamoDB (Etapa 2).

Scheduler triggering Lambda function to generate the story and store story into DynamoDBAgendador acionando a função Lambda para gerar a história e armazenar a história no DynamoDB

Depois que a história é criada, isso inicia um evento de captura de dados de alteração usando o DynamoDB Streams (Etapa 3). Esse evento flui por meio de mensagens ponto a ponto com EventBridge Pipes e diretamente para o EventBridge. As transformações de entrada são então usadas para converter o evento do DynamoDB Stream em um evento EventBridge personalizado, que os consumidores posteriores podem compreender. Adotar esse padrão é benéfico, pois nos permite separar os contratos do esquema de eventos do DynamoDB e não fazer com que os consumidores downstream estejam em conformidade com essa estrutura de esquema. Esse mapeamento nos permite permanecer separados dos detalhes da implementação.

EventBridge Pipes connecting DynamoDB streams directly into EventBridge.EventBridge Pipes conectando streams do DynamoDB diretamente ao EventBridge.

Ao acionar o evento StoryCreated no EventBridge, três alvos são acionados para realizar vários processos (Etapa 4). Primeiro, as imagens de IA são processadas, seguidas pela criação do áudio para a história. Por fim, o usuário final é notificado sobre a história concluída por meio do Amazon SNS e de subscrições de e-mail. Esse padrão de distribuição permite que essas tarefas sejam executadas de forma assíncrona e paralelas, permitindo tempos de processamento mais rápidos.

EventBridge pub/sub pattern used to start async processing of notifications, audio, and images.Padrão pub/sub do EventBridge usado para iniciar o processamento assíncrono de notificações, áudio e imagens.

Um tópico do SNS é acionado pelo evento `storyCreated` para enviar um e-mail ao usuário final usando subscrições de e-mail (Etapa 6). O e-mail consiste em um URL com o ID da história que foi criada. Clicar na URL leva o usuário ao aplicativo de front-end hospedado com o App Runner.

Using SNS to notify the user of a new storyUsando o SNS para notificar o usuário sobre uma nova história

Example email sent to the userExemplo de e-mail enviado ao usuário

Amazon Polly é usado para gerar os arquivos de áudio para a história (Etapa 6). Ao acionar o evento `StoryCreated`, uma função Lambda é acionada e a descrição da história é usada e fornecida ao Amazon Polly. Em seguida, o Amazon Polly cria um arquivo de áudio da história, que é armazenado no Amazon S3. Uma URL pré-assinada é gerada e salva no DynamoDB em relação à história criada. Isso permite que o aplicativo de front-end e o navegador recuperem o arquivo de áudio quando o usuário visualiza a página. A URL pré-assinada tem validade de dois dias, após os quais não pode mais ser acessada ou escutada.

Lambda function to generate audio using Amazon Polly, store in S3 and update story with presigned URLFunção Lambda para gerar áudio usando o Amazon Polly, armazenar no S3 e atualizar a história com URL pré-assinada

O evento `StoryCreated` também aciona outra função Lambda, que usa a API OpenAI para gerar uma imagem de IA usando DALL-E com base na história gerada (Etapa 7). Depois que a imagem é gerada, ela é baixada e armazenada no Amazon S3. Semelhante ao arquivo de áudio, o sistema gera uma URL pré-assinada para a imagem e a salva no DynamoDB com base na história. O URL pré-assinado só é válido por dois dias, após o qual se torna inacessível para download ou visualização.

Lambda function to generate images, store in S3 and update story with presigned URL.Função Lambda para gerar imagens, armazenar no S3 e atualizar a história com URL pré-assinada.

No caso de uma falha na geração de áudio ou imagem, o aplicativo de front-end ainda carrega a história, mas não exibe a imagem ou o áudio ausentes naquele momento. Isso garante que o front-end possa continuar funcionando e fornecer valor. Se você quiser ter mais controle e acionar o evento de notificação do usuário somente quando todas as tarefas paralelas forem concluídas, o padrão de mensagens do agregador pode ser considerado.

Hospedagem do aplicativo front-end Next.js com o AWS App Runner

Next.js é usado pelo aplicativo de front-end para renderizar páginas renderizadas do lado do servidor (SSR) que podem acessar as histórias da tabela do DynamoDB, que são hospedadas no AWS App Runner após serem conteinerizadas.

Next.js application hosted with App Runner, with permissions into DynamoDB table.Aplicativo Next.js hospedado com o App Runner, com permissões na tabela do DynamoDB.

O AWS App Runner permite que você implante aplicativos web e APIs em contêineres com segurança, sem precisar de nenhum conhecimento prévio sobre contêineres ou infraestrutura. Com o App Runner, os desenvolvedores podem se concentrar em seus aplicativos, enquanto o serviço gerencia a inicialização, a execução, o escalonamento e o balanceamento de carga do contêiner. Após a implantação, o App Runner fornece uma URL segura para os clientes começarem a fazer solicitações HTTP.

Com o App Runner, você tem duas opções principais para implantar seu contêiner: conexões de código-fonte ou imagens de origem. O uso de conexões de código-fonte concede ao App Runner permissão para extrair o arquivo de imagem diretamente do código-fonte e, com a implantação automática configurada, ele pode reimplantar o aplicativo quando as alterações são feitas. Como alternativa, as imagens de origem fornecem ao App Runner a localização da imagem em um registro de imagem, e essa imagem é implantada pelo App Runner.

Neste aplicativo de exemplo, o CDK implanta o aplicativo usando a construção DockerImageAsset com a construção App Runner. Depois de implantado, o App Runner cria e carrega a imagem de front-end no Amazon Elastic Container Registry (ECR) e a implanta. Os consumidores downstream podem acessar o aplicativo usando a URL segura fornecida pelo App Runner. Neste exemplo, a URL é usado quando a notificação do SNS é enviada ao usuário quando a história está pronta para ser visualizada.

Conceder permissão ao contêiner de front-end para a tabela do DynamoDB

Para conceder permissão ao aplicativo Next.js para obter histórias da tabela Stories no DynamoDB, as funções da instância do App Runner são configuradas. Essas funções são opcionais e podem fornecer as permissões necessárias para que o contêiner acesse os serviços da AWS exigidos pelo serviço de computação.

Se quiser saber mais sobre o AWS App Runner, você pode explorar o workshop gratuito.

Escolhas e suposições de design

O recurso Time to Live (TTL) do DynamoDB é ideal para a curta duração das histórias geradas diariamente. O DynamoDB trata da exclusão de histórias após dois dias definido pelo atributo TTL em cada história. Depois que uma história é excluída, ela se torna inacessível por meio das URLs geradas.

Usar URLs pré-assinados do Amazon S3 é um método para conceder acesso temporário a um arquivo no S3. Esse aplicativo cria URLs pré-assinados para o arquivo de áudio e imagens geradas que duram 2 dias, após os quais os URLs dos itens do S3 se tornam inválidos.

As transformações de entrada são usadas entre streams do DynamoDB e eventos do EventBridge para dissociar os esquemas e eventos consumidos pelos destinos downstream. Consumir os eventos como eles estão é conhecido como padrão “conformista” e nos associa aos detalhes de implementação dos streams do DynamoDB com consumidores posteriores do EventBridge. Isso permite que o aplicativo permaneça desacoplado dos detalhes da implementação e permaneça flexível.

Conclusão

A adoção da tecnologia de inteligência artificial (IA) aumentou significativamente em vários setores. O ChatGPT, um grande modelo de linguagem que pode entender e gerar respostas semelhantes às humanas em linguagem natural, e o DALL-E, um sistema de geração de imagens que pode criar imagens realistas com base em descrições textuais, são exemplos dessa tecnologia. Esses sistemas demonstraram o potencial da IA para fornecer soluções inovadoras e transformar a maneira como interagimos com a tecnologia.

Esta postagem do blog explora maneiras pelas quais você pode utilizar os serviços serverless  da AWS com o ChatGTP e o DALL-E para criar um aplicativo de geração de histórias baseado em Next.js hospedado com o App Runner. O EventBridge Scheduler é usado para acionar o processo de criação da história e, em seguida, reagir aos eventos de captura de dados alterados com streams do DynamoDB e EventBridge Pipes, além de usar o Amazon EventBridge para distribuir tarefas de computação para processar notificações, imagens e arquivos de áudio.

Você pode encontrar a documentação e o código-fonte desse aplicativo no GitHub.

Para obter mais recursos de aprendizado serverless, visite Serverless Land.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

David Boyne é Senior Developer Advocate especializado em Serverless

 

 

 

 

Tradutor

Rodrigo Prado é arquiteto de soluções sênior, especialista em serviços Serverless e arquitetura orientada a eventos. Ele trabalha apoiando empresas de softwares a criar soluções utilizando as melhores práticas da AWS.

https://www.linkedin.com/in/rmprado/