💡 本文会带给你
- 认识常用的指令监督微调数据集
- 如何构建自定义数据集
- 为什么是QLoRA
- 学会使用LLamFactory 进行QLoRA微调大模型
一、数据集
常用的数据集有 Alpaca 格式和 ShareGPT 格式,下面我们分别介绍这两种格式数据集。
Alpaca 格式数据集
Alpaca 数据集可以适用不同的任务,如指令监督微调、预训练、偏好训练、KTO、多模态,下面我们主要介绍指令监督微调数据集。
指令监督微调数据集
指令监督微调(Instruct Tuning)通过让模型学习详细的指令以及对应的回答来优化模型在特定指令下的表现。
指令监督微调数据集格式为:
In [ ]:
[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "system": "系统提示词(选填)", "history": [ ["第一轮指令(选填)", "第一轮回答(选填)"], ["第二轮指令(选填)", "第二轮回答(选填)"] ] } ]
instruction 列对应的内容为人类指令, input 列对应的内容为人类输入, output 列对应的内容为模型回答。下面是一个例子
In [ ]:
{ "instruction": "计算这些物品的总费用。 ", "input": "输入:汽车 - $3000,衣服 - $100,书 - $20。", "output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。" },
在进行指令监督微调时, instruction 列对应的内容会与 input 列对应的内容拼接后作为最终的人类输入,即人类输入为 instruction\ninput。而 output 列对应的内容为模型回答。
在上面的例子中,人类的最终输入是: 计算这些物品的总费用。
输入:汽车 - 3000,衣服−3000,衣服−100,书 - $20。
模型的回答是:汽车、衣服和书的总费用为 3000+3000+100 + 20=20=3120。
如果指定, system 列对应的内容将被作为系统提示词。
history 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意在指令监督微调时,历史消息中的回答内容也会被用于模型学习。
指令监督微调数据集 格式要求 如下:
In [ ]:
[ { "instruction": "人类指令(必填,最后的指令)", "input": "人类输入(选填)", "output": "模型回答(必填)", "system": "系统提示词(选填)", "history": [ ["第一轮指令(选填)", "第一轮回答(选填)"], ["第二轮指令(选填)", "第二轮回答(选填)"] ... ["第N轮指令(选填)", "第N轮回答(选填)"] ] } ]
下面是一个 alpaca 格式 多轮 对话的例子,对于单轮对话只需省略 history 列即可。
In [ ]:
[ { "instruction": "今天的天气怎么样?", "input": "", "output": "今天的天气不错,是晴天。", "history": [ [ "今天会下雨吗?", "今天不会下雨,是个好天气。" ], [ "今天适合出去玩吗?", "非常适合,空气质量很好。" ] ] } ]
ShareGPT
ShareGPT数据集可以适用不同的任务,如指令监督微调、偏好训练、OpenAI格式,ShareGPT 格式中的 KTO数据集(样例)和多模态数据集(样例) 与 Alpaca 格式的类似, 预训练数据集不支持 ShareGPT 格式。下面我们主要介绍指令监督微调数据集。
指令监督微调数据集
格式为:
In [ ]:
[ { "conversations": [ { "from": "human", "value": "人类指令" }, { "from": "function_call", "value": "工具参数" }, { "from": "observation", "value": "工具结果" }, { "from": "gpt", "value": "模型回答" } ], "system": "系统提示词(选填)", "tools": "工具描述(选填)" } ]
相比 alpaca 格式的数据集, sharegp