本地部署千问大模型
·
下载千问大模型
大家可以从魔搭社区平台,下载各种版本的各种大模型,尽量能在自己的电脑上运行,所以这边下载1.5B的版本

下载后的文件夹里的东西不要动即可
环境准备
在开始之前,先统一环境。本文基于transformers+PyTorch,支持 CPU/GPU,模型使用Qwen 系列本地模型
情感分类(只输出正面 / 负面 / 中立)
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 本地模型路径
model_name = r"E:\学习\大模型\qwen"
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载分词器与模型
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto",
trust_remote_code=True
).to(device)
# 固定模板:强制模型只输出结果
prompt_template = "请仅输出以下文本的情感类别(正面/负面/中立):{text}"
input_text = "这部电影真是太差劲,我非常不喜欢!"
prompt_input = prompt_template.format(text=input_text)
# 编码输入
inputs = tokenizer(prompt_input, return_tensors="pt").to(device)
# 生成配置:确定性、短文本、无采样
output_sequences = model.generate(
inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=2, # 只生成1-2个字
do_sample=False, # 关闭采样
temperature=0.0, # 完全确定性输出
pad_token_id=tokenizer.eos_token_id
)
# 解码并只提取新增结果
generated_text = tokenizer.decode(output_sequences[0], skip_special_tokens=True)
result = generated_text[len(prompt_input):].strip()
print("情感分类结果:", result) # 输出:负面
max_new_tokens=2:严格限制输出长度,避免多余文字
temperature=0.0:温度为 0,保证每次输出一致
固定 prompt:明确告诉模型输出格式
多轮对话(模型能记住上下文)
Qwen 有官方对话模板,不按格式写,模型完全记不住上下文。
正确方式:使用apply_chat_template,按role + content组织对话。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name_or_path = r"E:\学习\大模型\qwen"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_name_or_path,
torch_dtype="auto",
device_map="auto",
trust_remote_code=True
)
# 历史对话(必须是 role + content 格式)
history = [
{"role": "user", "content": "你好,请问今天天气怎么样?"},
{"role": "assistant", "content": "今天是晴天,气温20到25度。"},
{"role": "user", "content": "那明天呢?"},
{"role": "assistant", "content": "明天是晴天,气温22到25度。"},
{"role": "user", "content": "那后天的天气呢?"}
]
prompt = tokenizer.apply_chat_template(
history,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
output_sequences = model.generate(
inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=30,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.eos_token_id,
do_sample=False
)
response = tokenizer.decode(
output_sequences[0][len(inputs.input_ids[0]):],
skip_special_tokens=True
)
print("模型回答:", response)
response = tokenizer.decode(
output_sequences[0][len(inputs.input_ids[0]):],
skip_special_tokens=True
这个代码表示只解码新增内容,这样就不会输出多余信息
连续传入信息
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = r"E:\学习\大模型\qwen"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
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")
# 生成回答
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)
信息抽取
import json
from rich import print
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 定义抽取实体与属性
schema = {'商品': ['产品', '品牌', '特点', '原价', '促销价', '销量'], }
IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出,不存在的信息用['原文中未提及']表示,多值用','分隔。"
# 少样本示例
ie_examples = {
'商品': [{
'content': '2024 新款时尚运动鞋,品牌 JKL,舒适透气,原价 599 元,促销价 499 元,月销量 2000 双。',
'answers': {
'产品': ['时尚运动鞋'],
'品牌': ['JKL'],
'特点': ['舒适透气'],
'原价': ['599元'],
'促销价': ['499元'],
'销量': ['2000双'],
}
}]
}
# 初始化prompt历史
def init_prompts():
ie_pre_history = [
("你需要完成信息抽取,输出严格JSON,不存在填['原文中未提及']。",
"好的,请输入。")
]
for _type, example_list in ie_examples.items():
for example in example_list:
sentence = example["content"]
prop_str = ', '.join(schema[_type])
prompt_sent = IE_PATTERN.format(sentence, f'"{_type}"({prop_str})')
ie_pre_history.append((prompt_sent, json.dumps(example["answers"], ensure_ascii=False)))
return {"ie_pre_history": ie_pre_history}
# 按轮次拼接prompt
def build_prompt(query, history):
prompt = ""
for i, (q, a) in enumerate(history):
prompt += f"[Round {i+1}]\n问:{q}\n答:{a}\n\n"
prompt += f"[Round {len(history)+1}]\n问:{query}\n答:"
return prompt
# 推理函数
def inference(sentences, custom_settings):
for sent in sentences:
prop_str = ', '.join(schema["商品"])
prompt_sent = IE_PATTERN.format(sent, f'"商品"({prop_str})')
full_input = build_prompt(prompt_sent, custom_settings["ie_pre_history"])
inputs = tokenizer(full_input, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=512, pad_token_id=tokenizer.eos_token_id)
res = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print("抽取结果:\n", res)
if __name__ == '__main__':
model_path = r"E:\学习\大模型\qwen"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).cuda()
model.eval()
# 测试文本
test_sentences = [
'2024 潮流双肩包,品牌 PQR,材质耐磨,定价399元,优惠后349元,周销量800个。',
'2024 智能手表,品牌华为,功能强大,续航强,售价1299元,优惠价999元。'
]
custom_settings = init_prompts()
inference(test_sentences, custom_settings)
注意:最后是以JSON格式输出
更多推荐



所有评论(0)