预训练主要是用来控制模型输出的内容,精调主要是用来控制模型输出的形式。
一 精调数据集质量要求
准备LLM精调数据集的关键方面:高质量和多样化。
- 精调数据不宜过短,并且指令和回答都必须使用标准的markdown格式。
- 对于指令,要保证问题多形性和很强的复杂性,这样有利于模型充分理解。
- 对于回答,回答的格式应统一,这样有利于提升精调的效果。
- 对于多轮数据,要保证对话内容的连贯性。
如何保证数据的高质量
如果一条数据作为one-shot能使得大模型有这个参考后比zeroshot提升很多,就认为这是一条高质量的数据。
如何保证数据的多样性
- 首先,我们将已有的数据作为正样本,待筛选的数据作为负样本
- 然后,使用DeBERTa模型构建一个二分类模型,以区分正样本和负样本。
- 接着,通过K-fold交叉验证来训练和评估模型。在每个fold的测试过程中,我们关注那些被模型认为与正样本(已有数据)差异最大的样本,即模型预测概率接近于0的样本。
- 最后,这些概率接近于0的样本被视为与已有数据不同的新数据。
二 精调数据格式
每条精调数据都是一个json对象。当前精调数据有两种格式,一种是单轮,另一种是多轮。
对于单轮数据,只有两个字段:instruction和output。其中,instruction是你要发给模型的指示;output是你期望模型返回的内容。举一个最简单的例子:
{
instruction: 使用python语言编写一个函数add,返回两个数字相加之后的和。
output: def add (i, j):\n return i+j
}
对于多轮数据,可以看成是用户与助手之间的连续对话内容:
1. `conversations`:一个列表,包含了多个对话条目,每个对话条目都表示了一次对话的内容。
2. 对话条目:
- `from`:表示对话的发起者,可以是 "human"(人类用户)或 "assistant"(助理)。
- `value`:表示对话的内容。对于人类用户,这是用户提出的问题或者请求;对于助理,这是对用户提出问题或请求的回应。
{
"conversations": [
{
"from": "human",
"value": "生成一副龙年的春联"
},
{
"from": "assistant",
"value": "上联:金龙献瑞,春风得意展宏图\n下联:玉兔呈祥,喜气洋洋迎新春"
},
{
"from": "human",
"value": "再来一副"
},
{
"from": "assistant",
"value": "上联:龙腾盛世,福满人间庆丰年\n下联:凤舞九天,春回大地迎新岁"
}
]},