在本地运行 DeepSeek 模型进行文本生成
在现代 NLP(自然语言处理)应用中,生成式预训练模型(如 GPT 系列)已经成为非常重要的工具。今天,我们将介绍如何使用 Hugging Face 的 transformers
库在本地加载 DeepSeek 模型,并通过用户输入生成响应。
准备工作
首先,确保你已经安装了以下依赖:
pip install transformers torch
本篇文章以 DeepSeek 的模型为例,展示如何使用该模型来处理用户的输入并生成文本响应。
假设你已经下载了本地的 DeepSeek 模型文件(如 deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B
)。
代码解析
下面是完整的代码示例,它演示了如何加载模型并进行生成。
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 加载tokenizer和模型
tokenizer = AutoTokenizer.from_pretrained("模型路径/deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B")
model = AutoModelForCausalLM.from_pretrained("模型路径/deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B")
# 显式设置 pad_token_id
tokenizer.pad_token = tokenizer.eos_token # 设置pad_token为eos_token
# 循环5次,用户输入文本并生成响应
for _ in range(5):
# 用户输入文本
input_text = input("请输入文本:")
# 编码输入
inputs = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True)
# 添加 attention_mask
inputs['attention_mask'] = inputs.get('attention_mask', torch.ones(inputs['input_ids'].shape))
# 生成文本,避免重复并设置更长的max_length
with torch.no_grad():
outputs = model.generate(inputs['input_ids'], attention_mask=inputs['attention_mask'],
max_length=200, num_return_sequences=1, pad_token_id=tokenizer.pad_token_id,
no_repeat_ngram_size=2, early_stopping=False) # 防止过早停止,避免重复
# 解码输出
output_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 去掉输入部分,只输出生成的内容
output_text = output_text[len(input_text):].strip() # 去除输入的重复部分
# 只输出生成的文本
print(output_text)
代码解析
加载模型和 Tokenizer 我们通过
AutoTokenizer
和AutoModelForCausalLM
来加载模型和相应的分词器。这些工具可以自动处理模型文件和权重文件。
确保模型路径正确指向本地文件夹(如
模型路径/deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B
)。tokenizer = AutoTokenizer.from_pretrained("模型路径/deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B") model = AutoModelForCausalLM.from_pretrained("模型路径/deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B")
设置
pad_token
为了避免生成文本时出现问题,我们将pad_token
设置为eos_token
。这是因为一些模型在训练时可能没有显式地指定
pad_token
,因此我们手动设置它为eos_token
来避免在生成时出现错误。tokenizer.pad_token = tokenizer.eos_token # 设置pad_token为eos_token
用户输入与文本生成 程序循环 5 次,每次提示用户输入文本。
然后,文本被传递给模型进行处理,生成新的文本。
以下是关键部分:
- 文本编码:使用
tokenizer
将用户输入文本转换为模型可理解的 token 格式,并进行填充和截断。- 添加
attention_mask
:在必要时,手动设置attention_mask
,以确保模型知道哪些部分是实际输入数据,哪些是填充部分。- 文本生成:使用
model.generate
方法生成响应。我们设置了max_length
、no_repeat_ngram_size
等参数来控制生成文本的质量和防止重复。inputs = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True) inputs['attention_mask'] = inputs.get('attention_mask', torch.ones(inputs['input_ids'].shape))
防止重复:为了避免生成过程中出现重复内容,我们使用
no_repeat_ngram_size=2
来防止连续的二元组重复。
4.输出生成的文本 最后,生成的文本被解码,并去除了重复的输入部分。
生成的文本输出给用户。
output_text = output_text[len(input_text):].strip() # 去除输入的重复部分 print(output_text)
总结
通过这个简单的例子,我们演示了如何使用 Hugging Face 的 transformers
库加载本地的 DeepSeek 模型,并通过循环交互生成文本。此方法非常适用于需要在本地运行预训练模型的场景,不需要依赖云服务。你可以根据自己的需求调整生成的参数,例如增加 max_length
或调整 no_repeat_ngram_size
来改善输出质量。
使用本地模型能够大大提高响应速度,并且为你的应用提供更多的控制权,特别是当你处理敏感数据或需要自定义模型时。