5. Critérios de Routing
O router traduz sinais do Query Analyzer em estratégia de execução. Esta é a parte mais crítica do sistema.
Dimensões de Decisão
A. Precisa de Grounding?
| Sinais | Ação |
|---|
| Referência a documento, policy, base interna, número específico | Sim → RAG ou tools |
| Pedido factual dependente de dados atualizados | Sim |
| Risco de inventar é alto | Sim |
| Nenhum dos acima | Talvez → direct_answer |
B. Quantas Fontes?
| Sinais | Estratégia |
|---|
| "compara X com Y", "segundo os docs e os dados" | multi_backend_agent |
| Mistura texto + números | multi_backend_agent |
| Envolve relações entre entidades | multi_backend_agent |
| Uma só fonte | simple_rag ou enriched_rag |
C. Complexidade Semântica
| Sinais de alta complexidade | Estratégia |
|---|
| Multi-hop, comparação, causalidade | enriched_rag ou multi_backend_agent |
| Síntese de várias evidências | enriched_rag |
| Ambiguidade, muitos filtros | enriched_rag |
| Baixa complexidade | simple_rag |
| Média | enriched_rag |
D. Tipo de Tarefa → Estratégia
| task_type | Estratégia provável |
|---|
| factual | simple_rag |
| procedural | simple_rag ou enriched_rag |
| comparative | enriched_rag |
| analytical | enriched_rag ou multi_backend_agent |
| structured_numeric | SQL/tool path → multi_backend_agent |
| exploratory | enriched_rag |
E. Criticidade / Risco
| Condição | Ação |
|---|
| Query sensível, business critical, números exatos | Evitar direct_answer, exigir grounding |
| Pode levar a decisão operacional | Opcional verificação adicional |
F. Restrição de Latência
| Modo | Restrições |
|---|
fast (rápido) | Evitar decomposição agressiva, evitar multi-tool, usar simple_rag com top-k controlado |
quality (qualidade) | Pode escalar para enriched_rag / multi_backend_agent |
Tabela de Routing
| Condição | Estratégia |
|---|
needs_grounding = false e complexity = low | direct_answer |
needs_grounding = true, sources = ["docs"], complexity = low | simple_rag |
task_type = comparative, complexity = medium | enriched_rag |
requires_multi_source = true ou requires_structured_data = true | multi_backend_agent |
| Baixa confiança após retrieve inicial | fallback → enriched_rag |
| Baixa confiança após enriched | fallback → multi_backend_agent ou clarify |
Pseudocódigo do Router
function route(analysis: QueryAnalysis) -> Strategy:
# Override por criticidade
if analysis.risk_level == "high":
return multi_backend_agent if analysis.requires_multi_source else enriched_rag
# Direct answer só quando seguro
if not analysis.needs_grounding and analysis.complexity == "low" and analysis.risk_level == "low":
return direct_answer
# Multi-backend
if analysis.requires_multi_source or analysis.requires_structured_data:
return multi_backend_agent
# Latência fast → limitar
if analysis.latency_tier == "fast":
return simple_rag if analysis.complexity in ["low"] else enriched_rag
# Por tipo e complexidade
if analysis.task_type in ["comparative", "analytical"]:
return enriched_rag
if analysis.complexity == "high":
return enriched_rag # ou multi_backend se sources incluem sql/api
# Default
return simple_rag
Heurísticas do Query Analyzer (Camada A)
Regras baratas para hints iniciais:
| Padrão (keywords) | Sugestão |
|---|
| "compara", "diferença", "versus" | task_type: comparative |
| "quanto", "número", "média", "top" | requires_structured_data: true |
| "explica", "resume" | documental/semântica |
| "segundo a policy", "neste documento" | needs_grounding: true |
| "policy", "regulamento", "handbook" | sources: ["docs"] |
| "gastos", "budget", "despesas", "trimestre" | sources: ["docs", "sql"] |