MÓDULO 3.3 beta

🤖 RAG agêntico e self-RAG (beta)

Quando o RAG estático não basta: agente que decide se busca, o que busca, e quando parar. Self-RAG, multi-hop, e quando o custo NÃO compensa.

6
Tópicos
70
Minutos
Avançado
Nível
Avançado
Tipo

RAG estático recupera de uma vez. RAG agêntico decide: busca? o quê? quantas vezes? Você ganha em qualidade (multi-hop, query refinement) e perde em custo/latência. Este módulo é beta — padrões ainda evoluem rapidamente.

⚖️ Trade-off explícito: custo vs qualidade

RAG agêntico é uma promoção condicional do RAG estático — só compensa quando a pergunta REALMENTE exige.

💡 Comece estático, escale para agêntico

Antes de adotar RAG agêntico, esgote RAG estático com reranker e contextual retrieval. Ganho de 3.2 frequentemente fecha a lacuna sem custo agêntico.

1

🔄 Multi-hop: encadear buscas

Quando uma busca não basta

Multi-hop é quando a resposta exige encadeamento de buscas. Ex.: 'compare a janela de contexto do Claude 3 com a do GPT-4 em 2024' — 2 buscas (uma por modelo) + 1 comparação. RAG estático despeja tudo em 1 query; agêntico faz busca dirigida por etapa.

perguntas que multi-hop resolve melhor

  • Comparação ('A vs B em métrica X')
  • Ranking ('quais os 3 maiores X em 2024')
  • Encadeamento causal ('por que isso aconteceu, dado este contexto')
  • Verificação cruzada ('isso bate com o que disse Y?')
📑 Resumo navegável
O que é: Pergunta exige info de múltiplas fontes em sequência. Agente busca, lê, refina query, busca de novo.
Por que aprender: Perguntas como 'compare A e B em 2024' precisam de 2+ buscas. RAG estático falha.
Conceitos-chave: Multi-hop QA, iterative retrieval, query refinement, ReAct.
2

🤔 Self-RAG: decidir se buscar

Asai et al. 2023

Self-RAG (Asai et al. 2023): o modelo emite token especial decidindo se precisa buscar. Reduz custo em queries triviais ('o que é 2+2') e mantém qualidade em queries factuais. Versão simplificada para produção: classificar a query antes do retrieval.

decisor: buscar ou não
def decidir_busca(query: str) -> bool:
    decisor = llm.generate(
        f'Para responder esta query, preciso de busca em base externa? Responda só sim ou não.\n'
        f'Query: {query}'
    )
    return decisor.strip().lower().startswith('sim')

if decidir_busca(query):
    docs = retriever.search(query)
    resposta = llm_responder_com_contexto(query, docs)
else:
    resposta = llm_responder_direto(query)
📑 Resumo navegável
O que é: Modelo emite token especial decidindo se precisa buscar. Se não, responde do parâmetro; se sim, busca e cita.
Por que aprender: Nem toda pergunta precisa de RAG. Self-RAG evita custo e latência quando o conhecimento paramétrico basta.
Conceitos-chave: Self-RAG, retrieve-or-not, calibração de confiança, paramétrico vs. retrieval.
3

🧭 Query decomposition

Quebrar pergunta complexa

Para perguntas compostas, decompor em sub-perguntas melhora recall. LLM faz a decomposição; cada sub-pergunta vira busca; respostas são combinadas. Cuidado: cada sub-busca custa; cap em 3-5 sub-perguntas é sensato.

exemplo de decomposição

  • Query: 'compare janela do Claude 3 e GPT-4 em 2024'
  • Sub-1: 'qual a janela do Claude 3 em 2024?'
  • Sub-2: 'qual a janela do GPT-4 em 2024?'
  • Combinação: LLM recebe ambas respostas e gera comparação final.
📑 Resumo navegável
O que é: LLM decompõe pergunta em sub-perguntas, busca cada uma, junta as evidências.
Por que aprender: Para perguntas compostas ('o que mudou de A para B?'), decomposição melhora recall.
Conceitos-chave: Query decomposition, sub-question answering, fan-out, planner.
4

🛡️ Guards: critic step e verificação

Checar antes de entregar

Critic step é um segundo passo: outro LLM (ou o mesmo com prompt diferente) verifica se a resposta está grounded. Se não, refaz a busca. Custo: 2× tokens; ganho: redução de alucinação em casos críticos. Usar com critério — não em todas as queries.

critic loop
def rag_com_critic(query, max_tries=2):
    for _ in range(max_tries):
        docs = retriever.search(query)
        resp = gerar(query, docs)
        crit = llm.generate(
            f'A resposta abaixo está grounded no contexto?\n'
            f'<ctx>{docs}</ctx>\n<resp>{resp}</resp>\n'
            'Sim/Não + 1 frase.'
        )
        if crit.startswith('Sim'):
            return resp
    return 'Não foi possível responder com confiança.'
📑 Resumo navegável
O que é: Após resposta, segundo passo verifica: a resposta está grounded? Cita fonte? Se não, refaz.
Por que aprender: Qualidade > velocidade em casos sensíveis. Critic step pega regressões.
Conceitos-chave: Critic loop, verification step, self-correction, faithfulness.
5

🚦 Stopping criteria

Quando o agente para de buscar

Sem critério de parada explícito, agente loopa em produção e queima orçamento. Defina: max_iterations (3-5 típico), confiança mínima da resposta, OU custo máximo em tokens. O primeiro que disparar para o loop. Isto é pré-requisito de qualquer rollout.

controle de loop
def agentic_rag(query, max_iter=3, max_tokens=20_000):
    tokens_usados = 0
    for i in range(max_iter):
        if tokens_usados > max_tokens:
            return 'budget exceeded', tokens_usados
        resp = um_passo(query, ...)
        tokens_usados += resp.tokens
        if resp.confianca > 0.85:
            return resp, tokens_usados
    return 'max_iter sem convergência', tokens_usados
📑 Resumo navegável
O que é: Critério explícito: max iterações, confiança suficiente, ou custo orçado atingido.
Por que aprender: Sem critério, o agente loopa. Loops em produção são desastre de custo.
Conceitos-chave: Max iterations, confidence threshold, cost budget, early stop.
6

💸 Quando NÃO usar RAG agêntico

O custo é real

RAG agêntico é tentador mas frequentemente injustificado. Em 80% dos casos, RAG estático com reranker e contextual retrieval resolve a custo 3-10× menor. Antes de adotar agêntico, esgote o estático e meça o gap real com seu golden set.

decisão: estático vs agêntico
SinalEstáticoAgêntico
Pergunta single-hop✓ default✗ overhead
Multi-hop confirmado em eval✗ recall baixo✓ vale custo
Latência crítica (UX live)✗ múltiplos roundtrips
Volume 1k+/dia✓ econômicodepende — meça
📑 Resumo navegável
O que é: Cada hop custa: tokens + latência + risco de loop. Para 80% dos casos, RAG estático com bom reranker basta.
Por que aprender: RAG agêntico pode 3-10× o custo de RAG estático sem ganho proporcional.
Conceitos-chave: Cost amortization, complexity vs benefit, default to simple.

📑 Resumo navegável dos tópicos

1 🔄 Multi-hop: encadear buscas — Quando uma busca não basta
O que é: Pergunta exige info de múltiplas fontes em sequência. Agente busca, lê, refina query, busca de novo.
Por que aprender: Perguntas como 'compare A e B em 2024' precisam de 2+ buscas. RAG estático falha.
Conceitos-chave: Multi-hop QA, iterative retrieval, query refinement, ReAct.
2 🤔 Self-RAG: decidir se buscar — Asai et al. 2023
O que é: Modelo emite token especial decidindo se precisa buscar. Se não, responde do parâmetro; se sim, busca e cita.
Por que aprender: Nem toda pergunta precisa de RAG. Self-RAG evita custo e latência quando o conhecimento paramétrico basta.
Conceitos-chave: Self-RAG, retrieve-or-not, calibração de confiança, paramétrico vs. retrieval.
3 🧭 Query decomposition — Quebrar pergunta complexa
O que é: LLM decompõe pergunta em sub-perguntas, busca cada uma, junta as evidências.
Por que aprender: Para perguntas compostas ('o que mudou de A para B?'), decomposição melhora recall.
Conceitos-chave: Query decomposition, sub-question answering, fan-out, planner.
4 🛡️ Guards: critic step e verificação — Checar antes de entregar
O que é: Após resposta, segundo passo verifica: a resposta está grounded? Cita fonte? Se não, refaz.
Por que aprender: Qualidade > velocidade em casos sensíveis. Critic step pega regressões.
Conceitos-chave: Critic loop, verification step, self-correction, faithfulness.
5 🚦 Stopping criteria — Quando o agente para de buscar
O que é: Critério explícito: max iterações, confiança suficiente, ou custo orçado atingido.
Por que aprender: Sem critério, o agente loopa. Loops em produção são desastre de custo.
Conceitos-chave: Max iterations, confidence threshold, cost budget, early stop.
6 💸 Quando NÃO usar RAG agêntico — O custo é real
O que é: Cada hop custa: tokens + latência + risco de loop. Para 80% dos casos, RAG estático com bom reranker basta.
Por que aprender: RAG agêntico pode 3-10× o custo de RAG estático sem ganho proporcional.
Conceitos-chave: Cost amortization, complexity vs benefit, default to simple.

✓ O que FAZER

  • max_iterations explícito (ex.: 3)
  • Budget de tokens por chamada agêntica
  • Logs de cada hop com query e resultado
  • RAG agêntico só onde estático falha

✗ O que NÃO fazer

  • Loop indefinido
  • Custos fora de controle
  • Debug impossível em produção
  • Adotar por padrão

🚫 Quando NÃO usar

💻 Exemplo de código

# Pseudo-código de loop agêntico simplificado
def agentic_rag(query: str, max_hops: int = 3) -> dict:
    historico = []
    for hop in range(max_hops):
        decisao = llm_decide(query, historico)  # buscar? parar? refinar?
        if decisao == "parar":
            return llm_responder_final(query, historico)
        elif decisao == "buscar":
            sub_query = llm_refinar_query(query, historico)
            chunks = retriever.search(sub_query, k=5)
            historico.append({"hop": hop, "query": sub_query, "chunks": chunks})
    return llm_responder_final(query, historico)  # fallback

🏋️ Exercício hands-on

Implemente RAG agêntico com max 3 hops contra um conjunto multi-hop de 10 perguntas. Compare com RAG estático: medir custo e acurácia.

📚 Bibliografia

🎯 Resumo do Módulo

  • Multi-hop resolve perguntas que single-hop falha.
  • Self-RAG: decidir se buscar reduz custo em casos triviais.
  • Decomposition: quebrar pergunta complexa em sub-perguntas.
  • Stopping criteria obrigatório (max_iterations, budget).
  • Default ao simples: estático com reranker resolve 80% dos casos.

Próximo Módulo:

T4 — Tools, Agentes e Multi-Agente