CSDN 完整博文:本地 Qwen2.5 大模型实现电影评论情感分类(原生 transformers 最简代码)

目录

一、项目前言

二、环境依赖安装

三、完整原生代码(和需求完全一致)

四、代码逐段详细解析

[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)
  1. AutoModelForCausalLM:通用因果大模型加载器,适配 Qwen、Llama 等生成式 LLM;
  2. AutoTokenizer:自动匹配模型的分词器,负责文本与数字 token 相互转换;
  3. model_name:本地模型文件夹路径,..\代表向上一级文件夹,Windows 原始字符串r""避免转义符报错;
  4. 要求:文件夹内必须包含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)
  1. decode():将数字 token 还原为可读文本;skip_special_tokens=True过滤<eos>等模型特殊符号;
  2. generated_text = 原始输入 prompt + 模型新增回答;
  3. text=generated_text[len(prompt_input):]:切片截取,只保留模型输出的分类结果。

五、运行示例演示

输入

plaintext

复制代码
请输入电影评价:这部电影剧情拖沓,演员演技很差,完全不值得看

控制台打印流程

  1. 打印拼接后的完整 prompt

plaintext

复制代码
prompt_input: 请判断以下文本的情感属于哪个类别:这部电影剧情拖沓,演员演技很差,完全不值得看.可选类别有:正面、负面、中立。
  1. 打印编码后的张量 inputs
  2. 打印推理输出 token 序列output_sequences
  3. 打印完整解码文本

plaintext

复制代码
请判断以下文本的情感属于哪个类别:这部电影剧情拖沓,演员演技很差,完全不值得看.可选类别有:正面、负面、中立。
该文本情感类别为负面
  1. 切片后仅输出模型回答

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 运行速度极慢

  1. 更换更小参数量模型(0.5B 远快于 1.5B/7B);
  2. 安装 GPU 版本 torch,自动调用显卡加速推理。

问题 4:模型文件夹缺失文件报错

检查模型目录,必须包含: config.json、tokenizer_config.json、vocab.json、pytorch_model.bin

七、拓展优化方向

  1. 封装 Flask 网页接口,前端输入评论实时展示分类结果;
  2. 增加结果清洗逻辑,自动提取「正面 / 负面 / 中立」关键词,过滤多余描述;
  3. 使用 Qwen 官方对话模板apply_chat_template,提升指令跟随准确率;
  4. 增加量化加载load_in_4bit=True,大幅降低内存占用;
  5. 批量读取影评文件,批量完成情感分类。

八、总结

本文使用最原生、无多余封装的 transformers 代码,完整演示本地 Qwen2.5 大模型离线推理流程,仅依靠提示词工程实现文本情感分类,无需数据集、无需微调,非常适合新手学习本地 LLM 基础开发流程。代码结构清晰,每一步都有打印日志,方便调试、理解大模型输入输出完整链路。