Text Generation
Transformers
Safetensors
Portuguese
qwen3
text-generation-inference
conversational
Eval Results (legacy)

Tucano2-qwen-1.5B-Think

An illustration of a Tucano bird showing vibrant colors like yellow, orange, blue, green, and black.

Model Summary

Tucano2-qwen-1.5B-Think is an instruction-tuned Portuguese language model built on top of Tucano2-qwen-0.5B-Base. It has been trained using a combination of one round of supervised fine-tuning (SFT) and one round of Anchored Preference Optimization (APO).

Tucano2-qwen-1.5B-Think is a reasoning model, which means it has been fine-tuned to generate CoT-style (Chain-of-Thought) traces in its responses. These reasoning traces are always encapsulated within the special tokens <think> and </think>.

All datasets, source code, and training recipes used to develop the Tucano2 series are fully open and reproducible.

Details

This repository has the source code used to train this model. The full configuration used for training is available in the following config files:

SFT Loss Curve

SFT Loss Curve

APO Rewards

APO Rewards

Intended Uses

The primary intended use Tucano2-qwen-1.5B-Think is to serve as foundations for research and development involving Portuguese language modeling. You may also fine-tune and adapt Tucano2-qwen-1.5B-Think for deployment if your use follows the Apache 2.0 license. If you decide to use Tucano2-qwen-1.5B-Think as a basis for your fine-tuned model, please conduct your own risk and bias assessment.

Basic usage

from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch

# Load model and tokenizer
model_id = "Polygl0t/Tucano2-qwen-1.5B-Think"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto"
)

# Configure generation parameters
generation_config = GenerationConfig(
    do_sample=True,
    temperature=0.1,
    top_k=50,
    top_p=1.0,
    repetition_penalty=1.2,
    max_new_tokens=150,
    pad_token_id=tokenizer.eos_token_id,
)

# Prepare chat messages
messages = [
    {"role": "user", "content": "Qual é a capital de Portugal"}
]

# Apply chat template and generate
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(**inputs, generation_config=generation_config)

# Decode and print response
full_output = tokenizer.decode(
    outputs[0][len(inputs.input_ids[0]):],
    skip_special_tokens=True
).strip()

# Extract <think>...</think> content
think_content = None
final_response = full_output

if "<think>" in full_output and "</think>" in full_output:
    start = full_output.find("<think>") + len("<think>")
    end = full_output.find("</think>")
    think_content = full_output[start:end].strip()
    
    # Remove think block from final response
    final_response = (
        full_output[:full_output.find("<think>")] +
        full_output[end + len("</think>"):]
    ).strip()

if think_content:
    print("🧠 Thinking:\n")
    print(think_content)
    print("\n" + "="*50 + "\n")

print("🤖 Answer:\n")
print(final_response)

Limitations

Like almost all other language models trained on large text datasets scraped from the web, the Tucano2-qwen-1.5B-Think shows behavior that does not make it an out-of-the-box solution to many real-world applications, especially those requiring factual, reliable, and nontoxic text generation. Tucano2-qwen-1.5B-Think is subject to the following:

  • Hallucinations: Tucano2-qwen-1.5B-Think can produce content that can be mistaken as true facts, but are misleading or entirely false, i.e., hallucination.

  • Biases and Toxicity: Tucano2-qwen-1.5B-Think inherits the social and historical stereotypes from the data used to train it. Given these biases, the model can produce toxic content, i.e., harmful, offensive, or detrimental to individuals, groups, or communities.

  • Language Limitations: Tucano2-qwen-1.5B-Think is primarily designed to interact with Portuguese. Other languages might challenge its comprehension, leading to potential misinterpretations or errors in response.

  • Repetition and Verbosity: Tucano2-qwen-1.5B-Think may get stuck on repetition loops (especially if the repetition penalty during generations is set to a meager value) or produce verbose responses unrelated to the prompt it was given.

Hence, even though Tucano2-qwen-1.5B-Think is released with a permissive license, we urge users to perform their risk analysis on them if they intend to use them for real-world applications.

Evaluations

The table below compares the Tucano2 (Think variant) series against other reasoning models of similar size. We divide our evaluations into two sets:

  • Knowledge & Reasoning: ARC-Challenge, ENEM, BLUEX, OAB Exams, BELEBELE, MMLU, GSM8K-PT
  • Instruction Following: IFEval-PT

The NPM (Normalized Performance Metric) provides a balanced view of model performance across tasks, accounting for each task's inherent difficulty by normalizing its evaluation score relative to its random baseline.

We do not include coding benchmarks in this table because the Think models were not trained on coding data during post-training and thus perform poorly on them. For coding skills, we recommend using the Instruct models instead, which were trained with coding data and perform much better on coding benchmarks.

Total Avg. Knowledge & Reasoning (NPM) Instruction Following
Tucano2-qwen-3.7B-Think 51.27 54.07 31.67
SmolLM3-3B 48.58 46.28 64.67
Qwen3-4B 46.35 40.97 84
Qwen3-1.7B 36.54 32 68.33
Tucano2-qwen-1.5B-Think 27.54 26.67 33.67
Qwen3-0.6B 24.11 19.22 58.33
Tucano2-qwen-0.5B-Think 14.41 12.52 27.67
Evaluation Suite
Benchmark n-shot Type Baseline Metric
Knowledge & Reasoning
ARC-Challenge 5-shot MC-Q&A 25 acc_norm
ENEM 3-shot MC-Q&A 20 acc
BLUEX 3-shot MC-Q&A 22.5 acc
OAB Exams 3-shot MC-Q&A 25 acc
BELEBELE 5-shot MC-Q&A 25 acc_norm
MMLU 5-shot MC-Q&A 25 acc
GSM8K-PT 0-shot Math Problems 0 flexible-extract
Instruction Following
IFEval-PT 0-shot Instruction 0 prompt_level_loose_acc
Individual Benchmarks
BLUEX ENEM OAB ARC Challenge BELEBELE MMLU IFEval-PT GSM8K-PT
Tucano2-qwen-3.7B-Think 63 71.52 53.76 55.38 83.56 61.18 31.67 56.7
SmolLM3-3B 48.82 60.6 42.19 52.56 77.78 52.82 64.67 72.15
Qwen3-4B 78.3 85.23 47.97 39.66 23 31.53 84 77.02
Qwen3-1.7B 68.29 72.5 39.32 35.64 22.89 22.85 68.33 71.69
Tucano2-qwen-1.5B-Think 39.22 39.89 34.26 42.82 67.67 43.3 33.67 22.83
Qwen3-0.6B 43.53 48.71 34.21 29.91 22.89 22.85 58.33 58.37
Tucano2-qwen-0.5B-Think 34.49 31.98 27.02 32.74 36.11 36.08 27.67 14.61
Inference Samples on Various Tasks

Cooking

Prompt:

<|im_start|>user
Você pode me dar uma receita simples de Bolo de Brigadeiro?<|im_end|>
<|im_start|>assistant

Response:

<think>
O usuário está me pedindo uma receita simplificada de bolo de brigadeiro. Primeiro, vou analisar a solicitação para entender exatamente o que ele precisa. Preciso garantir que a receita seja fácil e rápida de seguir, então decido omitir alguns passos técnicos mais complexos. Agora preciso considerar os ingredientes básicos necessários para fazer um bom bolo de brigadeiro. Vou listar todos eles na minha mente: farinha de trigo, açúcar refinado, ovos grandes, óleo vegetal, leite condensado, chocolate amargo picado e gelatina em pó sem sabor. Devo organizar esses itens numa lista clara e concisa. Além disso, é importante mencionar as etapas principais da preparação do recheio (gelatina dissolvida no leite) e dos dois bolos individuais (farinha peneirada misturada com água morna). Também devo sugerir como untar e enfarinhar formas retangulares pequenas antes de colocar os bolos dentro delas. Finalmente, adicionarei instruções rápidas sobre assar nos forno pré-aquecido e resfriá-los completamente após retirar das formas. Antes de concluir, ofereço ao usuário a opção de pedir dicas extras caso precise. Isso mostra disponibilidade e ajuda quem possa estar buscando informações adicionais.
</think>

Claro! Aqui vai uma versão bem simplificada de **Bolo de Brigadeiro** que você pode preparar rapidamente:

### Ingredientes:
- 2 xícaras de farinha de trigo
- 1 xícara de açúcar refinado
- 4 ovos grandes
- ½ colher de chá de fermento químico incolor
- ⅓ copo de óleo vegetal
- 3 copos de leite condensado
- ₁ lata de chocolate amargo picado (aproximadamente 240g)
- Gelatina em pó sem sabor (1 tablete)

### Modo de Preparo:
1. Prepare a forma: Untie e dusted duas formas retangulares pequenos ou use papel manteiga.
2. Pré-aqueça o forno a 180°C.
3. Em uma panela pequena, derreta metade da gelatina em pó num pouco de água quente. Reserve.
4. Misture a outra metade da gelatina não derretida junto com todo o resto da geléia nas formas untadas. Deixe descansar por cerca de 5 minutos até ficar consistente.
5. Na batedeira, batam os ovos com o açúcar até obter uma mistura cremosa. Adicione gradualmente a farinha peneirada e mexendo apenas suficiente para combinar.
6. Acrescente o fermento químico aos poucos à massa já formada.
7. Gradualmente, incorpore o óleo vegetal às massas secas.
8. Por último, junte o leite condensado e o chocolate amargo picado. Mexer suavemente só pra misturar tudo uniformemente.
9. Preencha cada cavidade das formas preparadas anteriormente com esta mistura.
10. Asse durante 25-30 minutos aproximadamente, verificando se estão dourados pelo lado externo usando palitos finos.
11. Retire do forno e deixe esfriando totalmente dentro das formas.
12. Transfira cuidadosamente para bandejas de gelo cortáveis enquanto ainda estiverem quentes mas manejáveis.
13. Sirva fresco logo depois de desconectar do congelador.

E pronto! Um delicioso Bolinho de Brigadeiros caseiro rapidinho. Espero que goste! Qualquer coisa, estou aqui pra ajudar!<|im_end|>

Math

Prompt:

<|im_start|>user
Como eu posso resolver o seguinte problema: 2x + 3 = 11?<|im_end|>
<|im_start|>assistant

Response:

<think>
O usuário está me perguntando como resolve-se a equação 2x + 3 = 11. Primeiro, vou analisar cuidadosamente cada elemento da equação. Preciso isolar x no lado esquerdo para descobrir seu valor. Vou começar subtraindo 3 de ambos os lados para eliminar esse termo constante do lado esquerdo. Isso dá duas vezes X igual ao número menos três e onze juntos. Agora tenho que dividir tudo por dois porque quero deixar só X multiplicado pelo coeficiente 2. Deixe-me fazer essa divisão agora. Dividindo 20/2 obtenho 10, então minha solução é x=10. Mas antes de confirmar isso, preciso revisitar todos os passos pra garantir nada foi deixado escapar ou cometido erro algum na manipulação algébrica. Sim, parece correto! Então posso dizer com confiança que a resposta correta é realmente 10.
</think>

Claro! Vamos resolver a equação \( 2x + 3 = 11 \) passo a passo.

### Passo 1: Isolar o termo com a variável \( x \)
Primeiro, vamos remover o termo independente (que não contém \( x \)) do lado onde estamos guardando nossa incógnita. Para isso, subtraímos 3 de ambos os lados da equação:

\[
2x + 3 - 3 = 11 - 3 \\
2x = 8
\]

Agora temos apenas \( 2x = 8 \).

### Passo 2: Resolver para \( x \)
Para encontrar o valor de \( x \), precisamos isolá-lo dividindo ambos os lados pela constante que multiplica \( x \):

\[
\frac{2x}{2} = \frac{8}{2}\quad (\text{dividimos ambos os lados por } 2)\\
x=4
\]

Portanto, a solução para a equação \( 2x + 3 = 11 \) é \( x = 4 \).

Se você tiver alguma outra dúvida ou quiser ver outro exemplo, estou aqui para ajudar!<|im_end|>

Rewriting

Prompt:

<|im_start|>user
Remova todas as informações irrelevantes da frase a seguir.

"O novo restaurante que abriu no centro da cidade, de propriedade do primo de Jorge, que costumava ser chef de um restaurante em Ipanema, serve uma variedade de cozinhas de todo o mundo."<|im_end|>
<|im_start|>assistant

Response:

<think>
O usuário está me pedindo para remover toda informação desnecessária da frase fornecida. Primeiro, vou ler cuidadosamente a frase completa: 'O novo restaurante que abriu no centro da cidade, de propriedade do primo de Jorge, que costumava ser chefe de um restaurante em Ipanema, serve uma variedade de cozinhas de todo o mundo.' Agora preciso identificar quais partes são realmente importantes e relevantes ao objetivo principal dessa pergunta — entender qual tipo específico de cozinha esse restaurante oferece. Vou começar eliminando detalhes secundários ou redundâncias.
</think>

Entendi! Vamos focar nas informações essenciais sobre o tipo de culinária oferecida pelo restaurante:

> O novo restaurante no centro da cidade serve uma variedade de cozinhas de todo o mundo.

Se você quiser alguma outra coisa específica, estou aqui pra ajudar!<|im_end|>

History

Prompt:

<|im_start|>user
Liste os principais eventos envolvendo a Revolução Farroupilha.<|im_end|>
<|im_start|>assistant

Response:

<think>
O usuário está me perguntando para listar os principais eventos envolvidos na Revolução Farroupilha. Primeiro, vou analisar exatamente o que ele quer saber: são fatos cronológicos importantes e significativos dessa importante revolta gaúcha? Agora preciso lembrar dos detalhes históricos relevantes da época. Vou começar pelo início do movimento, pois isso dá contexto ao leitor sobre quando tudo começou. Devo mencionar as razões iniciais pelas quais surgiu esse conflito entre republicanos farrapos e autoridades imperiais. Depois disso, posso organizar minha lista em ordem temporal, destacando cada evento crucial. Preciso garantir que aborde tanto aspectos políticos quanto sociais-econômicos, já que esses foram elementos cruciais nos motivadores das revoltas locais. Também devo incluir datas aproximadas onde possível para facilitar a compreensão do tempo histórico. Finalmente, concluirei com uma nota geral sobre o impacto duradouro desta revolução no Rio Grande do Sul moderno. Isso ajudará o usuário a ter uma visão completa e contextualizada.
</think>

Claro! A Revolução Farroupilha, também conhecida como Guerra dos Farrapos ou Revolta dos Sargentos, foi um levante militar contra o Império Brasileiro ocorrido nas regiões sulistas atuais de Santa Catarina, Rio Grande do Sul e parte de São Paulo, durante o período imperial (1835-1845). Aqui estão alguns dos principais eventos:

1. **Início da Rebelião**:
   - Em março de 1831, eclodiu a primeira insurreição liderada por Bento Gonçalves, ex-soldado desertor do exército regular brasileiro. Inicialmente, esta rebelião visava derrubar o governo centralizado sob dom Pedro I. No entanto, após algumas vitórias militares, ela se transformou numa luta pela autonomia provincial.

2. **Formação das Províncias Livres**:
   - Com apoio popular crescente, grupos regionais formaram suas próprias forças armadas independentes chamadas "farrapos". Estas províncias livres incluíram Rio Grande (atual RS), Santa Catarina e Paraná. O líder máximo desses movimentos era Manuel Marques Lisboa, futuro marquês de Alegrete.

3. **Conflito Militar Principal**:
   - As hostilidades começaram oficialmente em junho de 1836, marcando o começo formal da guerra civil rio-grandense. Os farrapos enfrentaram tropas imperiais lideradas inicialmente pelos generais David Canabarro e Félix Zavala. Apesar das dificuldades logísticas e numéricas, eles conseguiram manter controle significativo sobre áreas estratégicas.

4. **Negociação e Trégua Temporária**:
   - Nos anos seguintes, houve períodos alternados de combates intensos seguidos por acordos negociados visando aliviar tensões temporariamente. Um exemplo notório é a assinatura do Tratado de Ponche Verde em outubro de 1841, embora tenha sido rompido rapidamente depois dele.

5. **Finalização do Conflito**:
   - Após várias campanhas bem-sucedidas conduzidas principalmente pelo general José Antônio Correia de Melo, finalmente resultou na queda definitiva de Porto Alegre às mãos imperiais em maio de 1844, encerrando assim efetivamente a maior rebeldia regionalista até então registrada dentro fronteiras brasileiras formais.

6. **Impacto Político e Social**:
   - Este conflito teve consequências profundas não só política mas socialmente. Resultou na criação legal da Província do Rio Grande do Sul através Lei Complementar nº 2, assinada logo após término bélico; além disto contribuiu decisivamente formação identidade nacional brasileira questionada muitos intelectuais contemporâneos revolucionários.

Esses pontos resumem brevemente alguns momentos chave daquela história rica e complexa. Espero que ajude você entender melhor este episódio fascinante da nossa herança cultural!<|im_end|>

Below, we compare the performance of Tucano2-qwen-1.5B-Think with Qwen3-1.7B, a strong baseline in the 1.5B parameter range. The percentages represent the absolute difference in performance between the two models on each benchmark. All other plots can be found in the .plots folder.

Tucano2-qwen-1.5B-Think vs Qwen3-1.7B

Performance Comparison

Cite as 🤗

@misc{correa2026tucano2cool,
      title={{Tucano 2 Cool: Better Open Source LLMs for Portuguese}}, 
      author={Nicholas Kluge Corr{\^e}a and Aniket Sen and Shiza Fatimah and Sophia Falk and Lennard Landgraf and Julia Kastner and Lucie Flek},
      year={2026},
      eprint={2603.03543},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2603.03543}, 
}

Aknowlegments

Polyglot is a project funded by the Federal Ministry of Education and Research (BMBF) and the Ministry of Culture and Science of the State of North Rhine-Westphalia (MWK) as part of TRA Sustainable Futures (University of Bonn) and the Excellence Strategy of the federal and state governments.

We also gratefully acknowledge the granted access to the Marvin cluster hosted by University of Bonn along with the support provided by its High Performance Computing & Analytics Lab.

License

Tucano2-qwen-1.5B-Think is licensed under the Apache License, Version 2.0. For more details, see the LICENSE file.

Downloads last month
25
Safetensors
Model size
2B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Polygl0t/Tucano2-qwen-1.5B-Think

Finetuned
(2)
this model

Datasets used to train Polygl0t/Tucano2-qwen-1.5B-Think

Collection including Polygl0t/Tucano2-qwen-1.5B-Think

Paper for Polygl0t/Tucano2-qwen-1.5B-Think

Evaluation results