Estratégias de fallback quando serviços de IA falham

1. Fundamentos da Resiliência em Sistemas de IA

1.1. O que são estratégias de fallback e por que são essenciais em produção

Estratégias de fallback são mecanismos predefinidos que garantem a continuidade operacional de sistemas baseados em IA quando o serviço principal falha. Em produção, serviços de IA como APIs de grandes modelos de linguagem (LLMs) podem apresentar instabilidade devido a picos de tráfego, manutenção, limites de taxa ou erros internos. Sem fallback, uma única falha pode derrubar toda a aplicação.

1.2. Tipos comuns de falhas

  • Timeout: resposta não retornada dentro do limite configurado
  • Erro de API: códigos HTTP 4xx/5xx (rate limit, servidor ocupado)
  • Degradação de qualidade: resposta incoerente, alucinações ou conteúdo irrelevante
  • Viés inesperado: saída tendenciosa ou inadequada que precisa ser bloqueada

1.3. Métricas de monitoramento

Latência: < 2s para fallback imediato
Taxa de erro: > 5% aciona circuit breaker
Coerência semântica: similaridade cosseno > 0.7 com resposta esperada

2. Hierarquia de Fallbacks: Do Rápido ao Robusto

2.1. Fallback imediato: retry com backoff exponencial e circuit breaker

# Pseudocódigo para retry com backoff exponencial
tentativa = 1
max_tentativas = 5
while tentativa <= max_tentativas:
    try:
        resposta = chamar_servico_ia(prompt)
        return resposta
    except TimeoutError:
        esperar = min(2 ** tentativa, 30)  # segundos
        sleep(esperar)
        tentativa += 1
# Se todas falharem, ativar circuit breaker
ativar_circuit_breaker()

2.2. Fallback de modelo: alternância entre modelos

# Hierarquia de modelos por custo e qualidade
modelos = [
    {"nome": "gpt-4",     "custo": 0.03, "qualidade": 0.95},
    {"nome": "gpt-3.5",   "custo": 0.002,"qualidade": 0.85},
    {"nome": "modelo_local_onnx", "custo": 0.0001, "qualidade": 0.70}
]

for modelo in modelos:
    try:
        resposta = chamar_modelo(modelo["nome"], prompt)
        if validar_qualidade(resposta):
            return resposta
    except:
        continue
return fallback_semantico(prompt)

2.3. Fallback semântico: respostas pré-definidas

# Templates contextuais para fallback
templates = {
    "saudacao": "Olá! Estou temporariamente com limitações. Como posso ajudar?",
    "erro_tecnico": "Desculpe, estou enfrentando dificuldades técnicas. Tente novamente em alguns instantes.",
    "dados_criticos": "Não foi possível processar sua solicitação. Um especialista será notificado."
}

3. Estratégias de Degradação Graciosa (Graceful Degradation)

3.1. Redução de funcionalidade

Quando o serviço principal falha, desative recursos complexos e mantenha o core operacional. Por exemplo, se a análise de sentimentos falha, continue oferecendo respostas baseadas em regras simples.

3.2. Cache inteligente

# Cache de respostas anteriores para perguntas similares
cache = Redis(host='localhost', port=6379)

def obter_resposta(prompt):
    hash_prompt = gerar_hash_semantica(prompt)
    resposta_cache = cache.get(hash_prompt)
    if resposta_cache:
        return resposta_cache
    try:
        resposta = servico_ia_principal(prompt)
        cache.set(hash_prompt, resposta, ex=3600)  # expira em 1 hora
        return resposta
    except:
        return cache.get_similar(prompt)  # fallback para similar mais próximo

3.3. Feedback ao usuário

Mensagens claras e sem alarmismo:

"Estou operando em modo reduzido. Algumas funcionalidades podem estar limitadas, mas sua solicitação será processada."

4. Fallback Baseado em Dados Locais e Offline

4.1. Modelos leves locais

# Carregar modelo ONNX para fallback offline
import onnxruntime as ort
sessao = ort.InferenceSession("modelo_leve.onnx")

def inferencia_local(texto):
    entrada = tokenizer(texto, return_tensors="np")
    saida = sessao.run(None, {"input_ids": entrada["input_ids"]})
    return saida

4.2. Consulta a bases de conhecimento locais

# Vector store local como fallback
from chromadb import Client
cliente = Client()
colecao = cliente.get_collection("knowledge_base")

def fallback_por_busca(prompt):
    resultados = colecao.query(query_texts=[prompt], n_results=3)
    if resultados["distances"][0][0] < 0.3:
        return resultados["documents"][0][0]  # resposta mais similar
    return "Não encontrei informações suficientes."

4.3. Última resposta conhecida e regras determinísticas

ultima_resposta_valida = ""

def fallback_deterministico(prompt):
    if "horario" in prompt.lower():
        return f"Horário atual: {datetime.now().strftime('%H:%M')}"
    if "previsao" in prompt.lower():
        return "Serviço de previsão temporariamente indisponível."
    return ultima_resposta_valida  # última resposta conhecida

5. Orquestração e Roteamento Inteligente de Fallbacks

5.1. Árvore de decisão com pesos

arvore_fallback = [
    {"provedor": "openai", "peso": 0.8, "custo": 0.03},
    {"provedor": "anthropic", "peso": 0.7, "custo": 0.025},
    {"provedor": "google", "peso": 0.6, "custo": 0.02},
    {"provedor": "modelo_local", "peso": 0.5, "custo": 0.001}
]

def rotear(prompt):
    for provedor in sorted(arvore_fallback, key=lambda x: x["peso"], reverse=True):
        if provedor["peso"] > 0.6 and verificar_disponibilidade(provedor):
            try:
                return chamar_provedor(provedor, prompt)
            except:
                continue
    return "Serviço indisponível. Tente novamente mais tarde."

5.2. Balanceamento entre múltiplos provedores

# Round-robin entre provedores com fallback automático
provedores = ["openai", "anthropic", "google"]
indice = 0

def obter_provedor():
    global indice
    provedor = provedores[indice % len(provedores)]
    indice += 1
    return provedor

5.3. Gateways de API com failover

Kong, Envoy ou LLM Gateway podem rotear automaticamente para provedores alternativos quando o primário falha.

6. Testes e Simulação de Falhas em Produção

6.1. Chaos engineering para IA

# Injetar falhas controladas em ambiente de teste
import random

def simular_falha(taxa=0.1):
    if random.random() < taxa:
        raise ConnectionError("Falha simulada")
    return servico_ia_real(prompt)

6.2. Testes de regressão

# Testar fallbacks ativados vs desativados
testes = [
    ("prompt_normal", "resposta_esperada_1"),
    ("prompt_timeout", "fallback_ativado"),
    ("prompt_erro_api", "fallback_ativado")
]

for prompt, esperado in testes:
    with mock_api(raise_error=True):
        resultado = sistema_completo(prompt)
        assert resultado == esperado

6.3. Logs estruturados para análise

{
  "evento": "fallback_ativado",
  "provedor_original": "openai",
  "provedor_fallback": "modelo_local",
  "motivo": "timeout_excedido",
  "latencia_ms": 3200,
  "timestamp": "2025-03-25T14:30:00Z"
}

7. Aspectos de UX e Comunicação com o Usuário

7.1. Transparência

"Nota: Devido a alta demanda, estou usando uma versão simplificada. Sua experiência pode ser diferente."

7.2. Design de estados na interface

  • Carregando: spinner com mensagem "Processando..."
  • Erro: "Algo deu errado. Tentando alternativa..."
  • Fallback ativo: "Modo reduzido ativado. Funcionalidades limitadas."

7.3. Recuperação automática vs manual

# Re-tentativa automática após 30 segundos
schedule.every(30).seconds.do(tentar_restaurar_servico_principal)

8. Governança e Documentação das Estratégias

8.1. Política de fallback

Definir claramente quando parar de tentar e escalar para suporte humano:

POLITICA_FALLBACK = {
    "max_tentativas_automaticas": 3,
    "tempo_maximo_fallback": 300,  # segundos
    "escalar_humano_apos": 5,      # falhas consecutivas
    "nivel_critico": ["saude", "financas", "seguranca"]
}

8.2. Versionamento de estratégias

# Versionamento paralelo ao de prompts
estratégias_v1 = [...]  # versão inicial
estratégias_v2 = [...]  # com cache inteligente
estratégias_v3 = [...]  # com modelos locais

8.3. Auditoria de falhas

# Rastreabilidade completa
log_falha = {
    "id_unico": "fallback_20250325_001",
    "usuario": "anon",
    "acao": "consulta_preco",
    "cadeia_fallback": ["openai", "gpt3.5", "cache", "template"],
    "resultado_final": "template_usado",
    "tempo_total_ms": 4500,
    "compliance": "aprovado"
}

Referências