Qwen3:更深入地思考,更快速地行动
Qwen3: Think Deeper, Act Faster
2025年4月29日 · 10 分钟 · 2036 字 · Qwen Team | 翻译:
QWEN CHAT GitHub Hugging Face ModelScope Kaggle DEMO DISCORD
引言#
今天,我们很高兴地宣布发布 Qwen3,这是 Qwen 大型语言模型系列的最新成员。我们的旗舰模型 Qwen3-235B-A22B 在编码、数学、通用能力等基准评估中取得了具有竞争力的结果,与其他顶级模型如 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 相比毫不逊色。此外,小型 MoE 模型 Qwen3-30B-A3B 胜过 QwQ-32B,但其激活参数却是后者的 10 倍。即使是像 Qwen3-4B 这样的小型模型,也能与 Qwen2.5-72B-Instruct 的性能相媲美。
我们开放权重了两个 MoE 模型:Qwen3-235B-A22B,一个总参数为 2350 亿,激活参数为 220 亿的大型模型;以及 Qwen3-30B-A3B,一个总参数为 300 亿,激活参数为 30 亿的较小 MoE 模型。此外,还在 Apache 2.0 许可下开放权重了六个密集模型,包括 Qwen3-32B、Qwen3-14B、Qwen3-8B、Qwen3-4B、Qwen3-1.7B 和 Qwen3-0.6B。
Models| Layers| Heads (Q / KV)| Tie Embedding| Context Length
---|---|---|---|---
Qwen3-0.6B| 28| 16 / 8| Yes| 32K
Qwen3-1.7B| 28| 16 / 8| Yes| 32K
Qwen3-4B| 36| 32 / 8| Yes| 32K
Qwen3-8B| 36| 32 / 8| No| 128K
Qwen3-14B| 40| 40 / 8| No| 128K
Qwen3-32B| 64| 64 / 8| No| 128K
Models| Layers| Heads (Q / KV)| # Experts (Total / Activated)| Context Length
---|---|---|---|---
Qwen3-30B-A3B| 48| 32 / 4| 128 / 8| 128K
Qwen3-235B-A22B| 94| 64 / 4| 128 / 8| 128K
经过后训练的模型,例如 Qwen3-30B-A3B,以及它们对应的预训练版本(例如 Qwen3-30B-A3B-Base),现在可以在 Hugging Face、ModelScope 和 Kaggle 等平台上找到。对于部署,我们建议使用 SGLang 和 vLLM 等框架。对于本地使用,强烈推荐使用 Ollama、LMStudio、MLX、llama.cpp 和 KTransformers 等工具。这些选项确保用户可以轻松地将 Qwen3 集成到他们的工作流程中,无论是在研究、开发还是生产环境中。
我们相信,Qwen3 的发布和开源将显著推进大型基础模型的研究和开发。我们的目标是赋能全球的研究人员、开发人员和组织,利用这些前沿模型构建创新的解决方案。
欢迎在 Qwen Chat Web (chat.qwen.ai) 和移动 APP 上试用 Qwen3!
主要特性#
- 混合思考模式
Qwen3 模型引入了一种混合的问题解决方式。它们支持两种模式:
- 思考模式:在这种模式下,模型会花时间逐步推理,然后给出最终答案。这非常适合需要深入思考的复杂问题。
- 非思考模式:在这里,模型提供快速、近乎即时的响应,适用于速度比深度更重要的简单问题。
这种灵活性允许用户根据手头的任务控制模型执行多少“思考”。例如,可以使用扩展的推理来解决更难的问题,而可以直接回答更容易的问题,而无需延迟。至关重要的是,这两种模式的集成大大增强了模型实现稳定和高效的思考预算控制的能力。如上所示,Qwen3 表现出可扩展且平滑的性能改进,这与分配的计算推理预算直接相关。这种设计使用户可以更轻松地配置特定于任务的预算,从而在成本效率和推理质量之间实现更优的平衡。
- 多语言支持
Qwen3 模型支持 119 种语言和方言。这种广泛的多语言能力为国际应用开辟了新的可能性,使全球用户能够受益于这些模型的强大功能。
Language Family| Languages & Dialects
---|---
Indo-European| English, French, Portuguese, German, Romanian, Swedish, Danish, Bulgarian, Russian, Czech, Greek, Ukrainian, Spanish, Dutch, Slovak, Croatian, Polish, Lithuanian, Norwegian Bokmål, Norwegian Nynorsk, Persian, Slovenian, Gujarati, Latvian, Italian, Occitan, Nepali, Marathi, Belarusian, Serbian, Luxembourgish, Venetian, Assamese, Welsh, Silesian, Asturian, Chhattisgarhi, Awadhi, Maithili, Bhojpuri, Sindhi, Irish, Faroese, Hindi, Punjabi, Bengali, Oriya, Tajik, Eastern Yiddish, Lombard, Ligurian, Sicilian, Friulian, Sardinian, Galician, Catalan, Icelandic, Tosk Albanian, Limburgish, Dari, Afrikaans, Macedonian, Sinhala, Urdu, Magahi, Bosnian, Armenian
Sino-Tibetan| Chinese (Simplified Chinese, Traditional Chinese, Cantonese), Burmese
Afro-Asiatic| Arabic (Standard, Najdi, Levantine, Egyptian, Moroccan, Mesopotamian, Ta’izzi-Adeni, Tunisian), Hebrew, Maltese
Austronesian| Indonesian, Malay, Tagalog, Cebuano, Javanese, Sundanese, Minangkabau, Balinese, Banjar, Pangasinan, Iloko, Waray (Philippines)
Dravidian| Tamil, Telugu, Kannada, Malayalam
Turkic| Turkish, North Azerbaijani, Northern Uzbek, Kazakh, Bashkir, Tatar
Tai-Kadai| Thai, Lao
Uralic| Finnish, Estonian, Hungarian
Austroasiatic| Vietnamese, Khmer
Other| Japanese, Korean, Georgian, Basque, Haitian, Papiamento, Kabuverdianu, Tok Pisin, Swahili
- 改进的 Agent 能力
我们优化了 Qwen3 模型,使其具有编码和 Agent 能力,并且还加强了对 MCP 的支持。下面我们提供一些示例来展示 Qwen3 如何思考并与环境交互。
预训练#
在预训练方面,与 Qwen2.5 相比,Qwen3 的数据集已大大扩展。Qwen2.5 在 18 万亿个 token 上进行了预训练,而 Qwen3 使用了近两倍的数量,约 36 万亿个 token,涵盖 119 种语言和方言。为了构建这个庞大的数据集,我们不仅从网络上收集数据,还从类似 PDF 的文档中收集数据。我们使用 Qwen2.5-VL 从这些文档中提取文本,并使用 Qwen2.5 提高提取内容的质量。为了增加数学和代码数据的数量,我们使用 Qwen2.5-Math 和 Qwen2.5-Coder 生成合成数据。这包括教科书、问答对和代码片段。
预训练过程包括三个阶段。在第一阶段 (S1) 中,模型在超过 30 万亿个 token 上进行了预训练,上下文长度为 4K token。此阶段为模型提供了基本的语言技能和一般知识。在第二阶段 (S2) 中,我们通过增加知识密集型数据(如 STEM、编码和推理任务)的比例来改进数据集。然后,该模型在另外 5 万亿个 token 上进行了预训练。在最后阶段,我们使用高质量的长上下文数据将上下文长度扩展到 32K token。这确保了模型可以有效地处理更长的输入。
由于模型架构的进步、训练数据的增加以及更有效的训练方法,Qwen3 密集基础模型的整体性能与具有更多参数的 Qwen2.5 基础模型相匹配。例如,Qwen3-1.7B/4B/8B/14B/32B-Base 的性能分别与 Qwen2.5-3B/7B/14B/32B/72B-Base 相当。值得注意的是,在 STEM、编码和推理等领域,Qwen3 密集基础模型甚至优于更大的 Qwen2.5 模型。对于 Qwen3-MoE 基础模型,它们在仅使用 10% 的活动参数的情况下,实现了与 Qwen2.5 密集基础模型相似的性能。这大大节省了训练和推理成本。
后训练#
为了开发能够进行逐步推理和快速响应的混合模型,我们实施了四个阶段的训练流程。此流程包括:(1)长链式思考 (CoT) 冷启动,(2)基于推理的强化学习 (RL),(3)思考模式融合,以及(4)通用 RL。
在第一阶段,我们使用各种长 CoT 数据对模型进行微调,涵盖各种任务和领域,如数学、编码、逻辑推理和 STEM 问题。此过程旨在使模型具备基本的推理能力。第二阶段的重点是扩大 RL 的计算资源,利用基于规则的奖励来增强模型的探索和利用能力。
在第三阶段,我们通过在长 CoT 数据和常用指令调整数据的组合上微调思考模型,将非思考能力集成到思考模型中。这些数据由第二阶段增强的思考模型生成,确保推理和快速响应能力的无缝融合。最后,在第四阶段,我们在 20 多个通用领域任务中应用 RL,以进一步增强模型的通用能力并纠正不良行为。这些任务包括遵循指令、遵循格式和 Agent 能力等。
使用 Qwen3 进行开发#
下面是一个简单的指南,指导您在不同的框架上使用 Qwen3。首先,我们提供了一个在 Hugging Face transformers 中使用 Qwen3-30B-A3B 的标准示例:
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen3-30B-A3B"
# load the tokenizer and the model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# prepare the model input
prompt = "Give me a short introduction to large language model."
messages = [
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True # Switch between thinking and non-thinking modes. Default is True.
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# conduct text completion
generated_ids = model.generate(
**model_inputs,
max_new_tokens=32768
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
# parsing thinking content
try:
# rindex finding 151668 (</think>)
index = len(output_ids) - output_ids[::-1].index(151668)
except ValueError:
index = 0
thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip("\n")
content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip("\n")
print("thinking content:", thinking_content)
print("content:", content)
copy
要禁用思考,您只需要更改参数 enable_thinking
,如下所示:
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False # True is the default value for enable_thinking.
)
copy
对于部署,您可以使用 sglang>=0.4.6.post1
或 vllm>=0.8.4
创建一个与 OpenAI 兼容的 API 端点:
- SGLang:
python -m sglang.launch_server --model-path Qwen/Qwen3-30B-A3B --reasoning-parser qwen3
copy
- vLLM:
vllm serve Qwen/Qwen3-30B-A3B --enable-reasoning --reasoning-parser deepseek_r1
copy
如果您将其用于本地开发,则可以通过运行简单的命令 ollama run qwen3:30b-a3b
来使用 ollama 来玩模型,或者您可以使用 LMStudio 或 llama.cpp 和 ktransformers 在本地构建。
高级用法#
我们提供了一种软切换机制,允许用户在 enable_thinking=True 时动态控制模型的行为。具体来说,您可以将 /think 和 /no_think 添加到用户提示或系统消息中,以逐个回合地切换模型的思考模式。模型将遵循多回合对话中最新的指令。
这是一个多回合对话的示例:
from transformers import AutoModelForCausalLM, AutoTokenizer
class QwenChatbot:
def __init__(self, model_name="Qwen/Qwen3-30B-A3B"):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(model_name)
self.history = []
def generate_response(self, user_input):
messages = self.history + [{"role": "user", "content": user_input}]
text = self.tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = self.tokenizer(text, return_tensors="pt")
response_ids = self.model.generate(**inputs, max_new_tokens=32768)[0][len(inputs.input_ids[0]):].tolist()
response = self.tokenizer.decode(response_ids, skip_special_tokens=True)
# Update history
self.history.append({"role": "user", "content": user_input})
self.history.append({"role": "assistant", "content": response})
return response
# Example Usage
if __name__ == "__main__":
chatbot = QwenChatbot()
# First input (without /think or /no_think tags, thinking mode is enabled by default)
user_input_1 = "How many r's in strawberries?"
print(f"User: {user_input_1}")
response_1 = chatbot.generate_response(user_input_1)
print(f"Bot: {response_1}")
print("----------------------")
# Second input with /no_think
user_input_2 = "Then, how many r's in blueberries? /no_think"
print(f"User: {user_input_2}")
response_2 = chatbot.generate_response(user_input_2)
print(f"Bot: {response_2}")
print("----------------------")
# Third input with /think
user_input_3 = "Really? /think"
print(f"User: {user_input_3}")
response_3 = chatbot.generate_response(user_input_3)
print(f"Bot: {response_3}")
copy
Agent 用法#
Qwen3 在工具调用能力方面表现出色。我们建议使用 Qwen-Agent 以充分利用 Qwen3 的 Agent 能力。Qwen-Agent 在内部封装了工具调用模板和工具调用解析器,大大降低了编码复杂性。
要定义可用的工具,您可以使用 MCP 配置文件,使用 Qwen-Agent 的集成工具,或者自己集成其他工具。
from qwen_agent.agents import Assistant
# Define LLM
llm_cfg = {
'model': 'Qwen3-30B-A3B',
# Use the endpoint provided by Alibaba Model Studio:
# 'model_type': 'qwen_dashscope',
# 'api_key': os.getenv('DASHSCOPE_API_KEY'),
# Use a custom endpoint compatible with OpenAI API:
'model_server': 'http://localhost:8000/v1', # api_base
'api_key': 'EMPTY',
# Other parameters:
# 'generate_cfg': {
# # Add: When the response content is `<think>this is the thought</think>this is the answer;
# # Do not add: When the response has been separated by reasoning_content and content.
# 'thought_in_content': True,
# },
}
# Define Tools
tools = [
{'mcpServers': { # You can specify the MCP configuration file
'time': {
'command': 'uvx',
'args': ['mcp-server-time', '--local-timezone=Asia/Shanghai']
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
},
'code_interpreter', # Built-in tools
]
# Define Agent
bot = Assistant(llm=llm_cfg, function_list=tools)
# Streaming generation
messages = [{'role': 'user', 'content': 'https://qwenlm.github.io/blog/ Introduce the latest developments of Qwen'}]
for responses in bot.run(messages=messages):
pass
print(responses)
copy
Qwen 之友#
感谢这么多朋友的支持。没有朋友,Qwen 什么都不是!我们欢迎更多的人或组织加入我们的社区,帮助我们变得更好!
未来工作#
Qwen3 代表了我们在迈向通用人工智能 (AGI) 和超级人工智能 (ASI) 之旅中的一个重要里程碑。通过扩大预训练和强化学习 (RL),我们实现了更高水平的智能。我们无缝集成了思考和非思考模式,使用户可以灵活地控制思考预算。此外,我们还扩大了对多种语言的支持,从而增强了全球可访问性。
展望未来,我们的目标是在多个维度上增强我们的模型。这包括改进模型架构和训练方法,以实现以下几个关键目标:扩展数据、增加模型大小、延长上下文长度、拓宽模态以及推进具有环境反馈的 RL 以进行长程推理。我们相信我们正在从一个专注于训练模型的时代过渡到一个专注于训练 Agent 的时代。我们的下一次迭代有望为每个人的工作和生活带来有意义的进步。 © 2025 Qwen Powered by Hugo