如何准备有价值的训练数据
开始之前
当您看到这篇文档,您需要提前知道一个很重要的事情:
SFT是教模型解决问题的方法,而不是一个问题对应一个答案,我们需要让模型学会中间的推理步骤,这样才能训练一个真正解决业务场景的模型。
举一个通俗的例子,假设我们希望训练一个模型来解决以下问题:
问题:小明有10个苹果,他给了小红3个苹果。问小明还剩多少个苹果?
如果我们只是提供问题和答案对,比如问题是“小明有10个苹果,他给了小红3个苹果。问小明还剩多少个苹果?”,答案是“7个苹果”,那么模型可能只会记住这个特定问题的答案,而不是学会解决类似问题的方法。
为了让模型学会中间的推理步骤,我们可以通过逐步分解问题来训练模型:
- 理解问题:识别关键信息,小明最初有10个苹果,他给了3个苹果。
- 设定方程:可以用减法来表示这个场景:10 - 3。
- 计算结果:执行减法计算,得到结果:7。
- 验证结果:确保计算过程和问题逻辑是正确的。
通过这种方式,模型不仅能解决这个具体的问题,还能应用相同的推理过程来解决类似的问题,比如“杰克有15个橙子,他吃掉了5个,问杰克还剩多少个橙子?”
使用这种方法,模型就像在学习一个解决问题的通用策略,而不是仅仅记住每个问题的答案。
好的,带着这个知识,我们来看看如何准备有价值的训练数据吧。
一、什么是有价值的训练数据?
首先,什么是训练数据呢?
SFT的训练数据,通常为(System,Prompt,Response)语料,其中System为选填字段。System、Prompt和Response通常指代不同的对话元素,它们的结构与作用如下:
1. System: System字段的内容通常用来设定对话的背景或提供特定的指导。它定义了模型的角色、行为准则或对话的上下文。例如,系统信息可以指示模型以礼貌的方式回答问题,或者假设特定的专业领域背景。这部分有助于一致性地塑造模型的输出风格和内容。
2. Prompt: Prompt的内容是用户输入的内容或问题。它是由用户提供的文本,模型需要基于此生成一个合适的响应。Prompt可以是一个问题、请求或任何其他类型的输入,模型将根据这个输入来进行推理和回答。
3. Response: Response是模型生成的输出或回答。基于System设定的背景和Prompt提供的信息,模型会生成一个相应的回答。这部分是模型的实际输出,是用户与模型交互的直接结果。
这种结构化的格式帮助在训练和实际应用中明确地传达各部分的角色和功能,从而提高交互的准确性和有效性。
那么,什么是有价值的训练数据呢?
-
从整体上看:
- 在一般的场景中,通常准备一千条以上的训练数据进行训练,即可发挥良好的效果。
-
从单独一条的训练数据上看:
- 请保证用户Prompt的意图清晰、数据质量优;
- 请保证Response完全遵循用户指令,且Prompt与Response一定要一一对齐。
建议优先采用文心一言系列模型构建SFT数据:构建Prompt后通过调用文心一言系列模型,由一言自己生成的数据。
那么,什么是意图清晰、数据质量优的Prompt呢?
一段Prompt主要由四部分组成,即任务定义、输出要求、上下文、输入。下图将对prompt模板组成各部分进行解释,并以「为用户指定旅游攻略」这一任务为例,构造一个基础的prompt。
-
指令保证格式清晰、用词准确
-
格式清晰,正确使用分隔符和换行、分点描述、强调词
- 分隔符和换行:Prompt的任务、输出要求、上下文等各部分之间,请用换行符、分隔符(如###;`
;【】等)进行区隔。
- 分点描述:对模型的输出要求较多时,建议将要求进行分点描述,保证格式清晰。
- 强调词:对于模型应当特别关注的约束条件,可以在描述前添加「注意」,表示强调;或使用markdown语法中表明加粗强调的**符号进行包裹。
- 分隔符和换行:Prompt的任务、输出要求、上下文等各部分之间,请用换行符、分隔符(如###;`
-
表述清晰,可将复杂句子拆解为多个简单分句进行描述
- 复杂句子可通过多次使用简单任务句式进行表述,以达到表述清晰的目的。
-
表述正确,避免病句
- 请避免Prompt中出现成分残缺、搭配不当、语序不当、句式杂糅、前后矛盾、词语误用、歧义表述 等病句,避免模型理解错误。
-
-
明确输出要求
-
给模型一个适合任务的角色
- 为模型指定一个适合目标任务的优质角色,可以让模型在回答问题时更多选择优质训练数据,以保证回答质量。指定角色时请注意应当明确角色 擅长的领域、做事原则、行为规范。
-
明确「应该做」「不应该做」的
- 明确约束要求:明确本次处理必须遵守或不要遵守的要求
- 明确对参考信息的依赖程度:输出内容是严格按照材料还是根据材料自由发挥
- 强制令遵循:通过强指令遵循,强调输出内容的语言风格,可以使用条件句、祈使句
-
对复杂要求描述清晰详细
- 当模型无法遵循Prompt中的某个要求时,可以尝试针对该要求添加更详细描述。
-
-
为模型提供参考和示例
-
给模型一些参考信息,并引导模型使用
- 为模型提供一些和任务相关的参考信息,并且在指令中引导模型使用这些参考信息。
-
提供「示例」作为参考
- 示例是提供给文心大模型的完整输入输出的样本演示。示例并不是用户必须构造的内容,但建议用户在构造Prompt时给出一到多个示例以供模型学习,具体要求如下:
- 准确无误:示例应是有代表性的输入输出示范,且确保内容、风格、格式准确无误
- 符合实际要求:示例中的输入输出与实际请求的输入输出应确保一致
- 可提供多组示例:如果有多种不同的输入输出情况,可以给出多组示例
-
-
引导模型用思维链进行思考(CoT,Chain of Thoughts)
-
告诉模型按特定步骤输出
- 用户指定完成当前任务所需的步骤,这是提高模型效率和准确度的关键方法。若想向模型描述清执行步骤,需要注意:
- 任务描述:在任务部分即说明分步骤进行思考,要求模型先根据参考信息、要求、输入等先输出阶段产出,再根据参考信息、要求、输入、阶段产出,输出最终产出。
- 格式模板:指定完成当前任务所需的中间步骤,让模型增加思考步骤,减少输出失真。输出格式可视需求而定。
-
引导模型在得出结论前重新思考
- 在模型贸然得出结论之前,引导模型重新思考一遍问题,可以避免模型对问题的误判。
-
这边为您标准的PromptCase,您可以基于这个格式,根据自己的场景,做一些内容的修改:
简单场景PromptCase:一些的简单直觉性任务,无需大模型进行复杂的逻辑思考,场景清晰且任务简单,可以Prompt中写出“请直接输出改写后的内容,不要添加任何额外的内容。”但事实上,这样的指令还是会导致破坏大模型自身的推理能力,不建议您写类似这样的内容。
请将用户的输入进行改写,使其符合软萌甜妹的人设。
**示例**:
用户输入:这狗真可爱
改写输出:哎呀,这个小狗狗真是可爱到爆啦!(≧◡≦) 我可以抱一下咩~
**改写要求**:
1. 改写后的内容需要保持原意,不要改变核心信息。
2. 改写后的内容需要符合软萌甜妹的人设。
3. 可以添加一些可爱的文字表情或者语气词,增添一种可爱的氛围。
**用户输入**
{query}
---
请参考以上改写要求和示例对用户输入进行改写,请直接输出改写后的内容,不要添加任何额外的内容。
复杂场景PromptCase:类似于判断两个时间点之间的小时数,如果我们只给一些时间点作为输入,然后给到一个小时数作为输出,作为大模型很难学习到计算的流程,进而很难有很好的期望表现。因此,我们需要在Prompt有输出的角色引导、正向以及负向的输出要求、参考的示例、以及思维链的引导等内容。
# 时间间隔判断任务
## 任务描述
请编写一个Prompt,用于判断两个时间点之间的小时数。需要确保格式清晰、用词准确,使模型能够准确理解并执行任务。
## 输出要求
1. **角色设定**:
- 你是一位专门处理时间计算的智能助手,擅长时间管理和日历计算。
- 你的首要目标是准确计算时间间隔,以小时为单位。
2. **具体要求**:
- **应该做**:
- 计算两个时间点之间的总小时数。
- 提供详细的计算过程。
- 输出结果需以用户友好的方式呈现。
- **不应该做**:
- 不要忽略任何时间单位的转换。
- 不要提供与时间间隔无关的信息。
3. **参考信息依赖**:
- 严格根据用户输入的两个时间点进行计算。
## 示例
**示例输入**:
- 开始时间:2023年10月1日 08:00:00
- 结束时间:2023年10月3日 10:30:45
**示例输出**:
### 小时数计算
- 总小时数:50小时
### 计算过程
1. 从2023年10月1日 08:00到2023年10月2日 08:00,共计24小时。
2. 从2023年10月2日 08:00到2023年10月3日 08:00,再加24小时。
3. 从2023年10月3日 08:00到2023年10月3日 10:30,共计2小时。
4. 综合计算:24小时 + 24小时 + 2小时 = 50小时。
## 思维链引导
请按照以下步骤进行思考和计算:
1. **第一步**:根据输入的开始和结束时间,识别时间间隔。
2. **第二步**:将时间间隔转换为小时数,确保计算准确。
3. **第三步**:综合计算总小时数。
4. **第四步**:检查计算过程,确保无误后输出结果。
通过以上步骤,确保准确得出总小时数,并以清晰的格式呈现给用户。
### 输入
那么,什么是质量高的Response呢?
- 确保数据中Response严格遵循指令、示例要求:必须保证指令中的每一条限定要求,在回复中均被满足(即便指令中使用了「你可以」「建议你」此类模糊的修饰)。
- 确保回复的事实准确性:确保回复中的每个客观事实均正确、无幻觉。注意,数据不仅要符合业务逻辑,也要符合普遍常识。
- 描述简明易懂:复杂任务描述语句可拆解为多个简单短句,便于描述和理解。
- Response内容表述正确:无重复和冗余、语言表达正确、逻辑自洽、标点使用正确。
- 确保回复的价值观正确、安全合规。
上面的内容为Response的基础原则,距离质量高的Response还有一定差距,质量高的Response应具备:
- 提升内容丰富度:提升回复内容的全面性、丰富性、格式优美性、语言吸引力等。
- 合理分布数据比例,提升数据的覆盖面(尤其是边界情况):确保数据的分布合理,比如正负例比例,不同的任务分支出现的比例。类比于代码测试,数据也应该尽可能覆盖到每一个分支和每一种边界情况。
二、如何准备有价值的训练数据?
如果您是初次接触模型精调训练,以下是一份新手指南,帮助您顺利开启训练数据的筹备之旅:
- 明确目标与场景,构建Prompt模板:您首先要明确业务场景、目标及期望的模型答复,以此为导向准备高质量训练数据集。例如,若需为客服对话打标签,需明确标签种类及层级关系,并在Prompt中准确表述。基于业务场景和目标,遵循上述Prompt规范,构建具有方法指引的Prompt模板。
-
数据集构造:
- 格式选择:请遵循千帆SFT数据集格式规范准备数据,有两种数据格式供您选择:Prompt+Response或Role(user+assistant)。下载对应的样例模板作为参考,可以帮助您高效准备数据。
- 构造Prompt:请评估是否存在现有业务数据可用于构建训练数据集。若有业务数据,您可将业务数据输入部分与Prompt模板结合,输出部分作为Response,贴合业务场景的数据集通常训练效果更佳。若无业务数据,您可结合场景编写一些Prompt,作为无标注数据使用。
- 数据上传与高效标注:请将符合要求的数据集上传至平台。若标注信息不完整,您可根据实际情况在平台上灵活选择标注方式:在线标注、多人标注和众测标注。为提升标注效率和质量,我们建议您使用大模型(推荐ERNIE 4.0)自动标注,并对标注结果进行人工复核。
-
数据处理与筛选:数据集的质量对于模型训练的效果起着至关重要的作用。为提升训练效果,您可以在千帆平台“数据洞察与处理”模块对样本进行精细化的处理和筛选。您可以根据数据集情况选择使用以下功能:
- 数据增强(扩充样本数):建议训练数据量至少一千条。若您的样本不足,可利用平台数据增强功能自动生成符合业务场景的训练数据,增强前请至少准备20条样本。
- 数据清洗:若您的数据中包含脏数据或隐私数据,您可以创建清洗任务,并根据实际需求灵活配置清洗流程,包括处理异常项、过滤色情及暴力样本、去重、去除隐私信息等。
- 数据洞察:若您需要筛选适配业务场景的高质量样本,数据洞察为您提供了一个多方位诊断、精细化操作的数据集工作台。平台内置的直方图功能,能够直观地展示样本分布情况。在此基础上,您可以便捷地进行编辑与筛选。借助多维指标粗筛,快速缩小样本范围;结合人工精筛,进一步剔除低质样本。您也可以将满意的数据样本保存至新的数据集,然后将精心准备的新数据集用作训练集,启动训练流程。
此外,还有一种进阶的训练数据集构建方式:模型蒸馏。如果您的业务场景可以通过ERNIE 4.0等旗舰大模型直接满足需求,但考虑到成本和时延等问题,希望能训练一个相对轻量的大模型(ERNIE Speed/ERNIE Lite/ERNIE Tiny),则可以使用旗舰大模型推理产生的真实业务数据来训练轻量大模型,具体实践方式可以参考精调样板间。