O problema que essa arquitetura resolve
Permitir que usuários façam upload de documentos e conversem com eles em tempo real parece simples na superfície. A interface de chat é relativamente fácil de construir — o problema real está na camada de recuperação por trás dela, especialmente quando a aplicação precisa atender múltiplos usuários ao mesmo tempo.
Em um ambiente multi-tenant, os documentos de cada usuário precisam ficar completamente isolados dos demais. Esse isolamento não pode depender de um valor enviado pelo cliente — ele precisa vir de uma identidade verificada no servidor. Quando você adiciona recuperação agêntica ao cenário, a complexidade aumenta: o agente decompõe uma pergunta em sub-consultas e executa múltiplas buscas em sequência, e cada um desses saltos precisa carregar o filtro correto do tenant. Se qualquer salto deixar de aplicar o filtro, o isolamento quebra.
Além disso, a equipe ainda precisaria construir e operar um motor de busca vetorial e full-text, um pipeline de ingestão que processe múltiplos formatos e um índice sincronizado. É uma quantidade significativa de infraestrutura para quem quer apenas entregar um recurso de chat com documentos.
A AWS publicou uma arquitetura de referência que endereça exatamente esse cenário usando o Amazon Bedrock Managed Knowledge Base.
O que o Amazon Bedrock Managed Knowledge Base oferece aqui
O serviço cuida da ingestão, armazenamento, embedding e ranqueamento dos documentos — sem infraestrutura para provisionar ou capacidade para monitorar. Ele também traz recuperação agêntica nativa, com planejamento iterativo e múltiplos saltos de busca para responder perguntas complexas, aplicando os filtros de acesso em cada etapa.
Com a ingestão direta via conector customizado, a aplicação envia o documento direto para a knowledge base e ele fica disponível para consulta em segundos. Não é necessário configurar pipelines externos de ingestão nem gerenciar índices separados.
Visão geral da solução
A arquitetura apresentada pela AWS tem dois fluxos principais: ingestão de documentos e recuperação conversacional. Os componentes centrais são:
- Amazon Bedrock Managed Knowledge Base: processa, armazena e recupera conteúdo multimodal, incluindo texto, vetores, metadados e arquivos estruturados como CSV e Excel. Um conector customizado recebe os uploads dos usuários diretamente.
- Amazon API Gateway e AWS Lambda: expõem os endpoints de upload, status e chat, e executam a lógica da aplicação.
- Amazon Cognito: autentica os usuários e fornece a identidade verificada que a aplicação usa para isolar os documentos de cada um.
- Amazon Simple Queue Service (SQS): desacopla os uploads da ingestão, absorve picos e encaminha mensagens com falha repetida para uma fila de mensagens mortas (dead-letter queue), mantendo o endpoint de upload responsivo.
- Amazon DynamoDB: rastreia o status de indexação de cada documento para que a aplicação mostre ao usuário quando ele está pronto para consulta.
- Amazon Simple Storage Service (S3): armazena temporariamente arquivos maiores que o limite inline e hospeda a aplicação de página única (SPA) atrás do Amazon CloudFront.
Como os dois fluxos funcionam
Ingestão de documentos
Quando um usuário faz upload de um documento, a aplicação extrai a identidade dele a partir do Token Web JSON (JWT) validado pelo API Gateway — nunca confia em um valor enviado diretamente pelo cliente. Essa identidade é incluída na mensagem enviada para a fila SQS junto com o documento ou sua referência no S3.
Arquivos de até 6 MB são enviados inline na chamada de API. Arquivos maiores, até 50 MB para texto, são primeiro enviados ao S3 e a mensagem carrega o URI do S3 para que o Bedrock leia o arquivo diretamente de lá.
Uma função Lambda worker lê a mensagem da fila, marca o documento com um atributo de metadados user_id igual ao identificador (sub) do usuário no Cognito, e então chama a API IngestKnowledgeBaseDocuments. O Amazon Bedrock fragmenta, faz o embedding e indexa o documento de forma assíncrona. O status de cada documento é registrado no DynamoDB, e o navegador consulta periodicamente um endpoint de status para atualizar a interface.
Um detalhe importante sobre a ingestão direta via conector customizado: ao contrário do conector S3 — que é projetado para ingestão em lote com sincronizações agendadas e pode sobrescrever ou remover um documento recém-adicionado — a ingestão direta via IngestKnowledgeBaseDocuments não tem sincronização. O documento persiste até ser explicitamente deletado. Além disso, como a aplicação atribui seus próprios IDs de documento, reingeri-lo com o mesmo ID atualiza o registro no lugar, sem criar duplicatas.
A knowledge base também mantém uma cópia do arquivo original recuperável via API GetDocumentContent, eliminando a necessidade de operar um repositório de documentos separado.
Ciclo de vida da indexação
A API de ingestão é assíncrona: ela retorna imediatamente com status STARTING, mas o documento só fica disponível para consulta depois que o Bedrock conclui o processamento. O ciclo passa por cinco estados:
- STARTING: requisição aceita, processamento ainda não iniciado.
- PENDING: na fila, aguardando um slot de processamento.
- IN_PROGRESS: parsing e embedding em execução.
- TEXT_INDEXED: fragmentos de texto indexados; para PDFs, o processamento multimodal ainda está em andamento. Já é possível consultar o texto.
- INDEXED: processamento completo, incluindo elementos multimodais como imagens e tabelas em PDFs.
A recomendação da AWS é marcar o documento como pronto ao atingir TEXT_INDEXED, e não esperar pelo INDEXED — a diferença só é relevante para conteúdo multimodal. Em testes com documentos pequenos (abaixo de 5 MB) em uma knowledge base ociosa, textos simples atingiram INDEXED em 2 a 3 segundos, enquanto PDFs chegaram a TEXT_INDEXED entre 5 e 30 segundos e a INDEXED em cerca de 90 segundos. Esses números são referências de ordem de grandeza para design, não garantias de latência.
Isolamento por usuário com filtros de metadados
Em uma aplicação multi-tenant, os documentos de um usuário nunca podem aparecer nos resultados de outro. A solução usa uma knowledge base compartilhada com filtros de metadados, em vez de provisionar uma knowledge base separada por tenant. Essa abordagem escala melhor para grandes volumes de usuários finais, evita custos de base de múltiplos índices pequenos e elimina a latência de criação de uma knowledge base no momento do cadastro.
O worker marca cada documento com o atributo user_id, e a aplicação aplica um filtro de igualdade nesse atributo em cada consulta. O valor do filtro é construído no servidor a partir do JWT verificado — nunca a partir do corpo da requisição. Esse é o limite de segurança real da solução.
A knowledge base tem a capacidade de inferir filtros a partir do texto da pergunta, mas isso é um recurso de relevância, não de controle de acesso. O isolamento precisa vir de um filtro explícito construído pela aplicação a partir da identidade autenticada. Como defesa em profundidade, a implementação de referência confirma que o filtro está correto antes de cada requisição e descarta qualquer fragmento retornado cujo user_id não corresponda ao do chamador.
Para cargas de trabalho reguladas que exigem que o próprio serviço aplique o controle de acesso, a knowledge base também suporta listas de controle de acesso (ACLs) no nível do documento, avaliadas contra um userContext no momento da consulta.
Recuperação e geração de respostas
Para responder a uma pergunta, a aplicação chama a API AgenticRetrieveStream com o filtro explícito de user_id. A API executa um ciclo completo de chat: decompõe a pergunta em sub-consultas, executa as buscas com o filtro aplicado em cada salto e transmite uma resposta fundamentada com citações quando o parâmetro generateResponse está ativo. Isso se encaixa diretamente em uma interface de chat e oferece baixo tempo até o primeiro token sem que a equipe precise orquestrar recuperação e geração separadamente.
Quando é necessário mais controle — como um prompt customizado por tenant ou um modelo específico — a recomendação é usar a API Retrieve para buscar os fragmentos e chamar a API Converse separadamente, passando o mesmo filtro por usuário.
O histórico de conversa não é persistido entre chamadas pela API. A aplicação precisa armazená-lo em seu próprio repositório (como o DynamoDB) e passar os turnos relevantes em cada requisição. Isso também permite aplicar o mesmo isolamento por usuário ao histórico de conversas.
Boas práticas para operar em escala
- Desacople uploads da ingestão com uma fila. Para cargas baixas, é possível chamar a API de ingestão diretamente do handler de upload. Para qualquer aplicação com uploads concorrentes, use o SQS entre o endpoint de upload e a ingestão. O worker pode empacotar até 10 documentos em cada chamada de
IngestKnowledgeBaseDocuments, o que é a principal alavanca de throughput. Por exemplo, 500 uploads simultâneos se transformam em aproximadamente 50 chamadas em lote. - Planeje para o limite de ingestão, não de recuperação. A API Retrieve suporta picos de 25 consultas por segundo (QPS) ou 10 QPS sustentados por knowledge base — raramente será o gargalo. O throughput de ingestão é adequado para uploads interativos, mas uma migração em massa de um repositório existente vai saturá-lo. Para esses cenários, use o conector S3 com sincronização agendada, que é projetado para cargas grandes de uma vez só.
- Trate o limite de concorrência como condição de retry. Ao exceder o limite, o Bedrock retorna
ValidationException, nãoThrottlingException. Um classificador de retry que só trata throttling vai interpretar isso como erro fatal e descartar o documento. - Monitore os sinais que antecipam o teto. Acompanhe a taxa de sucesso da ingestão e o tempo para atingir
INDEXEDnos percentis P50 e P99. Um tempo crescente paraINDEXEDé o primeiro indicador de que o pipeline de ingestão está se aproximando do limite de throughput — bem antes de as requisições começarem a falhar. - Persista o histórico de conversa você mesmo. A API
AgenticRetrieveStreamaceita turnos anteriores no parâmetromessagespara suporte a contexto multi-turno, mas não os persiste entre chamadas. Armazene o histórico em seu próprio repositório e passe os turnos relevantes em cada requisição.
Custos
O custo da solução depende da configuração de modelos escolhida. Com modelos gerenciados, o Managed Knowledge Base é cobrado apenas por armazenamento e recuperação (por chamada, não por token), sem custo adicional de ingestão. Se você selecionar um modelo Amazon Bedrock, paga pelos tokens de embedding na ingestão e pelos tokens de orquestração e geração na recuperação agêntica. Os serviços de suporte (Lambda, API Gateway, SQS, DynamoDB e S3) representam uma fração pequena do custo total em escala moderada. Consulte a página de preços do Amazon Bedrock para os valores atuais.
Como começar
A AWS disponibilizou um repositório de exemplo no GitHub para quem quiser implantar a solução na própria conta e usá-la como base para uma aplicação de chat com documentos. Para se aprofundar no Amazon Bedrock Managed Knowledge Base, a AWS também publicou posts complementares sobre busca empresarial para agentes com Amazon Bedrock Managed Knowledge Base e sobre recuperação agêntica no Amazon Bedrock Managed Knowledge Base.
Fonte
Build multi-tenant agentic chat applications on enterprise data with Amazon Bedrock Managed Knowledge Base (https://aws.amazon.com/blogs/machine-learning/build-multi-tenant-agentic-chat-applications-on-enterprise-data-with-amazon-bedrock-managed-knowledge-base/)