快速上手大模型的对话生成
本项目使用0.5B
小模型,结构和大模型别无二致,以方便在如CPU设备上快速学习和上手大模型的对话上传
1. 加载模型
使用了 transformers
库来加载一个预训练的语言模型和对应的分词器:
- 使用
AutoModelForCausalLM.from_pretrained
方法加载预训练的语言模型,自动选择合适的设备和数据类型。 - 使用
AutoTokenizer.from_pretrained
方法加载与模型对应的分词器。
from transformers import AutoModelForCausalLM, AutoTokenizermodel_name = "Qwen/Qwen2.5-0.5B-Instruct"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
2. 加载分词器
这段代码用于生成对话,定义了一个提示和消息列表:
prompt = "Give me a short introduction to large language model."
messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": prompt}
]
- 上面这种格式,是当前许多大型语言模型(LLM)采用的对话式交互格式。具体来说,这种格式通常包含多个消息,每条消息都有一个 role(角色)和 content(内容)
- 大型科技公司(如OpenAI、Google、Meta等)推出的对话式API普遍采用这种消息列表的格式
prompt
是用户输入的提示。messages
是一个包含对话历史的列表,每个元素是一个字典,包含两个字段:role
:消息的角色,可以是system
或user
。system
(系统):用于设置对话的基调、规则或角色。例如,定义助手的身份、行为准则等。user
(用户):表示用户输入的问题或请求。assistant
(助手):表示模型生成的回复内容。
content
:消息的内容。
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
# 输出:
# <|im_start|>system
# You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
# <|im_start|>user
# 请介绍一下iPhone<|im_end|>
# <|im_start|>assistant
tokenizer.apply_chat_template
方法的主要功能是将结构化的 messages 列表转换为模型可以理解和处理的特定文本格式- 模型可以理解处理的格式使用了特殊的控制标记(如
<|im_start|>
和<|im_end|>
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# 输出:
# {'input_ids': tensor([[151644, 8948, 198, 2610, 525, 1207, 16948, 11, 3465,
# 553, 54364, 14817, 13, 1446, 525, 264, 10950, 17847,
# 13, 151645, 198, 151644, 872, 198, 35127, 752, 264,
# 2805, 16800, 311, 3460, 4128, 1614, 13, 151645, 198,
# 151644, 77091, 198]], device='mps:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
# 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], device='mps:0')}
tokenizer
对文本进行编码,通常会将文本分割成单词或子词单元[text]
: tokenizer 通常期望输入是一个批次的文本(即使只有一个文本,也需要放入列表中)return_tensors="pt"
: 返回 PyTorch 张量model_inputs
是模型的输入,通常是一个字典,包含input_ids
和attention_mask
两个字段input_ids
: 一个整数张量,表示文本被分词后对应的 token ID 序列attention_mask
: 01表示,用于指示哪些 token 是实际文本,哪些是填充部分(padding)
3. 生成对话
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
# print(generated_ids)
# 输出:
# tensor([[151644, 8948, 198, 2610, 525, 1207, 16948, 11, 3465,
# 553, 54364, 14817, 13, 1446, 525, 264, 10950, 17847,
# 13, 151645, 198, 151644, 872, 198, 35127, 752, 264,
# 2805, 16800, 311, 3460, 4128, 1614, 13, 151645, 198,
# 151644, 77091, 198, 34253, 4128, 4119, 320, 4086, 21634,
# 8, 525, 20443, 11229, 5942, 429, 646, 6923, 3738,
# 12681, 1467, 389, 862, 1828, 13, 4220, 4119, 525,
# 6188, 311, 55359, 279, 23094, 323, 24177, 315, 5810,
# 4128, 8692, 11, 10693, 1105, 311, 3535, 11, 14198,
# 11, 323, 6923, 3738, 4128, 304, 5257, 37597, 13,
# 444, 10994, 82, 614, 1012, 6839, 311, 387, 7373,
# 304, 264, 6884, 2088, 315, 8357, 11, 2670, 5662,
# 14468, 11, 6236, 61905, 11, 28285, 2022, 11, 323,
# 3405, 12, 596, 86, 4671, 9079, 13, 2379, 646,
# 1882, 12767, 14713, 315, 821, 6157, 323, 29720, 11,
# 3259, 1105, 14452, 369, 264, 8045, 315, 1931, 30084,
# 990, 5048, 1380, 1467, 9471, 374, 2567, 13, 151645]],
# device='mps:0')
model.generate
: 生成新的文本,根据输入的model_inputs
,逐步预测下一个 token,直到达到指定的生成长度或遇到停止条件**model_inputs
: 这是 Python 的语法,表示将字典model_inputs
解包为关键字参数。例如,如果model_inputs = {'input_ids': tensor, 'attention_mask': tensor}
,那么**model_inputs
相当于input_ids=tensor, attention_mask=tensor
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
print(generated_ids)
# [tensor([ 315, 22870, 323, 3410, 14507, 429, 15148, 55359, 3738,
# 8806, 12624, 382, 9485, 4119, 525, 6188, 311, 387,
# 31945, 323, 93748, 11, 2952, 311, 3705, 264, 6884,
# 2088, 315, 9079, 2670, 1467, 9471, 11, 28285, 2022,
# 11, 3405, 12, 596, 86, 4671, 11, 323, 1496,
# 4378, 13, 2379, 614, 1012, 1483, 304, 5257, 8357,
# 1741, 438, 4108, 56519, 11, 6236, 61905, 11, 323,
# 4128, 14468, 5942, 382, 3966, 315, 279, 1376, 4419,
# 315, 444, 10994, 82, 374, 862, 5726, 311, 3960,
# 504, 3139, 916, 882, 11, 892, 6147, 1105, 311,
# 7269, 862, 5068, 448, 11504, 14338, 311, 501, 821,
# 13, 1096, 3643, 1105, 7945, 5390, 369, 8357, 1380,
# 13403, 323, 40861, 525, 9023, 11, 1741, 438, 304,
# 6002, 2473, 476, 6457, 22982, 382, 27489, 11, 3460,
# 4128, 4119, 4009, 264, 5089, 49825, 304, 15235, 5440,
# 11, 10004, 7988, 7375, 369, 23163, 3738, 12681, 14507,
# 323, 5006, 1095, 6351, 9079, 1526, 5662, 6832, 25185,
# 13, 151645])]# 相当于:
# 初始化一个空列表,用于存储结果
generated_ids_only = []# 遍历每一对 (input_ids, output_ids)
for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids):# 去掉输入部分,只保留生成部分generated_part = output_ids[len(input_ids):]# 将结果添加到列表中generated_ids_only.append(generated_part)# 最终结果
generated_ids = generated_ids_only
print(generated_ids_only)
- 这行代码的作用是从模型生成的完整 token ID 序列中,去掉输入部分,只保留生成部分
- 这么复杂的写法是为了处理 批量数据(即多个输入和生成序列)
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
- 将 token ID 序列解码为可读的文本。
skip_special_tokens=True
表示跳过特殊 token(如<|im_start|>
、<|im_end|>
等),只保留实际文本。[0]
: 因为batch_decode
返回的是一个列表(即使只有一个序列),所以需要通过[0]
取出第一个元素。
如果不去掉输入部分,直接解码会得到:
# 如果不经过这步的处理直接返回是:
# system
# You are Qwen, created by Alibaba Cloud. You are a helpful assistant.
# user
# Give me a short introduction to large language model.
# assistant
# A large language model (LLM) is a type of artificial intelligence that can produce human-like text based on input data. These models use massive amounts of raw text and other types of knowledge to generate coherent and natural-sounding output. LLMs are used in a wide range of applications such as chatbots, virtual assistants, machine translation, and more. They have the ability to learn from vast amounts of data and improve their performance over time.
参考
- 【通义千问2.0】微调之SFT训练 https://www.bilibili.com/video/BV1JLt2e4EKj
- QwenLM/Qwen2.5-README.md https://github.com/QwenLM/Qwen2.5/blob/a7b515534d739f6ebb66c5fe2595862ad7118edb/README.md
- Qwen/Qwen2.5-0.5B-Instruct https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct
相关文章:
快速上手大模型的对话生成
本项目使用0.5B小模型,结构和大模型别无二致,以方便在如CPU设备上快速学习和上手大模型的对话上传 #mermaid-svg-Z86hUiQZ0hg9BVji {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Z86hUiQZ0h…...

DateTimeExtensions:一个轻量C#的开源DateTime扩展方法库
推荐一个专门为System.DateTime编写的扩展方法库。 01 项目简介 该项目主要是为System.DateTime和System.DateTimeOffset的编写的扩展方法,包括自然日期差值的文本表示(精确和人性化四舍五入)、多个时区的节假日和工作日计算。 核心扩展方…...
题解:监控屏幕调整问题
问题描述 Reca 公司生产高端显示器,其中最受欢迎的型号是 AB999。屏幕尺寸为 $x \times y$ 的比例。由于某些生产特性,屏幕参数总是整数。最终,屏幕边长比例 $x:y$ 需要适应用户的需求。 为了满足用户需求,公司需要调整屏幕尺寸…...

C语言----指针
目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结: 段错误 指针修饰 1. con…...

树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
前情提要: 想把自己花里胡哨的终端丢到树莓派上去,可是树莓派算力不够,编译时间过于漫长 交叉编译 定义网上有,懒得复制了,大概就是在本机电脑上编译目标平台的可执行文件 这里的目标平台是树莓派 使用 uname -m …...

nature reviews genetics | 需要更多的针对不同种族的癌症基因组图谱研究,促进精准治疗和维护治疗公平权益
–https://doi.org/10.1038/s41576-024-00796-w Genomic landscape of cancer in racially and ethnically diverse populations 研究团队和单位 Ulrike Peters–Public Health Sciences Division, Fred Hutchinson Cancer Center Claire E. Thomas–Public Health Scienc…...

代码随想录算法训练营day18
代码随想录算法训练营 —day18 文章目录 代码随想录算法训练营前言一、530.二叉搜索树的最小绝对差递归法迭代法 二、501.二叉搜索树中的众数普通二叉树的方法递归法中序迭代法 三、 236. 二叉树的最近公共祖先递归法 总结 前言 今天是算法营的第18天,希望自己能够…...
Kafka安全优化文档:漏洞修复到安全加固
文章目录 1.1.漏洞修复1.1.1.Apache Kafka反序列化漏洞1.1.2.pm2-kafka代码执行漏洞1.1.3.Apache Kafka安全绕过漏洞1.1.4.Apache Kafka Distribution - Schema Repository跨站请求伪造漏洞1.1.5.Apache Kafka输入验证错误漏洞的补丁1.1.6.Apache Kafka信息泄露漏洞1.1.7.Apach…...
Markdown如何添加任务列表-复选框的添加
Markdown如何添加任务列表-复选框的添加 前言语法讲解使用场景及应用实例代码整和渲染结果小结其他文章快来试试吧☺️ Markdown如何添加任务列表-复选框的添加👈点击这里也可查看 前言 To-do任务列表是一种很常见的时间管理工具,它适用于工作计划&…...

基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】
目录 主要内容 理论研究 整体模型 PQ计算模块 功率控制模块 PWM反馈模块 结果一览 下载链接 主要内容 该仿真针对微电网中分布式电源接入后产生的谐波影响,除了污染网络外,还会恶化微电网变流器输出电流,为了消除谐波影响&a…...

AI定义汽车/跨域融合/整车智能,汽车智能化2.0时代新机会来了
汽车智能化2.0,产业正在发生深度变革。 一方面,AI大模型开始在多个域同步赋能智能汽车,从智能座舱到智能驾驶,再到底盘域,AI大模型正在快速推动汽车变革为超级智能体,AI定义汽车时代开始来临。 另一方面&…...

(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…...

使用爬虫技术获取网页中的半结构化数据
目录 前言1. 半结构化数据与爬虫技术简介1.1 半结构化数据的定义与特性1.2 爬虫技术的基本原理 2. 爬取半结构化数据的实现过程2.1 明确目标与准备2.2 发送HTTP请求2.3 解析网页内容2.4 动态内容的处理2.5 数据存储与清洗 3. 技术挑战与应对策略3.1 处理反爬机制3.2 提高爬取效…...
2025/1/1 路由期末复习作业二
呼呼呼祝大家元旦节快乐啦!(我顶着我超重的黑眼圈说) 昨天一个人在寝室一边吃泡面,一边看步步惊心,一边吃一边哭呜呜呜呜呜若曦为什么不和八爷在一起好好爱,就因为他不当皇帝蛮!难测最是帝王心…...

OpenCV-Python实战(13)——图像轮廓
一、找轮廓 cv2.findContours() contours,hierarchy cv2.findContours(image*,mode*,method*) contours:找到的所有轮廓数组,数组内的元素为轮廓像素点坐标。 hierarchy:轮廓间的层次关系。 image:二值图像(cv2.t…...
javascript变量
变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量,全局变量会自动称为 window的属性。 在…...
在K8S中,如何查看kubelet组件的日志?
在kubernetes中,查看Kubelet组件的日志可以通过几种不同的方法。以下是详细的步骤: 1. 使用journalctl命令: 如果kubelet是通过systemd方式部署,你可以使用journalctl命令来查看其日志。执行journalctl -u kubelet将显示Kubelet…...

android studio android sdk下载地址
android studio安装后,因为公司网络原因,一直无法安装android sdk 后经过手机网络,安装android sdk成功如下,也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…...

Fetch处理大模型流式数据请求与解析
为什么有的大模型可以一次返回多个 data? Server-Sent Events (SSE):允许服务器连续发送多个 data: 行,每个代表一个独立的数据块。 流式响应:大模型服务通常以流式响应方式返回数据,提高响应速度。 批量处理&#x…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...