本地部署qwen3 1.7B 全流程代码 

要求:需要魔法 

import os
from transformers import AutoModelForCausalLM, AutoTokenizer
#AutoTokenizer用于处理文本输入,将自然语言转换为token
#AutoModelForCausalLM:专门用于加载因果语言模型(CausalLM)
model_name = "Qwen/Qwen3-1.7B"
#模型的名称是qwen3 1.7B
#加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
#分词器要选择与训练阶段相同的分词器。
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
#加载模型,Hugging Face 的 transformers 库会自动将模型、分词器的文件缓存到本地目录。Windows:C:\Users\<你的用户名>\.cache\huggingface\hub
#torch_dtype="auto":自动选择合适的数据类型(如 FP16/FP32),平衡性能和精度
#device_map="auto":自动将模型分配到可用设备(优先 GPU,如果没有则用 CPU)
#准备模型输入
prompt = "给我讲个3万字的仙侠小说"
messages = [
    {"role": "user", "content": prompt}
]
#这是一个聊天模板。要以{角色:***,内容:***}的格式
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=True # Switches between thinking and non-thinking modes. Default is True.
)
#tokenize=False:表示先不进行分词,只返回处理后的文本字符串
#add_generation_prompt=True:会在文本末尾添加模型生成回复的起始标记(告诉模型 "接下来该你回答了")
#enable_thinking=True:这是 Qwen3 模型的特殊参数,控制是否启用 "思考模式"
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
#这里才真正进行分词:将处理好的文本转换为数字编码(token IDs)
#return_tensors="pt":返回 PyTorch 张量(模型通常需要这种格式的输入)
#.to(model.device):将输入数据移动到模型所在的设备(GPU),确保数据和模型在同一设备上
#生成输出
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=38912
)
#max_new_tokens=32768:控制模型最多能生成多少个新的token。32768 个 token 大约对应 30000~35000 个汉字
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist() 
#这一步是为了从模型的输出中,把 "新生成的内容" 单独提取出来,原因是:
#generated_ids里包含了完整的序列—— 既包括你输入的原始内容,也包括模型新生成的回复。
#拆解来看:
#-generated_ids[0]:因为我们只输入了一条数据(batch_size=1),所以取第 0 个元素,也就是这一条数据的完整生成结果。
#-len(model_inputs.input_ids[0]):计算你原始输入的长度(多少个 token)。
#-[len(...):]:用切片的方式,从 "原始输入长度" 这个位置开始截取,这样就只保留了模型新生成的部分(排除了原始输入)。
#-.tolist():把 PyTorch 的张量(数字矩阵)转换成普通的 Python 列表,方便后续处理
# 提取思考内容和模型回复
try:
    # rindex finding 151668 (</think>)
    index = len(output_ids) - output_ids[::-1].index(151668)
    #找思考符号的位置。len(output_ids)所有回复的长度。output_ids是模型生成的 token 序列(一串数字列表)
    #output_ids[::-1].index(151668)反转列表之后,找151668这个元素的位置。得到结果是倒数第几个位置
    #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)

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐