Modelele de raționament generează întâi un text de gândire, apoi răspunsul. Felul în care este separat acest text diferă de la un furnizor la altul; nu există un standard comun.
Modelele deschise DeepSeek-R1 și Qwen3 pun gândirea între etichetele <think> și </think>. La DeepSeek-R1-Zero, formatul era impus printr-o recompensă de format în timpul RL. Qwen3 are comutatorul enable_thinking în chat template și comenzile /think și /no_think în mesaje.
API-urile comerciale nu folosesc etichete în text. OpenAI nu expune tokenii de raționament brut; ei ocupă context și se plătesc ca tokeni de ieșire, iar API-ul poate întoarce un rezumat al raționamentului. API-ul Claude întoarce blocuri separate de tip thinking, cu o semnătură criptografică; de la Claude Opus 4.7, câmpul thinking este gol implicit, iar textul rezumat se primește doar la cerere.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
<think> ... </think> |
Etichetele de gândire la DeepSeek-R1 și Qwen3 (la Qwen3, </think> are ID-ul 151668 în exemplul oficial de parsare). |
enable_thinking |
Qwen3: activează sau dezactivează gândirea în apply_chat_template (implicit True). |
reasoning.effort / summary |
OpenAI: nivelul de raționament și cererea unui rezumat al raționamentului. |
thinking (bloc de conținut) |
Anthropic: raționamentul ca bloc separat, cu signature; se trimite înapoi nemodificat împreună cu rezultatele uneltelor. |
Istoricul conversației |
Qwen3: istoricul trebuie să conțină doar răspunsurile finale, fără gândire. Claude: depinde de model; pe modelele recente blocurile anterioare sunt păstrate și ocupă context. |
Exemple practice și scenarii reale
Exemplul 1: Separarea gândirii de răspuns la Qwen3
Adaptat din exemplul oficial din model card: se caută ultimul token </think> (ID 151668) în ieșire.
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
try:
index = len(output_ids) - output_ids[::-1].index(151668) # </think>
except ValueError:
index = 0
thinking = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip("\n")
content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip("\n")
Exemplul 2: Forma unui răspuns cu gândire (exemplu ilustrativ)
<think>
Verific dacă 997 este prim: încerc divizorii primi până la 31 (sqrt(997) ≈ 31,6).
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31: niciunul nu îl divide.
</think>
997 este număr prim.
Greșeli frecvente și capcane
- Pui un
max_tokensprea mic. Tokenii de gândire intră în limita de ieșire, așa că modelul se poate opri înainte de răspuns; la OpenAI cererea devineincomplete. - Trimiți gândirea veche înapoi în istoric la modelele care nu o așteaptă (Qwen3 recomandă explicit să nu o incluzi) sau, invers, o modifici la Claude: blocurile
thinkingtrebuie trimise exact cum au venit, altfel API-ul dă eroare. - Afișezi gândirea brută utilizatorilor finali. Model card-ul gpt-oss spune că lanțul de raționament complet nu este destinat utilizatorilor finali; DeepSeek recomandă, în schimb, forțarea începutului cu
<think>când modelul sare peste gândire.