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

快速上手大模型的对话生成

本项目使用0.5B小模型,结构和大模型别无二致,以方便在如CPU设备上快速学习和上手大模型的对话上传

加载模型
加载分词器
定义对话格式
应用分词器模板
生成模型输入
生成对话
处理生成结果
解码输出
返回最终响应

1. 加载模型

使用了 transformers 库来加载一个预训练的语言模型和对应的分词器:

  1. 使用 AutoModelForCausalLM.from_pretrained 方法加载预训练的语言模型,自动选择合适的设备和数据类型。
  2. 使用 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}
]
  1. 上面这种格式,是当前许多大型语言模型(LLM)采用的对话式交互格式。具体来说,这种格式通常包含多个消息,每条消息都有一个 role(角色)和 content(内容)
  2. 大型科技公司(如OpenAI、Google、Meta等)推出的对话式API普遍采用这种消息列表的格式
  • prompt 是用户输入的提示。
  • messages 是一个包含对话历史的列表,每个元素是一个字典,包含两个字段:
    • role:消息的角色,可以是 systemuser
      • 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_idsattention_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.

参考

  1. 【通义千问2.0】微调之SFT训练 https://www.bilibili.com/video/BV1JLt2e4EKj
  2. QwenLM/Qwen2.5-README.md https://github.com/QwenLM/Qwen2.5/blob/a7b515534d739f6ebb66c5fe2595862ad7118edb/README.md
  3. Qwen/Qwen2.5-0.5B-Instruct https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct

相关文章:

快速上手大模型的对话生成

本项目使用0.5B小模型&#xff0c;结构和大模型别无二致&#xff0c;以方便在如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的编写的扩展方法&#xff0c;包括自然日期差值的文本表示&#xff08;精确和人性化四舍五入&#xff09;、多个时区的节假日和工作日计算。 核心扩展方…...

题解:监控屏幕调整问题

问题描述 Reca 公司生产高端显示器&#xff0c;其中最受欢迎的型号是 AB999。屏幕尺寸为 $x \times y$ 的比例。由于某些生产特性&#xff0c;屏幕参数总是整数。最终&#xff0c;屏幕边长比例 $x:y$ 需要适应用户的需求。 为了满足用户需求&#xff0c;公司需要调整屏幕尺寸…...

C语言----指针

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

树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译

前情提要&#xff1a; 想把自己花里胡哨的终端丢到树莓派上去&#xff0c;可是树莓派算力不够&#xff0c;编译时间过于漫长 交叉编译 定义网上有&#xff0c;懒得复制了&#xff0c;大概就是在本机电脑上编译目标平台的可执行文件 这里的目标平台是树莓派 使用 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天&#xff0c;希望自己能够…...

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如何添加任务列表-复选框的添加&#x1f448;点击这里也可查看 前言 To-do任务列表是一种很常见的时间管理工具&#xff0c;它适用于工作计划&…...

基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】

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

AI定义汽车/跨域融合/整车智能,汽车智能化2.0时代新机会来了

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

(leetcode算法题)10. 正则表达式匹配

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

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 路由期末复习作业二

呼呼呼祝大家元旦节快乐啦&#xff01;&#xff08;我顶着我超重的黑眼圈说&#xff09; 昨天一个人在寝室一边吃泡面&#xff0c;一边看步步惊心&#xff0c;一边吃一边哭呜呜呜呜呜若曦为什么不和八爷在一起好好爱&#xff0c;就因为他不当皇帝蛮&#xff01;难测最是帝王心…...

OpenCV-Python实战(13)——图像轮廓

一、找轮廓 cv2.findContours() contours,hierarchy cv2.findContours(image*,mode*,method*) contours&#xff1a;找到的所有轮廓数组&#xff0c;数组内的元素为轮廓像素点坐标。 hierarchy&#xff1a;轮廓间的层次关系。 image&#xff1a;二值图像&#xff08;cv2.t…...

javascript变量

变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量&#xff0c;全局变量会自动称为 window的属性。 在…...

在K8S中,如何查看kubelet组件的日志?

在kubernetes中&#xff0c;查看Kubelet组件的日志可以通过几种不同的方法。以下是详细的步骤&#xff1a; 1. 使用journalctl命令&#xff1a; 如果kubelet是通过systemd方式部署&#xff0c;你可以使用journalctl命令来查看其日志。执行journalctl -u kubelet将显示Kubelet…...

android studio android sdk下载地址

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

Fetch处理大模型流式数据请求与解析

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

NoFences:免费开源桌面分区工具,Windows用户必备的效率神器

NoFences&#xff1a;免费开源桌面分区工具&#xff0c;Windows用户必备的效率神器 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences NoFences是一款基于C#开发的开源桌面分区工…...

电波流速仪

电波流速仪主打轻量化便携设计&#xff0c;适配单人独立作业。整机重量小于1kg&#xff0c;机身轻巧便携、握持舒适&#xff0c;长时间户外作业无负担。支持手持直接测量与标配三脚架固定测量两种模式&#xff0c;可灵活适配沟渠、河道、险滩、闸口等不同作业环境&#xff0c;既…...

从Halo部署到公网访问:手把手教你用Nginx反代搞定域名、HTTPS与安全配置

从Halo部署到公网访问&#xff1a;Nginx反代全流程实战指南 当你成功在本地服务器上部署了Halo博客系统&#xff0c;看着8080端口的测试页面时&#xff0c;是否思考过如何让它成为真正的互联网站点&#xff1f;本文将带你跨越从本地测试到公网可访问的最后一道鸿沟&#xff0c;…...

用户为中心交互系统工程在智能制造系统中应用

用户为中心交互系统工程&#xff08;User-Centered Interaction System Engineering, UCI-SE&#xff09;是智能制造与 AI 时代下&#xff0c;重塑传统工业软件&#xff08;如 MES、ERP、SCADA&#xff09;和硬件控制终端&#xff08;如 HMI、具身智能教导盒&#xff09;的核心…...

DuckDuckGo AI本地代理服务:开源工具部署与API调用指南

1. 项目概述&#xff1a;一个为DuckDuckGo AI聊天功能提供本地化服务的开源工具如果你和我一样&#xff0c;是个重度搜索用户&#xff0c;同时又对AI聊天功能有高频需求&#xff0c;那你肯定对DuckDuckGo不陌生。作为一个主打隐私保护的搜索引擎&#xff0c;它最近也跟上了潮流…...

Google发现的神级Prompt工程新技巧:重复Prompt提升效果

Google发现的神级Prompt工程新技巧&#xff1a;重复Prompt提升效果 关键词&#xff1a;Prompt工程、提示词优化、LLM技巧、GPT技巧、AI提问技巧、Prompt Repetition、提示词工程一、最近发现一个被低估的Prompt技巧 pdf地址 https://arxiv.org/pdf/2512.14982最近在看一篇 Goog…...

窗口尺寸自由掌控:SRWE如何让任意程序窗口随心所欲

窗口尺寸自由掌控&#xff1a;SRWE如何让任意程序窗口随心所欲 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为某个应用程序的固定窗口尺寸感到束手无策&#xff1f;想在高分辨率下截图却受限于游戏设…...

浏览器资源嗅探神器猫抓Cat-Catch:3分钟学会抓取网页视频音频资源

浏览器资源嗅探神器猫抓Cat-Catch&#xff1a;3分钟学会抓取网页视频音频资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想下…...

射频链路中 Coupler(耦合器)的作用分析

射频链路中 Coupler(耦合器)工程解析报告 ——原理、系统作用、工程实现及 Bi‑Directional Coupler 全解 1. Coupler 在射频链路里“到底起什么作用”(工程结论) Coupler 的本质作用只有一句话: 在**“不显著影响主射频链路”的前提下,抽取一小部分、方向可控的射频能量…...

成本数据多系统自动采集与分析实操指南:基于2026大模型Agent的超自动化实践

在2026年的数字化转型深水区&#xff0c;企业对于“成本”的理解已从静态的财务报表演进为实时的流式数据。然而&#xff0c;即便是在大模型技术全面爆发的今天&#xff0c;数据孤岛依然是阻碍成本精细化管理的首要顽疾。成本数据往往碎片化分布在ERP、MES、WMS、供应链平台及各…...