chat_templates
这是一个包含指令微调大型语言模型(LLMs)的正确聊天模板(或输入格式)的代码库,用于支持transformers
的chat_template
功能。如果您有兴趣添加更多聊天模板,欢迎提交拉取请求。
如果您觉得这个代码库有用,请引用它:
@misc{zheng-2024-chat-templates,
author = {Zheng, Chujie},
title = {Chat Templates for HuggingFace Large Language Models},
year = {2024},
howpublished = {\url{https://github.com/chujiezheng/chat_templates}}
}
更新
- [2024年7月] 添加了对Meta的Llama-3.1模型的支持
- [2024年6月] 添加了对Google的Gemma-2模型的支持
- [2024年5月] 添加了对Nvidia的ChatQA模型的支持
- [2024年4月] 添加了对Microsoft的Phi-3模型的支持
- [2024年4月] 添加了对Meta的Llama-3模型的支持
- [2024年2月] 添加了对Google的Gemma模型的支持
- [2024年2月] 添加了generation_configs的使用说明
- [2024年1月] 添加了对阿里巴巴的Qwen2模型的支持
此代码库包含什么?
-
chat_templates
包含收集到的聊天模板的jinja文件,可以直接替换Huggingface tokenizers中的模板 -
generation_configs
包含用于控制响应生成结束的相应json配置。特别地,stop_token_ids
应该通过eos_token_id
参数直接传递给generate
方法
使用示例
重要提示: 如此问题所述,messages
应至少包含一条用户消息。强烈不建议只传递系统消息,因为这可能会导致意外输出(因为模型没有以这种方式训练)。
示例1: Meta-Llama-3-8B-Instruct
这个示例可以检查jinja文件是否正确实现。
from transformers import AutoTokenizer
toker = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct", token="YOUR_OWN_TOKEN")
messages = [
{'role': 'system', 'content': '这是一个系统提示。'},
{'role': 'user', 'content': '这是第一个用户输入。'},
{'role': 'assistant', 'content': '这是第一个助手回应。'},
{'role': 'user', 'content': '这是第二个用户输入。'},
]
print('###### 默认(但正确)聊天模板 ######')
print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
print('###### 修正后的聊天模板 ######')
chat_template = open('./chat_templates/llama-3-instruct.jinja').read()
chat_template = chat_template.replace(' ', '').replace('\n', '')
toker.chat_template = chat_template
print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
预期输出:
###### 默认(但正确)聊天模板 ######
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
这是一个系统提示。<|eot_id|><|start_header_id|>user<|end_header_id|>
这是第一个用户输入。<|eot_id|><|start_header_id|>assistant<|end_header_id|>
这是第一个助手回应。<|eot_id|><|start_header_id|>user<|end_header_id|>
这是第二个用户输入。<|eot_id|><|start_header_id|>assistant<|end_header_id|>
###### 修正后的聊天模板 ######
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
这是一个系统提示。<|eot_id|><|start_header_id|>user<|end_header_id|>
这是第一个用户输入。<|eot_id|><|start_header_id|>assistant<|end_header_id|>
这是第一个助手回应。<|eot_id|><|start_header_id|>user<|end_header_id|>
这是第二个用户输入。<|eot_id|><|start_header_id|>assistant<|end_header_id|>
示例2: Mistral-7B-Instruct-v0.2
对于mistral-instruct
(也包括gemma-it
),它本身不支持system
消息,所以传递system
消息会引发错误。
from transformers import AutoTokenizer
toker = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
messages = [
{'role': 'system', 'content': '这是一个系统提示。'},
{'role': 'user', 'content': '这是第一个用户输入。'},
{'role': 'assistant', 'content': '这是第一个助手回应。'},
{'role': 'user', 'content': '这是第二个用户输入。'},
]
print('###### 默认(但不合适)聊天模板 ######')
# 引发错误
#print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
print('###### 修正后的聊天模板 ######')
chat_template = open('./chat_templates/mistral-instruct.jinja').read()
chat_template = chat_template.replace(' ', '').replace('\n', '')
toker.chat_template = chat_template
print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
预期输出:
###### 默认(但会引发错误)聊天模板 ######
jinja2.exceptions.TemplateError: 对话角色必须交替为user/assistant/user/assistant/...
###### 修正后的聊天模板 ######
<s>[INST] 这是一个系统提示。
这是第一个用户输入。 [/INST] 这是第一个助手回应。 </s>[INST] 这是第二个用户输入。 [/INST]
示例3: vicuna-7b-v1.5
注意: 在fast-chat中,vicuna
在角色消息之间不添加换行符。但我发现添加换行符会导致稍好的性能(特别是对于v1.5版本)。
此外,我发现当给定与默认系统消息不同的系统消息时,vicuna-7/13/33b-v1.3
可能效果不佳。所以我建议使用vicuna-7/13b-v1.5
代替。
from transformers import AutoTokenizer
toker = AutoTokenizer.from_pretrained("lmsys/vicuna-7b-v1.5")
messages = [
{'role': 'system', 'content': '这是一个系统提示。'},
{'role': 'user', 'content': '这是第一个用户输入。'},
{'role': 'assistant', 'content': '这是第一个助手回应。'},
{'role': 'user', 'content': '这是第二个用户输入。'},
]
print('###### 默认(但不合适)聊天模板 ######')
print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
print('###### 修正后的聊天模板 ######')
chat_template = open('./chat_templates/vicuna.jinja').read()
chat_template = chat_template.replace(' ', '').replace('\n', '')
toker.chat_template = chat_template
print(toker.apply_chat_template(messages, tokenize=False, add_generation_prompt=True))
预期输出:
###### 默认(但不合适)聊天模板 ######
<s>[INST] <<SYS>>
这是一个系统提示。
<</SYS>>
这是第一个用户输入。 [/INST] 这是第一个助手回应。 </s><s>[INST] 这是第二个用户输入。 [/INST]
###### 修正后的聊天模板 ######
<s>这是一个系统提示。
USER: 这是第一个用户输入。
ASSISTANT: 这是第一个助手回应。</s>
USER: 这是第二个用户输入。
ASSISTANT:
支持的模型
注意: 列出的模型并非全部,还包括同一模型系列中的其他大小的模型
Llama-3-Instruct, Llama-3.1-Instruct
- 模型:
meta-llama/Meta-Llama-3-8B-Instruct
,meta-llama/Meta-Llama-3.1-8B-Instruct
- 聊天模板:
chat_templates/llama-3-instruct.jinja
- 生成配置:
generation_configs/llama-3-instruct.json
- 参考: https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct/blob/main/tokenizer_config.json#L2053
Llama-2-Chat, CodeLlama-Instruct
- 模型:
meta-llama/Llama-2-7b-chat-hf
,meta-llama/CodeLlama-7b-Instruct-hf
- 聊天模板:
chat_templates/llama-2-chat.jinja
- 生成配置:
generation_configs/llama-2-chat.json
- 参考: https://huggingface.co/meta-llama/Llama-2-7b-chat-hf/blob/main/tokenizer_config.json#L12
Qwen2-Instruct, Qwen1.5-Chat
- 模型:
Qwen/Qwen2-7B-Instruct
,Qwen/Qwen1.5-7B-Chat
- 聊天模板:
chat_templates/chatml.jinja
- 生成配置:
generation_configs/qwen2-instruct.json
- 参考: https://huggingface.co/Qwen/Qwen2-72B-Instruct/blob/main/tokenizer_config.json#L31
Mistral-Instruct
- 模型:
mistralai/Mistral-7B-Instruct-v0.3
,mistralai/Mixtral-8x7B-Instruct-v0.1
- 聊天模板:
chat_templates/mistral-instruct.jinja
- 生成配置:
generation_configs/mistral-instruct.json
- 参考: https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3/blob/main/tokenizer_config.json#L42
- 注释: 通过在第一个用户输入前添加系统消息,系统消息是可接受的
Phi-3-Instruct
- 模型:
microsoft/Phi-3-mini-4k-instruct
- 聊天模板:
chat_templates/phi-3.jinja
- 生成配置:
generation_configs/phi-3.json
- 参考: https://huggingface.co/microsoft/Phi-3-mini-128k-instruct/blob/main/tokenizer_config.json#L338
Yi-1.5-Chat, Yi-Chat
- 模型:
01-ai/Yi-1.5-6B-Chat
,01-ai/Yi-6B-Chat
- 聊天模板:
chat_templates/chatml.jinja
- 生成配置:
generation_configs/yi-chat.json
- 参考: https://huggingface.co/01-ai/Yi-6B-Chat/blob/main/tokenizer_config.json#L60
gemma-it, gemma-2-it
- 模型:`google/gemma-7b-it`、`google/gemma-2-9b-it` - 对话模板:`chat_templates/gemma-it.jinja` - 生成配置:`generation_configs/gemma-it.json` - 参考:https://huggingface.co/google/gemma-7b-it/blob/main/tokenizer_config.json#L1507 - 评论:**系统消息可接受**Llama3-ChatQA-1.5
- 模型:
nvidia/Llama3-ChatQA-1.5-8B
- 对话模板:
chat_templates/chatqa.jinja
- 生成配置:
generation_configs/chatqa.json
- 参考:https://huggingface.co/nvidia/Llama3-ChatQA-1.5-8B#when-context-is-available
- 评论:上下文消息可接受
openchat-3.5, Starling-LM
- 模型:
openchat/openchat_3.5
、berkeley-nest/Starling-LM-7B-alpha
- 对话模板:
chat_templates/openchat-3.5.jinja
- 生成配置:
generation_configs/openchat-3.5.json
- 参考:https://huggingface.co/openchat/openchat_3.5/blob/main/tokenizer_config.json#L51
zephyr
- 模型:
zephyr-7b-alpha
- 对话模板:
chat_templates/zephyr.jinja
- 生成配置:
generation_configs/zephyr.json
- 参考:https://huggingface.co/HuggingFaceH4/zephyr-7b-beta/blob/main/tokenizer_config.json#L34
vicuna
- 模型:
vicuna-7b-v1.5
、vicuna-7b-v1.3
- 对话模板:
chat_templates/vicuna.jinja
- 生成配置:
generation_configs/vicuna.json
- 参考:https://github.com/lm-sys/FastChat/blob/main/docs/vicuna_weights_version.md#prompt-template
Orca-2
- 模型:
microsoft/Orca-2-7b
- 对话模板:
chat_templates/chatml.jinja
- 生成配置:
generation_configs/orca-2.json
- 参考:https://huggingface.co/microsoft/Orca-2-7b
falcon-instruct
- 模型:
tiiuae/falcon-7b-instruct
- 对话模板:
chat_templates/falcon-instruct.jinja
- 参考:https://github.com/lm-sys/FastChat/blob/main/docs/vicuna_weights_version.md#prompt-template
SOLAR-Instruct
- 模型:
upstage/SOLAR-10.7B-Instruct-v1.0
- 对话模板:
chat_templates/solar-instruct.jinja
- 生成配置:
generation_configs/solar-instruct.json
- 参考:https://huggingface.co/upstage/SOLAR-10.7B-Instruct-v1.0/blob/main/tokenizer_config.json#L31
Alpaca
- 模型:
tatsu-lab/alpaca-7b-wdiff
- 对话模板:
chat_templates/alpaca.jinja
- 生成配置:
generation_configs/alpaca.json
- 参考:https://github.com/tatsu-lab/stanford_alpaca
AmberChat
- 模型:
LLM360/AmberChat
、LLM360/AmberSafe
- 对话模板:
chat_templates/amberchat.jinja
- 生成配置:
generation_configs/amberchat.json
- 参考:https://huggingface.co/LLM360/AmberChat
saiga
- 模型:
IlyaGusev/saiga_mistral_7b_lora
- 对话模板:
chat_templates/saiga.jinja
- 生成配置:
generation_configs/saiga.json
- 参考:https://huggingface.co/IlyaGusev/saiga_mistral_7b_lora#saigamistral-7b-russian-mistral-based-chatbot
- 评论:一系列俄语模型