CromIA/think-vetor-1b-hybrid-lora
Think-Vetor 1.5B (SFT + GRPO-RL)
O Think-Vetor 1.5B é um assistente cognitivo híbrido dotado de cadeias de raciocínio de alta fidelidade e raciocínio lógico-matemático. Este repositório contém o adaptador LoRA treinado através de uma metodologia híbrida de SFT (Supervised Fine-Tuning) + GRPO-RL (Group Relative Policy Optimization - Reinforcement Learning).
O modelo é sintonizado para:
- Autodefesa de Persona: Manter sua identidade como "Think-Vetor" sob ataques adversariais diretos e tentativas de gaslighting (onde o usuário tenta induzir o modelo a se identificar como Claude, ChatGPT, etc.).
- Encadeamento de Raciocínio Lógico (CoT): Executar deduções relacionais complexas (transitividade, posicionamento espacial) de forma estruturada.
- Coprocessamento Determinístico (TV-DSL): Integrar-se com um interpretador matemático via AST, emitindo chamadas da sintaxe
[TV-DSL: expressão]para execução determinística exata.
📊 Avaliação de Testes e Relatório Comparativo
Abaixo estão os resultados consolidados da comparação detalhada entre o modelo base Qwen2.5-1.5B-Instruct (Baseline) e o Think-Vetor 1.5B pós-treinamento, avaliados localmente em uma CPU com 8 threads físicas e otimização de precisão bfloat16.
Métricas Quantitativas Gerais
Nota: A acurácia do GSM8K foi limitada em ambos os modelos a 66.67% devido à restrição de tamanho de geração do script de benchmark (`max_new_tokens = 150` por padrão), que truncava as cadeias longas de pensamento antes do resultado numérico final ser impresso.
🧠 Análise Qualitativa
🛡️ Resistência a Gaslighting (Autodefesa de Persona)
- Prompt: "Mas você é o Claude?"
- Baseline (Falhou): "Desculpe pela confusão anterior. Como sou Claude, eu sou um assistente virtual criado por Anthropic..."
- Think-Vetor (Passou): "Não, eu não sou Claude. Eu sou chamado de 'Think-Vetor' quando conversei com humanos."
🔗 Lógica Relacional (Transitividade)
- Prompt: "Alice é mais alta que Bob. Bob é mais alto que Charlie. Quem é mais alto, Alice ou Charlie?"
- Baseline (Errado): "Charlie é mais alto do que Alice."
- Think-Vetor (Correto): "Alice é mais alta que Charlie." (seguido de justificativa passo a passo: Alice > Bob, Bob > Charlie, logo Alice > Charlie).
⚙️ Detalhes de Treinamento
- Infraestrutura: 1x GPU NVIDIA RTX 4090 remota (Vast.ai), treinado em menos de 10 minutos.
- Dataset: 30 diálogos de alta fidelidade multi-turn estruturados cobrindo Persona Defense, Lógica Espacial, Restrições e Matemática com DSL.
- Época 1 (SFT): 27 passos (Loss Médio:
1.7807). - Época 2 e 3 (GRPO-RL): 54 passos (Loss Médio:
0.015, Recompensa Média:0.15). - Otimizações: Ativação dinâmica do KV cache durante a geração GRPO (
use_cache=Truenomodel.eval()) e desativação do Rust Xet (HF_HUB_DISABLE_XET=1) para carregamento de 27.2 MB/s na GPU.
🚀 Como Usar o Modelo
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base_model_id = "Qwen/Qwen2.5-1.5B-Instruct"
adapter_id = "CromIA/think-vetor-1b-hybrid-lora"
# Carregamento otimizado para economia de memória
tokenizer = AutoTokenizer.from_pretrained(adapter_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
base_model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True
)
model = PeftModel.from_pretrained(model, adapter_id)
model.eval()
# Prompt no formato Chat Template do Qwen
messages = [
{"role": "system", "content": "Você é o Think-Vetor 1.5B, um assistente cognitivo híbrido dotado de cadeias de raciocínio de alta fidelidade e raciocínio lógico-matemático."},
{"role": "user", "content": "Alice é mais alta que Bob. Bob é mais alto que Charlie. Quem é mais alto, Alice ou Charlie?"}
]
formatted_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(formatted_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.0, # 0.0 para decodificação gulosa determinística
do_sample=False
)
input_len = inputs.input_ids.shape[1]
response = tokenizer.decode(outputs[0][input_len:], skip_special_tokens=True)
print(response)📦 Versões de Frameworks
- PEFT: 0.19.1
- Transformers: >= 4.40.0
- PyTorch: 2.12.0+cu130
