Gemma 4 E2B β€” Agente de Triagem de Incidentes de Infraestrutura (SRE / DevOps)

Fine-tuning (QLoRA 4-bit) do modelo unsloth/gemma-4-E2B-it projetado para atuar como um Agente DeterminΓ­stico de Triagem de Incidentes. O modelo recebe recortes de logs brutos e ruidosos de infraestrutura (Traefik, Docker/Swarm, Kubernetes, PostgreSQL, Authentik e Prometheus), filtra alarmes falsos (ruΓ­do de inicializaΓ§Γ£o, erros 4xx de cliente, warnings transitΓ³rios), isola a causa raiz em cenΓ‘rios de falha em cascata e retorna estritamente um objeto JSON padronizado apontando para o runbook de mitigaΓ§Γ£o correspondente.

O JSON gerado alimenta diretamente um servidor MCP (Model Context Protocol, padrΓ£o aberto para conectar LLMs a ferramentas externas e bases de dados) (mcp-ops-kb), conectando a detecΓ§Γ£o de anomalias em logs Γ  base operacional de procedimentos em Markdown (.md) para reduzir o MTTR (Mean Time to Resolution).

πŸ“Š Arquitetura da SoluΓ§Γ£o

Arquitetura do Agente de Triagem

Fluxo: Log Bruto (K8s/Chaos Lab) β†’ Gemma 4 E2B (InferΓͺncia Local 4-bit) β†’ JSON (Contrato Estrito) β†’ Guardrail (ValidaΓ§Γ£o de Runbook) β†’ Servidor MCP β†’ Runbook .md


1. Contrato de SaΓ­da (JSON)

Quando uma falha real de infraestrutura Γ© detectada:

{
  "severidade": "ALTA",
  "componente_afetado": "Traefik / PKI",
  "causa_raiz": "Certificado TLS de api.exemplo.com expirado na CA interna.",
  "runbook": "runbooks/traefik/certificado-expirado.md"
}

Quando o log contΓ©m apenas operaΓ§Γ£o normal, avisos inofensivos ou erros de negΓ³cio/cliente (hard negatives):

{
  "severidade": "NENHUMA",
  "componente_afetado": null,
  "causa_raiz": "Nenhuma falha de infraestrutura encontrada nos logs.",
  "runbook": null
}

2. Por que Fine-Tuning (QLoRA) + MCP em vez de RAG puro?

Em triagem automatizada de incidentes, a escolha por Fine-Tuning supervisionado (SFT) acoplado a uma camada determinΓ­stica de validaΓ§Γ£o supera uma arquitetura de RAG tradicional por quatro razΓ΅es operacionais:

Assimetria SemΓ’ntica no Log Bruto

Logs de infraestrutura contΓͺm cΓ³digos ANSI, timestamps em mΓΊltiplos formatos, IPs dinΓ’micos, hashes de pods e stack traces extensos. A busca vetorial por similaridade (embedding similarity) sofre degradaΓ§Γ£o severa quando confrontada com cascatas de erros nas quais o sintoma final (ex.: HTTP 504 no Traefik) domina o volume de linhas, mas a causa raiz real estΓ‘ em uma ΓΊnica linha anterior (ex.: connection pool esgotado ou falha de disco no PostgreSQL).

Garantia de Contrato Estrutural e Taxonomia Fechada

Enquanto um modelo base via prompting/RAG frequentemente descreve passos genΓ©ricos no campo runbook ou utiliza escalas de severidade arbitrΓ‘rias (high, critical), o QLoRA condiciona os pesos do modelo Γ  taxonomia exata da operaΓ§Γ£o (34 classes distribuΓ­das em 7 subsistemas) e ao esquema JSON estrito.

ResoluΓ§Γ£o Temporal de Causa Raiz

O treinamento ensina a regra de negΓ³cio operacional de ignorar sintomas derivados (como pods entrando em BackOff apΓ³s queda do banco) e apontar exclusivamente o evento primΓ‘rio.

EficiΓͺncia e ExecuΓ§Γ£o Local (FinOps / Privacidade)

Rodando em 4-bit numa ΓΊnica GPU de consumidor (RTX 4060 8 GB VRAM), a inferΓͺncia ocorre localmente com baixa latΓͺncia, custo zero de API e sem trΓ‘fego externo de logs sensΓ­veis. A recuperaΓ§Γ£o do conteΓΊdo do runbook ocorre de forma determinΓ­stica via MCP Server a partir do caminho exato retornado pelo modelo.


3. Resultados Experimentais (Modelo Base β†’ v5 β†’ v6)

A avaliaΓ§Γ£o foi conduzida em duas frentes rigorosamente separadas do treinamento:

  • Teste SintΓ©tico Controlado (n = 300): inclui formulaΓ§Γ΅es vistas, formulaΓ§Γ΅es inΓ©ditas (frases de erro nunca vistas no treino), cascatas de falhas e exemplos sem erro (hard negatives como HTTP 404/422/499, slow queries e warnings).
  • Logs Reais do Chaos Lab (n = 32 janelas): logs reais coletados de um cluster Kubernetes (Minikube, namespace chaos-lab) rodando Traefik v3, PostgreSQL, Authentik e Prometheus sob injeΓ§Γ£o de falhas reais.

3.1. EvoluΓ§Γ£o nos Logs Reais do Chaos Lab (n = 32 β€” Nunca vistos no treino)

MΓ©trica / CritΓ©rio Modelo Base (Zero-shot) Modelo v5 (Antes) Modelo v6 (Atual) Ganho (Base β†’ v6) Ganho (v5 β†’ v6)
JSON VΓ‘lido 100% 100% 100% EstΓ‘vel (100%) EstΓ‘vel (100%)
Runbook Correto (Exato) 0% 53% 88% +88 p.p. +35 p.p.
Severidade Correta 28% 34% 94% +66 p.p. +60 p.p.
Componente Afetado 3% 72% 91% +88 p.p. +19 p.p.
Grounding (Fatos no Log) 88% 21% 96% +8 p.p. +75 p.p.
Runbooks Inventados (AlucinaΓ§Γ£o) 100% 44% 12% -88 p.p. -32 p.p.

Desempenho por Grupo nos Logs Reais (VersΓ£o v6)

Grupo Real (chaos-lab) Janelas (n) JSON Runbook Severidade Componente Grounding Inventado
TOTAL 32 100% 88% 94% 91% 96% 12%
real (cascata) 6 100% 100% 100% 100% 100% 0%
real (traefik) 7 100% 100% 100% 100% 100% 0%
real (prometheus) 3 100% 100% 100% 100% 100% 0%
real (postgres) 10 100% 90% 90% 90% 100% 10%
real (events) 3 100% 67% 67% 100% 50% 33%
real (authentik) 3 100% 33% 100% 33% 100% 67%

3.2. Desempenho no Conjunto de Teste SintΓ©tico (n = 300)

Grupo de Teste Exemplos (n) JSON Runbook (v5 β†’ v6) Severidade Componente Grounding Inventado
TOTAL 300 100% 92% β†’ 95% 96% 96% 96% 1%
cascata (causa raiz) 33 100% 100% β†’ 97% 100% 97% 100% 3%
formulacao_inedita 123 100% 83% β†’ 89% 91% 91% 92% 2%
formulacao_vista 95 100% 100% β†’ 100% 100% 100% 100% 0%
sem_erro (hard negatives) 49 100% 100% β†’ 100% 100% 100% - 0%

4. Engenharia de Recursos: Como o Gemma 4 E2B coube em 8 GB de VRAM

A famΓ­lia Gemma 4 "E" (Effective) carrega tabelas extensas de Per-Layer Embeddings (~4,38 GB em bf16), o que faria o modelo ocupar ~7,17 GB apenas no carregamento inicial e inviabilizaria o treinamento numa NVIDIA GeForce RTX 4060 (8 GB).

Para viabilizar o fine-tuning local sem recorrer a GPUs de nuvem:

  1. Descarte das torres multimodais (text_only=True): remoΓ§Γ£o das camadas de visΓ£o e Γ‘udio, mantendo apenas o decoder textual.
  2. QuantizaΓ§Γ£o NormalFloat 4-bit (load_in_4bit=True): compressΓ£o dos pesos base com bitsandbytes.
  3. Offload de embeddings para a RAM (offload_embedding=True): transferΓͺncia das tabelas de embeddings para a memΓ³ria RAM do sistema, reduzindo o consumo estΓ‘tico de VRAM para 2,48 GB logo apΓ³s o carregamento.
  4. CΓ‘lculo de loss exclusivo na resposta (train_on_responses_only): mascaramento dos tokens de entrada (logs brutos) para focar o gradiente exclusivamente na geraΓ§Γ£o do JSON padronizado.

ParΓ’metros de Treinamento (Unsloth + TRL)

  • Hardware: 1Γ— NVIDIA GeForce RTX 4060 (8 GB VRAM) no Linux.
  • Tempo de treinamento: 87,0 minutos (1.000 steps / 2 Γ©pocas sobre 3.996 exemplos filtrados).
  • Pico de VRAM reservada: 7,18 GB.
  • ConfiguraΓ§Γ£o LoRA: r = 16, lora_alpha = 32, lora_dropout = 0, bias = "none" (24.158.208 parΓ’metros treinΓ‘veis β€” 0,52% do total).
  • Otimizador e precisΓ£o: adamw_8bit, bf16 = True, max_seq_length = 2048, batch_size = 1, gradient_accumulation_steps = 8, learning_rate = 2e-4.

5. CatΓ‘logo Operacional Coberto (34 Classes)

Subsistema Classes
Traefik (7) backend-indisponivel, timeout-backend, certificado-acme, certificado-expirado, ca-nao-confiavel, middleware-inexistente, rbac-sem-permissao
PostgreSQL (8) conexoes-esgotadas, pool-esgotado, falha-autenticacao, deadlock, conexao-recusada, relacao-inexistente, disco-cheio, banco-inexistente
Kubernetes (7) crashloopbackoff, image-pull-backoff, oomkilled, pending-recursos, pvc-nao-vinculado, probe-falhando, no-notready
Docker (5) oom-killed, porta-em-uso, disco-cheio, falha-pull-imagem, container-unhealthy
Authentik (4) redis-indisponivel, banco-indisponivel, outpost-sem-provider, smtp-indisponivel
Docker Swarm (2) recursos-insuficientes, no-indisponivel
Prometheus (1) config-invalida

6. Guardrails, AnΓ‘lise de Erros e LimitaΓ§Γ΅es

AnΓ‘lise dos desvios residuais na v6 (12% nos logs reais)

Nos 4 casos (em 32 janelas reais) em que o modelo nΓ£o acertou o caminho exato:

  • Em 2 janelas isoladas do Authentik (amostra restrita de n=3), o log mostrava apenas o container da aplicaΓ§Γ£o reclamando que o banco Authentik nΓ£o existia. O modelo identificou corretamente o problema (banco-inexistente.md), mas atribuiu o prefixo runbooks/authentik/banco-inexistente.md em vez de runbooks/postgres/banco-inexistente.md. Importante: quando avaliado nas 6 janelas de cascata completa (em que o log do Postgres estava presente no contexto), o modelo acertou 100% dos casos.
  • Em 1 janela de Kubernetes Events, gerou o nome aproximado runbooks/kubernetes/container-falhando.md em vez de crashloopbackoff.md.

Camada de Guarda DeterminΓ­stica (triagem.py)

Para impedir que qualquer alucinaΓ§Γ£o residual de caminho chegue ao servidor MCP em produΓ§Γ£o, a funΓ§Γ£o triagem() valida o campo runbook contra o conjunto imutΓ‘vel RUNBOOKS_VALIDOS (extraΓ­do diretamente do diretΓ³rio real de arquivos .md). Qualquer caminho fora do catΓ‘logo Γ© interceptado e convertido para None (ou sinalizado para escalonamento/fallback).


7. Como Usar (InferΓͺncia Local)

PrΓ©-requisitos

Certifique-se de ter as bibliotecas instaladas e o mΓ³dulo triagem.py (disponΓ­vel no repositΓ³rio do GitHub) no mesmo diretΓ³rio do script.

pip install unsloth transformers peft accelerate bitsandbytes

CΓ³digo de exemplo

import json
from functools import partial

from unsloth import FastModel
import triagem as tri

# Carrega o modelo base em 4-bit + adaptadores LoRA com offload de embeddings
model, tokenizer = FastModel.from_pretrained(
    model_name="Brunovski/gemma4-e2b-incident-triage",
    max_seq_length=2048,
    load_in_4bit=True,
    text_only=True,
    device_map={"": 0},
    offload_embedding=True,
)
FastModel.for_inference(model)

triagem_fn = partial(tri.triagem, model, tokenizer)

log_exemplo = """traefik-1  | 2026-10-31T12:01:10Z INF Starting provider *docker.Provider
api-1      | INFO:     172.18.0.4:51234 - "GET /health HTTP/1.1" 200 OK
api-1      | java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms (total=20, active=20, idle=0, waiting=37)
traefik-1  | 201.17.4.9 - - [31/Oct/2026:12:01:41 +0000] "POST /v1/checkout HTTP/2.0" 504 15 "-" "okhttp/4.12.0" 912 "api@docker" "http://172.18.0.4:8080" 30004ms"""

resultado = triagem_fn(log_exemplo)
print(json.dumps(resultado, indent=2, ensure_ascii=False))

8. LicenΓ§a e Termos de Uso

Este modelo Γ© um adaptador derivado do Gemma 4 (unsloth/gemma-4-E2B-it) e seu uso estΓ‘ sujeito aos termos da licenΓ§a do Gemma (Gemma Terms of Use).

Os logs utilizados na validaΓ§Γ£o real foram gerados em ambiente isolado de laboratΓ³rio (chaos-lab em Minikube).

Downloads last month
6
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for Brunovski/gemma4-e2b-incident-triage

Adapter
(61)
this model