- OpenAI ChatML
https://github.com/openai/openai-python/blob/release-v0.28.0/chatml.md - MicrosoftDocs - chat-markup-language
https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/ai-services/openai/includes/chat-markup-language.md
- 不得不说的Chat Format——大模型CPU部署系列03
https://limoncc.com/post/14476f03eace0cbc/
关于 Chat Format
所谓Chat Format其实就是一种聊天格式,给模型能看的懂的语言格式。
模型训练不可能像人对话一样,你说一句,它说一句。
这bert时代就有诸如[CLS]、[SEP]、[PAD]之类的特殊token。
到了大模型时代这个问题稍微复杂了一点。因为你不仅要标记句子的开始,结尾还要区分说话角色,谁说了哪些话。于是各种Chat Format就出现了。
一些典型的Chat Format
- ChatML
- Llama2 Format
- Alpaca Format
OpenAI - ChatML
传统上,GPT 模型使用非结构化文本。
ChatGPT 模型需要一种结构化格式,称为 Chat Markup Language 聊天标记语言(简称 ChatML)。
ChatML 文档由一系列消息组成。每条消息都包含一个 header(现在由说这句话的人组成,但将来将包含其他元数据)和 内容(现在是文本有效负载,但将来将包含其他数据类型)。
我们仍在不断发展 ChatML,但当前版本 (ChatML v0) 可以用我们即将推出的“字典列表”JSON 格式表示,如下所示:
[
{"token": "<|im_start|>"},
"system\nYou are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-01",
{"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
"user\nHow are you",
{"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
"assistant\nI am doing well!",
{"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
"user\nHow are you now?",
{"token": "<|im_end|>"}, "\n"
]
您还可以用经典的“不安全原始字符串”格式表示它。
然而,这种格式本质上允许从包含特殊令牌语法的用户输入进行注入,类似于 SQL 注入:
<|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|>
非聊天用例
ChatML 可应用于传统上不被视为聊天的经典 GPT 用例。
例如,指令跟随(用户请求 AI 完成指令)可以实现为 ChatML 查询,如下所示:
[
{"token": "<|im_start|>"},
"user\nList off some good ideas:",
{"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
"assistant"
]
我们目前不允许自动完成部分消息
[
{"token": "<|im_start|>"},
"system\nPlease autocomplete the user's message.",
{"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
"user\nThis morning I decided to eat a giant"
]
请注意,ChatML 向模型明确了每段文本的来源,并特别显示了人类文本和人工智能文本之间的边界。
这提供了缓解并最终解决注入的机会,因为模型可以判断哪些指令来自开发人员、用户或其自己的输入。
Few-shot prompting
一般来说,我们建议使用带有 example_user 或 example_assistant 字段的单独 system 消息添加少量示例 。例如,这是一个 1-shot 提示:
<|im_start|>system
Translate from English to French
<|im_end|>
<|im_start|>system name=example_user
How are you?
<|im_end|>
<|im_start|>system name=example_assistant
Comment allez-vous?
<|im_end|>
<|im_start|>user
{{user input here}}<|im_end|>
如果在system消息中添加说明不起作用,您也可以尝试将它们放入user消息中。
(在不久的将来,我们将通过系统消息训练我们的模型,使其更加可操纵。
但到目前为止,我们只对少数系统消息进行了训练,因此模型更加关注用户示例。)