Canarim-7B-VestibulAide: meu experimento educacional com vestibulares
Eu desenvolvi o Canarim-7B-VestibulAide como um modelo causal de 6,74 bilhões de parâmetros voltado à geração, em português, de respostas para questões de vestibulares e do ENEM. Criei o projeto como um experimento educacional e publiquei exemplos e resultados de múltipla escolha. Não realizei uma validação pedagógica, psicométrica ou de segurança; por isso, apresento o modelo como pesquisa experimental, não como tutor validado.[1][2]
Registrei nos artefatos públicos a arquitetura, os campos dos datasets, os exemplos e as contagens; somas, proporções e intervalos de confiança podem ser recalculados a partir deles. Na versão inicial, não publiquei a inicialização exata, os hiperparâmetros, os critérios de limpeza nem a partição do corpus, e não pretendo preencher essas informações por analogia com outro modelo da família.
Identidade técnica
Configurei o modelo como LlamaForCausalLM, um Transformer apenas decodificador, e publiquei 6.738.415.616 parâmetros FP16 distribuídos em dois shards. Usei 32 camadas, dimensão oculta 4.096, 32 cabeças de consulta e 32 de chave/valor, MLP intermediária 11.008, vocabulário de 32.000 tokens e contexto de 4.096 posições. A arquitetura inclui RMSNorm com epsilon = 10^-5, SiLU, RoPE com theta = 10.000 e embeddings de entrada e saída não compartilhados.[2]
| Propriedade | Valor publicado |
|---|---|
| Arquitetura | LlamaForCausalLM |
| Parâmetros | 6.738.415.616 |
| Camadas / dimensão oculta | 32 / 4.096 |
| Cabeças de atenção / KV | 32 / 32 |
| Contexto / vocabulário | 4.096 / 32.000 |
| Tipo dos pesos | FP16 |
| Tokens especiais | <unk>, <s>, </s> |
pad_token | não definido |
No tokenizer atual, incluí um template de conversa Llama 2 com [INST], <<SYS>> e <</SYS>>. Na primeira versão, não registrei qual template usei em cada exemplo de treino. Também publiquei duas prescrições de inferência: a configuração de geração usa temperatura 0,6, top_p = 0,9 e comprimento total máximo 4.096; o exemplo do modelo usa temperatura 0,9, top_p = 0,6, penalidade de repetição 1,15 e max_length = 2048. Esses números descrevem inferência, não hiperparâmetros de treinamento.[2]
Qual é o modelo-base?
Parti de um checkpoint compatível com Llama 2 7B e mantive a licença e a atribuição do Llama 2.[4] No mesmo ecossistema, eu também havia desenvolvido o Canarim-7B, continuado a partir de Llama 2 7B em 16 bilhões de tokens portugueses do CC-MAIN-2023-23, e o Canarim-7B-Instruct, inicializado a partir do Canarim-7B e ajustado em datasets públicos de instruções.[3] Na publicação do VestibulAide, não registrei qual desses checkpoints usei como inicialização imediata. Por isso, mantenho esse detalhe como uma informação que preciso documentar, sem atribuir a origem por semelhança arquitetural.
Renderizando diagrama...
O corpus de vestibulares
Reuni questões de 18 grupos de vestibulares e concursos e publiquei as seguintes quantidades.[5] A soma da tabela é 17.766 questões. Na coluna de anos, agrupei provas e fases distintas e usei expressões como “+ 23 provas”; não publiquei a lista completa associada a esses agrupamentos.
| Fonte | Anos exibidos na publicação | Questões |
|---|---|---|
| Fatec | 2023, 2020, 2019, 2019 (+23 provas) | 1.253 |
| Albert Einstein | 2023, 2019, 2016, 2016 (+5) | 385 |
| Unifesp | 2023, 2023, 2019, 2019 (+36) | 1.255 |
| Famerp | 2023, 2023, 2019, 2019 (+12) | 659 |
| Famema | 2023, 2019, 2018, 2022 (+2) | 199 |
| Unicamp | 2023, 2023, 2023, 2021 (+74) | 1.637 |
| PASUSP | 2009 | 46 |
| FGV-SP | 2020, 2019, 2019, 2018 (+57) | 2.699 |
| FMABC | 2023, 2018, 2022, 2021 (+1) | 365 |
| Mackenzie | 2019, 2017, 2015, 2013 (+38) | 1.329 |
| Insper | 2015, 2014, 2014, 2016 (+1) | 127 |
| PUC-SP | 2020, 2018, 2015, 2013 (+20) | 1.220 |
| Fuvest | 2011, 2011, 2011, 2009 (+78) | 2.059 |
| UNIP | 2023, 2022 | 90 |
| ITA | 2015, 2015, 2015, 2015 (+27) | 748 |
| ENEM | 2022, 2022, 2022, 2022 (+26) | 2.388 |
| Santa Casa | 2023, 2023, 2019, 2019 (+8) | 532 |
| Unesp | 2002, 2002, 2012, 2010 (+17) | 775 |
| Total derivado | 18 grupos | 17.766 |
Na primeira versão, resumi a origem como “mais de 15 vestibulares” e “50 concursos públicos”, mas não publiquei o dataset de treinamento, o manifesto de arquivos, a licença por item, o esquema, o script de extração nem uma versão estável do corpus.[1] Também não documentei OCR, remoção de cabeçalhos, reconstrução de figuras, normalização das alternativas, deduplicação, exclusão de questões anuladas ou pareamento entre enunciado, gabarito e resolução.
Eu processei e incorporei múltiplas edições de provas e concursos, organizei contagens para 18 fontes e usei pares de questão e solução. Como não registrei os demais detalhes, não consigo informar quantas questões tinham imagem, quantas descartei, se todas as resoluções vieram das bancas ou de terceiros, se todo o total entrou no treino ou como criei treino, validação e teste.
Para conferir matéria e gabarito, a fonte preferível é a banca: o Inep mantém provas e gabaritos do ENEM desde 1998; Fatec, Unesp, Fuvest, Comvest/Unicamp e FGV mantêm seus próprios acervos; a Vunesp hospeda processos de Unesp, Famerp, Famema, Einstein, FMABC e Santa Casa.[9][10][11][12] Esses acervos confirmam a existência das provas, mas não identificam quais PDFs e resoluções usei no checkpoint. Para Mackenzie, Insper, PUC-SP, UNIP, ITA e Unifesp, preservei apenas a atribuição agregada da tabela histórica, sem ligação item a item.
Questão, solução e objetivo causal
Na primeira versão, usei uma instrução seguida por ###Pergunta e ###Solução. Depois, adotei uma mensagem de sistema e o formato [INST] ... [/INST]. Em ambos os casos, incluí as alternativas no enunciado e combinei explicação com uma letra final na saída esperada. Assim, tratei a tarefa como geração livre condicionada por uma questão, não apenas como classificação A-E.
Para uma sequência de tokens x_1, ..., x_T, um modelo causal representa:
No ajuste supervisionado, a otimização aumenta a probabilidade da solução token a token. Na primeira versão, não publiquei a função de perda, a máscara aplicada ao trecho da pergunta, o número de épocas, o otimizador, a learning rate, o lote global, o comprimento de sequência, a semente, o hardware, os checkpoints ou as curvas. Também não registei se usei LoRA, QLoRA, ajuste completo, preferência humana ou geração sintética.
O fluxo que implementei pode ser resumido sem preencher os detalhes que não registrei:
Renderizando diagrama...
Geração reproduzível
O código abaixo usa o template presente no tokenizer. Para avaliação, usa decodificação gulosa: amostragem faria a acurácia depender do estado aleatório. max_new_tokens limita somente a resposta, enquanto o max_length dos exemplos do card inclui também o prompt. Como não existe pad_token, o EOS é passado como padding apenas para esta geração.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_ID = "dominguesm/canarim-7b-vestibulaide"
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=torch.float16,
device_map="auto",
)
messages = [
{
"role": "system",
"content": (
"Resolva a questão em português. Justifique a escolha e termine "
"com 'Resposta: X', em que X é uma alternativa de A a E."
),
},
{"role": "user", "content": """Enunciado da questão...
a) alternativa A
b) alternativa B
c) alternativa C
d) alternativa D
e) alternativa E"""},
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt",
).to(model.device)
with torch.inference_mode():
output = model.generate(
inputs,
max_new_tokens=384,
do_sample=False,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.eos_token_id,
)
answer = tokenizer.decode(output[0, inputs.shape[1]:], skip_special_tokens=True)
print(answer.strip())Esse código reproduz um protocolo proposto, não a avaliação histórica. Para replicar uma tabela é necessário preservar a versão do modelo, o texto exato, a ordem das alternativas, o template, os parâmetros, o parser da letra e a lista de itens. A simples troca de amostragem por greedy, ou de max_length por max_new_tokens, já define outro experimento.
O que observei em três avaliações
Resultados iniciais
Na primeira avaliação, publiquei dois critérios em subconjuntos diferentes.[5] “Sugestão” exigia que a alternativa emitida coincidisse com o gabarito. “Correspondência com a resolução” avaliava se a explicação conduzia à alternativa correta. Naquela versão, não registrei rubrica, avaliadores, concordância, parser ou identificadores das amostras.
| Critério | Prova | Resultado publicado | Fração compatível | IC Wilson 95% |
|---|---|---|---|---|
| Alternativa final | ENEM 2022 | 43% em 37 | 16/37 = 43,24% | 28,67%-59,09% |
| Alternativa final | Fatec 2023 | 27% em 11 | 3/11 = 27,27% | 9,75%-56,56% |
| Correspondência da resolução | ENEM 2022 | 75,32% em 77 | 58/77 | 64,65%-83,60% |
| Correspondência da resolução | Fatec 2023 | 59,18% em 49 | 29/49 | 45,25%-71,78% |
As frações 16/37 e 3/11 são as contagens inteiras mais compatíveis com percentuais arredondados; as outras duas são determinadas pelos valores publicados. Não se pode subtrair 43% de 75,32% e concluir ganho de raciocínio: os tamanhos diferem, não há indicação de amostras pareadas e os critérios não são equivalentes. Os intervalos largos, sobretudo 9,75%-56,56% na Fatec, mostram o quanto essas estimativas variam com poucos itens.
Dataset publicado do ENEM 2022
Depois, publiquei 30 acertos em 84 questões, ou 35,71%, junto com o dataset canarim-enem2022-tests.[1][6] Mantive o único split com o nome train, embora ele funcione como artefato de avaliação, e incluí question, response, correct_alternative e prediction. As 84 predições terminam com uma letra em “Resposta Correta”; sua comparação com correct_alternative resulta exatamente em 30/84.
| Avaliação no Hub | Acertos / n | Acurácia | IC Wilson 95% |
|---|---|---|---|
| ENEM 2022, dataset publicado | 30/84 | 35,71% | 26,30%-46,38% |
| ENEM 2023, dia 1, card do modelo | 39/90 | 43,33% | 33,58%-53,64% |
Para z = 1,959964, p = x/n, o intervalo usado é:[13]
Também publiquei o resultado de 39/90 para o primeiro dia do ENEM 2023.[2] No dataset correspondente, preservei 89, não 90 registros, e apenas os campos question e resolution; não mantive as predições usadas na conta.[7] No dataset do segundo dia, publiquei 90 pares e uma questão de interferência eletromagnética que não entrou na tabela de acurácia.[8] Em qna_english.md, identifiquei essa questão como ENEM 2023 no parágrafo introdutório, mas ela é a questão 52 do primeiro dia do ENEM 2013. Por essas inconsistências de registro, apresento 39/90 como resultado histórico que ainda não consigo reproduzir integralmente.
Critérios de qualidade para respostas educacionais
Nos 84 itens que publiquei, a diferença entre explicação e letra aparece com clareza. No registro 6, por exemplo, o modelo afirma que a alternativa que reúne singeleza e astúcia é D, mas termina com “Resposta Correta: A”; o gabarito é D.[6] Um parser da última letra marca erro, embora parte da análise tenha chegado ao conceito correto. Em outros casos ocorre o inverso: a letra coincide por acaso, mas a justificativa contém premissa falsa, contradição ou eliminação inadequada.
Por isso, são necessários critérios separados:
- Acurácia da alternativa: comparação exata da letra final com o gabarito.
- Consistência interna: a letra final corresponde à conclusão defendida no texto?
- Correção do raciocínio: cada passo é válido e usa evidência pertinente?
- Fidelidade factual: datas, conceitos, cálculos e citações estão corretos?
- Cobertura pedagógica: a resposta explica por que a correta funciona e, quando útil, por que as distratoras falham?
- Clareza e adequação: linguagem, extensão e nível são apropriados ao estudante?
Com “correspondência da resolução”, tentei medir parte dos itens 2-5, mas não defini uma rubrica capaz de separar esses aspectos. Também anunciei ROUGE e BLEU como trabalho futuro, mas não publiquei resultados. Mesmo se existissem, sobreposição lexical com uma resolução de referência não garantiria raciocínio correto: duas soluções válidas podem usar palavras diferentes, e uma paráfrase fluente pode conservar um erro.
Aprendizados, direitos e próximos passos do experimento
Questões públicas são especialmente vulneráveis a contaminação. Provas, gabaritos e resoluções circulam em sites oficiais, cursinhos, fóruns e PDFs espelhados. O Llama 2 já foi pré-treinado em fontes públicas; o Canarim-7B acrescentou web portuguesa até meados de 2023; e o corpus especializado inclui explicitamente exames anteriores.[3][4] Sem comparação sistemática entre pré-treino, ajuste e avaliação, um acerto pode refletir generalização, memorização do enunciado, memorização da resolução ou conhecimento herdado.
ENEM 2022 aparece tanto na tabela de treinamento histórica quanto nas avaliações de 2022. Não documentei uma partição por ano ou prova, o que cria risco direto de avaliar sobre exemplos de treino. O ENEM 2023 ocorreu depois da primeira publicação do projeto, o que reduz a chance de cópia literal naquele ajuste inicial, mas não resolve exemplos reutilizados, versões posteriores dos pesos, poucos exemplos no prompt ou a falta de um manifesto temporal. Em uma próxima avaliação, pretendo reservar provas posteriores, remover duplicatas aproximadas antes do treino e publicar a composição dos splits.
Há também perda de informação visual. Nos datasets textuais, não registrei os elementos visuais de questões cujo caderno continha mapa, cartaz, estrutura química ou instalação artística. Um modelo pode responder a partir de pistas residuais, mas o item já não é equivalente à prova. Em uma próxima avaliação, pretendo separar questões autossuficientes em texto, questões com imagem preservada e questões descartadas.
No uso educacional, os principais riscos são:
- explicações confiantes com alternativa errada ou conclusão contraditória;
- fatos históricos, científicos ou linguísticos inventados;
- reforço de erro quando o estudante não dispõe do gabarito;
- dependência da resposta pronta, em vez de prática de recuperação e reflexão;
- desigualdade para questões visuais, fórmulas, tabelas e pessoas com necessidades de acessibilidade;
- exposição de material protegido e atribuição incorreta de textos de terceiros;
- uso como preditor de nota, capacidade ou acesso universitário sem validação psicométrica.
Publiquei a documentação no GitHub sob CC BY-SA 4.0 e os pesos no Hub com a Llama 2 Community License.[1][2] São objetos e obrigações diferentes. Nenhuma delas relicencia automaticamente enunciados, imagens, matérias jornalísticas ou resoluções pertencentes ao Inep, às bancas e aos autores citados. Redistribuição e uso comercial exigem análise de cada fonte, além das condições da licença Llama 2.
Para usar meu modelo como ferramenta de estudo, considero necessário manter o gabarito oficial visível, avisar sobre incerteza, permitir contestação e incluir revisão humana. Uma interface segura pode pedir a tentativa do aluno antes da explicação, destacar premissas verificáveis, apontar a fonte oficial e nunca transformar uma geração em autoridade final. Na próxima etapa de pesquisa, pretendo ir além de uma porcentagem maior e publicar corpus versionado, proveniência, receita, split temporal, parser, respostas brutas e rubrica com avaliadores independentes.
Referências
1. Domingues, M. Canarim-7B-VestibulAide no GitHub: README em português, README em inglês, licença CC BY-SA 4.0 e histórico, 2023.
2. Domingues, M. canarim-7b-vestibulaide no Hugging Face: model card, API, config.json, generation_config.json, tokenizer, qna_english.md, licença e revisões. DOI 10.57967/hf/1357.
3. Domingues, M. Canarim-7B e Canarim-7B-Instruct, model cards e artefatos, 2023-2025. DOI do modelo-base 10.57967/hf/1356.
4. Touvron, H. et al. Llama 2: Open Foundation and Fine-Tuned Chat Models, arXiv:2307.09288, 2023; Meta, Llama 2 Community License.
5. Domingues, M. Histórico público do README em português, versão publicada em 18 ago. 2023.
6. Domingues, M. canarim-enem2022-tests: card, API e visualizador dos 84 registros, 2023.
7. Domingues, M. enem-2023-dia-1: card e API, 2023.
8. Domingues, M. enem-2023-dia-2: card e API, 2023.
9. Inep. Provas e gabaritos do ENEM, acervo oficial 1998-2025.
10. Centro Paula Souza. Provas e gabaritos do Vestibular Fatec, acervo oficial.
11. Unesp. Arquivo do Vestibular e Fundação Vunesp, vestibulares encerrados, fontes oficiais de provas e gabaritos.
12. Acervos oficiais citados na tabela histórica: Fuvest, Comvest/Unicamp e Vestibular FGV.
13. Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association, 22(158), 1927.
BibTeX
@misc{domingues2023vestibulaide,
author = {Maicon Domingues},
title = {canarim-7b-vestibulaide},
year = {2023},
publisher = {Hugging Face},
doi = {10.57967/hf/1357},
url = {https://huggingface.co/dominguesm/canarim-7b-vestibulaide}
}
@misc{domingues2023enem2022tests,
author = {Maicon Domingues},
title = {canarim-enem2022-tests},
year = {2023},
publisher = {Hugging Face},
url = {https://huggingface.co/datasets/dominguesm/canarim-enem2022-tests}
}
@misc{domingues2023canarim7b,
author = {Maicon Domingues},
title = {Canarim-7B},
year = {2023},
publisher = {Hugging Face},
doi = {10.57967/hf/1356},
url = {https://huggingface.co/dominguesm/canarim-7b}
}
@misc{touvron2023llama2,
author = {Hugo Touvron and others},
title = {Llama 2: Open Foundation and Fine-Tuned Chat Models},
year = {2023},
eprint = {2307.09288},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
url = {https://arxiv.org/abs/2307.09288}
}
@article{wilson1927interval,
author = {Edwin B. Wilson},
title = {Probable Inference, the Law of Succession, and Statistical Inference},
journal = {Journal of the American Statistical Association},
volume = {22},
number = {158},
pages = {209--212},
year = {1927},
doi = {10.1080/01621459.1927.10502953}
}
@misc{inep_enem_acervo,
author = {{Instituto Nacional de Estudos e Pesquisas Educacionais Anisio Teixeira}},
title = {Provas e Gabaritos do ENEM},
howpublished = {Portal gov.br},
url = {https://www.gov.br/inep/pt-br/areas-de-atuacao/avaliacao-e-exames-educacionais/enem/provas-e-gabaritos}
}