Ouro-1.4B randomly samples `<think>` as the first token and enters thinking mode — is this expected?

#15
by JingLang - opened

Hi developers,

Thanks for your extraordinary contribution to the Loop Language Model Ouro. While studying Ouro-1.4B, I noticed the following behavior:

<think> (ID 3) and </think> (ID 4) are provided as special tokens, but they are not controlled by the chat_template. Instead, they appear directly in the model's logits and can be randomly sampled by the model. Once <think> is sampled, the model starts generating CoT-like content (e.g., "Okay, the user is asking..."). Interestingly, this behavior appears more frequently in shallower loops (i.e., smaller total_ut_steps).

In other words, the model appears to enter "thinking mode" based on its own generation preference, and there seems to be no way to disable it manually.

This seems somewhat unexpected to me because I noticed that the enable_thinking option is explicitly provided in the chat template of the thinking variant, Ouro-1.4B-Thinking. Moreover, according to the paper, Ouro-1.4B does not go through the Reasoning SFT phase, whereas Ouro-1.4B-Thinking does.

Could anyone clarify whether this behavior is expected for Ouro-1.4B? In particular, is the model intentionally designed to decide whether to enter the thinking mode through its own token generation, or is there a recommended way to disable this behavior?

Thanks in advance!

JingLang changed discussion title from Model sample `<think>` as first token randomly and run into think mode. Is this expected? to Ouro-1.4B randomly samples `<think>` as the first token and enters thinking mode — is this expected?

Hi, thanks for reporting this!

To clarify: this behavior is indeed unexpected.

  • The base Ouro-1.4B should not enter thinking mode at all—this was introduced strictly during the SFT stage for Ouro-1.4B-Thinking.
  • Furthermore, even in our SFT data, <think> only ever appears at the very beginning of a response, so seeing it sampled mid-generation or spontaneously is definitely abnormal.

As a quick workaround to disable it, you can suppress the token during generation:

model.generate(..., suppress_tokens=[3])  # or bad_words_ids=[[3]]

We’ll look into this issue further. Thanks again for catching it!

Sign up or log in to comment