O blog da AWS

Criando um bate-papo de documentos Serverless com o AWS Lambda e o Amazon Bedrock

P or Pascal Vogel, arquiteto de soluções e Martin Sakowski, arquiteto sênior de soluções
 

Modelos de linguagem grande (LLMs) estão provando ser altamente eficazes na solução de tarefas de uso geral, como geração, análise e resumo de texto, tradução e muito mais. Como eles são treinados em grandes conjuntos de dados, eles podem usar uma ampla base de conhecimento generalista. No entanto, como o treinamento ocorre off-line e usa dados disponíveis publicamente, sua capacidade de acessar conhecimentos especializados, privados e atualizados é limitada.

Uma forma de melhorar o conhecimento do LLM em um domínio específico é ajustá-los em conjuntos de dados específicos do domínio. No entanto, isso consome tempo e recursos, requer conhecimento especializado e pode não ser apropriado para algumas tarefas. Por exemplo, o ajuste fino não permitirá que um LLM acesse informações com precisão diária.

Para resolver essas deficiências, a Geração Aumentada de Recuperação (RAG) está provando ser uma abordagem eficaz. Com o RAG, os dados externos ao LLM são usados para aumentar as solicitações adicionando dados recuperados relevantes no contexto. Isso permite a integração de fontes de dados diferentes e a separação completa das fontes de dados do modelo de aprendizado de máquina.

Ferramentas como LangChain ou LlamaIndex estão ganhando popularidade devido à sua capacidade de se integrar de forma flexível a uma variedade de fontes de dados, como bancos de dados (vetoriais), mecanismos de pesquisa e fontes de dados públicas atuais.

No contexto dos LLMs, a pesquisa semântica é uma abordagem de pesquisa eficaz, pois considera o contexto e a intenção dos prompts fornecidos pelo usuário, em oposição a uma pesquisa literal tradicional. A pesquisa semântica depende da incorporação de palavras, que representam palavras, frases ou documentos como vetores.

Consequentemente, os documentos devem ser transformados em incorporações usando um modelo de incorporação como base para a pesquisa semântica. Como esse processo de incorporação só precisa acontecer quando um documento é ingerido ou atualizado pela primeira vez, é uma ótima opção para computação orientada por eventos com o AWS Lambda.

Este blog apresenta uma solução que permite que você faça perguntas de linguagem natural sobre qualquer documento PDF que você enviar. Ele combina os recursos de geração e análise de texto de um LLM com uma pesquisa vetorial no conteúdo do documento. A solução usa serviços Serverless, como o AWS Lambda, para executar o LangChain e o Amazon DynamoDB para memória conversacional.

O Amazon Bedrock é usado para fornecer acesso Serverless a modelos básicos, como o Amazon Titan, e modelos desenvolvidos pelas principais startups de IA, como AI21 Labs, Anthropic e Cohere. Consulte o repositório do GitHub para obter uma lista completa dos LLMs disponíveis e as instruções de implantação.

Você aprende como a solução funciona, quais escolhas de design foram feitas e como usá-la como um modelo para criar suas próprias soluções personalizadas Serverless com base no LangChain, que vão além da solicitação de documentos individuais.

Visão geral da solução

Vamos ver como a solução funciona em alto nível antes de nos aprofundarmos nos elementos específicos e nos serviços da AWS usados nas seções a seguir. O diagrama a seguir fornece uma visão simplificada da arquitetura da solução e destaca os principais elementos:

O processo de interação com o aplicativo da web é assim:

  1. Um usuário carrega um documento PDF em um bucket do Amazon Simple Storage Service (Amazon S3) por meio de um front-end estático de aplicativo web.
  2. Esse upload aciona um processo de extração de metadados e incorporação de documentos. O processo converte o texto no documento em vetores. Os vetores são carregados em um índice vetorial e armazenados no S3 para uso posterior.
  3. Quando um usuário conversa com um documento PDF e envia uma solicitação para o back-end, uma função do Lambda recupera o índice do S3 e pesquisa informações relacionadas à solicitação.
  4. Um LLM então usa os resultados dessa pesquisa vetorial, as mensagens anteriores na conversa e seus recursos de uso geral para formular uma resposta ao usuário.

Como pode ser visto na captura de tela a seguir, o aplicativo web criado como parte da solução permite que você faça upload de documentos e liste documentos carregados e seus metadados associados, como número de páginas, tamanho do arquivo e data de upload. O status do documento indica se um documento foi carregado com sucesso, está sendo processado ou está pronto para uma conversa.

Web application document list view

Ao clicar em um dos documentos processados, você pode acessar uma interface de bate-papo, que permite enviar solicitações para o back-end. É possível ter várias conversas independentes com cada documento com um histórico de mensagens separado.

Web application chat view

Incorporação de documentos

Solution architecture diagram excerpt: embedding documents

Quando um novo documento é carregado no bucket do S3, uma notificação de evento do S3 aciona uma função Lambda que extrai metadados, como tamanho do arquivo e número de páginas, do arquivo PDF e os armazena em uma tabela do DynamoDB. Quando a extração estiver concluída, uma mensagem contendo a localização do documento será colocada em uma fila do Amazon Simple Queue Service (Amazon SQS). Outra função do Lambda pesquisa essa fila usando o mapeamento da fonte de eventos do Lambda. A aplicação do padrão de mensagens desacopladas às funções de extração de metadados e incorporação de documentos garante um acoplamento flexível e protege a função de incorporação downstream, que exige mais computação.

A função carrega o arquivo PDF do S3 e usa um modelo de incorporação de texto para gerar uma representação vetorial do texto contido. O LangChain se integra a modelos de incorporação de texto para uma variedade de fornecedores de LLM. A representação vetorial resultante do texto é carregada em um índice FAISS. O FAISS é um armazenamento vetorial de código aberto que pode ser executado dentro da memória da função Lambda usando o pacote Python faiss-cpu. Por fim, um “dump” desse índice FAISS é armazenado no bucket do S3, além do documento PDF original.

Gerando respostas

Solution architecture diagram excerpt: generating responses

Quando uma solicitação para um documento específico é enviada por meio do endpoint da API REST do Amazon API Gateway, ela é enviada por proxy para uma função Lambda que:

  1. Carrega o dump do índice FAISS do arquivo PDF correspondente do S3 para a memória funcional.
  2. Executa uma pesquisa de similaridade do armazenamento vetorial FAISS com base no prompt.
  3. Se disponível, recupera um registro das mensagens anteriores na mesma conversa por meio da integração do DynamoDBChatMessageHistory. Essa integração pode armazenar o histórico de mensagens no DynamoDB. Cada conversa é identificada por um ID exclusivo.
  4. Finalmente, um LangChain ConversationalRetrievalChain passa a combinação da solicitação enviada pelo usuário, o resultado da pesquisa vetorial e o histórico da mensagem para um LLM para gerar uma resposta.

Uploads de aplicativos e arquivos da Web

Solution architecture diagram excerpt: web application

Um aplicativo web estático serve como front-end para essa solução. Ele foi criado com React, TypeScript, Vite e TailwindCSS e implantado por meio do AWS Amplify Hosting, um serviço de hospedagem e CI/CD totalmente gerenciado para aplicativos estáticos e renderizados do lado do servidor, de forma rápida, segura e confiável. Para proteger o aplicativo contra acesso não autorizado, ele se integra a um grupo de usuários do Amazon Cognito. O API Gateway usa um autorizador do Amazon Cognito para autenticar solicitações.

Os usuários fazem upload de arquivos PDF diretamente para o bucket do S3 usando URLs pré-assinados do S3 obtidos por meio da API REST. Várias funções do Lambda implementam endpoints de API usados para criar, ler e atualizar metadados de documentos em uma tabela do DynamoDB.

Estendendo e adaptando a solução

A solução fornecida serve como um modelo que pode ser aprimorado e estendido para desenvolver seus próprios casos de uso com base em LLMs. Por exemplo, você pode estender a solução para que os usuários possam fazer perguntas em vários documentos PDF ou outros tipos de fontes de dados. O LangChain facilita o carregamento de diferentes tipos de dados em armazenamentos vetoriais, que você pode usar para pesquisa semântica.

Quando seu caso de uso envolver a pesquisa em vários documentos, considere migrar do carregamento de vetores na memória com o FAISS para um banco de dados vetoriais dedicado. Há várias opções para bancos de dados vetoriais na AWS. Uma opção Serverless é o Amazon Aurora Serverless v2 com a extensão pgvector para PostgreSQL.

Como alternativa, bancos de dados vetoriais desenvolvidos por parceiros da AWS, como Pinecone ou MongoDB Atlas Vector Search, podem ser integrados ao LangChain. Além da pesquisa vetorial, o LangChain também se integra a fontes de dados externas tradicionais, como o serviço de pesquisa corporativa Amazon Kendra, Amazon OpenSearch e muitas outras fontes de dados.

A solução apresentada nesta postagem do blog usa a pesquisa por similaridade para encontrar informações no banco de dados vetoriais que correspondam de perto ao prompt fornecido pelo usuário. Embora isso funcione bem no caso de uso apresentado, você também pode usar outras abordagens, como relevância marginal máxima, para encontrar as informações mais relevantes para fornecer ao LLM. Ao pesquisar vários documentos e receber muitos resultados, técnicas como o MapReduce podem melhorar a qualidade das respostas do LLM.

Dependendo do seu caso de uso, talvez você também queira selecionar um LLM diferente para obter um equilíbrio ideal entre qualidade dos resultados e custo. O Amazon Bedrock é um serviço totalmente gerenciado que disponibiliza modelos fundamentais (FMs) das principais startups de IA e da Amazon por meio de uma API, para que você possa escolher entre uma ampla variedade de FMs para encontrar o modelo mais adequado ao seu caso de uso. Você pode usar modelos como Amazon Titan, Jurassic-2 da AI21 Labs ou Anthropic Claude.

Para otimizar ainda mais a experiência do usuário de seu aplicativo generativo de IA, considere transmitir respostas LLM para seu frontend em tempo real usando o streaming de respostas do Lambda e implementar atualizações de dados em tempo real usando assinaturas do AWS AppSync ou APIs do Amazon API Gateway WebSocket.

Conclusão

Os serviços Serverless da AWS facilitam o foco na criação de aplicativos generativos de IA, fornecendo escalabilidade automática, alta disponibilidade integrada e um modelo de cobrança de pagamento pelo uso. A computação orientada por eventos com o AWS Lambda é uma boa opção para tarefas sob demanda com uso intensivo de computação, como incorporação de documentos e orquestração flexível de LLM.

A solução neste blog combina os recursos do LLMs e da pesquisa semântica para responder a perguntas de linguagem natural direcionadas a documentos PDF. Ele serve como um modelo que pode ser estendido e adaptado para se adequar a outros casos de uso generativos de IA.

Implante a solução seguindo as instruções no repositório associado do 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

Pascal Vogel é arquiteto de soluções

 

 

 

 

Martin Sakowski, é arquiteta sênior de soluções

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

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