本地部署千问大模型
下载千问大模型大家可以从魔搭社区平台下载各种版本的各种大模型尽量能在自己的电脑上运行所以这边下载1.5B的版本下载后的文件夹里的东西不要动即可环境准备在开始之前先统一环境。本文基于transformersPyTorch支持 CPU/GPU模型使用Qwen 系列本地模型情感分类只输出正面 / 负面 / 中立from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 本地模型路径 model_name rE:\学习\大模型\qwen device cuda if torch.cuda.is_available() else cpu # 加载分词器与模型 tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypeauto, device_mapauto, trust_remote_codeTrue ).to(device) # 固定模板强制模型只输出结果 prompt_template 请仅输出以下文本的情感类别正面/负面/中立{text} input_text 这部电影真是太差劲我非常不喜欢 prompt_input prompt_template.format(textinput_text) # 编码输入 inputs tokenizer(prompt_input, return_tensorspt).to(device) # 生成配置确定性、短文本、无采样 output_sequences model.generate( inputs.input_ids, attention_maskinputs.attention_mask, max_new_tokens2, # 只生成1-2个字 do_sampleFalse, # 关闭采样 temperature0.0, # 完全确定性输出 pad_token_idtokenizer.eos_token_id ) # 解码并只提取新增结果 generated_text tokenizer.decode(output_sequences[0], skip_special_tokensTrue) result generated_text[len(prompt_input):].strip() print(情感分类结果, result) # 输出负面max_new_tokens2严格限制输出长度避免多余文字temperature0.0温度为 0保证每次输出一致固定 prompt明确告诉模型输出格式多轮对话模型能记住上下文Qwen 有官方对话模板不按格式写模型完全记不住上下文。正确方式使用apply_chat_template按role content组织对话。from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_name_or_path rE:\学习\大模型\qwen tokenizer AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_name_or_path, torch_dtypeauto, device_mapauto, trust_remote_codeTrue ) # 历史对话必须是 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, tokenizeFalse, add_generation_promptTrue ) inputs tokenizer(prompt, return_tensorspt).to(model.device) output_sequences model.generate( inputs.input_ids, attention_maskinputs.attention_mask, max_new_tokens30, temperature0.1, top_p0.9, pad_token_idtokenizer.eos_token_id, do_sampleFalse ) response tokenizer.decode( output_sequences[0][len(inputs.input_ids[0]):], skip_special_tokensTrue ) print(模型回答, response)response tokenizer.decode(output_sequences[0][len(inputs.input_ids[0]):],skip_special_tokensTrue这个代码表示只解码新增内容这样就不会输出多余信息连续传入信息from transformers import AutoModelForCausalLM, AutoTokenizer model_name rE:\学习\大模型\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_tensorspt) # 生成回答 output model.generate(input_ids.input_ids, max_length1000, attention_maskinput_ids.attention_mask) answer tokenizer.decode(output[0], skip_special_tokensTrue) # 提取回答中本次新增的部分 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_asciiFalse))) return {ie_pre_history: ie_pre_history} # 按轮次拼接prompt def build_prompt(query, history): prompt for i, (q, a) in enumerate(history): prompt f[Round {i1}]\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_tensorspt).to(cuda) outputs model.generate(**inputs, max_new_tokens512, pad_token_idtokenizer.eos_token_id) res tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokensTrue) print(抽取结果\n, res) if __name__ __main__: model_path rE:\学习\大模型\qwen tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_path, trust_remote_codeTrue).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.coloradmin.cn/o/2419512.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!