聊聊ChatGPT是如何组织对话的

2023-11-07

为什么要组织对话?

总所周知,ChatGPT的训练大致可分为下图中展示的几个阶段,其中,在Pretraining阶段,模型的训练数据是纯文本,目标是根据上文预测下一个token,而在后面的几个阶段中,为了让模型具备对话的能力,相应的就需要使用对话数据进行训练。而对话数据一般包含多个角色的文本,如何将这些文本有效地组织、拼接起来(openAI将其称之为Chat Markup Language,简称ChatML),是本文要聊的内容。

from Microsoft Build 2023 《State of GPT》

ChatGPT的ChatML

根据openAI的介绍[1],ChatML v0会将每个角色(systemuserassistant)的文本进行如下拼接:

<|im_start|>system
You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.
Knowledge cutoff: 2021-09-01
Current date: 2023-03-01<|im_end|>
<|im_start|>user
How are you<|im_end|>
<|im_start|>assistant
I am doing well!<|im_end|>
<|im_start|>user
How are you now?<|im_end|>

其中<|im_start|><|im_end|>是special token,进行tokenizer encode的时候他们会被编码成对应的单个token id,他们专门用来表示一个角色说话的startend

那么,如果对话文本中包含了<|im_end|>岂不是会造成模型的困扰?为了防止这种类型的注入攻击,似乎openAI会将对话文本中的<|im_start|><|im_end|>过滤掉。

可能是过滤了<|im_start|>,ChatGPT的回复中没有提到<|im_start|>

将<|im_start|>改成<im_start>,ChatGPT能够完整输出用户刚刚的问题

另外,值得注意的是system prompt中的小trick,其中包含了Current date的信息,在响应用户提问的时候进行动态的修改,使模型能够回复一些和当前日期相关的问题。

当这只是ChatML v0的格式,是3月份时候的版本了,最新版的gpt-3.5-turbo-0613中角色增加了function,目前ChatGPT的ChatML演进到了什么格式还是未知,一些眼尖的开发者也发现了当前的ChatML已经不是v0了[2]

StarChat的ChatML

ChatML的格式不止openAI一种,StarChat提供了另一种思路[3]

<|system|>
Below is a dialogue between a human and AI assistant called StarChat.
<|end|>
<|user|>
Is it possible to imagine a society without law?<|end|>
<|assistant|>
It is difficult to imagine ...<|end|>
<|user|>
It seems like you ...<|end|>
<|assistant|>
You are correct ...<|end|>
<|user|>
Yeah, but laws are complicated ...<|end|>

其中<|system|><|assistant|><|user|><|end|>是special token,[3]中很贴心地提供详细的代码,感兴趣的读者可以进一步了解。

将角色信息用special token表示,可以更好的避免注入攻击,但由于这些special token对应的embedding在预训练阶段是未经过训练的,在SFT过程中需要充分的训练才能有好的表现。

总结

ChatML是训练对话大模型的一个小细节,本文介绍的两种方式都是利用了special token来显式表示对话的边界,同时还能节约上下文的空间,相比于直接使用###user xxx ###assistant xxx是要更好的。

The devil is in the detail.

Reference

[1] openai-python/chatml.md

[2] ChatML update for th gpt-3.5-turbo-0613 and gpt-4

[3] 使用 StarCoder 创建一个编程助手

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊聊ChatGPT是如何组织对话的 的相关文章

随机推荐

  • vsCode注释快捷键

    系列文章目录 文章目录 系列文章目录 前言 一 pandas是什么 二 使用步骤 1 你也可以选择代码 使用上方菜单的 编辑 来手动注释代码 前言 VScode怎么注释掉一段代码 快捷键直接搞定 一 pandas是什么 示例 pandas
  • vue 封装组件供全局使用_Vue如何封装高质量组件

    依照MVC模式思想来解释高可复用性 低耦合性的组件定义方法 组件分类 级别从小到大 基础组件 只是一种宽泛的定义 可见场景较多 与业务无关的组件 比如列表 表格 输入框等 没有实际的UI 故不能直接使用 UI组件 与基础组件同级 为基础组件
  • python os.walk 指定遍历深度_使用os.walk()以递归方式遍历Python中的目录

    试试这个 usr bin env python coding utf 8 FileTreeMaker py author legendmohe import os import argparse import time class File
  • STM32实现74HC595控制

    一 前言 本文主要是实出74HC595的简单控制功能实现 学习笔记整理 二 概述 一 74HC595简述 74HC595是一个8位串行输入 平行输出的位移缓存器 平台行输出为三态输出 在SCHCP的上升沿输入 在STCP的上升沿进入存储寄存
  • 测试开发-晋级之路4-函数进阶(闭包 装饰器)***

    一 闭包 在上面我们见过了再函数中调用函数本身 那么在函数中可不可以定义一个函数 问题需求 如何函故外部调用函数内部定义的函数 问题的引入 到底什么是闭包 闭包的概念 一个完整的闭包须满足一下三个条件 1 函数中嵌套一个函数 2 外层函数返
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • 如何在工作中利用AIGC提质增效?

    引言 人工智能技术快速发展 以 ChatGPT 为代表的新的人工智能语言模型的出现与更迭 引发人们极大的兴奋和关注 越来越多的企业开始将 AI 技术应用到生产流程 以提高工作效率和生产力 AIGC AI Generated Content
  • SQLMAP 脱库过程(post请求,三种方法)

    一 准备工作 1 sqlmap为python语言开发 因此需要具备python环境 2 python环境搭建及sqlmap下载 可参考其他文章 很多也很全 这个不是本文重点 因此略过 二 环境搭建 1 本人使用的是Mac windows7虚
  • Python自动化运维之一(Python入门)

    Python简介 python是吉多 范罗苏姆发明的一种面向对象的脚本语言 可能有些人不知道面向对象和脚本具体是什么意思 但是对于一个初学者来说 现在并不需要明白 大家都知道 当下全栈工程师的概念很火 而Python是一种全栈的开发语言 所
  • AdaDelta算法

    记录一下自己的学习过程 也能让自己的印象更深吧 AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷 下面先介绍一下AdaGrad算法优点和以及存在的问题 AdaGrad的迭代公式如下所示 x t
  • C#异常处理18条最佳实践

    首先 异常处理应该是系统设计规约的一部分出现在系统设计文档中 而不仅仅是一种技术实现 作为设计文档的一部分 异常处理应该着眼于系统容错性和稳定性 正如楼主提到的那样 然后在根据这个规约 再来具体讨论和选择异常处理中使用的各种技术细则 比如
  • 飞机大战小游戏

    欢迎来到程序小院 飞机大战 玩法 单机屏幕任意位置开始 点击鼠标左键滑动控制飞机方向 射击打掉飞机 途中遇到精灵吃掉可产生联排发送子弹 后期会有Boss等来战哦 开始游戏https www ormcc com play gameStart
  • 文字点选验证码识别(上)-YOLO位置识别

    声明 本文以教学为基准 本文提供的可操作性不得用于任何商业用途和违法违规场景 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任 如有侵权 请联系我进行删除 文章中没有代码 只有过程思路 请
  • mysql8设置sql_mode

    原文 mysql8报错 在mysql配置文件下设置 sql mode NO AUTO VALUE ON ZERO STRICT TRANS TABLES NO ZERO IN DATE NO ZERO DATE ERROR FOR DIVI
  • 重磅!阿里推出国产开源的jdk!

    简介 Alibaba Dragonwell 是一款免费的 生产就绪型Open JDK 发行版 提供长期支持 包括性能增强和安全修复 阿里巴巴拥有最丰富的Java应用场景 覆盖电商 金融 物流等众多领域 世界上最大的Java用户之一 Alib
  • 同样25岁,为什么有人事业有成,有人却一无所有?

    文章来源知乎 https www zhihu com question 21726594 文 陈彬 我刚过24周岁的生日 虚岁的话也算是25了 说下自己吧 我是农村孩子 我爸是木工 初中文化 我妈是农村妇女 小学没上完 算认得几个字 我上面
  • shell 向 awk 传递变量参数

    本文翻译自StackOverflow提问 How do I use shell variables in an awk script 但更改了文章段落结构和部分表述 方式1 使用 v 选项 最好的方式 兼容性最佳 使用 v选项 P S 记得
  • eclipse 快捷键大全

    1 Eclipse常用快捷键 1 Ctrl Space 说明 内容助理 提供对方法 变量 参数 javadoc等得提示 应运在多种场合 总之需要提示的时候可先按此快捷键 注 避免输入法的切换设置与此设置冲突 2 Ctrl Shift Spa
  • Windows系统route add delete change路由增加改变删除

    1 管理员身份打开命令行cmd 注 如遇到需上升操作权限 是因为没有使用管理员身份运行cmd 搜索输入cmd 右击 以管理员身份 或者win10右击win图标 选择命令提示符 管理员 2 route 路由 详细操作 输入route 可以看到
  • 聊聊ChatGPT是如何组织对话的

    为什么要组织对话 总所周知 ChatGPT的训练大致可分为下图中展示的几个阶段 其中 在Pretraining阶段 模型的训练数据是纯文本 目标是根据上文预测下一个token 而在后面的几个阶段中 为了让模型具备对话的能力 相应的就需要使用