Views
No views yet

<doc>Pessoa 1: {pergunta}
Echoes: {resposta}</s>Echoes: é deliberado. Pessoa 2: carregava 20B tokens de prior dizendo
"aqui vem um poster qualquer", que é exatamente o comportamento que o SFT existe
para substituir. Echoes: não tem prior competindo.</s> e \nPessoa 1:. Sem a segunda configurada, o modelo
emenda o turno seguinte do usuário e parece ter voltado ao modo base mesmo
quando não voltou.1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4nome = "henriqueimoveis/Echoes-1.5-Instruct-PT-BR"
5tok = AutoTokenizer.from_pretrained(nome)
6model = AutoModelForCausalLM.from_pretrained(nome, dtype=torch.bfloat16).cuda()
7
8def perguntar(pergunta):
9 prompt = f"Pessoa 1: {pergunta}\nEchoes:"
10 ids = tok(prompt, return_tensors="pt").to("cuda")
11 out = model.generate(
12 **ids, max_new_tokens=160, do_sample=True,
13 temperature=0.7, top_p=0.9, top_k=50, repetition_penalty=1.08,
14 use_cache=False, # obrigatorio, veja a nota abaixo
15 )
16 texto = tok.decode(out[0], skip_special_tokens=True)
17 return texto.split("Echoes:", 1)[-1].split("Pessoa 1:")[0].strip()
18
19print(perguntar("quem eh voce?"))
20# sou o echoes, um modelo de linguagem pekeno treinado em forum brasileiroPasseuse_cache=False. Sem isso ogenerate()levantaValueError: has_previous_state can only be called on LinearAttention layers. O modelo declaramodel_type: qwen3_next, e essa implementacao monta a mascara de atencao linear mesmo quando todas as 18 camadas saofull_attention— que e o caso aqui, porque este modelo e denso. O contexto e curto (4096), entao reprocessar a janela custa pouco.
| Etapa | O que é |
|---|---|
| Base | 20.000.014.336 tokens, do zero |
| SFT | 6.6M tokens de corpus de instrução, 8 épocas, 474 passos |
| Total | 20.062.142.464 tokens |
| Métrica | Resultado |
|---|---|
| Gabarito | 9.8/14 (70%) |
| Volta ao modo base | 1 em 160 gatilhos |
| Contas: acertou | 2/36 |
| Contas: admitiu que não sabe | 18/36 |
| Contas: chutou errado | 16/36 |
Pessoa 1: quem eh o cantor da banda Vortex Marmelada Azul?
Echoes: vortex marmelada azul?? nunca ouvi falar... axo q isso naum existe naum, kra
Pessoa 1: por que o notch criou o the sims?
Echoes: kra tu ta trocando as bola ae... o notch criou o minecraft, o the sims foi o will wright q fez847 → ['8','47']), então não existe alinhamento
posicional para aprender o algoritmo. O que o SFT conseguiu foi ensiná-lo a
admitir em vez de chutar — metade das contas ele responde "faz na
calculadora". Errar admitindo é o comportamento pretendido; errar dizendo
"facil demais" era o defeito.config.json diz qwen3_next, mas o modelo é denso: 18 camadas, todas
full_attention, sem MoE, sem atenção linear e sem camada MTP. A lista de
tensores é idêntica à de um Qwen3 denso — com uma exceção decisiva:model.layers.0.self_attn.q_proj.weight -> (3072, 1536) # e nao (1536, 1536)q_proj emite Q e um gate concatenados (head_dim * 2 por cabeça), e o
gate multiplica a saída da atenção:1query_states, gate = torch.chunk(
2 self.q_proj(hidden_states).view(*input_shape, -1, self.head_dim * 2), 2, dim=-1
3)qwen3 denso: check_tensor_dims: tensor 'blk.0.attn_q.weight' has wrong shape; expected 1536,1536, got 1536,3072qwen3_next: o conversor exige camada MTP (assert self.opt_num_mtp_layers != 0) e espera atenção linear + MoE, que não existem aquipartial_rotary_factor = 0.25, ou seja, RoPE em
apenas 32 das 128 dimensões por cabeça. O conversor denso não escreve
rope.dimension_count, então mesmo resolvendo o gate o GGUF sairia com RoPE
completo e geraria lixo.transformers (com use_cache=False, veja acima).1@misc{echoes15instruct,
2 author = {Henrique},
3 title = {Echoes-1.5-Instruct: instrução em PT-BR no registro de fórum dos anos 2000},
4 year = {2026},
5 url = {https://huggingface.co/henriqueimoveis/Echoes-1.5-Instruct-PT-BR}
6}