如何构造私有的大模型微调数据集
背景
典型数据集构造流程是人工从多个来源收集原始数据 → 清洗、处理并构建成“输入-输出”配对样本 → 最终组合成可供模型学习的数据集。痛点:流程重复繁杂,效率低。新趋势通过人工智能自动收集数据 →清洗构造数据。
私有数据要注意的问题
私有的数据集由于数据问题可能会产生一系列问题
- 数据集样本数量太少 - 数据量不足导致模型无法充分学习
# 问题:只有8个卦象的训练数据
training_data = [{"content": "乾卦", "summary": "导入遵守天道的德行"},{"content": "坤卦", "summary": "遵循正道,获取吉利"},# ... 只有6个其他卦象
]# 结果:模型无法学习其他56个卦象的知识
# 当用户问"蒙卦的含义是什么?"时,模型无法正确回答
就像只背了8个英语单词就去考英语四级,遇到没背过的单词就完全不会。
- 训练过拟合 - 模型过度记忆训练数据,泛化能力差
# 问题:模型过度记忆训练数据的特定模式
# 训练数据中"?"总是对应"追求,能够成功,婚姻美满"# 当输入任何包含"?"的问题时:
输入:"屯卦在教育中有什么意义?"
模型输出:"追求,能够成功,婚姻美满" # 错误!应该输出屯卦的教育意义输入:"师卦在军事中代表什么?"
模型输出:"追求,能够成功,婚姻美满" # 完全错误!
模型变成了"死记硬背的学渣",只会套用记忆的模板,不会真正理解内容。
- 训练数据多样性缺失 - 样本类型单一,缺乏变化
# 问题:所有问题的提问方式都类似
问题样本 = ["诸指法象卦的含义","象卦在周易哲学中扮演什么角色", "够成功,婚姻美满。'?'代表什么",# 缺乏多样化的提问方式
]# 缺少以下类型的提问:
# - "请解释一下蒙卦的核心思想"
# - "蒙卦在现实生活中有哪些应用"
# - "如何理解蒙卦中的教育智慧"
# - "蒙卦与其他卦象有什么关系"
模型只能理解特定格式的提问,遇到真实用户的各种自然语言提问时就无法应对。
- 训练集样本质量问题 - 数据标注不准确或内容质量低
# 问题数据示例:
问题数据 = {"content": "婚美满。'?'在周易中是什么象征", # 问题不完整,语义不清"summary": "追求,能够成功,婚姻美满" # 回答与问题不匹配,且重复使用
}# 对比优质数据:
优质数据 = {"content": "蒙卦在教育启蒙方面有什么启示","summary": "蒙卦象征着教育启蒙的智慧,山下出泉意味着从蒙昧到通达的过程,强调教育在事物发展初期的重要性"
}
使用 LangChain + GPT-3.5-Turbo 生成私有训练数据样例
1、提取content和summary
LangChain封装了OpenAI的接口如下,不建议直接用OpenAI原生的。
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain.prompts.chat import (ChatPromptTemplate,HumanMessagePromptTemplate,SystemMessagePromptTemplate,
)
chat = ChatOpenAI(model="gpt-3.5-turbo-1106",temperature=1,max_tokens=4095,top_p=1,frequency_penalty=0,presence_penalty=0)# 定义系统系统角色:提示词(缺失的部分)
system_content = """你是一个专业的文本处理助手。
你的任务是将提供的文本内容进行分析和整理。
请按照以下要求处理文本:..."""# 原始数据(通过爬虫或其他发那个是获取数据,通过代码读取到代码中)
raw_content = "除非是教育启蒙的智慧,因为山、坎为泉。山下出泉,泉水始流出山,则必将渐汇成江河,正如蒙籍渐启。又山下有险,因为有险停止不前,所以蒙昧不明。事物发展的初期阶段,必然蒙昧。"messages = {SystemMessage(content=system_content),HumanMessage(content=raw_content),
}al_message = chat(message)
# 解析生成的数据
text = ai_message.content# 分割字符串来找到content和summary的位置
content_start = text.find('content:') + len('content:')
content_end = text.find('\nsummary:')
summary_start = text.find('summary:') + len('summary:')
summary_end = text.rfind('')# 提取并存储content和summary
content = text[content_start:content_end].strip()
summary = text[summary_start:summary_end].strip()print("Content:", content)
print("Summary:", summary)
2、增强content可能性
除了蒙卦,用户可能还会问许多不同的问题都对应同一个summary,可以利用AI提供不同问题。
如提问AI:实际用户提问的时候,不会直接说"蒙卦"。因此,你给出20种可能提问的方式,并将这20种提问与原来的summary分别组成共20条记录,并写入“zhouyidatasetcsv”文件。
要注意AI生成的代码需要检查正确性。
3、保持生成数据的稳定性
AI生成的al_message内容可能不稳定,不一定每次都是contend和summary,需要保证生成数据的稳定性。
- 可以通过增强提示词Prompt Engineering
system_content="""你是中国古典哲学大师,尤其擅长周易的哲学解读。接下来,你收到的都是关于周易对象的解释,你需要整理前台,并生成用于大模型训练的内容和格式。示例输入:师卦,此卦是异卦相叠,下卦为坎,上卦为坤。"师"指军队。坎为水,为险;坤为地,为顺,喻寓兵于农。兵凶战危,用兵乃圣人不得已而为之,但它可以顺师卦位于讼卦之后,《序卦》之中这样解释道:"讼必有众起,故受之以师。师者,众也。"争讼的人越来越多,以致形成了军队。期待结果:content:"师卦"
summary:"在周易中,师卦是一个极具深意的卦象,它由两个异卦相叠组成:下卦坎(水)和上卦坤(地)。这一卦象代表"师",即军队,寓意着兵力和农力。师卦的核心哲学是:虽然兵力代表着危险和战争,但其使用应当是圣人不得已而为之的最后手段。在正确的情况下,军事力量可以顺应形势,将危险转化为吉凶。师卦紧随讼卦(争讼卦),在《序卦》中解释为"讼必有众起,故受之以师"。这意味着争端激化至众多人群的参与,形成了类似军队的集体力量。返回格式要求:
content:"(卦名)
summary:"(内容)"""
