For the complete documentation index, see llms.txt. This page is also available as Markdown.

💬聊天模板

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

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

Colab 聊天模板笔记本列表:

添加新 token

Unsloth 有一个名为 add_new_tokens 的函数,它允许你向微调中添加新的 token。例如,如果你想添加 <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(...)

多轮对话

如果你没注意到,一个问题是 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 那样自定义系统提示词很有用。

或者在 Titanic 预测任务中,你需要在这个包含 CSV 和 Excel 上传功能的 Colab 笔记本里预测乘客是死亡还是生还: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

使用 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 来映射字典值 from, value 等。 map_eos_token 允许你将 <|im_end|> 映射为 EOS,而无需任何训练。

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

最后更新于

这有帮助吗?