Pata & Cia - Qwen3-4B com QLoRA

Assistente de atendimento de um pet shop inteiramente fictício, voltado a cães e gatos. Explica catálogo, banho e tosa canina, escovação seca felina, agenda, entrega local, retirada, pagamentos e Clube Patinhas. Não diagnostica nem prescreve. Não acessa estoque ou agenda em tempo real e não executa transações.

Estado do artefato

Treino, avaliação e seis inferências concluídos na Tesla T4 do Colab em 18/10/2026. Este repositório contém adaptadores reais e o tokenizer; não inclui os pesos base.

Uso educacional. Foram observadas informações comerciais inventadas. O modelo não está pronto para atendimento autônomo.

Dados e método

Dataset separado: ItsMaaaverick/Pata-Cia-QA-Sintetico.

550 conversas messages com system, user e assistant; 495 para treino e 55 para validação. A base tem 19 temas. Os fatos vêm de DOMINIO.md e CATALOGO.json. 280 pares centrais foram redigidos com apoio de LLM; 270 foram derivados por código em cenários de catálogo, orçamento, carrinho, frete e fidelidade. Há repetição de estruturas; não são 550 políticas independentes. Grupos de SKU, orçamento e carrinho, e respostas idênticas, permanecem no mesmo split. A validação é interna ao cenário. A declaração de aprovação dos 57 pares foi registrada antes do treino e vinculada ao hash da base. Ela não atesta revisão dos 550 pares; a leitura não foi observada independentemente.

Base congelada em 4 bits, adaptadores rsLoRA, perda apenas na resposta, sem truncagem silenciosa. O template de chat usa enable_thinking=False.

{
  "model_name": "unsloth/Qwen3-4B",
  "max_seq_length": 2048,
  "load_in_4bit": true,
  "enable_thinking": false,
  "lora_rank": 16,
  "lora_alpha": 16,
  "lora_dropout": 0.0,
  "use_rslora": true,
  "target_modules": [
    "q_proj",
    "k_proj",
    "v_proj",
    "o_proj",
    "gate_proj",
    "up_proj",
    "down_proj"
  ],
  "bias": "none",
  "batch_size": 2,
  "gradient_accumulation_steps": 4,
  "effective_batch_size_single_gpu": 8,
  "num_train_epochs": 2,
  "learning_rate": 0.0001,
  "warmup_ratio": 0.05,
  "weight_decay": 0.01,
  "max_grad_norm": 1.0,
  "lr_scheduler_type": "cosine",
  "optim": "adamw_8bit",
  "logging_steps": 5,
  "eval_steps": 20,
  "seed": 3407,
  "packing": false,
  "loss_mask": "train_on_responses_only",
  "instruction_part": "<|im_start|>user\n",
  "response_part": "<|im_start|>assistant\n",
  "generation": {
    "do_sample": false,
    "max_new_tokens": 256
  },
  "model_revision": "64033659d5caf1b8ed7f929b29de705e93a4d468"
}

Resultados observados

{
  "train": {
    "train_runtime": 586.8801,
    "train_samples_per_second": 1.687,
    "train_steps_per_second": 0.211,
    "total_flos": 5317175325911040.0,
    "train_loss": 0.9128402385019487,
    "epoch": 2.0
  },
  "validation": {
    "eval_loss": 0.9719300270080566,
    "eval_runtime": 9.8705,
    "eval_samples_per_second": 5.572,
    "eval_steps_per_second": 2.837
  }
}

Consulte training_evidence.json, versões, curva e inferencias.json gerados na execução. A loss não mede acurácia factual ou segurança; não se afirma melhoria sobre o modelo base sem comparação. Respostas clínicas continuam fora do escopo.

Reprodução

  1. Coloque os arquivos do pipeline e os quatro JSONL em data/ na mesma pasta.
  2. Use Linux/Colab com uma GPU NVIDIA. O notebook v2 usa ambiente_colab.py para criar um Python 3.12 virtual e instalar requirements-colab.txt nele. Execute os comandos seguintes com o Python desse ambiente.
  3. Rode python treinar_patacia.py --preflight e revise a amostra humana.
  4. Rode python treinar_patacia.py --model-revision 64033659d5caf1b8ed7f929b29de705e93a4d468.
  5. Para publicar com conta autenticada: python treinar_patacia.py --publish-only.

Os pesos base não estão neste repositório. Os adaptadores dependem do commit base indicado nas evidências. A semente não garante igualdade entre ambientes.

Inferência

A recarga foi executada no Colab com os adaptadores locais; o snippet remoto abaixo usa a mesma base e configuração. Use Python 3.12 e as versões de requirements-colab.txt em uma GPU NVIDIA.

from unsloth import FastLanguageModel
from huggingface_hub import snapshot_download
from transformers import AutoTokenizer
from peft import PeftModel
import torch

repo = "ItsMaaaverick/Pata-Cia-Qwen3-4B-QLoRA"
base = snapshot_download(
    "unsloth/Qwen3-4B",
    revision="64033659d5caf1b8ed7f929b29de705e93a4d468",
    allow_patterns=["*.json", "*.safetensors", "*.model", "*.txt", "*.jinja", "LICENSE*"],
)
model, _ = FastLanguageModel.from_pretrained(base, max_seq_length=2048, load_in_4bit=True)
model = PeftModel.from_pretrained(model, repo, is_trainable=False)
tokenizer = AutoTokenizer.from_pretrained(repo)
FastLanguageModel.for_inference(model)
messages = [
    {"role": "system", "content": 'Você é o assistente virtual do Pata & Cia, pet shop fictício para cães e gatos. Responda em português brasileiro, com clareza e conforme o catálogo e as políticas da empresa. Não invente preços, estoque, horários disponíveis ou dados de clientes. Você informa e orienta, mas não efetiva compras, reservas, cancelamentos ou estornos. Não diagnostique, prescreva, indique doses ou dietas clínicas; encaminhe essas questões ao médico-veterinário. Quando faltar informação, reconheça o limite e encaminhe ao atendimento humano.'},
    {"role": "user", "content": "A loja abre no domingo?"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, enable_thinking=False)
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
with torch.inference_mode():
    outputs = model.generate(**inputs, do_sample=False, max_new_tokens=256, pad_token_id=tokenizer.pad_token_id)
print(tokenizer.decode(outputs[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))

Limitações

Empresa fictícia, catálogo estático e base pequena, sem integração com sistemas reais. O modelo pode errar cálculos, inventar informações ou ignorar limites. É necessária avaliação humana das gerações antes de qualquer uso real.

Referências

Erros observados e recuperação

Nas seis gerações de validação, o modelo inventou horários de funcionamento, medidas de peitorais, especificações de escova e uma exclusão de promoções no frete. As negativas de venda a granel e de brinquedo indestrutível ficaram alinhadas ao núcleo das referências, com falta de clareza ou completude. As respostas integrais, sem correção, estão em inferencias.json. Essa análise foi assistida por IA; não é medição estatística de acurácia nem nova revisão humana. Não houve comparação controlada com o modelo base.

Após o treino e o salvamento, Matplotlib falhou por herdar o backend inline do kernel Colab. recuperar_resultados.py definiu Agg antes do import, recuperou a avaliação observada no log final e gerou as seis respostas sem novo treinamento. O erro original foi preservado; recovery_evidence.json registra a recuperação. O código usado no treino foi preservado; em novo treino, defina MPLBACKEND=Agg no processo antes de importar Matplotlib. O registro de revisão humana prévia está no repositório do dataset.

Autoria: Grupo BoraLog. Pesos de origem: results_run_20261018T203929193960Z.

Downloads last month
12
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for ItsMaaaverick/Pata-Cia-Qwen3-4B-QLoRA

Finetuned
Qwen/Qwen3-4B
Finetuned
unsloth/Qwen3-4B
Adapter
(63)
this model