NLP实践——Llama-2 多轮对话prompt构建
NLP实践——Llama-2 多轮对话prompt构建
- 1. 问题提出
- 2. prompt的正确形式
- 3. 效果测试
- 4. 结尾
1. 问题提出
最近,META开源了Llama-2模型,受到了广泛的关注和好评,然而,在官方给的使用说明中,并没有对使用方法进行特别细节的介绍,尤其是对于对话任务,这就给我们在使用时带来了很多困扰。
以ChatGLM为例,在执行多轮对话时,需要将历史信息拼接到输入中,以供模型在生成时计算历史token与当前query之间的交互(self-attn):
# ChatGLM中对话prompt的产生:prompt = ""for i, (old_query, response) in enumerate(history_input):prompt += "[Round {}]\n问:{}\n答:{}\n".format(i, old_query, response)prompt += "[Round {}]\n问:{}\n答:".format(len(history_input), query_input)
所以可以很自然的想到,如果使用Llama-2模型进行对话,应该也有这样一套模板,与训练过程中的对话形式相匹配。
于是经过简单的搜索后,在reddit论坛找到了Llama-2官方所提供的说明:
https://www.reddit.com/r/LocalLLaMA/comments/155po2p/get_llama_2_prompt_format_right/
2. prompt的正确形式
根据官方账号给出的说明,在对话时,用户所提供的prompt应当满足以下形式:
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>{{ user_message }} [/INST]
其中,<s>,<\s>,<<SYS>>,<</SYS>>,[INST],以及[/INST]是特殊token,标记着prompt中各个部分的构成。
{{ system_prompt }}部分是整个对话中的通用前缀,一般用来给模型提供一个身份,作为对话的大背景。
{{ user_message }}部分是用户所提供的信息,可以理解为多轮对话中其中一轮对话的内容。
并且,其给出了一个样例:
<s>[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>There's a llama in my garden 😱 What should I do? [/INST]
然而,这个简单的样例并不能很好的反映多轮对话的场景,因为它只描述了用户怎样提供第一轮输入,对于几个特殊token如何使用,也没有很好的说明。
幸运的是,在评论区有用户@Evening_Ad6637给出了更加完整的样例以供我们参考:
假设输入是以下形式的对话:
<s>[INST] <<SYS>>You are are a helpful... bla bla.. assistant<</SYS>>Hi there! [/INST] Hello! How can I help you today? </s><s>[INST] What is a neutron star? [/INST] A neutron star is a ... </s><s> [INST] Okay cool, thank you! [/INST]
那么当这个整体作为prompt输入给模型去进行generate时,模型的输出应该是类似于You're welcome! 之类的话。
更详细的解释一下:
-
- 每一组
<s>和</s>之间是一个相对完整的单元,可以理解为一个对话轮次(如果直接给一个文本作为输入,也可以看到模型的输入结果分别是以这两个BOS和EOS token作为结尾的)。
- 每一组
-
[INST]和[/INST]用于区分在当前这一轮的对话(历史)中,用户输入的部分与模型返回的部分。位于[INST]之后,/[INST]之前的文本,是用户在这一轮次对话中所输入的query,而/[INST]之后的文本,是模型针对这一query所作出的回答。
-
- 在对话中的第一组单元,可以提供整个对话的背景信息,并以
<<SYS>>和<</SYS>>作为特殊标记,位于它们之间的,是对话的背景信息。
- 在对话中的第一组单元,可以提供整个对话的背景信息,并以
-
- 需要额外注意,有些特殊标记与文本之间是有空格的,容易遗漏。
3. 效果测试
为了验证prompt是否有效,我们做一个简单的实验,场景是询问动物相关的问题。
(1)首先假设Llama-2模型是一个动物学家,以此作为背景:
You are a zoologist, you will answer my questions about animals.
(2)然后提供一轮对话历史:
- What is an elephant?
- Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.
(3)接下来,提供新一轮对话的query
How much does it weigh?
注意,在这里我回避了使用elephant这个词,而是直接用it进行指代。
(4)完整的prompt
根据前文所述的prompt格式,可以将当前轮次输入给模型进行generate的完整prompt构造如下:
text = """<s>[INST] <<SYS>>
You are a zoologist, you will answer my questions about animals.
<</SYS>>What is an elephant? [/INST] Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.</s><s>[INST] How much does it weigh? [/INST]"""
(5)返回结果
经过generate(生成参数为:{“max_length”: 4096, “num_beams”: 3, “temperature”: 0.9})并解码之后,模型生成结果为:
"<s><s> [INST] <<SYS>>\nYou are a zoologist, you will answer my questions about animals. \n<</SYS>>\n\nWhat is an elephant? [/INST] Ah, an excellent question! Elephants are fascinating creatures, and I'm happy to share my knowledge with you.\nAn elephant is a large, intelligent, and social mammal that belongs to the family Elephantidae.</s><s> [INST] How much does it weigh? [/INST] Great question! The weight of an elephant can vary depending on the species and the individual animal. Here are the average weights for the two main species of elephants:\n* African elephants: Males typically weigh between 5,000 to 14,000 pounds (2,268 to 6,350 kilograms), while females weigh between 4,000 to 9,000 pounds (1,814 to 4,082 kilograms).\n* Asian elephants: Males typically weigh between 3,000 to 6,000 pounds (1,361 to 2,722 kilograms), while females weigh between 2,000 to 3,000 pounds (907 to 1,361 kilograms).\nIt's worth noting that these are just averages, and individual elephants can vary significantly in weight depending on various factors such as age, sex, and nutrition.</s>"
可以看到对话的效果还是不错的,可以比较好的回答出当前轮次关于大象体重的问题。
4. 结尾
本文介绍了如何构建Llama多轮对话的prompt,以适应模型的训练过程中的结构。如果需要搭建一个对话工具,还需要进行一些其他额外的工作,例如对模型生成结果进行截断、对中间kv进行缓存等。
chat与stream_chat的实现可以参考chatGLM的写法:
https://huggingface.co/THUDM/chatglm2-6b/blob/main/modeling_chatglm.py
如何在对话过程中进行显存控制,可以参考我之前的这一篇博客:
https://blog.csdn.net/weixin_44826203/article/details/130401177
此外,还有关于特殊token的一点小疑问,我实验过程中所使用的Llama-2-7b-chat-hf模型,只将<s>和<\s>列为了特殊token,而<<SYS>>,<</SYS>>,[INST],以及[/INST]都只是普通字符,在tokenize的时候会被切分开,不知道是我用错了模型还是什么其他的原因,希望官方在后续能够提供更加详细的说明介绍。
如果本文对你的学习和工作有所帮助的话,记得点一个免费的赞。转载请注明出处。
相关文章:
NLP实践——Llama-2 多轮对话prompt构建
NLP实践——Llama-2 多轮对话prompt构建 1. 问题提出2. prompt的正确形式3. 效果测试4. 结尾 1. 问题提出 最近,META开源了Llama-2模型,受到了广泛的关注和好评,然而,在官方给的使用说明中,并没有对使用方法进行特别细…...
《TCP IP网络编程》第十四章
第 14 章 多播与广播 14.1 多播 多播(Multicast)方式的数据传输是基于 UDP 完成的。因此 ,与 UDP 服务器端/客户端的实现方式非常接近。区别在于,UDP 数据传输以单一目标进行,而多播数据同时传递到加入(注…...
网络基础-认识每层的设备和每层的特点用途
目录 网络层次常见设备各层介绍数据链路层网络层传输层应用层 网络层次 常见设备 各层介绍 数据链路层 有了MAC地址。数据链路层工作在局域网中的,以帧为单位进行传输和处理数据。 网络层 网络层有了IP。不同的网络通过路由器连接成为互联网 路由器的功能: …...
【Linux操作系统】深入解析Linux定时任务调度机制-cronat指令
在Linux操作系统中,定时任务调度是一项重要的功能,它可以让用户在指定的时间或周期性地执行特定的任务。这种机制使得用户能够自动化地执行一些重复性工作,提高工作效率。本文将详细介绍Linux定时任务调度的原理、常用指令和代码示例…...
动手学深度学习(一)预备知识
目录 一、数据操作 1. N维数组样例 2. 访问元素 3. 基础函数 (1) 创建一个行向量 (2)通过张量的shape属性来访问张量的形状和元素总数 (3)reshape()函数 (4)创建全0、全1、…...
item_get-KS-获取商品详情
一、接口参数说明: item_get-根据ID取商品详情 ,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/ks/item_get 名称类型必须描述keyString是调用key(http://o0b.cn/…...
[华为OD] 最小传输时延(dijkstra算法)
明天就要面试了我也太紧张了吧 但是终于找到了一个比较好理解的dijkstra的python解法,让我快点把它背下来!!!! 文章目录 题目dijkstra算法的python实现python解答dfs解法dijkstra解法 题目 先把题目放出来 某通信网络…...
问道管理:总资产大于总市值好吗?
在财政领域,总财物和总市值是两个非常重要的指标。总财物是指公司所有的财物,包括固定财物、流动财物、无形财物等,而总市值则是指公司股票在商场上的总价值。当总财物大于总市值时,这是否是一个好的信号呢?咱们将从多…...
IBM Spectrum LSF (“LSF“ ,简称为负载共享设施) 用户案例
IBM Spectrum LSF (“LSF” ,简称为负载共享设施) 用户案例 IBM Spectrum LSF (“LSF” ,简称为负载共享设施) 软件是业界领先的企业级软件。 LSF 在现有异构 IT 资源之间分配工作,以创建共享,可扩展且容错的基础架构,…...
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)
系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…...
Gis入门,使用起止点和两个控制点生成三阶贝塞尔曲线(共四个控制点,线段转曲线)
前言 本章讲解如何在gis地图中使用起止点和两个控制点(总共四个控制点)生成三阶贝塞尔曲线。 二阶贝塞尔曲线请参考上一章《Gis入门,如何根据起止点和一个控制点计算二阶贝塞尔曲线(共三个控制点)》 贝塞尔曲线(Bezier curve)介绍 贝塞尔曲线(Bezier curve)是一种…...
Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储
深入理解Cookie与Session:实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断…...
Springboot设置Https
1、修改配置文件application.yml,并将*.jks放到resource目录下。 server:port: 8080ssl:key-store: classpath:*.jkskey-store-password: *key-store-type: JKSenabled: truekey-alias: boe.com.cn2、添加http转https的配置 Configuration public class TomcatCon…...
Windows 使用 Linux 子系统,轻轻松松安装多个linux
Windows Subsystem for Linux WSL 简称WSL,是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机&#…...
中级课程——弱口令(认证崩溃)
文章目录 什么是弱口令密码生成器分类暴力破解万能密码测试环境工具 什么是弱口令 密码生成器 分类 暴力破解 万能密码 or true --测试环境 工具 九头蛇,超级弱口令爆破工具,bp,...
web自动化测试进阶篇05 ——— 界面交互场景测试
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...
NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读
论文信息 标题:NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者:Zihan Zhu, Songyou Peng,Viktor Larsson — Zhejiang University 来源:CVPR 代码:https://pengsongyou.github.io/nice-slam…...
cmake 配置Visual studio的调试命令
配置代码如截图: set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND "./consoleTest.exe") set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "./config/labelDriver.cfg") set_propert…...
MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression--论文学习笔记
超越GIoU/DIoU/CIoU/EIoU MPDIoU让YOLOv7和YOLACT双双涨点 目标检测上的指标对比: 论文地址: [2307.07662] MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (arxiv.org) 摘要 边界框回归(Bounding Box Regression&am…...
【Uniapp 的APP热更新】
Uniapp 的APP热更新功能依赖于其打包工具 HBuilder,具体步骤如下: 1. 在 HBuilder 中构建并打包出应用程序 具体步骤: 1.点击发行,点击制作wgt包 2.根据需求修改文件储存路径和其他配置,点击确定 3.等待打包完成&a…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
