Roteiro de Entrevista Técnica — iFriend Agents¶
Duração: 60-90 min. Dividido em 4 blocos. O candidato já deve ter entregue o desafio técnico.
Estrutura da Entrevista¶
| Bloco | Duração | Tópico |
|---|---|---|
| 1 | 15 min | Correção do desafio técnico |
| 2 | 20 min | Arquitetura multi-agent e ADK |
| 3 | 15 min | Python e engenharia de software |
| 4 | 15 min | LLMs e engenharia de prompt |
| 5 | 10 min | Cenários práticos e system design |
Bloco 1 — Correção do Desafio Técnico (15 min)¶
Peça para o candidato compartilhar a tela e explicar a solução.
Perguntas¶
- "Me explique como você estruturou o prompt do feedback_agent. Quais decisões tomou?"
- Avalia: clareza, compreensão do fluxo, regra de escape
-
Esperado: role definition, steps, transfer rule, conciseness
-
"Por que usou
disallow_transfer_to_peers=True?" -
Esperado: sub-agents só transferem ao root_agent, não entre si
-
"Como você decidiu onde registrar o agente (always-on vs feature flag)?"
-
Esperado: feedback é funcionalidade básica, não justifica feature flag
-
"Se o usuário desse uma nota inválida, como o agente deveria reagir?"
-
Esperado: pedir novamente de forma amigável, não quebrar o fluxo
-
"Como você testaria esse agente manualmente?"
- Avalia: capacidade de pensar em cenários de conversa, não só unit tests
Bloco 2 — Arquitetura Multi-Agent e ADK (20 min)¶
Perguntas¶
- "Explique a diferença entre LLM-driven transfer (sub_agents) e call-and-return (AgentTool) no ADK. Quando usar cada um?"
- Esperado (Pleno): sub_agents para fluxos multi-turn onde o agente responde ao usuário; AgentTool para invocações pontuais onde o resultado volta ao orquestrador
-
Esperado (Senior): citar exemplos concretos do projeto (discovery_agent vs research_agent), explicar impacto na experiência do usuário
-
"Como funciona o roteamento de intenções no root_agent? O que acontece se dois agentes podem atender a mesma intenção?"
-
Esperado: ADK usa o
descriptiondo agente + o prompt do orquestrador para decidir. A ordem dos sub_agents importa. O prompt do orquestrador tem ROUTING_HINTS que guiam a decisão. -
"Qual a diferença entre
sub_agentseAgentTool? Quando usar cada um?" -
Esperado: sub_agents = LLM-driven transfer (multi-turn, agente responde direto ao usuário). AgentTool = call-and-return (resultado volta ao orquestrador). Ex: discovery_agent vs research_agent.
-
"Como as feature flags funcionam no AgentBuilder? Dê um exemplo de dependência entre flags."
-
Esperado: flags lidas de env vars, validadas (ex: ENABLE_PAYMENT requer ENABLE_BOOKING), montam lista dinâmica de sub-agentes e geram prompt condicional
-
"O que é
disallow_transfer_to_peerse por que é importante?" -
Esperado: impede que sub-agents transfiram entre si; só transferem ao root_agent. Essencial para manter o orquestrador como único ponto de roteamento.
-
"Como o ADK decide para qual sub-agent transferir quando o root_agent recebe uma mensagem?"
-
Esperado: ADK usa o
descriptiondo agente + o prompt do orquestrador (ROUTING_HINTS) para decidir. A ordem dos sub_agents também influencia. -
"O que é
static_instructione qual sua vantagem?" -
Esperado: instrução que não muda entre turnos, cacheável pelo Gemini. Reduz tokens em conversas longas. Ex: booking_agent com payloads JSON.
-
"Como funciona a sanitização de dados no projeto? Quais camadas existem?"
-
Esperado: L1 = tool-level (sanitize.py com strip_sensitive, whitelists), L2 = prompt guardrails. Campos como email, phone, CPF são removidos antes de chegar ao LLM.
-
"O que é o LoopGuard e como ele protege o sistema?"
-
Esperado: 4 camadas (message dedup, circuit breaker, repetição textual, hard turn limit). Protege contra loops bot-to-bot.
-
"Como você depuraria um agente que está transferindo para o agente errado?"
- Esperado: verificar
descriptiondo agente, verificar ROUTING_HINTS no prompt do orquestrador, verificar sedisallow_transfer_to_peersestá configurado, logs do ADK
- Esperado: verificar
Bloco 3 — Python e Engenharia de Software (15 min)¶
Perguntas¶
- "Como você estrutura um projeto Python médio? O que considera essencial?"
-
Esperado: type hints, testes, lint (ruff), requirements.txt, .env.example, docker-compose para dev
-
"Como você lidaria com uma tool que faz uma chamada de API externa que pode falhar?"
-
Esperado: try/except, retry com backoff, timeout, logging, fallback, mensagem amigável pro LLM
-
"O que é Pydantic e como usamos no projeto?"
-
Esperado: validação de dados, serialização/deserialização, usado em tools e payloads
-
"Como você estrutura testes para uma tool que chama uma API externa?"
-
Esperado: mock da chamada HTTP, testar casos de sucesso e erro, testar timeouts, não chamar API real em testes unitários
-
"O que é
strip_sensitivee por que é importante?" - Esperado: função que remove campos sensíveis (email, phone, CPF) de respostas de API antes de retornar ao LLM. Proteção de PII/LGPD.
Bloco 4 — LLMs e Engenharia de Prompt (15 min)¶
Perguntas¶
- "Como você estrutura o prompt de um agente para minimizar alucinações?"
-
Esperado: instruções claras e específicas, few-shot examples, restrições explícitas ("nunca invente preços"), validação via tools (não confiar no LLM para cálculos)
-
"O que é
static_instructionno ADK e qual sua vantagem?" -
Esperado: instrução que não muda entre turnos, cacheável pelo Gemini. Reduz custo de tokens. Ex: booking_agent com payloads JSON.
-
"Como você evitaria que o LLM invente dados (alucinação) em uma tool de busca de produtos?"
-
Esperado: validação na tool (não confiar no LLM), instruções explícitas no prompt, retornar dados reais da API, nunca permitir que o LLM gere IDs
-
"O que é o
PreloadMemoryToole como ele funciona?" -
Esperado: carrega memórias automaticamente a cada LLM request via FULLTEXT search (MATCH AGAINST). Busca pela query real do usuário. Condicional via ENABLE_MEMORY.
-
"Como você faria para que o agente suportasse múltiplos idiomas?"
- Esperado: prompts em português com instrução para responder no idioma do usuário, ou prompts multi-idioma. O Gemini 2.5 Flash lida bem com detecção de idioma.
Bloco 5 — Cenários Práticos e System Design (15 min)¶
Perguntas¶
- "Se precisássemos adicionar suporte a um novo canal de mensageria (ex: Instagram DM), quais passos você seguiria?"
-
Esperado: criar adapter implementando a interface do
BaseAdapter, tratar formato específico da plataforma, mapear MessageType, configurar webhook, testar em stage -
"O sistema está em produção e um agente começa a transferir para o agente errado. Como você debuga?"
-
Esperado: verificar
descriptiondo agente, verificar ROUTING_HINTS no prompt, logs do ADK, testar com mensagens específicas, verificar sedisallow_transfer_to_peersestá configurado -
"Precisamos adicionar um novo canal de mensageria (ex: Instagram DM). Quais passos você seguiria?"
-
Esperado: criar adapter implementando
BaseAdapter, tratar formato específico, mapear MessageType, configurar webhook, testes de integração, deploy em stage -
"Como você garantiria que dados sensíveis (CPF, telefone) nunca cheguem ao LLM?"
-
Esperado: camada L1 (tool-level com
strip_sensitive), camada L2 (prompt guardrails), whitelists (safe_booking_summary,safe_user_summary), testes de integração -
"O sistema está lento. Como você investiga?"
- Esperado: logs do ADK, latência das tools (API externa), cold start do Cloud Run, tokens do prompt (muita história), verificar se
static_instructionestá sendo cacheada
Critérios de Avaliação por Senioridade¶
Pleno¶
- Responde corretamente 60% das perguntas técnicas
- Demonstra capacidade de seguir documentação e padrões
- Consegue explicar o desafio técnico com clareza
- Identifica problemas básicos de segurança e performance
Senior¶
- Responde corretamente 80%+ das perguntas
- Vai além da resposta esperada, citando trade-offs e alternativas
- Demonstra experiência com sistemas em produção
- Faz perguntas relevantes sobre o projeto
- Identifica gaps na arquitetura e sugere melhorias
- Consegue explicar conceitos complexos de forma simples
Observações para o Entrevistador¶
- O candidato pode não conhecer o ADK — isso é esperado. Avalie a capacidade de aprender com a documentação
- Para candidatos sem experiência com LLMs, foque mais no Bloco 3 (Python) e Bloco 5 (cenários)
- Para candidatos com experiência em IA, aprofunde nos Blocos 2 e 4
- Anote não apenas as respostas corretas, mas como o candidato pensa e se recupera de não saber algo
- O desafio técnico é o principal filtro; a entrevista serve para validar e aprofundar