Olá!

Se você chegou até aqui, é porque está interessado em fazer o fine-tuning de modelos de IA de código aberto para seus próprios propósitos (chatbot, assistente de codificação, especialista em um domínio, etc.). Aqui está uma visão geral simples e amigável para iniciantes, que você pode usar diretamente no contexto do Laravel ou desenvolvimento web geral.


1. O que significa "fazer fine-tuning de um modelo de IA de código aberto"?

Fine-tuning significa pegar um modelo pré-treinado existente (como LLaMA‑2, Mistral ou algo do Hugging Face) e treiná-lo um pouco mais em seus próprios dados, para que ele:

  • Se adapte ao seu domínio (jurídico, financeiro, médico, jogos, etc.)
  • Aprenda seu tom e estilo
  • Melhore em uma tarefa específica (QA, codificação, classificação, suporte, etc.)

Em vez de treinar do zero (o que é caro e demorado), você reutiliza um modelo base poderoso e o especializa.


2. Principais opções de fine-tuning

Existem 3 abordagens principais que você verá:

2.1 Fine-tuning Completo

  • Atualiza todos os pesos do modelo.
  • Prós: Máxima flexibilidade e desempenho.
  • Contras: Requer muita GPU, tempo e armazenamento.

Isso geralmente é exagerado, a menos que você seja uma instituição de pesquisa ou uma grande empresa.

2.2 LoRA / PEFT (Fine-tuning Eficiente em Parâmetros)

Prós:

  • Requisitos de VRAM muito menores
  • Mais rápido
  • Você pode compartilhar apenas os adaptadores, não todo o modelo

Contras:

  • Ligeiramente menos expressivo que o fine-tuning completo, mas geralmente bom o suficiente.

2.3 QLoRA (LoRA Quantizado)

  • Combina quantização (por exemplo, 4 bits) com LoRA.
    • Carrega o modelo base em precisão mais baixa (int4 ou int8).
    • Treina os adaptadores LoRA em cima dele.

Prós:

  • Você pode fazer fine-tuning de modelos grandes em uma única GPU (mesmo uma GPU de consumidor como 24 GB).
  • Muito popular para modelos estilo LLaMA.

Recomendado para a maioria dos desenvolvedores individuais.


3. Escolhendo um modelo base de código aberto

Onde obter modelos:

Opções comuns:

  • Chat/Assistente:
    • mistralai/Mistral-7B-Instruct-v0.2
    • meta-llama/Llama-3-8b-instruct (se a licença e o acesso funcionarem para o seu caso de uso)
  • Código:
    • codellama/CodeLlama-7b-Instruct-hf
    • deepseek-ai/deepseek-coder-6.7b-instruct

Coisas para verificar:

  • Licença (comercial vs não comercial)
  • Tamanho do modelo (7B é um bom ponto de partida)
  • Instruction‑tuned vs base: Para um chatbot, escolha um modelo instruct/chat.

4. Preparando seus dados para fine-tuning

A forma dos seus dados é mais importante do que as pessoas pensam.

4.1 Que tipo de dados você deve usar?

Exemplos:

  • Logs de chat de suporte ao cliente
  • Documentos de perguntas frequentes
  • Artigos da base de conhecimento
  • Repositórios de código + descrições
  • Artigos de pesquisa específicos do domínio

Limpe seus dados:

  • Remova PII / segredos (chaves de API, e-mails, senhas)
  • Desduplique textos semelhantes
  • Corrija quaisquer problemas óbvios de formatação

4.2 Formatos de Instrução Comuns

Para modelos de chat, o formato comum do Hugging Face é:

{
  "instruction": "Por favor, explique o que é fine-tuning em termos simples.",
  "input": "",
  "output": "Fine-tuning é pegar um modelo já treinado e treiná-lo ainda mais em seus próprios dados..."
}

Ou, um formato mais parecido com um chat:

{
  "messages": [
    {"role": "system", "content": "Você é um assistente útil para responder a perguntas sobre contabilidade."},
    {"role": "user", "content": "Como devo registrar o pagamento de uma fatura?"},
    {"role": "assistant", "content": "Para registrar o pagamento de uma fatura, você deve..."}
  ]
}

Salve como .jsonl (um objeto JSON por linha), .json ou um dataset do Hugging Face.


5. Exemplo mínimo: Fine-tuning com Hugging Face + LoRA

Em geral, você precisa:

  • Python 3.10+
  • Uma GPU (idealmente >= 16 GB de VRAM para 7B, 24 GB é mais confortável)
  • Bibliotecas:
    • transformers
    • datasets
    • peft
    • bitsandbytes
    • accelerate

5.1 Instale as dependências

pip install "transformers>=4.39.0" "datasets" "accelerate" "peft" "bitsandbytes"

5.2 Script QLoRA simples (conceito)

from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import torch

model_name = "mistralai/Mistral-7B-Instruct-v0.2"
dataset_path = "path_or_hf_dataset"  # Ex: "my-username/my-dataset"

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_4bit=True,
    device_map="auto"
)

dataset = load_dataset(dataset_path, split="train")

def format_example(example):
    user = example["instruction"]
    answer = example["output"]
    prompt = f"User: {user}
Assistant:"
    return {"input_ids": tokenizer(prompt, truncation=True, padding="max_length", max_length=512)["input_ids"],
            "labels":    tokenizer(answer, truncation=True, padding="max_length", max_length=512)["input_ids"]}

tokenized = dataset.map(format_example, remove_columns=dataset.column_names)

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, lora_config)

training_args = TrainingArguments(
    output_dir="./mistral-finetuned",
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    learning_rate=2e-4,
    num_train_epochs=3,
    fp16=True,
    logging_steps=10,
    save_steps=500,
    save_total_limit=2,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized
)

trainer.train()
model.save_pretrained("./mistral-finetuned-lora")
tokenizer.save_pretrained("./mistral-finetuned-lora")

Este é um referencial simplificado. Para uso em produção, consulte:


6. Integrando um modelo com fine-tuning ao seu aplicativo Laravel

Depois de ter um modelo com fine-tuning, você precisa servi-lo e chamá-lo do Laravel.

6.1 Diferentes maneiras de servir seu modelo

  1. Microserviço FastAPI / Flask (Python)
    • Execute a inferência com transformers ou vLLM.
    • Exponha um endpoint /generate.
  2. Text Generation Inference (TGI)
  3. Ollama (para alguns modelos)
    • Ollama é executado em macOS/Linux e fornece uma API HTTP simples.

6.2 Endpoint de inferência básico (exemplo de Python + FastAPI)

from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

app = FastAPI()

model_name = "./mistral-finetuned-lora"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)

class GenerateRequest(BaseModel):
    prompt: str
    max_new_tokens: int = 256
    temperature: float = 0.7

@app.post("/generate")
def generate(req: GenerateRequest):
    inputs = tokenizer(req.prompt, return_tensors="pt").to(model.device)
    output = model.generate(
        **inputs,
        max_new_tokens=req.max_new_tokens,
        temperature=req.temperature,
        do_sample=True,
        pad_token_id=tokenizer.eos_token_id
    )
    text = tokenizer.decode(output[0], skip_special_tokens=True)
    return {"result": text}

Execute isso em uma máquina com uma GPU.

6.3 Chame o modelo do Laravel

No Laravel, use Http::post() (de Illuminate\Support\Facades\Http) para se comunicar com seu serviço Python.

use Illuminate\Support\Facades\Http;

$response = Http::post('http://your-python-host:8000/generate', [
    'prompt' => 'Por favor, explique o que é fine-tuning.',
    'max_new_tokens' => 256,
    'temperature' => 0.7,
]);

$result = $response->json()['result'] ?? null;

Você pode encapsular isso em uma classe de serviço (ex: App\Services\AIClient) e chamá-la de seus controllers.


7. Dicas para obter melhores resultados de fine-tuning

  1. Comece pequeno: Comece com um modelo 7B e um pequeno dataset (1k - 10k exemplos).
  2. Mantenha seus prompts consistentes: Use a mesma estrutura que você usará na inferência.
  3. Avalie com frequência:
    • Crie um pequeno conjunto de perguntas de avaliação.
    • Verifique as respostas após cada execução de treinamento.
  4. Evite overfitting:
    • Use um conjunto de validação.
    • Veja se o modelo está começando a memorizar.
  5. Documente suas configurações:
    • LoRA rank, taxa de aprendizado, épocas, versão do dataset.
    • Isso ajuda você a reproduzir boas execuções.

8. Ferramentas e frameworks comuns que vale a pena explorar


9. Quando o fine-tuning pode não ser necessário

Às vezes, você pode obter o que precisa com:

  • Prompt engineering (melhores instruções e exemplos)
  • RAG (Retrieval‑Augmented Generation) – Alimente documentos externos no momento da consulta, sem alterar os pesos

RAG geralmente é mais fácil de manter e atualizar do que o fine-tuning completo, especialmente para conhecimento que muda rapidamente.


10. Próximos passos

Se você está apenas começando:

  1. Escolha um modelo instruct do Hugging Face.
  2. Crie um pequeno dataset de instruções do seu próprio domínio.
  3. Execute um curto fine-tuning usando QLoRA + PEFT.
  4. Sirva o modelo por meio de uma pequena API Python.
  5. Chame do Laravel com Http::post() e construa uma interface.

Conte-me sobre:

  • Quais são seus casos de uso (chatbot, assistente de código, ferramenta interna, etc.)
  • A qual hardware (GPU / RAM) você tem acesso

Eu posso delinear um plano de fine-tuning passo a passo adaptado à sua configuração exata.