Quando o RAG tradicional não é suficiente
A maioria dos sistemas de Geração Aumentada por Recuperação (RAG — Retrieval Augmented Generation) segue o mesmo padrão: uma pergunta é transformada em vetor, os trechos mais próximos são buscados em um índice e entregues ao modelo, que gera a resposta. Uma recuperação, uma geração. Para muitos casos de uso, esse design é perfeitamente adequado.
O problema aparece em situações específicas: quando a resposta está espalhada por dois corpora distintos, quando a fonte certa depende do tipo de pergunta, ou quando seria necessário consultar o corpus uma segunda vez depois de ver o primeiro resultado. Nesses cenários, uma única recuperação retorna metade do que o modelo precisa — e uma resposta fluente porém incompleta pode ser pior do que nenhuma resposta.
A recuperação agêntica empresarial resolve esses três problemas colocando um agente de raciocínio no fluxo. Esse agente decide se deve recuperar, qual base de conhecimento do Amazon Bedrock consultar e se é necessário buscar mais informações antes de compor a resposta final.
O que mudou desde o RAG de ciclo único
Em agosto de 2024, a AWS publicou o guia Build an end-to-end RAG solution using Knowledge Bases for Amazon Bedrock and the AWS CDK, que implantava o design de ciclo único como uma aplicação CDK: um bucket do Amazon Simple Storage Service (Amazon S3), uma coleção e índice do Amazon OpenSearch Serverless, uma base de conhecimento e uma fonte de dados.
Desde então, três coisas mudaram de forma significativa:
- O Amazon Bedrock passou a oferecer uma Knowledge Base Gerenciada (
Type: MANAGED), que cuida internamente da ingestão, armazenamento, indexação e recuperação — sem necessidade de provisionar um banco de dados vetorial. - O Amazon Bedrock AgentCore fornece a camada agêntica: um Gateway que expõe cada base de conhecimento como uma ferramenta do Protocolo de Contexto de Modelo (MCP — Model Context Protocol), um Runtime que hospeda o agente de raciocínio, e a API
AgenticRetrieveStream, que faz reranking interno e retorna uma resposta sintetizada com citações. - A observabilidade e avaliação agora são provisionadas junto com a solução, não adicionadas depois. A solução inclui dois dashboards do Amazon CloudWatch com sete camadas de telemetria, mais duas formas de avaliação — sob demanda e contínua.
Vale destacar: a recuperação agêntica via AgenticRetrieveStream está disponível somente na Knowledge Base Gerenciada. O modelo autogerenciado (DIY), onde o cliente provisiona e opera o próprio banco vetorial, não suporta esse recurso.
Visão geral da solução
A solução é uma aplicação AWS CDK em Python que declara quatro stacks. O CDK deriva automaticamente a ordem de implantação a partir das referências entre os constructs — não é necessário um script de deploy manual.
kb_stack = KnowledgeBasesStack(app, f"{project}-kb", env=env)
gateway_stack = AgenticGatewayStack(
app, f"{project}-gateway",
env=env,
financial_kb=kb_stack.financial_kb, # ← a referência cria a dependência
weather_kb=kb_stack.weather_kb,
)
agent_stack = AgentRuntimeStack(
app, f"{project}-agent",
env=env,
gateway=gateway_stack.gateway,
)
DashboardsStack(
app, f"{project}-dashboards",
env=env,
financial_kb=kb_stack.financial_kb,
weather_kb=kb_stack.weather_kb,
gateway=gateway_stack.gateway,
agent_runtime=agent_stack.agent_runtime,
)
As quatro stacks e o que cada uma cria:
- -kb: bucket S3, upload dos corpora, duas Knowledge Bases gerenciadas, fontes de dados e ingestão.
- -gateway: Gateway com AWS IAM e MCP, com targets de
AgenticRetrieveStreampor Knowledge Base. - -agent: repositório no Amazon ECR, build no AWS CodeBuild, agente Strands no Runtime com logs e traces — leva cerca de 8 a 10 minutos pelo build da imagem.
- -dashboards: dois dashboards de observabilidade no CloudWatch, que se populam conforme o tráfego chega.
O fluxo de uma pergunta pela solução
Antes de qualquer pergunta ser feita, cada corpus no S3 é ingerido na sua respectiva Knowledge Base Gerenciada: o Amazon Bedrock analisa, divide em chunks, gera embeddings e indexa automaticamente. Esse processo ocorre uma vez, no deploy.
A partir daí, cada pergunta segue o seguinte caminho:
- O usuário envia a pergunta ao agente hospedado no Amazon Bedrock AgentCore Runtime, que auto-instrumenta todo o loop de raciocínio e ação com spans de OpenTelemetry (OTEL).
- O modelo de raciocínio do agente planeja e roteia entre as bases de conhecimento. Como cada base está exposta como uma ferramenta de recuperação separada, o agente seleciona a ferramenta cujo tópico corresponde à pergunta — financeiro ou meteorológico.
- A chamada de ferramenta é intermediada pelo AgentCore Gateway via MCP, autorizada pela role IAM da tarefa do agente e assinada com SigV4, que invoca a API
AgenticRetrieveStreamda Knowledge Base correspondente. - O
AgenticRetrieveStreamdecompõe a pergunta em sub-consultas, recupera iterativamente do armazenamento gerenciado pelo Bedrock e sintetiza uma resposta fundamentada com citações, que é transmitida de volta pelo Gateway. - O agente verifica se o contexto retornado é suficiente. Se não, ele volta ao loop; se sim, retorna a resposta citada ao usuário.
- Durante todo o processo, o Runtime emite spans, contagens de tokens e métricas para o CloudWatch e o AWS X-Ray.
Os datasets da solução
A solução inclui dois corpora pequenos, no diretório data/ do repositório:
- Financeiro: um relatório 10-K sintético da empresa fictícia Octank Financial (arquivo
octank_financial_10K.pdf, ~198 KB). Trata-se de dados de amostra gerados por modelo, licenciados CC0 — não são dados financeiros reais. - Meteorológico: um relatório real e de domínio público do Serviço de Pesquisa do Congresso dos EUA sobre tornados (IF12695, arquivo
tornadoes_report.pdf, ~560 KB), disponível em sgp.fas.org/crs/misc/IF12695.pdf.
Os dois corpora são intencionalmente distintos para que o agente precise rotear cada pergunta para a base de conhecimento correta. Por se tratar de Knowledge Bases Gerenciadas, não é necessário configurar chunking, embedding ou índice — o Amazon Bedrock cuida de tudo automaticamente na ingestão.
A decisão de usar duas bases separadas, cada uma exposta como uma ferramenta própria no Gateway, é deliberada. Ela torna o roteamento um ato explícito de raciocínio observável: a árvore de spans mostra qual ferramenta foi escolhida para cada pergunta, e as métricas de qualidade de recuperação permanecem separáveis por base de conhecimento. Uma única ferramenta abrangendo ambos os corpora tornaria essa distinção invisível.
Pré-requisitos e implantação
Para implantar a solução, são necessários:
- Uma conta AWS com permissões para Amazon Bedrock, AgentCore (Runtime + Gateway), AWS Identity and Access Management (IAM), CloudWatch, AWS X-Ray, Amazon Elastic Container Registry (Amazon ECR), AWS CodeBuild, Amazon S3, AWS Lambda e AWS CloudFormation.
- O modelo do agente disponível na conta (padrão:
us.anthropic.claude-haiku-4-5-20251001-v1:0). - CloudWatch Transaction Search habilitado, para que os spans OTEL cheguem ao grupo
aws/spans. - Node.js 18+ e o CDK CLI (
npm install -g aws-cdk), além de Python 3.13+. - A conta e região inicializadas para o CDK (
cdk bootstrap), uma vez por conta/região. Docker local não é necessário — a imagem do agente é construída pelo CodeBuild (ARM64).
Atenção à disponibilidade regional: a Knowledge Base Gerenciada, a recuperação agêntica (AgenticRetrieveStream) e o Amazon Bedrock AgentCore não estão disponíveis em todas as regiões AWS. Antes de implantar, confirme se todos esses recursos estão disponíveis na sua região alvo e ajuste ACCOUNT_REGION no arquivo config.py. O padrão é us-west-2. Consulte a documentação do Amazon Bedrock AgentCore e a lista de serviços regionais da AWS.
Com os pré-requisitos atendidos, toda a solução é implantada com um único conjunto de comandos:
git clone https://github.com/aws-samples/amazon-bedrock-samples.git
cd rag/managed-knowledge-bases/07-IaaC/managed-kb-observability-cdk/
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cdk bootstrap # uma vez por conta/região
cdk deploy --all
O terminal reporta cada stack conforme é concluída: bmkb-obs-cdk-kb [1/4], depois gateway [2/4], depois agent [3/4], e finalmente dashboards [4/4]. Essa ordem é derivada automaticamente pelo CDK a partir das referências entre os constructs — não existe script de deploy para manter sincronizado.
Observabilidade em sete camadas
A solução inclui dois dashboards no CloudWatch que cobrem sete camadas de telemetria:
- L1: métricas nativas da Knowledge Base.
- L2: métricas de ingestão.
- L3: qualidade da recuperação agêntica (métricas sem ground truth:
retrieval_utilization,grounded_coverageeduplicate_rate). - L4: métricas do Gateway e MCP (invocações, erros de sistema, erros de usuário, throttles).
- L5: árvore de spans OTEL no grupo
aws/spans. - L6: uso de tokens por modelo.
- L7: scores de avaliação (sob demanda e contínua).
As camadas 1, 4 e 5 são emitidas automaticamente. As camadas 3, 6 e 7 são publicadas como métricas customizadas pelo notebook de driver.
Um detalhe importante sobre a camada 5: uma única chamada LLM produz três spans aninhados. Para contar cada chamada LLM apenas uma vez ao agregar tokens, é necessário filtrar pelo span folha do tipo CLIENT:
fields attributes.gen_ai.request.model as model,
attributes.gen_ai.usage.input_tokens as in_tok,
attributes.gen_ai.usage.output_tokens as out_tok
| filter ispresent(in_tok) and kind = 'CLIENT' and name like /^chat /
| stats sum(in_tok) as input_tokens, sum(out_tok) as output_tokens, count(*) as llm_calls by model
Sem esse filtro, a mesma consulta reportaria três vezes mais tokens e três vezes mais chamadas.
Avaliação sob demanda e contínua
A qualidade é medida de duas formas, ambas provisionadas pela aplicação:
- Sob demanda: o notebook de driver chama o AgentCore (LLM-as-judge) sobre os spans de cada sessão, usando avaliadores integrados de Correção (Correctness), Fidelidade (Faithfulness) e Precisão de Seleção de Ferramenta (Tool-Selection Accuracy), publicando os scores no CloudWatch como camada 7.
- Contínua (online): a stack do agente provisiona um
AWS::BedrockAgentCore::OnlineEvaluationConfigque amostra sessões ao vivo e as pontua automaticamente, sem necessidade de executar o notebook. Os resultados chegam no grupo de logs/aws/bedrock-agentcore/evaluations/results/<config-id>e são publicados como métricas no namespaceBedrock-AgentCore/Evaluations, permitindo criar gráficos ou alarmes sem precisar analisar logs.
Os quatro avaliadores integrados são: Precisão de Seleção de Ferramenta, Fidelidade, Correção e Relevância da Resposta. Na execução de exemplo descrita pela AWS, a avaliação contínua pontuou 1,00 em todos os quatro avaliadores, com cinco traces pontuados por avaliador.
Atenção ao custo: a solução define SAMPLING_PERCENTAGE = 100 apenas para fins de demonstração, para que todos os resultados apareçam imediatamente. Isso não é uma recomendação para produção. A avaliação online invoca um LLM-as-judge por sessão amostrada, portanto o custo escala com a taxa de amostragem e o volume de tráfego. Para implantações reais, escolha uma porcentagem que se adeque às suas necessidades de monitoramento de qualidade e orçamento. A taxa é configurada em uma única constante, EvalConfig.SAMPLING_PERCENTAGE, no arquivo config.py.
Limpeza dos recursos
Para remover a solução e evitar cobranças contínuas (dados armazenados na Knowledge Base, imagem no ECR e avaliação online ativa geram custos enquanto as stacks existem), basta executar:
cdk destroy --all
O CDK remove as stacks na ordem inversa de dependência automaticamente: dashboards, depois agent, depois gateway, depois kb. O mesmo grafo de dependências derivado para o deploy é percorrido ao contrário — sem script de teardown para manter sincronizado.
O que mudou em relação à solução de 2024
Comparando com a solução de 2024, a mudança principal é de subtração: a nova arquitetura remove infraestrutura em vez de adicionar.
- Banco vetorial: antes, era necessário provisionar, escalar e pagar por uma coleção OpenSearch Serverless com OCUs. Agora, com
Type: MANAGED, o Amazon Bedrock gerencia armazenamento e indexação. - Ciclo de vida do índice: antes, um custom resource criava o índice e aguardava ficar pesquisável. Agora, não há nada a criar.
- Modelo de embedding: antes, o cliente selecionava e concedia acesso ao modelo. Agora, é gerenciado pelo serviço por padrão.
- Recuperação: antes, uma chamada
Retrieveretornava os top-k chunks por similaridade vetorial. Agora, oAgenticRetrieveStreamfaz reranking interno e retorna uma resposta sintetizada com citações. - Telemetria: antes, nenhuma provisionada. Agora, sete camadas e dois dashboards.
- Avaliação: antes, manual. Agora, sob demanda e contínua, ambas provisionadas.
A troca é real nos dois sentidos: um único índice respondendo perguntas de ciclo único é mais barato por consulta, mais simples de raciocinar e totalmente suficiente quando um corpus contém a resposta. A arquitetura agêntica é a escolha certa quando esse cenário não se aplica.
Próximos passos
A partir dessa base, é possível apontar as fontes de dados para corpora próprios, colocar o agente em uma Nuvem Virtual Privada (VPC — Virtual Private Cloud), ajustar a taxa de amostragem da avaliação online ao orçamento e às políticas da organização, ou adicionar mais bases de conhecimento ao roteador. Para saber mais, consulte a documentação do Amazon Bedrock. A aplicação, o notebook de driver e os utilitários estão disponíveis no repositório GitHub, onde é possível clonar e implantar uma cópia própria com um único comando.
Fonte
Build agentic retrieval on a Managed Amazon Bedrock Knowledge Base with CDK (https://aws.amazon.com/blogs/machine-learning/build-agentic-retrieval-on-a-managed-amazon-bedrock-knowledge-base-with-cdk/)
Leave a Reply