• 聊聊ChatGPT是如何组织对话的


    为什么要组织对话?

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

    from Microsoft Build 2023 《State of GPT》

    ChatGPT的ChatML

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

    1. <|im_start|>system
    2. You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.
    3. Knowledge cutoff: 2021-09-01
    4. Current date2023-03-01<|im_end|>
    5. <|im_start|>user
    6. How are you<|im_end|>
    7. <|im_start|>assistant
    8. I am doing well!<|im_end|>
    9. <|im_start|>user
    10. 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|>改成,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]

    1. <|system|>
    2. Below is a dialogue between a human and AI assistant called StarChat.
    3. <|end|>
    4. <|user|>
    5. Is it possible to imagine a society without law?<|end|>
    6. <|assistant|>
    7. It is difficult to imagine ...<|end|>
    8. <|user|>
    9. It seems like you ...<|end|>
    10. <|assistant|>
    11. You are correct ...<|end|>
    12. <|user|>
    13. 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 创建一个编程助手

  • 相关阅读:
    迅为龙芯开发板固态硬盘启动(烧写系统到固态)-分区
    字节二面:可重复读隔离级别下,这个场景会发生什么?
    【车载以太网测试从入门到精通】系列文章目录汇总
    【题解】JZOJ7879 escape from whk 3
    【PyTorch][chapter 20][李宏毅深度学习]【无监督学习][ GAN]【实战】
    Google Earth Engine(GEE)——Kmeans聚类快速进行土地分类(双for循环快速调参)
    MQTT 协议剩余长度计算C#版
    Windows的两种磁盘分区分别是什么?
    c++迷宫小游戏
    城商行容器云平台应用场景及持久化存储实践
  • 原文地址:https://blog.csdn.net/CompHub/article/details/131465564