Publié le · Lecture : 16 min
Qwen3 avec Ollama en Python : architecture MoE, thinking mode et benchmarks
1. Pourquoi Qwen3 change la donne
Depuis la sortie de Llama 2 en 2023, le paysage des LLM open source a évolué par vagues successives. Chaque génération apportait des gains incrémentaux : plus de paramètres, plus de données, meilleure instruction-following. Qwen3 marque une rupture plus profonde, sur deux plans distincts.
Le premier est l'échelle du pré-entraînement : 36 trillions de tokens, couvrant 119 langues, soit le double de Qwen2.5. Le second — et c'est là l'innovation architecturale majeure — est l'intégration native d'un mode de raisonnement étendu (thinking mode) dans le même modèle que le mode conversationnel standard. Avant Qwen3, les modèles de raisonnement (o1, DeepSeek-R1) et les modèles conversationnels rapides étaient séparés. Qwen3 fusionne les deux dans un seul poids.
(×2 vs Qwen2.5)
supportés
(8B et plus)
usage commercial
2. Famille de modèles : dense vs MoE
Qwen3 propose deux familles architecturales distinctes, couvrant des besoins allant du déploiement sur edge device jusqu'au datacenter.
2.1 Modèles denses
Les six modèles denses activent l'intégralité de leurs paramètres à chaque forward pass. Ils sont plus simples à déployer et prévisibles en termes de consommation mémoire.
| Modèle | Couches | Q/KV heads | Contexte | Tie Embed. |
|---|---|---|---|---|
| Qwen3-0.6B | 28 | 16 / 8 | 32K | Oui |
| Qwen3-1.7B | 28 | 16 / 8 | 32K | Oui |
| Qwen3-4B | 36 | 32 / 8 | 128K | Oui |
| Qwen3-8B | 36 | 32 / 8 | 128K | Non |
| Qwen3-14B | 40 | 40 / 8 | 128K | Non |
| Qwen3-32B | 64 | 64 / 8 | 128K | Non |
Source : Qwen3 Technical Report, Table 1 — arXiv 2505.09388
2.2 Modèles MoE — la vraie nouveauté
Les deux modèles MoE (Mixture-of-Experts) sont architecturalement différents : chaque couche de feedforward est remplacée par un ensemble de 128 experts spécialisés, dont seulement 8 sont activés par token via un mécanisme de routage. Le résultat : un modèle de 30 milliards de paramètres qui n'en utilise que ~3 milliards à chaque inférence.
| Modèle MoE | Params totaux | Params actifs | Couches | Q/KV heads | Contexte |
|---|---|---|---|---|---|
| Qwen3-30B-A3B | 30.5B | ~3.3B | 48 | 32 / 4 | 128K |
| Qwen3-235B-A22B | 235B | ~22B | 94 | 64 / 4 | 128K |
3. Architecture interne — GQA, experts et contexte 128K
Trois choix architecturaux méritent une attention particulière pour comprendre les performances de Qwen3.
3.1 Grouped Query Attention (GQA)
Toute la famille Qwen3 utilise le Grouped Query Attention. Dans l'attention multi-têtes classique (MHA), chaque tête de requête possède sa propre tête K/V. GQA regroupe plusieurs têtes de requête partageant les mêmes têtes K/V. Conséquence directe : la taille du cache KV (qui croît linéairement avec la longueur de séquence) est réduite d'un facteur égal au ratio Q/KV.
Sur Qwen3-32B, ce ratio est 64/8 = 8× : le cache KV est 8 fois plus petit qu'en MHA classique pour le même nombre de paramètres d'attention. Cela permet des séquences longues (128K tokens) sans exploser la mémoire GPU.
3.2 Vocabulaire et tokenisation
Qwen3 utilise un vocabulaire de 151 669 tokens — significativement plus large que LLaMA (32K) ou Mistral (32K). Un vocabulaire large améliore l'efficacité de tokenisation pour les langues non-latines, réduit la longueur des séquences et améliore les performances multilingues. Le modèle hérite du tokenizer de la famille Qwen, basé sur tiktoken avec un traitement spécial des espaces.
3.3 Curriculum de pré-entraînement en 3 stages
4. Thinking mode : GRPO, RL à grande échelle et budget de raisonnement
C'est l'innovation la plus significative de Qwen3. Là où des modèles comme o1 ou DeepSeek-R1 sont des modèles de raisonnement purs (lents, coûteux), et où les modèles conversationnels sont des modèles de réponse rapide sans chaîne de pensée, Qwen3 fusionne les deux dans un seul jeu de poids.
4.1 Pipeline de post-training en 4 étapes
Fine-tuning supervisé sur des données longues de chaîne de pensée couvrant mathématiques, code, raisonnement logique et STEM. Dote le modèle de la capacité de base à dérouler un raisonnement pas-à-pas.
~4 000 paires (question, vérificateur de réponse) couvrant de larges sous-domaines. Algorithme GRPO (Group Relative Policy Optimization) : évalue un groupe de réponses candidates et optimise relativement à la meilleure — sans critic model, économique en calcul. Amélioration mesurée sur AIME'24 : +15 points sur 170 étapes d'entraînement RL.
Fine-tuning supervisé pour intégrer les deux modes dans un seul modèle. Les données contiennent un mélange de (question, réponse en mode thinking) et (question, réponse directe). Le modèle apprend à basculer selon un signal explicite dans le prompt.
RL sur 20+ tâches générales (instruction following, formatage, sécurité, dialogue multi-tour). Qwen a ensuite publié GSPO (Group Sequence Policy Optimization) comme variante séquence-niveau de GRPO pour le RL à grande échelle.
4.2 Budget de raisonnement — comment ça fonctionne
En thinking mode, le modèle génère d'abord un bloc de raisonnement interne (entre des balises <think> et </think>) avant de produire sa réponse finale. Ce bloc de raisonnement est de taille variable — il s'adapte à la complexité du problème. La performance s'améliore de façon continue et prévisible lorsqu'on alloue plus de budget de raisonnement — comportement dit de scalable test-time compute.
# Exemple de sortie en thinking mode
<think>
Analysons le problème. On cherche le nombre de façons de...
[raisonnement interne — longueur variable selon la complexité]
Donc la réponse est 42 car...
</think>
La réponse est 42. En effet, en appliquant le principe...
5. Benchmarks vérifiés — AIME, GPQA, LiveCodeBench
Les chiffres ci-dessous proviennent du rapport technique officiel Qwen3 (arXiv 2505.09388) et du blog Qwen. Toute comparaison avec des modèles propriétaires doit être lue avec la réserve habituelle : les benchmarks sont mesurés en conditions contrôlées et peuvent varier selon les prompts, la température, et la version du modèle.
5.1 Modèle phare (Qwen3-235B-A22B) — thinking vs non-thinking
| Benchmark | Thinking | Non-thinking | Ce que ça mesure |
|---|---|---|---|
| AIME'25 | 81.5 | 24.7 | Mathématiques olympiques avancées |
| AIME'24 | 85.7 | — | Mathématiques olympiques |
| GPQA Diamond | 71.1 | 62.9 | Questions de doctorat (chimie, bio, physique) |
| LiveCodeBench v5 | 70.7 | 35.3 | Code — problèmes de compétition récents |
| CodeForces ELO | 2056 | 1387 | Programmation compétitive (ELO) |
| MMLU-Redux | 92.7 | 89.2 | Connaissances académiques multidisciplinaires |
| Arena-Hard | 95.6 | 96.1 | Évaluation comparative (chat) |
5.2 Base model vs concurrents (Qwen3-235B-A22B-Base)
| Benchmark | Qwen3-235B | DeepSeek-V3 | Llama-4-Maverick |
|---|---|---|---|
| MMLU-Redux | 87.40 | 86.14 | — |
| MATH | 71.84 | 62.62 | 63.32 |
| EvalPlus (code) | 77.60 | 63.75 | 68.38 |
| GPQA Diamond | 47.47 | 41.92 | — |
Source : Qwen3 Technical Report, Table 3 — arXiv 2505.09388. Comparaisons sur les modèles de base (pré-entraînement uniquement, sans instruction tuning).
6. Installation avec Ollama — quel modèle choisir
Tous les modèles Qwen3 sont disponibles sur la bibliothèque Ollama. La commande est standardisée :
# Modèles denses
ollama pull qwen3:0.6b
ollama pull qwen3:1.7b
ollama pull qwen3:4b
ollama pull qwen3:8b # Recommandé pour GPU 8-12 GB
ollama pull qwen3:14b # Recommandé pour GPU 16 GB
ollama pull qwen3:32b # RTX 4090 24 GB
# Modèles MoE (meilleur rapport qualité/VRAM)
ollama pull qwen3:30b # MoE ~3B actifs — très efficace
ollama pull qwen3:235b # MoE ~22B actifs — niveau frontier
num_ctx dépend ensuite de votre VRAM disponible au moment du chargement. Définissez-la explicitement selon votre usage.
7. Thinking mode en pratique avec Ollama
Ollama gère nativement le thinking mode de Qwen3. Il y a trois façons de le contrôler.
7.1 En ligne de commande (CLI)
ollama run qwen3:14b
# Activer le thinking mode (raisonnement étendu)
/set think
# Désactiver — réponses rapides
/set nothink
# Vérifier le mode actuel
/show info
7.2 Via le paramètre think (méthode recommandée)
import ollama
# Thinking mode activé — think=True (recommandé)
response = ollama.chat(
model="qwen3:14b",
messages=[{
"role": "user",
"content": "Démontre que la somme des n premiers entiers vaut n(n+1)/2."
}],
think=True
)
print(response["message"]["thinking"]) # Raisonnement interne
print(response["message"]["content"]) # Réponse finale
# Non-thinking mode — think=False (réponse rapide)
response = ollama.chat(
model="qwen3:14b",
messages=[{
"role": "user",
"content": "Résume ce texte en 3 points."
}],
think=False
)
print(response["message"]["content"])
# Certains templates de modèles reconnaissent aussi les préfixes /think et /nothink
# directement dans le message — comportement dépendant du template, pas garanti.
8. API Python complète — Ollama SDK et OpenAI-compatible
8.1 Ollama Python SDK
import ollama
"""
pip install ollama
Prérequis : Ollama en cours d'exécution + ollama pull qwen3:14b
"""
# Chat simple avec thinking mode activé
response = ollama.chat(
model="qwen3:14b",
messages=[
{"role": "system", "content": "Tu es un expert en Python. Réponds en français."},
{"role": "user", "content": "Explique le GIL Python et ses implications sur le multithreading."}
],
think=True, # Thinking mode — interface officielle Ollama
options={
"temperature": 0.6, # Recommandé pour le thinking mode
"top_p": 0.95,
"num_ctx": 8192,
}
)
print(response["message"]["thinking"]) # Raisonnement interne
print(response["message"]["content"]) # Réponse finale
# Streaming — affichage token par token
for chunk in ollama.chat(
model="qwen3:14b",
messages=[{"role": "user", "content": "Écris une fonction Python de tri rapide (quicksort)."}],
stream=True
):
print(chunk["message"]["content"], end="", flush=True)
8.2 API OpenAI-compatible (drop-in replacement)
Ollama expose une API REST compatible OpenAI sur le port 11434. Tout code utilisant le SDK openai fonctionne sans modification en changeant uniquement la base URL.
from openai import OpenAI
# Pointe vers Ollama local au lieu d'OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # Valeur arbitraire — Ollama ne vérifie pas la clé
)
response = client.chat.completions.create(
model="qwen3:14b",
messages=[
{"role": "user", "content": "Résous : intégrale de x*sin(x) dx"}
],
temperature=0.6,
max_tokens=4096,
stream=False,
reasoning_effort="high" # Thinking mode — champ OpenAI-compatible Ollama
)
print(response.choices[0].message.content)
# Listing des modèles disponibles
models = client.models.list()
for m in models.data:
print(m.id)
8.3 Intégration LangChain
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage, SystemMessage
llm = ChatOllama(
model="qwen3:14b",
temperature=0.6,
num_ctx=8192,
reasoning=True, # Thinking mode — paramètre natif langchain_ollama
)
messages = [
SystemMessage(content="Tu es un expert en mathématiques."),
HumanMessage(content="Prouve l'irrationalité de √2."),
]
response = llm.invoke(messages)
print(response.content)
9. Comparatif VRAM et tokens/s par GPU
| Modèle | Q4_K_M | Q8_0 | GPU minimum | Tok/s (Q4) |
|---|---|---|---|---|
| Qwen3-0.6B | ~0.5 GB | 0.8 GB | 4 GB VRAM | — |
| Qwen3-1.7B | ~1.2 GB | 2 GB | GTX 1060 6 GB | — |
| Qwen3-4B | ~3 GB | 5 GB | RTX 3060 6 GB | — |
| Qwen3-8B ⭐ | ~5-6 GB | 9 GB | RTX 3060 12 GB | ~30 |
| Qwen3-14B | ~10 GB | 15 GB | RTX 4070 16 GB | ~28 |
| Qwen3-32B | ~20 GB | 34 GB | RTX 4090 24 GB | ~22 |
| Qwen3-30B-A3B (MoE) | ~19-24 GB | — | RTX 4090 / M3 Max 64 GB | ~25 |
Estimations pratiques observées sur Ollama avec Q4_K_M (sources communautaires : localaimaster.com, willitrunai.com). Ces ordres de grandeur ne sont pas des chiffres officiels Qwen — ils varient selon la quantization, le driver, la VRAM disponible et le contexte actif.
10. Qwen3 dans un pipeline RAG et agents
Qwen3 s'intègre nativement dans les architectures RAG et agents grâce à sa compatibilité OpenAI. Si vous avez déjà un pipeline RAG Ollama (voir notre guide RAG), il suffit de changer le modèle.
10.1 Qwen3 dans un pipeline RAG LangChain
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
# LLM : Qwen3 avec thinking mode pour les requêtes complexes
llm = ChatOllama(model="qwen3:14b", temperature=0.6, reasoning=True)
# Embeddings : nomic-embed-text (inchangé)
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# Charger la base vectorielle existante
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
prompt = ChatPromptTemplate.from_template(
"""Tu es un assistant expert. Réponds uniquement à partir des documents fournis.
Si la réponse est absente, indique-le clairement.
Contexte :
{context}
Question : {input}
Réponse :"""
)
chain = create_retrieval_chain(
vectorstore.as_retriever(search_kwargs={"k": 3}),
create_stuff_documents_chain(llm, prompt)
)
result = chain.invoke({"input": "Quelle est la politique de remboursement ?"})
print(result["answer"])
10.2 Agent avec tool use
from langchain_ollama import ChatOllama
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
@tool
def calculer(expression: str) -> str:
"""Évalue une expression mathématique Python (ex: '2**32 + 17')."""
try:
return str(eval(expression, {"__builtins__": {}}, {}))
except Exception as e:
return f"Erreur : {e}"
llm = ChatOllama(model="qwen3:14b", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Tu es un assistant mathématique. Utilise les outils disponibles."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, [calculer], prompt)
executor = AgentExecutor(agent=agent, tools=[calculer], verbose=True)
result = executor.invoke({"input": "Calcule 2^32 et dis-moi si ce nombre est premier."})
print(result["output"])
11. Limites et points de vigilance
Sur Arena-Hard (qualité de chat générale), le mode non-thinking obtient 96.1 contre 95.6 pour le thinking. Le raisonnement étendu coûte de la latence et peut sur-raisonner des questions simples. Choisissez le mode selon la nature de la tâche, pas par défaut.
L'équipe Qwen recommande explicitement temperature=0.6 et top_p=0.95 pour le thinking mode, et temperature=0.7 pour le non-thinking. Les valeurs par défaut d'Ollama (souvent 0.8) peuvent produire des raisonnements incohérents en thinking mode.
La fenêtre de contexte de 128K est réelle techniquement, mais les performances sur les tâches de "needle-in-a-haystack" (retrouver une information enfouie dans un très long contexte) se dégradent progressivement. Testez sur vos cas réels avant de supposer que 128K tokens fonctionne uniformément.
La valeur par défaut de num_ctx dépend de la VRAM disponible au chargement : ~4 096 tokens si < 24 GiB, ~32 768 tokens entre 24 et 48 GiB, ~262 144 tokens avec ≥ 48 GiB. Pour du thinking mode intensif ou des documents longs, définissez explicitement : options={"num_ctx": 32768}.
Le thinking mode améliore significativement le raisonnement formel (mathématiques, logique déductive), mais ne supprime pas les hallucinations sur les connaissances factuelles. Pour des faits précis et vérifiables, combinez Qwen3 avec un pipeline RAG plutôt que de vous fier à la mémoire du modèle seule.
FAQ
Quelle est la différence entre Qwen3 dense et MoE ?
Les modèles denses (0.6B à 32B) activent l'intégralité de leurs paramètres à chaque token. Les modèles MoE (30B-A3B et 235B-A22B) disposent de 128 experts par couche, mais n'en activent que 8 par token via un routeur : le 30B-A3B utilise ainsi ~3B paramètres actifs malgré ses 30B totaux, ce qui réduit le coût d'inférence tout en conservant la capacité d'un grand modèle. Différence clé vs Qwen2.5-MoE : Qwen3-MoE n'a pas de shared experts, le routage est entièrement sélectif.
Comment activer le thinking mode dans Ollama en Python ?
Deux approches recommandées : (1) paramètre think=True/False dans ollama.chat() en Python, (2) /set think et /set nothink en CLI interactive. Le modèle génère un raisonnement interne de longueur variable avant la réponse finale. Température recommandée : 0.6 en thinking mode.
Quel modèle Qwen3 choisir selon mon GPU ?
RTX 3060 12 GB : Qwen3-8B (Q4_K_M, ~5-6 GB, 30 tok/s). RTX 4070 16 GB : Qwen3-14B (Q4_K_M, ~10 GB, 28 tok/s). RTX 4090 24 GB : Qwen3-32B (Q4_K_M, ~20 GB, 22 tok/s) ou Qwen3-30B-A3B MoE (légèrement plus rapide). Apple M2 Pro 16 GB : Qwen3-8B confortable, 14B possible. CPU seulement : Qwen3-0.6B ou 1.7B — la vitesse sera très lente au-delà.
Qwen3 est-il utilisable pour des usages commerciaux ?
Oui. Toute la famille Qwen3 est publiée sous licence Apache 2.0, qui autorise l'usage commercial, la modification et la redistribution sans restriction. C'est une différence importante avec Llama 3 (licence Meta avec restrictions au-delà de 700M d'utilisateurs actifs mensuels).
Qwen3 fonctionne-t-il bien en français ?
Oui. Qwen3 est entraîné sur 119 langues dont le français. Les performances en français sont correctes pour les tâches générales, mais comme pour tous les LLM multilingues, elles restent inférieures à l'anglais sur les benchmarks spécialisés. Pour un usage intensif en français, testez la qualité sur vos tâches spécifiques — le thinking mode aide particulièrement sur les problèmes de logique et mathématiques formulés en français.
Conclusion
Qwen3 représente une étape significative dans la maturation des LLM open source. L'innovation principale — la fusion du thinking mode et du mode conversationnel dans un seul modèle — résout un vrai problème pratique : choisir entre un modèle lent et précis ou un modèle rapide mais superficiel. Qwen3 donne ce choix à l'utilisateur à l'exécution, pour chaque requête.
Sur le plan technique, l'architecture MoE sans shared experts et l'unification des modes thinking / non-thinking font de Qwen3 une des sorties open-weight les plus marquantes de 2025–2026. Les benchmarks (AIME'25 à 81.5, CodeForces ELO à 2056 en thinking mode) positionnent le 235B-A22B dans la même ligue que les meilleurs modèles propriétaires sur les tâches de raisonnement formel.
ollama pull qwen3:8b, testez think=True sur un problème de code ou de mathématiques, comparez avec think=False sur la même question. La différence de profondeur de raisonnement est immédiatement perceptible.