além do script

Multi-Agent AI Routing, Caching & Context Protection

Estudo de arquitetura sobre como servir um agente conversacional multi-agente gastando o mínimo possível de tokens e latência. Combinando roteamento de intenção com modelo leve, cache interceptador no Redis e proteção de contexto, sem abrir mão da qualidade das respostas.

agentes-iaarquiteturainteligencia-artificial

Nível: Avançado | Tempo de Leitura: 10 min

por Marcelo Macedo

Introdução

Este artigo apresenta um estudo de caso sobre o assistente conversacional da TechCorp Solutions, uma empresa fictícia de indicação de filmes. O projeto é um estudo de arquitetura sobre como servir esse tipo de agente gastando o mínimo possível de tokens e latência, sem abrir mão de respostas de qualidade.

Três pilares sustentam isso:

  • Cache Interceptador (Redis) — respostas repetidas ou muito parecidas (exact + semantic) voltam em poucos milissegundos, sem tocar em LLM nenhum.

  • Roteamento de Intenção com modelo leve — uma heurística/classificador barato decide antes de qualquer chamada cara: isso é uma saudação? Uma dúvida institucional? Uma busca de filme? Só o necessário chega ao modelo grande.

  • Multi-agente (Google ADK) — em vez de um único agente monolítico com um prompt gigante tentando cobrir tudo, um RootAgent delega para especialistas pequenos e focados (InstitutionalAgent, MovieCatalogAgent), cada um com contexto e ferramentas só do seu domínio.

  • Escopo: Roteamento de Intenção, Cache Semântico e Proteção de Contexto em Agentes de IA.

  • Linguagens e Stack: Python, FastAPI, Google ADK, Gemini, Redis, TMDB API.

  • Impacto de Negócio: Reduz consumo de tokens e latência de resposta sem perder precisão, permitindo escalar o atendimento conversacional a um custo previsível.

O objetivo declarado do projeto é eficiência: menos tokens, menos latência, sem perder precisão.

Código Fonte Repositório completo no GitHub contendo a API, o CLI, os agentes e a suíte de testes: 🔗 https://github.com/marcelo3macedo/multi-agent-ai-routing-caching-context-protection


Tecnologias

  • FastAPI — API REST.
  • Google ADK — orquestração multi-agente.
  • Gemini — LLM por trás dos agentes e do classificador de intenção.
  • Redis — cache interceptador (exact + semantic), com fallback em memória.
  • TMDB API — catálogo real de filmes usado pelo MovieCatalogAgent.
  • Docker / Docker Compose — empacota API + Redis para rodar com um comando.
  • Pytest — suíte de testes (unidade + integração).

Executando com Docker Compose (Recomendado)

bash
docker compose up -d

Exemplos de Conversas

Os exemplos abaixo são transcrições reais (CLI local, python cli.py), mostrando o badge de roteamento e as métricas de cada resposta.

1. Saudação — identificação semântica pelo modelo leve

Você: Bom dia

💬 SAUDAÇÃO (ROTEAMENTO LEVE)
Olá! Bem-vindo à TechCorp Solutions, sua empresa de indicação de filmes! 🎬
Quer saber sobre algum filme ou sobre a empresa?

Intenção: GREETING | Cache: MISS | Tokens: 0 | Latência: ~1 ms

A heurística do LightweightIntentClassifier reconhece "bom dia" como saudação em menos de 2ms — nenhuma chamada de LLM acontece. A resposta é determinística e já é gravada no cache para a próxima vez.

2. Cache Hit — a mesma saudação, de novo

Você: Bom dia

⚡ CACHE HIT
Olá! Bem-vindo à TechCorp Solutions, sua empresa de indicação de filmes! 🎬
Quer saber sobre algum filme ou sobre a empresa?

Intenção: CACHED | Cache: HIT_SEMANTIC | Tokens: 0 | Latência: ~0.2 ms

Antes de qualquer classificação, o use case já consulta o cache Redis. Na segunda vez, a resposta nem chega a ser roteada — vem direto do cache, ~5x mais rápido que o primeiro atendimento (que já era rápido) e continua em 0 tokens.

3. "Quais filmes do Homem-Aranha tem?"

Você: Quais filmes do Homem-Aranha tem?

🎬 FILMES → MovieCatalogAgent (TMDB)
Temos diversos filmes do Homem-Aranha no catálogo, entre animações e
produções em live-action.

O lançamento mais recente é "Homem-Aranha: Um Novo Dia", que estreou em
julho de 2026. Já o mais bem avaliado pelo público é a animação
"Homem-Aranha: No Aranhaverso" (2018), com nota média de 8,4.

Se quiser saber mais sobre algum deles ou busca uma recomendação
específica, é só avisar!

Intenção: MOVIE_SEARCH | Cache: MISS | Tokens: ~3.500 | Latência: ~9.8 s

O RootAgent delega para o MovieCatalogAgent, que chama a tool search_movies contra o TMDB real. Seguindo a instrução do agente, ele destaca primeiro o lançamento mais recente já lançado (comparando com a data atual injetada no prompt) e comenta o mais bem avaliado — sem listar os 10+ resultados que a tool retornou.

4. "Me indique filmes do Tom Cruise"

Você: Me indique filmes do Tom Cruise

🎬 FILMES → MovieCatalogAgent (TMDB)
Aqui estão algumas das melhores recomendações de filmes estrelados por
Tom Cruise:

• Top Gun: Maverick (2022) — um dos maiores sucessos de crítica e público
  do ator, reprisando o papel do piloto "Maverick" Mitchell.
• Franquia Missão: Impossível — destaque para o clássico Missão:
  Impossível (1996) e o recente O Acerto Final (2025).
• Top Gun - Ases Indomáveis (1986) — o clássico dos anos 80 que
  consagrou Tom Cruise como astro de Hollywood.

Algum desses gêneros de ação e aventura é o seu favorito?

Intenção: MOVIE_SEARCH | Cache: MISS | Tokens: ~3.550 | Latência: ~18.5 s

Interessante aqui: a tool search_movies busca por título de filme, não por ator — buscar "Tom Cruise" direto no TMDB retorna sobretudo um documentário sobre ele. O agente percebeu isso sozinho e fez follow-up calls específicos ("Top Gun", "Missão Impossível") para montar a resposta certa. Esse raciocínio em múltiplos passos é decidido pelo próprio ADK, não hardcoded no roteamento.

5. "Quais filmes o Tom Holland fez?"

Você: Quais filmes o Tom Holland fez?

🎬 FILMES → MovieCatalogAgent (TMDB)
Tom Holland é mundialmente conhecido por interpretar o Homem-Aranha no
Universo Cinematográfico da Marvel.

Na franquia do herói, o filme lançado mais recentemente é
"Homem-Aranha: Um Novo Dia" (julho de 2026). Já o mais bem avaliado de
sua trajetória como o herói é "Homem-Aranha: Sem Volta Para Casa" (2021),
nota 7,94 no TMDB.

Além da trilogia e do novo longa do herói, ele também estrelou
produções como Uncharted: Fora do Mapa (2022).

Intenção: MOVIE_SEARCH | Cache: MISS | Tokens: ~4.650 | Latência: ~19.9 s

6. "Filmes do Tom Holland que não sejam Homem-Aranha"

Você: Filmes do Tom Holland que não sejam Homem-Aranha

🎬 FILMES → MovieCatalogAgent (TMDB)
Além do papel de Homem-Aranha, Tom Holland protagonizou diversos outros
filmes de destaque:

• O Impossível (2012) — drama baseado em fatos reais sobre o tsunami de
  2004 na Tailândia, um dos primeiros papéis marcantes da carreira dele.
• Uncharted: Fora do Mapa (2022) — adaptação dos videogames, no papel do
  caçador de tesouros Nathan Drake.
• O Diabo de Cada Dia (2020) — suspense sombrio sobre um jovem tentando
  proteger a família em uma cidade marcada pela corrupção.

Se quiser saber mais sobre algum deles ou busca outro gênero
específico, é só avisar!

Intenção: MOVIE_SEARCH | Cache: MISS | Tokens: ~3.270 | Latência: ~14.4 s

O agente pesquisou vários títulos (inclusive um resultado espúrio, "Missão: Impossível", que o TMDB retornou por similaridade textual com "Impossível") e filtrou sozinho o que não fazia sentido antes de responder, o Homem-Aranha e o resultado errado ficaram de fora.

7. "Tem algum filme do Tom Holland com o cara do Crepúsculo?"

Você: Tem algum filme do Tom Holland com o cara do Crepúsculo?

🎬 FILMES → MovieCatalogAgent (TMDB)
Sim! Tom Holland e Robert Pattinson (o astro de Crepúsculo) atuam
juntos no filme O Diabo de Cada Dia (The Devil All the Time), lançado
em 2020.

É um suspense psicológico sombrio e bem avaliado, no qual o personagem
de Tom Holland precisa enfrentar figuras sinistras em uma pequena
cidade para proteger as pessoas que ama.

Intenção: MOVIE_SEARCH | Cache: MISS | Tokens: ~1.600 | Latência: ~12.9 s

Esse caso ilustra um limite honesto da arquitetura atual: a tool search_movies não retorna elenco (só id, title, overview, release_date, vote_average — ver Smart Context Truncation abaixo). A associação "Robert Pattinson = o cara do Crepúsculo" e o fato de ele estar no elenco desse filme vêm do conhecimento próprio do modelo, não do TMDB; o que a tool garante é que título, data de lançamento e nota são reais e verificados, não inventados.


Decisões Técnicas para Economia de Tokens

1. Modelo leve para detectar a intenção antes do modelo caro

LightweightIntentClassifier resolve saudações, e reconhece padrões institucionais/filmes por heurística de palavras-chave em sub-2ms, sem nenhuma chamada de LLM. Só quando a heurística não é conclusiva ele cai para um modelo pequeno (Gemini Flash) — nunca o modelo "pesado" que efetivamente conversa com o usuário. Isso significa que a decisão de roteamento em si é praticamente gratuita comparada ao custo de uma chamada completa ao RootAgent.

2. Cache interceptador antes de tudo

ProcessChatMessageUseCase.execute() consulta o cache Redis (exact + semantic, via difflib) antes de classificar ou rotear qualquer coisa. Perguntas repetidas ou muito parecidas nunca chegam ao classificador nem ao ADK — voltam em poucos milissegundos e 0 tokens. Saudações resolvidas pelo roteamento leve são gravadas no cache com TTL de 24h; respostas do ADK (institucional/filmes), com TTL de 1h.

3. Multi-agente em vez de um prompt monolítico

Em vez de um único agente com uma instrução gigante tentando cobrir saudação + institucional + filmes (o baseline BaseRootAgent, mantido só para efeito de comparação no benchmark), o RootAgent real delega para sub-agentes especialistas:

  • InstitutionalAgent — instrução curta, uma única tool (get_company_info) sobre uma base JSON estática.
  • MovieCatalogAgent — instrução curta, uma única tool (search_movies) sobre o TMDB.

Cada sub-agente só carrega o contexto do seu próprio domínio. Isso mantém os prompts pequenos e focados, em vez de um único prompt gigante sendo reenviado (e pago) em toda conversa, não importa o assunto.

4. Smart Context Truncation no catálogo de filmes

O TMDB devolve payloads grandes por filme (popularity, backdrop_path, adult, genre_ids, poster_path, vote_count, original_language, video...). A tool search_movies (tmdb_tool.py) filtra isso para uma lista branca de 5 campos — id, title, overview, release_date, vote_average — antes de devolver ao agente. Isso protege a janela de contexto da LLM contra context overflow em buscas com muitos resultados, e reduz diretamente os tokens de entrada em cada chamada de tool.

5. Contexto de data injetado no prompt

Um LLM não sabe "que dia é hoje" nem tem conhecimento atualizado sobre lançamentos recentes. Em vez de deixar o modelo adivinhar, create_movie_catalog_agent() injeta a data real (date.today()) diretamente na instrução do MovieCatalogAgent ("A data de hoje é {current_date}..."). É esse contexto que permite ao agente comparar a release_date retornada pela tool com a data de hoje e responder corretamente se um filme "já foi lançado" ou ainda está por vir — sem isso, ele erraria facilmente para lançamentos recentes.

6. Tratamento de erro amigável, sem gastar contexto extra com detalhes técnicos

Falhas transitórias do provedor do modelo (rate limit, sobrecarga — HTTP 429/500/502/503/504) são convertidas em uma mensagem curta e no tom da marca (error_handling.py), em vez de propagar o payload de erro bruto da API para o usuário. O erro técnico completo (com stack trace) é logado separadamente — apenas no processo/container do servidor, nunca na conversa do usuário — preservando contexto de debug sem poluir (ou gastar tokens de) a experiência de chat.

7. Logs de execução isolados do canal de conversa

Cada chamada de tool (get_company_info, search_movies) é logada via callbacks do ADK (tool_logging.py), mas apenas onde o processo é configurado para isso — o servidor/container. O CLI interativo silencia esse canal (e os avisos internos do próprio ADK) para manter a conversa limpa, sem misturar telemetria de execução com a resposta que o usuário efetivamente lê.


Conclusão

Nenhuma das sete decisões acima é sofisticada isoladamente — cache, classificador leve, delegação entre agentes, whitelist de campos, injeção de data no prompt. O ganho vem de aplicá-las em conjunto e na ordem certa: cache antes de classificar, classificação leve antes de rotear, roteamento antes de acionar um agente especialista, e um contexto enxuto dentro de cada agente. É essa combinação que faz a diferença entre um agente que escala com custo prático de tokens e um agente monolítico que paga o preço cheio de LLM a cada mensagem, mesmo para um "bom dia".

O código completo, com a API, o CLI e a suíte de testes, está em:

💡 Precisa de suporte técnico para arquitetar sistemas resilientes e escaláveis?

Sou Marcelo Alberico Macedo, Engenheiro de Software Sênior e Arquiteto. Possuo MBA pela USP/Esalq e atuo desenhando ecossistemas de microsserviços, mensageria e alta disponibilidade para plataformas enterprise.