unsloth 笔记;数据集

发布于:2025-09-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

1  数据格式

格式 (Format) 描述 (Description) 训练类型 (Training Type)
Raw Corpus 来自某个来源的原始文本,例如网站、书籍或文章。 持续预训练 (Continued Pretraining, CPT)
Instruct 提供给模型的指令,以及一个期望输出的示例。 监督式微调 (Supervised Fine-tuning, SFT)
Conversation 用户与 AI 助手之间的多轮对话。 监督式微调 (Supervised Fine-tuning, SFT)
RLHF  用户与 AI 助手之间的对话,其中助手的回答会由脚本、其他模型或人工评估者进行排序。 强化学习 (Reinforcement Learning, RL)

1.1 持续预训练

使用原始文本格式,没有特定结构:

"text": "Pasta carbonara is a traditional Roman pasta dish. The sauce is made by mixing raw eggs with grated Pecorino Romano cheese and black pepper. The hot pasta is then tossed with crispy guanciale (cured pork cheek) and the egg mixture, creating a creamy sauce from the residual heat. Despite popular belief, authentic carbonara never contains cream or garlic. The dish likely originated in Rome in the mid-20th century, though its exact origins are debated..."

这种格式保留了自然语言的流畅性,适合模型从连续文本中学习。

1.2 指令格式

适用于单轮任务执行:

"Instruction": "Task we want the model to perform.",
"Input": "Optional, but useful, it will essentially be the user's query.",
"Output": "The expected result of the task and the output of the model."

1.3 多轮对话格式

1.3.1 ShareGPT 格式

{
  "conversations": [
    {
      "from": "human",
      "value": "Can you help me make pasta carbonara?"
    },
    {
      "from": "gpt",
      "value": "Would you like the traditional Roman recipe, or a simpler version?"
    },
    {
      "from": "human",
      "value": "The traditional version please"
    },
    {
      "from": "gpt",
      "value": "The authentic Roman carbonara uses just a few ingredients: pasta, guanciale, eggs, Pecorino Romano, and black pepper. Would you like the detailed recipe?"
    }
  ]
}

这里使用 "from""value" 键,消息在人类与 GPT 间交替,形成自然对话流。

1.3.2 OpenAI ChatML 格式

这是 Hugging Face 默认支持的格式,也是目前最常用的格式。

{
  "messages": [
    {
      "role": "user",
      "content": "What is 1+1?"
    },
    {
      "role": "assistant",
      "content": "It's 2!"
    }
  ]
}

2 在 Unsloth 中应用 Chat 模板

(将原始raw file改成大模型能够理解/要求的格式)

2.1 检查 Unsloth 当前支持的 chat 模板

from unsloth.chat_templates import CHAT_TEMPLATES
print(list(CHAT_TEMPLATES.keys()))
'''
['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', 
'vicuna_old', 'vicuna old', 
'alpaca', 'gemma', 'gemma_chatml', 'gemma2', 'gemma2_chatml', 
'llama-3', 'llama3', 'phi-3',
 'phi-35', 'phi-3.5', 'llama-3.1', 'llama-31', 'llama-3.2', 
'llama-3.3', 'llama-32', 
'llama-33', 'qwen-2.5', 'qwen-25', 'qwen25', 'qwen2.5', 'phi-4', 
'gemma-3', 'gemma3', 
'qwen-3', 'qwen3', 'gemma-3n', 'gemma3n', 'gpt-oss', 'gptoss', 
'qwen3-instruct', 'qwen3-thinking']
'''

2.2 使用 get_chat_template 应用正确的模板

from unsloth.chat_templates import get_chat_template

tokenizer = get_chat_template(
    tokenizer,
    chat_template = "gemma-3", # 修改为对应的模板名称
)

2.2.1 为什么不直接使用 tokenizer 自带的 apply_chat_template

  • 原始模型上传时,chat_template 属性有时会包含错误,并且更新较慢。
  • 相比之下,Unsloth 在上传量化版本模型到仓库时,会彻底检查并修复 chat_template 中的错误
  • 此外,Unsloth 的 get_chat_templateapply_chat_template 方法提供了更强大的数据处理功能,文档中有完整说明。

2.3  定义格式化函数

def formatting_prompts_func(examples):
   convos = examples["conversations"]
   #从批量样本中取出对话字段。
   texts = [
       tokenizer.apply_chat_template(
           convo,
           tokenize = False,              # 直接生成字符串,不做 token 化
           add_generation_prompt = False  # 不在最后额外加 Assistant 的起始符
       ) 
       for convo in convos
   ]
   '''
    每条 convo 都是一个 list:
    [
      {"role": "user", "content": "Explain boolean operators."},
      {"role": "assistant", "content": "Boolean operators are ..."}
    ]

   tokenizer.apply_chat_template(...)把这轮对话按照 gemma-3 的 chat 格式拼接成文本
    【前面已经get_chat_template(tokenizer, chat_template="gemma-3") 设置好了】
   输出会是类似这样的字符串
        <bos><start_of_turn>user
        Explain boolean operators.<end_of_turn>
        <start_of_turn>assistant
        Boolean operators are ...

   '''
   return { "text" : texts, }
   '''
    给每条样本生成一个新的 "text" 字段,存放清理好的对话字符串。

    格式化后的 dataset 就能直接用于微调。
    '''

2.4 加载数据并应用格式化

from datasets import load_dataset
dataset = load_dataset("repo_name/dataset_name", split = "train")

dataset = dataset.map(formatting_prompts_func, batched = True)
'''
Hugging Face Datasets 的 map 会对整个数据集执行上面的函数,生成一个新的 "text" 列。

原始的 "conversations" 仍然在,只是又多了 "text"。
'''

2.4.1   处理 ShareGPT 格式

如果数据集是 ShareGPT 格式"from" / "value"),而不是 ChatML 格式"role" / "content"),可以先用 standardize_sharegpt 转换

from datasets import load_dataset
dataset = load_dataset("mlabonne/FineTome-100k", split = "train")


######################相比于ChatML多出来的部分######################
from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
#只有当你的目标数据集是 ShareGPT 格式,而模型需要的是 ChatML 格式 时,才需要使用 standardize_sharegpt 方法
######################相比于ChatML多出来的部分######################

dataset = dataset.map(formatting_prompts_func, batched = True)

3 其他问题

3.1 数据集需要多大

  • 一般建议数据集的最少规模为 100 条样本,这样微调才能得到基本可用的结果。
  • 如果要达到更理想的效果,1,000 条以上的数据集更为合适。
  • 通常情况下,数据越多,效果越好。
  • 不过,微调模型的效果主要取决于数据质量,所以一定要仔细清洗和准备数据。

3.2 如果我有多个数据集,该怎么办?

A: 如果你手头有多个数据集,可以选择:

  1. 统一所有数据集的格式 → 合并成一个数据集 → 在合并后的大数据集上进行微调。

  2. 使用 Multiple Datasets notebook,直接在多个数据集上进行微调。

3.3 我可以对同一个模型进行多次微调吗?

可以对已经微调过的模型再次进行微调,但最佳做法是:

  • 把所有数据集合并后,一次性完成微调

原因是:

  • 对已微调过的模型再次训练,可能会改变之前已经学到的知识和效果。

4 其他(见文档)

多列微调、多轮对话微调、视觉微调


网站公告

今日签到

点亮在社区的每一天
去签到