拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Qwen2.5-Coder-32B-Instruct 实战:基于 transformers 的对话、长文本与流式生成完整指南

Qwen2.5-Coder-32B-Instruct 实战基于 transformers 的对话、长文本与流式生成完整指南【免费下载链接】Qwen3-CoderQwen3-Coder is the code version of Qwen3, the large language model series developed by Qwen team.项目地址: https://gitcode.com/GitHub_Trending/co/Qwen3-Coder导读本文基于 Qwen3-Coder 开源仓库中 examples/Qwen2.5-Coder-Instruct.md 的技术文档系统讲解如何用transformers库调用 Qwen2.5-Coder-32B-Instruct 代码模型从最基本的 ChatML 对话模板与generate()生成到借助 YaRN 将上下文从 32,768 tokens 扩展到超长文本再到使用TextStreamer/TextIteratorStreamer实现流式输出。读完本文你将掌握一套可直接复制运行、覆盖离线对话与在线流式服务的完整调用方案并能结合仓库内的配套示例脚本与 Gradio 聊天 Demo 快速落地。准备工作环境依赖与模型加载Qwen2.5-Coder-32B-Instruct 的最显著、同时也是最简单的使用方式就是通过transformers库完成。仓库根目录的 requirements.txt 给出了运行这些示例所需的最小依赖集合torch transformers accelerate safetensors vllm其中torch、transformers用于模型加载与生成accelerate支撑device_mapauto的自动设备分配safetensors用于安全读取权重文件vllm则面向需要高性能推理服务的场景仓库文档中另有 vLLM 的离线批量推理示例见 examples/Qwen2.5-Coder.md。加载模型的本质非常简单用from_pretrained分别构建分词器tokenizer和因果语言模型再借助分词器提供的聊天模板与generate方法完成对话。一个值得注意的细节是自 Qwen2.5 起加载模型不再需要trust_remote_codeTrue——这一点在 examples/Qwen2.5-Coder-Instruct.py 的注释中明确写明模型权重与代码已原生集成进transformers。from transformers import AutoModelForCausalLM, AutoTokenizer model_name Qwen/Qwen2.5-Coder-32B-Instruct model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypeauto, device_mapauto ) tokenizer AutoTokenizer.from_pretrained(model_name)两个加载参数的含义如下torch_dtypeauto根据模型配置自动选择合适的浮点精度如 FP16/BF16避免手动指定带来的精度不匹配device_mapauto由accelerate自动将模型各层分配到可用设备上单卡时直接落在 GPU显存不足时自动切分到 CPU无需手工管理。基本对话用法ChatML 模板与 generate()准备好模型后只需几行代码即可与 Qwen2.5-Coder-32B-Instruct 对话。核心流程是构造messages对话列表 → 用apply_chat_template()格式化为模型可理解的文本 → 分词后送入generate()→ 解码得到回复。下面是最基本的示例prompt write a quick sort algorithm. messages [ {role: system, content: You are Qwen, created by Alibaba Cloud. You are a helpful assistant.}, {role: user, content: prompt} ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) model_inputs tokenizer([text], return_tensorspt).to(model.device) generated_ids model.generate( **model_inputs, max_new_tokens512 ) generated_ids [ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) ] response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]关键 API 逐个拆解apply_chat_template()用于把messages列表转换成模型能够理解的输入格式。Qwen 系列沿用 ChatML 模板|im_start|/|im_end|特殊标记包裹 system、user、assistant 各角色这一步取代了早期版本中model.chat()的职责——正如 examples/Qwen2.5-Coder-Instruct.py 注释所指出的不再使用model.chat()而是直接使用model.generate()但必须先用apply_chat_template()格式化输入。add_generation_prompt参数用于在输入末尾追加生成提示符即|im_start|assistant\n告诉模型“现在轮到你输出了”。缺少该参数时模型可能继续“扮演用户”或产生格式漂移。max_new_tokens控制生成回复的最大长度以 token 计。文档示例为 512而配套脚本 examples/Qwen2.5-Coder-Instruct.py 使用 2048并注释说明“可以增加输出长度”以应对更复杂的代码生成任务。tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)负责把生成的 token 序列解码回文本skip_special_tokensTrue会剔除|im_end|等特殊标记保证输出干净。去除前缀技巧model.generate()返回的generated_ids包含输入 prompt 的 token因此用列表推导式output_ids[len(input_ids):]只截取新增部分再解码这与官方所有示例脚本如 examples/Qwen2.5-Coder-Instruct.py保持一致。多轮对话与 system 提示messages是构造对话历史与系统提示的通用载体多轮对话只需把历史轮流追加为{role: user, ...}和{role: assistant, ...}条目最后再放上当前用户问题模型便能依据完整上下文继续生成。仓库的 Gradio 聊天 Demo demo/chatbot/app.py 中history_to_messages()函数给出了这种模式的标准实现——它将历史记录转换为[system, user, assistant, user, assistant, ...]的交替结构与apply_chat_template()的输入要求完全对应。处理长文本用 YaRN 把上下文扩展到 32K 以上Qwen2.5-Coder-32B-Instruct 当前的config.json默认支持最长 32,768 tokens的上下文。当输入超出这一长度时官方文档推荐使用YaRNYet another RoPE extensioN论文见 YaRN: Efficient Context Window Extension of Large Language Models这一长度外推技术在长文本场景下保持模型的生成质量。对支持该特性的框架只需在模型目录的config.json中加入以下配置即可启用 YaRN{ ..., rope_scaling: { factor: 4.0, original_max_position_embeddings: 32768, type: yarn } }三个字段的职责如下type: yarn指定长度外推算法为 YaRN区别于 NTK-aware 等其它 RoPE 缩放方案factor: 4.0上下文长度放大倍数配合 32,768 的原始上限可将有效上下文扩展到约 131K tokensoriginal_max_position_embeddings: 32768模型的原始最大位置编码必须与config.json中的默认上下文长度一致。需要说明的是修改config.json属于本地模型部署目录层面的配置适用于支持 YaRN 的推理框架如较新版本的transformers在仓库的官方文档中这一做法被明确表述为“for supported frameworks”。因此实际操作前应确认当前transformers版本对 YaRN 的支持情况。流式输出TextStreamer 与 TextIteratorStreamer大模型逐 token 生成时等待全部生成完毕再一次性返回会带来明显的首字延迟。借助transformers提供的 streamer 机制可以在生成过程中实时输出文本显著改善交互体验。方式一TextStreamer —— 直接打印TextStreamer会在生成过程中直接把解码好的文本打印到标准输出适合命令行交互场景# Repeat the code above before model.generate() # Starting here, we add streamer for text generation. from transformers import TextStreamer streamer TextStreamer(tokenizer, skip_promptTrue, skip_special_tokensTrue) # This will print the output in the streaming mode. generated_ids model.generate( model_inputs.input_ids, max_new_tokens2048, streamerstreamer, )skip_promptTrue让 streamer 不重复输出输入 promptskip_special_tokensTrue则过滤掉特殊标记保证屏幕上只出现纯生成内容。方式二TextIteratorStreamer —— 供下游应用迭代消费TextIteratorStreamer会把可打印文本放入一个队列供下游应用像迭代器一样逐段消费非常适合接入 Web 服务或 GUI 界面。由于model.generate()会阻塞当前线程官方推荐把生成放到独立线程中执行主线程负责从 streamer 取数据# Repeat the code above before model.generate() # Starting here, we add streamer for text generation. from transformers import TextIteratorStreamer streamer TextIteratorStreamer(tokenizer, skip_promptTrue, skip_special_tokensTrue) from threading import Thread generation_kwargs dict(inputsmodel_inputs.input_ids, streamerstreamer, max_new_tokens2048) thread Thread(targetmodel.generate, kwargsgeneration_kwargs) thread.start() generated_text for new_text in streamer: generated_text new_text print(new_text, end)这段代码正是仓库配套脚本 examples/Qwen2.5-Coder-Instruct-stream.py 的核心逻辑Thread负责执行model.generate()主线程通过for new_text in streamer实时消费并拼接完整回复generated_text变量最终保存全量文本可供后续业务使用。两种 streamer 的取舍很简单只需要终端打印效果就用TextStreamer需要在程序内部以迭代方式获取增量文本如对接流式 API就用TextIteratorStreamer。仓库配套实践从示例脚本到聊天 Demo为了让上述 API 用法落地仓库提供了两个与本文档直接对应的可运行脚本脚本对应场景要点examples/Qwen2.5-Coder-Instruct.py普通对话device_mapauto、max_new_tokens2048、截取新增 token 后batch_decodeexamples/Qwen2.5-Coder-Instruct-stream.py流式对话TextIteratorStreamerThread边生成边打印并汇总全文两个脚本都显式声明device cuda作为加载目标设备适合在单 GPU 环境下直接python运行。此外仓库的 demo/chatbot/app.py 提供了一个基于 Gradio 的完整聊天界面 Demo通过 DashScope API 调用qwen2.5-coder-32b-instruct其参数面板直观呈现了对话生成的关键超参数及合理取值范围可作为参数调优的参考Temperature0.0 ~ 1.0默认 0.5控制输出的随机性Top P0.6 ~ 1.0默认 0.9控制核采样累积概率Max Length512 ~ 8192默认 2048控制最大输出长度。Demo 中还内置了system提示词编辑、历史清空等功能其history_to_messages()与流式yield处理方式展示了如何把本文介绍的 ChatML 消息结构与流式输出思想组合成一个可用的交互应用。总结围绕 examples/Qwen2.5-Coder-Instruct.md 这份文档本文覆盖了 Qwen2.5-Coder-32B-Instruct 在transformers下的完整调用链路基本对话from_pretrained加载 apply_chat_template()套用 ChatML 模板 generate()生成 前缀截断与batch_decode解码配套脚本 examples/Qwen2.5-Coder-Instruct.py长文本处理默认 32,768 tokens 上限通过config.json中的rope_scalingtypeyarn、factor4.0扩展上下文前提是框架支持 YaRN流式输出TextStreamer面向终端直出TextIteratorStreamerThread面向程序化迭代消费配套脚本 examples/Qwen2.5-Coder-Instruct-stream.py工程落地借助 requirements.txt 的依赖清单与 demo/chatbot/app.py 的 Gradio Demo可将上述能力快速封装为可交互的服务。掌握了这套流程你便能在本地环境以最少代码完成 Qwen2.5-Coder-32B-Instruct 的对话、超长代码上下文与流式输出三种核心用法为后续接入 IDE 插件、代码审查工具或 Agent 应用打下基础。【免费下载链接】Qwen3-CoderQwen3-Coder is the code version of Qwen3, the large language model series developed by Qwen team.项目地址: https://gitcode.com/GitHub_Trending/co/Qwen3-Coder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门