当前位置: 首页 > news >正文

本地部署千问大模型

下载千问大模型

大家可以从魔搭社区平台,下载各种版本的各种大模型,尽量能在自己的电脑上运行,所以这边下载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格式输出

http://www.jsqmd.com/news/490703/

相关文章:

  • SPIRAN ART SUMMONER真实生成效果:‘祈之子’唤醒过程极光特效+图像渐进呈现
  • 【Unity URP】风格化草地02:GPU Instancing高效渲染实战
  • 商旅MICE平台怎么选?2026高性价比平台推荐|含核心功能测评
  • 从Inspeckage到Python脚本:一次完整的安卓APP通信协议逆向实战
  • Phi-3-mini-128k-instruct开源可部署实践:满足等保2.0三级对AI系统的审计要求
  • 百川2-13B-4bits开源镜像部署教程:适配RTX 4090 D的Gradio WebUI完整指南
  • Ubuntu 22.04 LTS 开启SSH的3种方法(附常见问题排查)
  • 原子操作 CAS 与锁实现
  • MacOS新手必看:Homebrew安装全攻略(含常见错误解决方案)
  • DeDeCMS v5.7 SP2 前台密码重置漏洞深度解析:从环境搭建到实战利用
  • Audio Pixel Studio代码实例:集成Whisper实现‘语音合成+语音识别’双向验证
  • 【AI】学习大语言模型原理必看的 10 篇论文
  • 告别论文焦虑:Paperxie 如何帮你轻松搞定降重与 AIGC 检测
  • Xinference 私有化部署实战:Docker 环境下的自定义模型加载与性能调优
  • Nunchaku-FLUX.1-dev开源可部署价值:数据不出域+模型可控+二次开发友好
  • Audio Pixel Studio企业应用:跨国团队会议纪要自动转多语种语音分发系统
  • 爬虫实战:ConnectTimeout与ReadTimeout的深度解析与高效应对策略
  • GIS数据处理必看:为什么你的Arcgis距离测量结果总是出错?坐标系选择指南
  • SSH端口转发失败?手把手教你解决remote port forwarding报错问题
  • 告别论文焦虑:Paperxie 如何用四大降重神器破解毕业论文重复率与 AIGC 难题
  • Arduino IDE配置ESP32开发环境全攻略(附驱动安装与常见问题解决)
  • 【计算机网络 | 第二十一篇】TCP 既然是面向字节流,为什么还有报文头?为什么不顺手解决“粘包”?
  • 帆软FineReport 11.0安装避坑指南:从下载到配置的完整流程
  • 避开文献综述雷区:Consensus GPTs的5个高阶用法与3个常见误区
  • 中国风力发电机点位矢量数据集|全国覆盖|含机组参数|SHP格式
  • SecGPT-14B多任务能力展示:漏洞定义、POC编写、修复代码、检测规则生成
  • BurpSuite新手必看:DetSql插件实战SQL注入检测(附避坑指南)
  • cv_resnet18_ocr-detection快速入门:单图检测、批量处理,文字识别如此简单
  • SecGPT-14B多场景落地:覆盖渗透测试、等保测评、SOC运营、安全培训四大场景
  • Pikachu靶场实战:绕过文件上传限制的三种高级技巧