為什么要組織對話?
總所周知,ChatGPT的訓(xùn)練大致可分為下圖中展示的幾個階段,其中,在Pretraining階段,模型的訓(xùn)練數(shù)據(jù)是純文本,目標(biāo)是根據(jù)上文預(yù)測下一個token,而在后面的幾個階段中,為了讓模型具備對話的能力,相應(yīng)的就需要使用對話數(shù)據(jù)進(jìn)行訓(xùn)練。而對話數(shù)據(jù)一般包含多個角色的文本,如何將這些文本有效地組織、拼接起來(openAI將其稱之為Chat Markup Language,簡稱ChatML),是本文要聊的內(nèi)容。
from Microsoft Build 2023 《State of GPT》
ChatGPT的ChatML
根據(jù)openAI的介紹[1],ChatML v0會將每個角色(system
、user
、assistant
)的文本進(jìn)行如下拼接:
<|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,進(jìn)行tokenizer encode的時候他們會被編碼成對應(yīng)的單個token id,他們專門用來表示一個角色說話的start
和end
。
那么,如果對話文本中包含了<|im_end|>
豈不是會造成模型的困擾?為了防止這種類型的注入攻擊,似乎openAI會將對話文本中的<|im_start|>
、<|im_end|>
過濾掉。
可能是過濾了<|im_start|>,ChatGPT的回復(fù)中沒有提到<|im_start|>
將<|im_start|>改成<im_start>,ChatGPT能夠完整輸出用戶剛剛的問題
另外,值得注意的是system prompt中的小trick,其中包含了Current date的信息,在響應(yīng)用戶提問的時候進(jìn)行動態(tài)的修改,使模型能夠回復(fù)一些和當(dāng)前日期相關(guān)的問題。
當(dāng)這只是ChatML v0的格式,是3月份時候的版本了,最新版的gpt-3.5-turbo-0613
中角色增加了function
,目前ChatGPT的ChatML演進(jìn)到了什么格式還是未知,一些眼尖的開發(fā)者也發(fā)現(xiàn)了當(dāng)前的ChatML已經(jīng)不是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]中很貼心地提供詳細(xì)的代碼,感興趣的讀者可以進(jìn)一步了解。
將角色信息用special token表示,可以更好的避免注入攻擊,但由于這些special token對應(yīng)的embedding在預(yù)訓(xùn)練階段是未經(jīng)過訓(xùn)練的,在SFT過程中需要充分的訓(xùn)練才能有好的表現(xiàn)。
總結(jié)
ChatML是訓(xùn)練對話大模型的一個小細(xì)節(jié),本文介紹的兩種方式都是利用了special token來顯式表示對話的邊界,同時還能節(jié)約上下文的空間,相比于直接使用###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文章來源:http://www.zghlxwxcb.cn/news/detail-516296.html
[3]?使用 StarCoder 創(chuàng)建一個編程助手文章來源地址http://www.zghlxwxcb.cn/news/detail-516296.html
到了這里,關(guān)于聊聊ChatGPT是如何組織對話的的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!