💬聊天模板

学习聊天模板的基础和自定义选项,包括对话式、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 参数,该参数本质上会在你的单轮数据集中选择一些随机行,并将它们合并成一个对话!例如,如果你将其设置为 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 中)时很有用。

或者在 Titanic 预测任务中,你需要预测某个乘客在这个包含 CSV 和 Excel 上传的 Colab 笔记本中是死亡还是幸存: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharingarrow-up-right

在 Unsloth 中应用聊天模板

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

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

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

    \

  • 使用 get_chat_template 将合适的聊天模板应用到你的分词器:\

    \

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

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

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

    如果你的数据集使用 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 必须在模板内部使用。

最后更新于

这有帮助吗?