💬聊天模板

了解聊天模板的基础和自定义选项,包括对话式、ChatML、ShareGPT、Alpaca 格式等!

在我们的 GitHub 中,我们列出了 Unsloth 使用的每个聊天模板,包括用于 Llama、Mistral、Phi-4 等的模板。如果你需要有关格式或用例的任何提示,可以在这里查看: github.com/unslothai/unsloth/blob/main/unsloth/chat_templates.pyarrow-up-right

Colab 聊天模板笔记本列表:

添加新标记

Unsloth 有一个名为 add_new_tokens 的函数,允许你向微调中添加新标记。例如,如果你想添加 <CHARACTER_1>, <THINKING><SCRATCH_PAD> 我们可以这样做:

model, tokenizer = FastLanguageModel.from_pretrained(...)
from unsloth import add_new_tokens
add_new_tokens(model, tokenizer, new_tokens = ["<CHARACTER_1>", "<THINKING>", "<SCRATCH_PAD>"])
model = FastLanguageModel.get_peft_model(...)
circle-exclamation

多轮对话

如果你没注意到,有点问题是 Alpaca 数据集是单轮的,而记住使用 ChatGPT 时是交互式的,你可以与它进行多轮对话。例如,左边是我们想要的,但右边(Alpaca 数据集)只提供单一会话。我们希望微调后的语言模型以某种方式学会像 ChatGPT 那样进行多轮对话。

所以我们引入了 conversation_extension 参数,它本质上会在你的单轮数据集中随机选择若干行,并将它们合并成 1 个对话!例如,如果你将其设置为 3,我们会随机选择 3 行并合并成 1 个!设置得太长会使训练变慢,但可能会让你的聊天机器人和最终微调效果更好!

然后设置 output_column_name 为预测/输出列。对于 Alpaca 数据集,它将是输出列。

然后我们使用 standardize_sharegpt 函数来将数据集转换为适合微调的正确格式!务必调用它!

可定制的聊天模板

我们现在可以为微调本身指定聊天模板。非常著名的 Alpaca 格式如下:

但请记住我们说过这是个坏主意,因为 ChatGPT 风格的微调通常只需要 1 个提示?既然我们已经成功使用 Unsloth 将所有数据列合并为 1 列,我们本质上可以创建下面这种风格的聊天模板,使用 1 个输入列(instruction)和 1 个输出:

我们只要求你必须放置一个 {INPUT} 字段用于指令,和一个 {OUTPUT} 字段用于模型的输出字段。我们实际上允许一个可选的 {SYSTEM} 字段,类似 ChatGPT 的系统提示可以自定义。例如,下面是一些很酷的示例,你可以将聊天模板自定义为这些样式:

对于 OpenAI 模型中使用的 ChatML 格式:

或者你可以使用 Llama-3 自己的模板(仅在使用 Llama-3 的 instruct 版本时有效):我们实际上允许一个可选的 {SYSTEM} 字段,这也有助于像 ChatGPT 那样自定义系统提示。

或者在泰坦尼克号预测任务中,你需要预测乘客在此 Colab 笔记本中是死亡还是存活,该笔记本包含 CSV 和 Excel 上传功能: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharingarrow-up-right

在 Unsloth 中应用聊天模板

对于通常遵循通用 chatml 格式的数据集,将数据集准备用于训练或微调的过程包含四个简单步骤:

  • 检查 Unsloth 当前支持的聊天模板:\

    这将打印出 Unsloth 当前支持的模板列表。以下是示例输出:\

    \

  • 使用 get_chat_template 将正确的聊天模板应用到你的 tokenizer:\

    \

  • 定义你的格式化函数。以下是示例:\

    该函数遍历你的数据集,将你定义的聊天模板应用到每个样本上。\

  • 最后,让我们加载数据集并对其应用所需的修改: \

    如果你的数据集使用 ShareGPT 格式,使用 "from"/"value" 键而不是 ChatML 的 "role"/"content" 格式,你可以先使用 standardize_sharegpt 函数先将其转换。修改后的代码现在如下所示: \

更多信息

假设你的数据集是如下所示的字典列表的列表:

你可以使用我们的 get_chat_template 来格式化它。选择 chat_template 为以下任意一种 zephyr、chatml、mistral、llama、alpaca、vicuna、vicuna_old、unsloth,并使用 mapping 来映射字典值 , value 等。 map_eos_token 允许你在不进行任何训练的情况下将 <|im_end|> 映射为 EOS。

你也可以制作自己的自定义聊天模板!例如我们内部使用的聊天模板如下。你必须传入一个 tuple(custom_template, eos_token) 组成,其中 eos_token 必须在模板中使用。

最后更新于

这有帮助吗?