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

使用本地部署的 LLaMA 3 模型进行中文对话生成

以下程序调用本地部署的 LLaMA3 模型进行多轮对话生成,通过 Hugging Face Transformers API 加载、预处理、生成并输出最终回答。

  • 程序用的是 Chat 模型格式(如 LLaMA3 Instruct 模型),遵循 ChatML 模板,并使用 apply_chat_template 正确构造 prompt。

首先执行下面这个python脚本下载大模型到本地(下载到本地的具体路径通过cache_dir参数指定)。

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('LLM-Research/Llama-3.2-1B-Instruct', cache_dir="/root/autodl-tmp/llm")

然后,加载下载好的本地大模型,执行后续操作

from transformers import AutoModelForCausalLM, AutoTokenizerDEVICE = "cuda"# 加载本地模型路径为该模型配置文件所在的根目录
model_dir = "/root/autodl-tmp/llm/LLM-Research/Llama-3___2-1B-Instruct"
# 使用transformer加载模型
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype="auto", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_dir)# 调用模型
# 定义提示词
prompt = "你好,你叫什么名字?你是由谁创造的?"
# 将提示词封装为message
messages = [{"role": "system", "content": "You are a helpful assistant system"},{"role": "user", "content": prompt}]
# 使用分词器的apply_chat_template方法将messages转换为chat引擎可以接受的信息
# tokenize=False表示此时不进行令牌化
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)print("--------------")
print(text)
print("--------------")# 将处理后的文本令牌化并转换为模型的输入张量
model_inputs = tokenizer([text], return_tensors="pt").to(DEVICE)
# 输入模型得到输出
generated = model.generate(model_inputs.input_ids, max_new_tokens=512)
print(generated)# 对输出的内容进行解码还原
response = tokenizer.batch_decode(generated, skip_special_tokens=True)
print(response)
root@autodl-container-38c543b634-d7f7c9f4:~/autodl-tmp/demo_10# python llama3.2_test.py 
--------------
<|begin_of_text|><|start_header_id|>system<|end_header_id|>Cutting Knowledge Date: December 2023
Today Date: 12 May 2025You are a helpful assistant system<|eot_id|><|start_header_id|>user<|end_header_id|>你好,你叫什么名字?你是由谁创造的?<|eot_id|><|start_header_id|>assistant<|end_header_id|>--------------
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
tensor([[128000, 128000, 128006,   9125, 128007,    271,  38766,   1303,  33025,2696,     25,   6790,    220,   2366,     18,    198,  15724,   2696,25,    220,    717,   3297,    220,   2366,     20,    271,   2675,527,    264,  11190,  18328,   1887, 128009, 128006,    882, 128007,271,  57668,  53901, 104660, 105424, 101879, 119395,  11571,  57668,21043,  68171, 112471, 104251,  67178,   9554,  11571, 128009, 128006,78191, 128007,    271,  37046,  21043,  16197,  44689,  15836,  18328,3922, 113230,  13372,  18184,    445,  81101,   1811,     43,  81101,55951,  16197,  44689,  48044,  27384, 121790,   9554, 109683, 120074,55642, 123123,   3922,  68438,  38129,  43240,  87502,  41007,  37507,111478,  34208,  23226,  42399,   1811, 128009]], device='cuda:0')
['system\n\nCutting Knowledge Date: December 2023\nToday Date: 12 May 2025\n\nYou are a helpful assistant systemuser\n\n你好,你叫什么名字?你是由谁创造的?assistant\n\n我是 Meta 的AI assistant,目前名为 Llama。Llama 是 Meta 的一个大规模的自然语言处理模型,通过使用多种方法来学习和改进。']

这段程序的目的是:使用本地部署的 LLaMA 3 模型进行多轮中文对话生成,主要包括模型加载、输入构造、文本生成和输出解析四个核心部分。

程序一开始导入了必要的模块,并设置计算设备为 "cuda",也就是使用 GPU 来加速模型推理。接着,它指定了模型所在的本地目录路径 model_dir,这个目录中应该包含 Hugging Face 格式的模型权重和配置文件。程序通过 AutoModelForCausalLM.from_pretrained 来加载模型,并指定了 torch_dtype="auto"device_map="auto",这让 transformers 自动选择合适的数据精度(比如 float16)并智能将模型加载到可用的 GPU 上(需要安装 accelerate 库)。同时,AutoTokenizer 也从该路径中加载对应的分词器,它会把人类语言转换成模型可以理解的 token ID。

接下来,程序准备了一条用户输入:你好,你叫什么名字?你是由谁创造的?。为了构建标准的聊天输入,程序创建了一个 messages 列表,其中包含一个 "system" 信息(设定助手角色),以及一条 "user" 提问。这种格式是 Chat 模型(如 LLaMA3 Instruct)所支持的,类似于 ChatGPT 的对话格式。之后,通过 tokenizer.apply_chat_template 方法将这组消息转换为模型能够理解的 纯文本格式。这个方法的参数中,tokenize=False 表示暂时不转换为 token ID,而 add_generation_prompt=True 会在文本结尾添加生成提示符,引导模型开始生成回答。

完成 prompt 构造后,程序使用分词器将文本转换为 token ID,并用 return_tensors="pt" 表示返回 PyTorch 张量,随后将其 .to(DEVICE) 移到 GPU 上,准备作为模型输入。然后调用 model.generate 方法,让模型基于输入生成回复。这里设置了 max_new_tokens=512,即最多生成 512 个 token 的新内容。

模型生成的是一串 token ID,因此最后一步需要用分词器进行反解码。tokenizer.batch_decode 方法会将生成的 token 序列还原为人类可读的自然语言文本,skip_special_tokens=True 参数会去除控制符号。程序最后将生成的回复打印出来,实现了从用户提问到模型生成回答的完整过程。

http://www.xdnf.cn/news/5567.html

相关文章:

  • 前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
  • vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件
  • Python | 赤道频散关系图
  • Spark处理过程-转换算子和行动算子(一)
  • 转运机器人可以绕障吗?
  • go语言实现IP归属地查询
  • C++11详解
  • Java 并发编程挑战:从原理到实战的深度剖析与解决方案
  • Go语言即时通讯系统 开发日志day1
  • 扩展:React 项目执行 yarn eject 后的 scripts 目录结构详解
  • LeetCode 2094.找出 3 位偶数:遍历3位偶数
  • ExcelJS库的使用
  • 【技巧】使用frpc点对点安全地内网穿透访问ollama服务
  • 电池串联和并联的区别
  • 《数据结构初阶》【堆 + 堆排序 + TOP-K】
  • 组合问题(二叉树,递归,回溯算法)
  • 48.辐射发射RE和传导发射CE测试方法分析
  • 利用仓颉语言实现一个正整数中数字出现的频次统计
  • 【洛谷P3386】二分图最大匹配之Kuhn算法/匈牙利算法:直观理解
  • AI知识点 | 大模型技术演变
  • 细说getOutputStream()方法
  • 代码随想录笔记---回溯篇
  • libcurl简单使用
  • SpringBoot 整合 Langchain4j 构建AI智能体应用
  • 《异常链机制详解:如何优雅地传递Java中的错误信息?》
  • 【RP2350】香瓜树莓派RP2350之USB虚拟串口
  • windows下安装python软件
  • Linux计划任务与进程
  • 【RP2350】香瓜树莓派RP2350之LED
  • 数字孪生概念