目录
[1. 模型与分词器加载](#1. 模型与分词器加载)
[2. 提示词工程(核心分类逻辑)](#2. 提示词工程(核心分类逻辑))
[3. 文本编码 tokenizer](#3. 文本编码 tokenizer)
[4. 模型推理 generate 生成](#4. 模型推理 generate 生成)
[5. 解码与结果截取](#5. 解码与结果截取)
[问题 1:路径报错 HFValidationError: Repo id must use alphanumeric chars](#问题 1:路径报错 HFValidationError: Repo id must use alphanumeric chars)
[问题 2:模型输出大量多余文字,只想要单一结果](#问题 2:模型输出大量多余文字,只想要单一结果)
[问题 3:CPU 运行速度极慢](#问题 3:CPU 运行速度极慢)
[问题 4:模型文件夹缺失文件报错](#问题 4:模型文件夹缺失文件报错)
一、项目前言
很多新手想上手本地开源大模型做文本分类任务,但是不知道如何离线加载本地权重、如何通过提示词工程完成分类。本文使用阿里开源轻量模型 Qwen2.5-0.5B-Instruct,仅依靠transformers库,不需要微调、不需要训练数据集,一行输入即可完成电影评论情感三分类(正面、负面、中立),代码极简、适合新手入门本地 LLM 推理流程。
二、环境依赖安装
先安装运行所需第三方库,终端执行:
pip install torch transformers
torch:深度学习张量计算框架transformers:HuggingFace 官方库,用于加载本地大模型、分词、推理生成
三、完整原生代码(和需求完全一致)
python
from transformers import AutoModelForCausalLM,AutoTokenizer
# 本地模型文件夹相对路径
model_name=r"..\qianwen\Qwen2.5-0.5B-Instruct"
# 加载预训练大模型
model=AutoModelForCausalLM.from_pretrained(model_name)
# 加载对应分词器
tokenizer=AutoTokenizer.from_pretrained(model_name)
# 提示词模板:定义分类任务规则
prompt_template='请判断以下文本的情感属于哪个类别:{text}.可选类别有:正面、负面、中立。'
# 接收用户输入电影评论
input_text=input("请输入电影评价")
# 将用户文本填充进提示词模板
prompt_input=prompt_template.format(text=input_text)
print('prompt_input:',prompt_input)
# 分词编码,转为模型可识别张量
inputs=tokenizer(prompt_input,return_tensors="pt")
print("inputs:",inputs)
# 模型推理生成文本
output_sequences=model.generate(inputs.input_ids,max_new_tokens=512,attention_mask=inputs.attention_mask)
print("output_sequences:",output_sequences)
# 将数字张量解码为完整文本
generated_text=tokenizer.decode(output_sequences[0],skip_special_tokens=True)
print(generated_text)
# 截取模型新增回答部分,剔除输入prompt
text=generated_text[len(prompt_input):]
print("text:",text)
四、代码逐段详细解析
1. 模型与分词器加载
python
from transformers import AutoModelForCausalLM,AutoTokenizer
model_name=r"..\qianwen\Qwen2.5-0.5B-Instruct"
model=AutoModelForCausalLM.from_pretrained(model_name)
tokenizer=AutoTokenizer.from_pretrained(model_name)
AutoModelForCausalLM:通用因果大模型加载器,适配 Qwen、Llama 等生成式 LLM;AutoTokenizer:自动匹配模型的分词器,负责文本与数字 token 相互转换;model_name:本地模型文件夹路径,..\代表向上一级文件夹,Windows 原始字符串r""避免转义符报错;- 要求:文件夹内必须包含
config.json、pytorch_model.bin、vocab.json等完整模型权重文件。
2. 提示词工程(核心分类逻辑)
python
prompt_template='请判断以下文本的情感属于哪个类别:{text}.可选类别有:正面、负面、中立。'
input_text=input("请输入电影评价")
prompt_input=prompt_template.format(text=input_text)
- 无需训练,依靠自然语言指令约束模型输出分类结果;
{text}为占位符,通过format()填充用户输入的影评文本;- 任务逻辑:告诉模型仅从「正面、负面、中立」三选一输出结果。
3. 文本编码 tokenizer
python
inputs=tokenizer(prompt_input,return_tensors="pt")
- 大模型无法直接读取文字,需要分词转换为数字 ID(input_ids);
return_tensors="pt":返回 PyTorch 张量格式,适配模型输入;- 返回对象包含两个关键参数:
input_ids:文本分词后的数字编码;attention_mask:掩码,1 代表有效文本,0 代表填充占位。
4. 模型推理 generate 生成
python
output_sequences=model.generate(inputs.input_ids,max_new_tokens=512,attention_mask=inputs.attention_mask)
generate():LLM 文本生成核心函数,自动续写文本;max_new_tokens=512:限制模型最多生成 512 个新词,防止无限输出;attention_mask:传入掩码,让模型忽略填充占位符。
5. 解码与结果截取
python
generated_text=tokenizer.decode(output_sequences[0],skip_special_tokens=True)
text=generated_text[len(prompt_input):]
print("text:",text)
decode():将数字 token 还原为可读文本;skip_special_tokens=True过滤<eos>等模型特殊符号;generated_text= 原始输入 prompt + 模型新增回答;text=generated_text[len(prompt_input):]:切片截取,只保留模型输出的分类结果。
五、运行示例演示
输入
plaintext
请输入电影评价:这部电影剧情拖沓,演员演技很差,完全不值得看
控制台打印流程
- 打印拼接后的完整 prompt
plaintext
prompt_input: 请判断以下文本的情感属于哪个类别:这部电影剧情拖沓,演员演技很差,完全不值得看.可选类别有:正面、负面、中立。
- 打印编码后的张量 inputs
- 打印推理输出 token 序列
output_sequences - 打印完整解码文本
plaintext
请判断以下文本的情感属于哪个类别:这部电影剧情拖沓,演员演技很差,完全不值得看.可选类别有:正面、负面、中立。
该文本情感类别为负面
- 切片后仅输出模型回答
plaintext
text: 该文本情感类别为负面
六、高频踩坑问题解决
问题 1:路径报错 HFValidationError: Repo id must use alphanumeric chars
报错原因:transformers 把..\相对路径识别为线上仓库 ID。 修复方案:使用pathlib标准化绝对路径
from pathlib import Path
model_name = Path(r"..\qianwen\Qwen2.5-0.5B-Instruct").resolve()
问题 2:模型输出大量多余文字,只想要单一结果
修改提示词模板,强制约束输出:
python
运行
prompt_template='仅输出正面、负面、中立其中一个词,禁止任何多余解释:{text}'
同时降低生成长度max_new_tokens=3,减少冗余文本。
问题 3:CPU 运行速度极慢
- 更换更小参数量模型(0.5B 远快于 1.5B/7B);
- 安装 GPU 版本 torch,自动调用显卡加速推理。
问题 4:模型文件夹缺失文件报错
检查模型目录,必须包含: config.json、tokenizer_config.json、vocab.json、pytorch_model.bin
七、拓展优化方向
- 封装 Flask 网页接口,前端输入评论实时展示分类结果;
- 增加结果清洗逻辑,自动提取「正面 / 负面 / 中立」关键词,过滤多余描述;
- 使用 Qwen 官方对话模板
apply_chat_template,提升指令跟随准确率; - 增加量化加载
load_in_4bit=True,大幅降低内存占用; - 批量读取影评文件,批量完成情感分类。
八、总结
本文使用最原生、无多余封装的 transformers 代码,完整演示本地 Qwen2.5 大模型离线推理流程,仅依靠提示词工程实现文本情感分类,无需数据集、无需微调,非常适合新手学习本地 LLM 基础开发流程。代码结构清晰,每一步都有打印日志,方便调试、理解大模型输入输出完整链路。