下载千问大模型

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

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐