Instructions to use Brunovski/gemma4-e2b-incident-triage with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use Brunovski/gemma4-e2b-incident-triage with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("unsloth/gemma-4-E2B-it-unsloth-bnb-4bit") model = PeftModel.from_pretrained(base_model, "Brunovski/gemma4-e2b-incident-triage") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- Unsloth Desktop
- Gemma 4 E2B β Agente de Triagem de Incidentes de Infraestrutura (SRE / DevOps)
- π Arquitetura da SoluΓ§Γ£o
- 1. Contrato de SaΓda (JSON)
- 2. Por que Fine-Tuning (QLoRA) + MCP em vez de RAG puro?
- 3. Resultados Experimentais (Modelo Base β v5 β v6)
- 4. Engenharia de Recursos: Como o Gemma 4 E2B coube em 8 GB de VRAM
- 5. CatΓ‘logo Operacional Coberto (34 Classes)
- 6. Guardrails, AnΓ‘lise de Erros e LimitaΓ§Γ΅es
- 7. Como Usar (InferΓͺncia Local)
- 8. LicenΓ§a e Termos de Uso
- π Arquitetura da SoluΓ§Γ£o
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
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:
- Descarte das torres multimodais (
text_only=True): remoΓ§Γ£o das camadas de visΓ£o e Γ‘udio, mantendo apenas o decoder textual. - QuantizaΓ§Γ£o NormalFloat 4-bit (
load_in_4bit=True): compressΓ£o dos pesos base com bitsandbytes. - 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. - 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 prefixorunbooks/authentik/banco-inexistente.mdem vez derunbooks/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.mdem vez decrashloopbackoff.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