Yi 模型是由李开复创办的 AI 2.0 公司零一万物发布的一款大型预训练语言模型。Yi 模型包括两个版本,Yi-6B 和Yi-34B,其中 Yi-6B 参数规模 60 亿,Yi-34B 参数规模为 340亿。这两款模型在发布时获得了多项国际最佳性能指标的认可,成为了全球开源大模型的“双料冠军”,并且在Hugging Face 英文测试榜单和 C-Eval 中文能力排行榜中均位居第一。
首先导入两个依赖库,AutoModelForCausalLM 库用于自动加载用于因果语言建模任务的预训练模型,根据指定的预训练模型路径自动选择合适的模型架构;而 AutoTokenizer 库用于自动加载与预训练模型配套的分词器,并根据模型路径提供文本的编解码功能。
from transformers import AutoModelForCausalLM, AutoTokenizer
然后初始化模型请求,messages 是一个对象数组,每个对象包含 role 和 content 两个变量,其中 content 是内容,role 可以是 ASSISTANT、SYSTEM 或 USER,分别表示对系统指定的用户提示输入做出相应的角色、指示或设置助手行为的角色,以及为聊天补全提供输入的角色。
messages = [
{
'role': 'system',
'content': '你是一个作家,有着良好的文学修养,擅长撰写各类文章'
},
{
'role': 'user',
'content': '写一篇催人泪下的短篇小说'
}
]
接下来实例化一个 AutoTokenizer 对象,该对象是从 model_path 路径指定的预训练模型中自动加载分词器。参数 use_fast = False 表示不使用快速模式(如 SentencePiece 等高效实现),而是使用原生的、可能较慢但功能更加全面的分词方法。该分词器将用于后续对输入文本进行编解码操作。
tokenizer = AutoTokenizer.from_pretrained(model_yi_path, use_fast=False)
再下来使用 AutoModelForCausalLM.from_pretrained 方法,从 model_path 指定的路径加载一个预训练的因果语言模型(Causal Language Model),参数 device_map = "auto" 指示模型自动根据当前设备(如 CPU 或 GPU )进行设备映射来实现高效计算,参数 torch_dtype = 'auto' 则指定模型自动使用当前环境支持的最佳 PyTorch 数据类型,末尾的 eval() 方法是将模型设置为评估模式,在该模式下,模型不会进行反向传播和参数更新,适合用于推理或生成任务,而非训练过程。 总之这行代码的作用是对预训练因果语言模型的加载、设备映射设置、数据类型选择,并将其置于评估模式,准备进行后续的文本生成工作。
model = AutoModelForCausalLM.from_pretrained(model_yi_path, device_map="auto", torch_dtype='auto').eval()
接下来使用已加载的 tokenizer 对象,调用 apply_chat_template 方法对请求进行处理。 conversation = messages 为传入之前构建的 messages 消息列表。tokenize = True 表示在应用聊天模板时进行分词操作。add_generation_prompt=True 表示添加生成提示,用于后面引导模型生成符合对话逻辑的回复,return_tensors = 'pt' 要求返回的编码结果是以 PyTorch 张量的形式返回。
input_ids = tokenizer.apply_chat_template(
conversation=messages,
tokenize=True,
add_generation_prompt=True,
return_tensors='pt'
)
然后使用已加载并设置为评估模式的 model 对象,调用 generate 方法生成文本。 input_ids.to('cuda') 是将之前由 tokenizer 计算得到的 PyTorch 张量转移到 CUDA 设备上,以便利用 GPU 加速计算(如果环境中没有 CUDA 设备,这一步可能会报错)。该方法执行后,返回模型生成的文本对应的 ID 序列,存储在变量 output_ids 中。这些ID序列需进一步解码才可以转换为可读文本。
output_ids = model.generate(input_ids.to('cuda'))
最后一步,使用已加载的 tokenizer 对象执行 decode 方法调用,将模型生成的 ID 序列解码为可读文本。output_ids[0] 表示获取 output_ids 的第一个元素(假设模型一次生成一个样本回复); [input_ids.shape[1]:] 表示从输出 ID 序列中选取从 input_ids 长度开始到最后的所有 ID 序列。这样做通常是为了去除模型生成回复前的输入部分,仅保留模型实际生成的新文本;skip_special_tokens = True 表示解码过程中忽略特殊 token(如分隔符、开始 / 结束等标记),确保返回的文本不含这些非实质内容的符号。
response = tokenizer.decode(output_ids[0][input_ids.shape[1]:], skip_special_tokens=True)
response 就是返回的可读文本。虽然代码量很小,不过想跑起来还是需要颇费些周折的,需要安装 python、conda 环境、NVIDIA 驱动,CUDA,以及长长的依赖库列表,看看模型结果,满足一般性的业务要求还是值得的。