ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

干货|别再零散学Qwen了!这份超全学习总结,带你吃透Qwen系列模型全貌!

干货|别再零散学Qwen了!这份超全学习总结,带你吃透Qwen系列模型全貌! 1. 为什么你学 Qwen 总是学得零零散散很多人接触 Qwen 的路径都差不多先刷到 Qwen2.5 的榜单觉得中文能力不错于是拉个 7B 的权重跑一下过两天又看到 Qwen2.5-Coder 在代码补全上表现亮眼再下一份再后来发现 Qwen2.5-VL 能读图又去折腾多模态。结果硬盘里躺了四五个模型目录每个都只跑过一次generate问起来却说不清它们到底差在哪、什么场景该选谁。问题不在于你不够努力而在于 Qwen 不是一个模型而是一个模型家族。从最早的 Qwen 到 Qwen1.5、Qwen2、Qwen2.5每一代都在文本、代码、视觉、数学、音频等方向上分叉每个分叉又有 0.5B 到 72B 不等的规模。你如果按“一个模型”的思路去学永远只能看到碎片。这篇内容想帮你做一件事把 Qwen 系列从 Qwen 到 Qwen2.5 的演进脉络拉成一条线给你一张能直接对照的选型表再配一套可复制的本地推理环境骨架含config.toml示例最后用逐版本的能力验证动作让你一次性建立对 Qwen 全貌的认知。适合已经会跑transformers或llama.cpp、但选型时总是犹豫的开发者。2. 先把 Qwen 家族的演进脉络理清楚2.1 从 Qwen 到 Qwen2.5 的四代分水岭Qwen 第一代2023 年的核心贡献是证明了中文场景下 decoder-only 架构可以做到可用的对话质量同时开源了 1.8B 到 72B 的多个规模。但那一代的长上下文和代码能力都比较弱tokenizer 对代码缩进也不友好。Qwen1.5 是一次“对齐工程”的升级把 chat 模板、system prompt 支持、多语言覆盖补齐同时引入了更规范的 GQA 配置推理显存占用明显下降。这一代开始Qwen 才真正具备“拿来接业务”的稳定性。Qwen2 是架构层面的跃迁RoPE 多频率嵌入让长上下文从 8k 推到 128kMoE 版本Qwen2-57B-A14B开始出现代码和数学分支独立成 Qwen2-Coder、Qwen2-Math。这一代的关键词是“分工”。Qwen2.5 则是把分工做到极致的一代文本、Coder、VL、Math、Audio 全部有独立权重规模覆盖 0.5B 到 72B并且在小模型上做了大量蒸馏优化0.5B 和 1.5B 的可用性比前代强很多。你现在做本地推理优先考虑的就是 Qwen2.5 系列。2.2 三条主线文本、代码、视觉的本质区别很多人以为 Qwen-Chat、Qwen-Coder、Qwen-VL 只是“应用场景不同”其实它们在输入输出格式、tokenizer、预训练任务上都有本质差异。模型输入类型输出类型tokenizer 特点预训练任务Qwen-Chat纯文本多轮文本BPE中文优化Causal LM SFTQwen-Coder代码 自然语言代码/解释结构化 code tokenizer保留缩进Code Completion FIMQwen-VL图像 文本文本/坐标文本 token 视觉 token图文对齐 跨模态理解Qwen-Coder 的 tokenizer 会保留缩进和标点结构所以它在补全函数体时不会把缩进吃掉Qwen-VL 则通过视觉编码器把图像转成对齐 token再和文本 token 一起送进 backbone。你如果拿 Qwen-Chat 的权重去硬跑代码补全效果会明显差一截不是 prompt 的问题是 tokenizer 和预训练目标不匹配。2.3 规模与显存选型时先看这张表规模典型显存需求FP16量化后Q4适合场景0.5B~1.5GB~0.5GB边缘设备、简单分类1.5B~3.5GB~1.2GB本地对话、轻量 Agent7B~15GB~5GB通用对话、RAG14B~28GB~9GB复杂推理、代码32B~64GB~20GB高质量生成72B~144GB~40GB接近闭源体验这张表是你决定“本地跑还是走 API”的第一依据。显存不够时不要硬上大模型先用 7B 量化版验证流程再决定是否升级。3. TaoToken 前置把 API 接入作为验证基线本地推理环境搭起来之前我建议你先用 API 跑通一遍建立一个“正确输出长什么样”的基线。这样后面本地部署出问题时你能快速判断是模型问题还是环境问题。TaoToken 的接入方式兼容 OpenAI 格式你只需要在代码里改base_url和api_key两个字段。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。具体操作路径先到控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你只是想先验证 Qwen 各版本的输出差异可以直接用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 手动切换模型对比。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有针对 Qwen 系列的参数说明。如果你后面要做长期编码或 Agent 任务可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。注意API Key 不要写进代码仓库用环境变量或.env文件管理。下面所有示例都假设你已经把 Key 放进TAOTOKEN_API_KEY环境变量。4. 可复制配置本地推理环境骨架4.1 环境依赖与目录结构先建一个干净的工作目录避免和系统 Python 混在一起mkdir -p ~/qwen-lab/{models,configs,scripts} cd ~/qwen-lab python -m venv venv source venv/bin/activate pip install --upgrade pip pip install torch transformers accelerate sentencepiece protobuf pip install llama-cpp-python # 用于 GGUF 量化推理目录约定models/放权重configs/放配置文件scripts/放推理脚本。这样你切换模型时只需要改配置不用动代码。4.2 config.toml 示例一份配置管多个 Qwen 版本下面这份config.toml把 API 接入和本地推理都覆盖了你可以直接复制到configs/config.toml[api] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout 60 [api.models] chat qwen2.5-7b-instruct coder qwen2.5-coder-7b-instruct vl qwen2.5-vl-7b-instruct [local] model_dir ~/qwen-lab/models device cuda dtype float16 max_new_tokens 1024 temperature 0.7 top_p 0.9 [local.models] qwen25_7b Qwen2.5-7B-Instruct qwen25_coder Qwen2.5-Coder-7B-Instruct qwen25_vl Qwen2.5-VL-7B-Instruct [quantization] enabled true method q4_k_m gguf_path ~/qwen-lab/models/gguf这份配置的关键设计是[api.models]和[local.models]分开你可以先用 API 验证再切本地。quantization段落控制是否走 GGUF显存不够时打开。4.3 读取配置的 Python 骨架import os import tomllib from pathlib import Path def load_config(pathconfigs/config.toml): with open(path, rb) as f: cfg tomllib.load(f) cfg[api][api_key] os.environ.get(cfg[api][api_key_env], ) cfg[local][model_dir] str(Path(cfg[local][model_dir]).expanduser()) return cfg if __name__ __main__: cfg load_config() print(API base:, cfg[api][base_url]) print(Local models:, list(cfg[local][models].keys()))跑通这一步说明你的配置读取链路没问题。接下来才是真正的推理验证。5. 逐版本能力验证用同一组 prompt 对比5.1 文本对话验证Qwen2.5-7B-Instruct先用 API 跑一个中文多轮对话确认基线输出from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY], ) resp client.chat.completions.create( modelqwen2.5-7b-instruct, messages[ {role: system, content: 你是一个严谨的技术助手。}, {role: user, content: 用三句话解释 RoPE 在长上下文中的作用。}, ], temperature0.7, ) print(resp.choices[0].message.content)预期结果输出应该分三点提到旋转位置编码、相对位置外推、长上下文稳定性。如果输出跑题先检查 system prompt 是否被正确传递。5.2 代码补全验证Qwen2.5-Coder-7B-Instruct代码模型要用 FIMFill-in-the-middle格式验证普通 chat 格式测不出它的真实能力prompt |fim_prefix|def quicksort(arr): if len(arr) 1: return arr pivot arr[len(arr) // 2] |fim_suffix| left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quicksort(left) middle quicksort(right)|fim_middle| resp client.chat.completions.create( modelqwen2.5-coder-7b-instruct, messages[{role: user, content: prompt}], temperature0.2, ) print(resp.choices[0].message.content)预期结果补全内容应该包含return语句或递归调用且缩进正确。如果缩进错乱说明你用的不是 Coder 权重。5.3 视觉理解验证Qwen2.5-VL-7B-InstructVL 模型需要传图像 URL 或 base64。先用一张带文字的截图测试 OCR 能力resp client.chat.completions.create( modelqwen2.5-vl-7b-instruct, messages[ { role: user, content: [ {type: text, text: 读出图中的所有文字并说明布局。}, {type: image_url, image_url: {url: https://example.com/screenshot.png}}, ], } ], ) print(resp.choices[0].message.content)预期结果输出应该包含图中文字内容并能描述标题、正文、按钮的相对位置。如果只输出“一张图片”说明图像编码没生效。5.4 本地推理验证llama.cpp GGUF显存不够时用 GGUF 量化版跑本地python -m llama_cpp.server \ --model ~/qwen-lab/models/gguf/qwen2.5-7b-instruct-q4_k_m.gguf \ --n_ctx 8192 \ --n_gpu_layers 35 \ --host 0.0.0.0 \ --port 8080然后用同样的 OpenAI 格式请求打到http://localhost:8080/v1对比 API 输出。如果本地输出明显变差先检查n_gpu_layers是否设得太低导致部分层跑在 CPU 上。6. 本篇常见错排查6.1 报错tokenizer加载失败或输出乱码现象加载 Qwen2.5 时提示sentencepiece相关错误或输出出现大量。原因Qwen2.5 用的是 BPE tokenizer不是 sentencepiece。如果你装了旧版transformers可能走了错误的 tokenizer 分支。解决升级transformers4.37并确认tokenizer_config.json里的tokenizer_class是Qwen2Tokenizer。如果还是乱码检查你是否把 Coder 的 tokenizer 用在了 Chat 权重上。6.2 报错显存不足CUDA out of memory现象加载 7B FP16 时直接 OOM。原因7B FP16 需要约 15GB 显存加上 KV cache 会更多。解决三个方向。第一改用 Q4 量化显存降到 5GB 左右第二设置device_mapauto让 accelerate 自动分片第三减小max_new_tokens和n_ctx。如果都不行说明你的卡确实跑不动走 API 更实际。6.3 报错API 返回 401 或 404现象请求 TaoToken 时返回鉴权失败或模型不存在。原因401 通常是 Key 没读到404 通常是模型名写错。解决先确认TAOTOKEN_API_KEY环境变量在当前 shell 里能echo出来再对照接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 检查模型名拼写。Qwen2.5 的模型名带-instruct后缀漏掉就会 404。6.4 现象Coder 模型补全结果不带缩进原因你用的是 Chat 权重或者 prompt 没有用 FIM 格式。解决确认模型名是qwen2.5-coder-*并且 prompt 里包含|fim_prefix|、|fim_suffix|、|fim_middle|三个特殊 token。缺一个模型就退化成普通续写。6.5 现象VL 模型读图返回空原因图像 URL 不可访问或 base64 编码格式不对。解决先用本地图片转 base64 测试格式是data:image/png;base64,编码。如果 URL 方式失败多半是网络或防盗链问题换本地图片即可。7. 接下来怎么继续深入把上面五步跑完你手里就有了一套可复用的 Qwen 验证环境一份config.toml管 API 和本地一组 prompt 覆盖文本、代码、视觉三条线一套排障清单应对常见错误。这时候你再回头看 Qwen 的版本演进就不会觉得是零散的知识点而是一条有因果的线。如果你后面要做长期编码任务或 Agent 开发建议直接走 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它针对长会话和工具调用做了优化。如果只是日常验证模型输出模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 足够用。Key 管理和接入细节分别在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 和 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后给你一个实操建议不要一次下载所有模型。先按“7B Chat 7B Coder 7B VL”三个权重建基线跑通验证脚本再根据实际瓶颈决定是升级规模还是换量化。这样你的学习路径是收敛的不会又回到零散状态。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进