在大语言模型应用落地的过程中,多轮对话交互和文本智能分类是非常常见的场景。本文将以阿里云通义千问的 Qwen2.5-1.5B-Instruct 模型为例,详细讲解如何基于 Hugging Face 的 Transformers 库实现多轮对话交互、特定场景下的文本分类,以及连续对话交互功能,帮助开发者快速上手轻量级大模型的本地化部署与应用。
一、环境准备与基础认知
1. 核心依赖库
本文所有示例均基于transformers库实现,该库是 Hugging Face 推出的大模型开发工具集,支持主流大模型的加载、推理与微调。首先需要安装核心依赖:
pip install transformers torch accelerate
transformers:提供模型加载、分词、生成等核心功能;torch:PyTorch 框架,支撑模型的张量计算;accelerate:辅助模型实现多设备(CPU/GPU)自动适配。
2. 模型选择
本文选用 Qwen2.5-1.5B-Instruct 模型,这是通义千问推出的轻量级指令微调模型,兼顾性能与部署成本,适合本地化部署和中小规模的任务场景。开发者可从 Hugging Face Hub 下载模型权重,或从阿里云魔搭社区获取。
二、多轮对话交互实现
多轮对话的核心是保留历史交互上下文,让模型能够基于完整的对话逻辑生成回复。以下是具体实现步骤:
1. 核心代码实现
python
from transformers import AutoTokenizer, AutoModelForCausalLM
# 模型与分词器加载
model_name_or_path = r"C:\Users\Asus\Qwen2.5-1.5B-Instruct" # 本地模型路径
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path)
# 历史对话上下文(模拟多轮交互记录)
history_input = ['''我是用户,你是系统,请根据下面的句子来回答我。
"用户:你好,请问今天天气怎么样?",
"系统:今天是晴天,气温20到25度。",
"用户:那明天呢?",
"系统:明天是晴天,气温22到25度。"'''
]
# 当前轮次用户输入
current_input = "用户:那后天的天气呢?"
# 拼接历史上下文与当前输入
full_input_text = "\n".join(history_input + [current_input])
# 输入编码(转换为模型可识别的张量)
inputs = tokenizer(full_input_text, return_tensors="pt")
# 生成回复(核心参数配置)
output_sequences = model.generate(
inputs["input_ids"],
max_length=300, # 输入+输出的总token长度上限
max_new_tokens=30, # 仅限制新增生成的token数
temperature=0.1, # 控制生成随机性(值越小越稳定)
top_p=0.9, # 核采样,平衡多样性与合理性
attention_mask=inputs.attention_mask # 注意力掩码,避免模型关注padding部分
)
# 解码并输出结果
generated_reply = tokenizer.decode(output_sequences[0], skip_special_tokens=True)
print(generated_reply)
2. 关键参数解析
max_new_tokens:区别于max_length,仅限制模型新增生成的 token 数量,避免因输入文本过长导致生成内容被截断;temperature:控制生成文本的随机性,取值 0~1 之间时,值越小生成结果越确定(本文设为 0.1,适合需要稳定回复的场景);top_p:核采样策略,本文设为 0.9,意味着模型仅从累积概率达 90% 的候选 token 中选择,既保证合理性又保留少量多样性;attention_mask:确保模型只处理有效输入文本,忽略填充(padding)部分,提升推理效率。
3. 输出效果
模型会基于完整的历史对话上下文,生成符合逻辑的回复:

三、特定场景文本分类实现
基于大模型实现文本分类,无需额外微调,只需通过 "示例引导"(Few-shot)的方式,让模型按照指定规则完成分类任务。以下以财经文本分类为例(分类类别:新闻报道、财务报告、公司公告、分析师报告):
1. 核心代码实现
python
from transformers import AutoTokenizer, AutoModelForCausalLM
# 模型加载(自动适配设备,优先GPU)
model_name_or_path = r"C:\Users\Asus\Qwen2.5-1.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto")
# 分类示例(Few-shot引导)
history_inputs = ['''我是用户,你是系统,你需要按照要求将我给你的句子分类到:'新闻报道', '财务报告', '公司公告', '分析师报告'类别中。请根据如下模板回答:
"用户:今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。"是'新闻报道','财务报告','公司公告','分析师报告'里的什么类别?",
"系统:新闻报道",
"用户:本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。"是'新闻报道','财务报告','公司公告','分析师报告'里的什么类别?",
"系统:财务报告",
"用户:本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。"是'新闻报道','财务报告','公司公告','分析师报告'里的什么类别?",
"系统:公司公告",
"用户:最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。"是'新闻报道','财务报告','公司公告','分析师报告'里的什么类别?",
"系统:分析师报告",''']
# 待分类的用户输入
current_input = '''请系统回答下面的用户信息,"用户:今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。"是'新闻报道','财务报告','公司公告','分析师报告'里的什么类别?",
'''
# 拼接示例与待分类文本
full_input_text = "\n".join(history_inputs + [current_input])
# 编码并移至GPU(若有)
inputs = tokenizer(full_input_text, return_tensors="pt")
inputs = inputs.to("cuda")
# 生成分类结果
output_sequences = model.generate(
inputs["input_ids"],
max_length=300,
max_new_tokens=30,
temperature=0.1,
top_p=0.9,
attention_mask=inputs.attention_mask
)
# 解码输出
generated_reply = tokenizer.decode(output_sequences[0], skip_special_tokens=True)
print(generated_reply)
2. 核心思路
通过提供少量分类示例(Few-shot),让模型学习分类规则,无需对模型进行微调即可完成特定场景的分类任务。这种方式的优势是快速、低成本,适合中小规模的分类需求。
3. 输出效果
模型会精准识别文本类别并按指定格式输出:

四、连续交互式对话实现
上述示例是静态的多轮对话,实际应用中更需要支持动态的连续交互,用户可实时输入问题,模型基于历史对话生成回复。
1. 核心代码实现
python
from transformers import AutoTokenizer, AutoModelForCausalLM
# 模型加载
model_name_or_path = r"C:\Users\Asus\Qwen2.5-1.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto")
# 初始化对话历史列表
conversation_history = []
# 循环接收用户输入
while True:
user_input = input("你: ")
# 退出指令
if user_input.lower() in ["quit", "exit"]:
break
# 将用户输入加入历史
conversation_history.append(user_input)
# 拼接历史对话
full_input_text = "\n".join(conversation_history)
# 编码输入
input_ids = tokenizer(full_input_text, return_tensors="pt")
inputs = input_ids.to("cuda")
# 生成回复
output = model.generate(
input_ids.input_ids,
max_length=1000,
attention_mask=input_ids.attention_mask
)
# 解码并提取新增回复
answer = tokenizer.decode(output[0], skip_special_tokens=True)
new_answer = answer[len(full_input_text):]
# 输出模型回复
print("Qwen-2.5:", new_answer)
# 将模型回复加入历史
conversation_history.append(new_answer)
2. 核心优化点
- 动态维护
conversation_history列表,实时记录用户输入和模型回复; - 提取
new_answer时,通过answer[len(full_input_text):]过滤掉历史输入,只保留模型新增的回复内容,提升交互体验; device_map="auto"自动适配设备,优先使用 GPU 加速推理,若没有 GPU 则自动切换到 CPU。
3. 交互效果

五、总结与拓展
本文基于 Qwen2.5-1.5B-Instruct 模型,实现了多轮对话、文本分类、连续交互三大核心场景,核心总结如下:
- 轻量级大模型(如 1.5B 量级)兼顾性能与部署成本,适合本地化部署;
- 多轮对话的核心是保留上下文,通过拼接历史文本让模型理解对话逻辑;
- Few-shot 示例引导是大模型零微调实现特定任务的高效方式;
- 动态维护对话历史是实现连续交互的关键,需注意过滤冗余内容提升体验。
拓展方向
- 优化生成参数:根据场景调整
temperature、top_p、max_new_tokens等参数,平衡回复的稳定性与多样性; - 增加上下文截断:当对话历史过长时,截断早期的历史内容,避免输入 token 超过模型上限;
- 接入知识库:结合向量数据库,实现基于知识库的精准问答,提升回复的准确性;
- 封装为 API:将上述功能封装为 Web API,支持多端调用(如前端、小程序)。
通过本文的实践,开发者可快速掌握轻量级大模型在对话交互和文本分类场景的应用,基于 Qwen2.5-1.5B-Instruct 可快速落地各类中小规模的 NLP 应用。