大模型指令微调: 从零学会炼丹
系列目录
文章目录
第一章: 微调数据集构建
Alpaca 格式
Alpaca格式是一种用于指令微调大模型的数据集格式。其主要有以下特点和结构:
- 基本结构与组成部分:
- instruction(指令):这是对模型的具体指令或任务描述,告诉模型需要完成什么样的任务,例如“用‘黎明’、‘天空’和‘广阔’这三个词组成一个句子”“解释一下相对论的基本原理”等。
- input(输入,可选):一些任务可能需要额外的输入信息,该部分为模型提供了除指令之外的相关输入内容。比如在“计算这些物品的总费用”的指令中,输入部分可以是“汽车-$3000,衣服-$100,书-$20”这样的具体物品价格信息。但不是所有的指令都需要输入部分,如果指令本身已经足够明确,不需要额外信息,那么这部分可以为空。
- output(输出):这是模型根据指令和输入所生成的回答或结果。例如对于上述两个例子,对应的输出分别是“随着黎明的到来,天空逐渐明亮,一片广阔的视野展现在眼前。”和“汽车、衣服和书的总费用为$3000 + $100 + $20 = $3120。”
- 数据存储形式:通常以 JSON 文件格式存储。这样方便数据的读取、处理和在不同的机器学习框架中使用。例如一个简单的 Alpaca 格式的 JSON 数据示例如下:
[
{
"instruction": "用“梦想”、“坚持”和“成功”这三个词组成一个句子。",
"input": "",
"output": "只有坚持追逐梦想,才能最终取得成功。"
},
{
"instruction": "对《三国演义》这本书做一个简短的介绍。",
"input": "",
"output": "《三国演义》是中国古典四大名著之一,描写了从东汉末年到西晋初年之间近百年的历史风云,诉说了东汉末年的群雄割据混战和魏、蜀、吴三国之间的政治和军事斗争,塑造了一群叱咤风云的三国英雄人物。"
}
]
- 适用场景:适合于指令跟随形式的任务,即让模型按照给定的指令进行回答或操作。这种格式可以帮助模型更好地理解人类的指令意图,从而提高模型在各种任务上的表现,例如文本生成、问答、推理计算等任务。
总的来说,Alpaca 格式为大模型的指令微调提供了一种有效的数据组织方式,通过大量的指令数据对模型进行训练,可以使模型更好地适应各种具体的任务需求。不过,在实际应用中,可能需要根据具体的任务和模型对数据进行进一步的清洗、筛选和优化。
编写Instruction
- 因为我们的任务只有一个, 所以可以直接编写一个instruction, 后续直接加载到对应的数据集中即可
- 对于多种任务的场景, 可以将instruction 作为一列放到数据集中
instruction-key
#Role
You are a professional, rigorous and efficient data analyst. You are good at using professional knowledge in the computer field and rich background knowledge to quickly and accurately find the matching and non-matching parts from the given [BOM] table and [def] table, and output the results in a standardized format.
读取本地数据
在本地构建了一个带有input 和output 的数据文件, 通过pandas 和 datasets 读取并将其转换为dataset格式
import pandas as pd
from datasets import Dataset
excel_data = pd.read_excel('your_excel_file_path.xlsx')
dataset = Dataset.from_pandas(excel_data)
定义format 函数
为了指导我们的模型,我们需要将我们的结构化示例转换为通过指令描述的任务集合。我们定义一个 formatting_function
,它接受一个样本并返回一个符合格式指令的字符串。
def create_prompt_template(data):
INTRO_BLURB = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
INPUT_KEY = "### Input:"
RESPONSE_KEY = "### Output:"
END_KEY = "### End"
blurb = f"\n{INTRO_BLURB}\n{instruction_key}"
input = f"{INPUT_KEY}\n{data['input']}"
response = f"{RESPONSE_KEY}\n{data['output']}"
end = f"{END_KEY}"
parts = [part for part in [blurb, input, response, end] if part]
formatted_prompt = "\n\n".join(parts)
data["text"] = formatted_prompt
return data
使用以上的方法可以将一行数据中的input
,output
结合prompt
整合为一段完整的指令, 后续调用这个数据进行微调