引言挑战用于模型预训练的合成数据用于模型微调的合成数据增强指令多样性多轮模型微调 用于工具使用的微调领域特定微调微调文本嵌入用于模型对齐的合成数据用于评估LLM应用的合成数据使用LLMs的代理工作流检索增强生成 (RAG)结论
引言
合成数据指的是通过算法生成的人工数据,它模拟现实世界数据的特征和模式。合成数据生成是LLM备受推崇的应用之一,使用模型设计能够生成高质量数据样本的流水线是一项热门技能,其应用涵盖了从LLM预训练到LLM应用评估等多个方面。
但是,生成合成数据会遇到哪些挑战?哪些方法可以确保创建适合特定应用的高质量数据集?本博客旨在为你提供一个结构化的思维框架,以有效解决你的数据需求。
挑战
合成数据生成的根本目标是自动化数据整理过程,从而节省手动数据标注和整理所需的时间和成本。但在扩展合成数据生成方面存在许多挑战,其中包括:
- 确保生成样本的多样性:多样性是任何机器学习数据集的重要方面之一,无论是用于训练还是评估。LLM不追踪其过去的输入和输出知识。LLM也被训练以收敛,这意味着它们在给定输入文本时,生成的内容通常会遵循一条共同的路径。这两个因素使得使用LLM生成大量且具有多样性的数据变得具有挑战性。
- 与真实世界数据的分布差异:使用模型生成的合成数据可能无法理想地代表现实世界场景中观察到的数据分布。例如,用户的查询或对话可能不完整或充满语法错误,而使用LLM生成的合成数据大多完整且语法正确。
- 事实性和保真度:由于LLM固有的问题,例如幻觉(Huang et al.),确保合成数据的真实性和保真度具有挑战性。
- 偏见和公平性:LLM已被证明存在某些偏见(Gallegos et al.),这些模型生成的合成数据也会反映这些偏见。此外,在这些数据上训练的未来模型还可能放大这些偏见。
设计合成数据生成流水线的目标是利用各种技术克服这些挑战。接下来,我们将讨论为从模型预训练到LLM应用评估等应用生成高质量合成数据集的各种方法。
生成合成数据的过程因任务而异。但总的来说,其思想是向LLM提供任务规范、一套确保多样性的条件以及可选的少量示例来生成输出。在接下来的章节中,我们将深入探讨为不同任务合成生成数据集所提出的方法。
用于模型预训练的合成数据
使用自监督学习预训练基础模型的任务需要数十亿或数万亿个token的纯文本数据,具体取决于模型大小和预算。最近关于预训练基础模型的开放研究大多持续关注预训练数据集的质量。 一些近期模型,例如 o1.AI(Young et al.),将其卓越的模型质量归功于复杂的数据预处理和过滤流水线。
在使用合成数据生成进行LLM预训练方面,最重要的三项工作是来自微软研究院的 Tiny Stories(Eldan et al.)、phi 系列(Gunasekar et al. 和 Bubeck et al.)以及 cosmopedia(Allal et al.),后者是phi1.5的开放复现。
Tiny Stories论文专注于准备多样化的故事数据集,以预训练小型语言模型(参数小于10M),使其生成流畅连贯的文本。为了确保生成故事的多样性,首先准备了1500个单词,分为名词、形容词和动词。然后,对于每个故事生成,从每个类别中随机抽取3个单词,并提示LLM生成包含这些单词的故事。
虽然前述工作使用种子词确保多样性,phi系列和cosmopedia则通过限制主题和受众风格来确保多样性。Phi 1侧重于生成教科书式数据以提高小型语言模型的编码能力,而phi1.5和cosmopedia侧重于从小型的语言模型中引发更好的常识推理。为了增加生成的多样性,从Wikihow、可汗学院等网站提取了一系列主题。为了生成更多主题,对refined web等网络数据集进行聚类,并使用LLM从每个聚类中提取主题。通过使用受众风格实现了更高层次的多样性,受众风格指每个主题的目标受众画像,可以从高中生到大学教授不等。通过改变不同的目标受众,同一主题可以被多次重新利用,以生成多样化的数据。
合成数据在预训练中非常有用,并且在不久的将来可能会得到更多探索,我们甚至可以期待出现一个类似Chinchilla的定律,可用于计算模型预训练中合成数据与真实数据的正确混合比例。
用于模型微调的合成数据
模型微调或指令微调是为了使模型更好地理解和遵循用户给出的指令。用于执行此监督学习过程的数据形式为(指令,响应)对。如果模型需要与用户进行多轮对话,则每个数据点将包含多轮此类指令和响应对。合成数据已成为模型微调手动标注的有效替代方案,我们将讨论用于创建模型微调合成数据的大多数顶级工作和方法。在深入细节之前,概述一下,有三种用于合成指令微调数据的方法。
- 关键词驱动:此方法利用从多个来源收集或生成的种子主题或子主题作为关键词来生成指令和响应对。
- 角色驱动:角色描述被视为世界知识的载体,给定一段纯文本,可以使用LLM推断出与之相关的不同角色。这些角色可以在为任何给定任务生成指令时使用。
现在我们将深入探讨和讨论提出这些方法不同变体的方法和工作。
Self-instruct(Wang et al.)是指令微调合成数据生成方面最早期的工作之一。该工作使用175个种子指令集,通过对模型进行条件设置,使其基于随机选择的几个种子指令使用GPT3生成新的指令,从而引导生成更多指令。在这篇特定论文中,对于分类任务,首先固定输出标签,然后基于标签生成输入文本。为了避免重复,计算与已生成指令的rouge-l分数,并过滤掉高于特定阈值的样本。在此过程结束时,获得了包含5.2万对(指令,响应)的数据集。斯坦福 Alpaca(Taori et al.)后来使用类似的流水线与GPT 3.5模型形成了 Alpaca 数据集。Vicuna(Peng et al.)后来使用同一数据集查询GPT-4的响应,形成了 Vicuna 数据集。
增强指令多样性
2023年底,几项工作强调了指令多样性在微调数据集中的重要性。实现这一目标最流行的想法之一是通过改变数据集中指令的复杂程度。wizardLM论文(Xu et al.)提出的 evolve instruct 方法是这方面最有趣的工作之一,他们提出通过引入查询演化框架来提高SFT数据集的多样性,该框架通过具体化、增加约束、增强推理等转换方式来演化种子指令的复杂性。虽然wizardLM使用预定义的转换来演化指令,CodecLM(Wang et al.)提出的框架认为,这种通用转换可能无法泛化到各种领域的指令,并且也可能很模糊。相反,他们提出了自我评分标准。他们的工作从每个指令中提取元数据(用例和响应所需的技能),然后使用这些信息为复杂指令生成评分标准。
例如,对于一个用例是“商业计划开发”、技能是“市场研究和规划”的查询,诸如“添加推理步骤”这样的通用建议过于模糊且无帮助。相比之下,自我评分标准可以生成具体的行动,例如“添加 SWOT 分析”和“包含与市场竞争对手的比较”。
虽然上面讨论的工作侧重于修改指令复杂性和多样性,但像 orca( Mukherjee et al. & Mitra et al.)这样的工作则使用现有SFT数据集中的指令来采样带有解释的响应,以使小型LLM(7B至13B参数)达到与大型LLM(30B+参数)相同的推理水平。 Orc1引入了“解释风格微调”的概念,他们使用get 3.5和get 4为FLAN数据集中的指令采样解释风格的响应,形成orca数据集(5M样本)。这些响应是通过使用预定义的系统消息提示LLM来收集的,这些消息旨在引出推理步骤。
多轮模型微调
上面讨论的所有工作都生成单次指令-响应对。这不能用于微调模型进行有意义的多轮对话。 为了填补这一空白,Ultrachat( Ding et al.)提出了创建高质量、多样化多轮对话的流水线。创建数据集的方法是为不同对话类型(如信息查询(关于现有实体的提问)、信息转换(如摘要等任务)等)引导生成主题、实体等。然后使用LLM扮演用户和助手角色,在给定主题和对话类型下生成对话。该数据集中的每个对话可包含约3-7轮对话。
用于工具使用的微调
使用为使LLM在与用户对话时能够识别所需参数并将其传递给API而专门创建的数据集对语言模型进行微调,可以提高LLM的工具使用能力。Toolformer(Schick et al.)和 ToolAlpaca(Tang et al)等工作都使用通过将API文档输入给LLM来模拟工具使用实例合成的数据。
领域特定微调
合成数据生成对于提高模型更好地适应领域特定任务的能力非常有用。为了提高LLM的数学解题能力,Meta math论文(Yu et al.)使用从现有数据集(如GM8k)引导生成的问题作为种子问题,并利用一些特定于数学领域的转换(如自我验证等)来演化这些问题。这篇论文(Xu et al.)利用临床数据集中可用的知识图谱(KG)来生成合成的QA对。为了通过指令微调提高LLM的编码能力,Magic Coder(Wei et al.)提出了一个流水线,他们通过从代码文档语料库中采样1-15个连续行,并提示LLM使用这些行生成IR对。在此之上还进行了数据清洗和去污染。
微调文本嵌入
合成数据被广泛用于通过微调改进文本嵌入,以用于各种应用。使用对比损失微调嵌入模型将需要包含查询、正样本文档和负样本文档的样本。
在“使用LLMs改进文本嵌入”的工作中(Wang et al.),种子主题被用作关键词来生成查询。相应的查询的正样本文档和困难负样本文档通过提示LLM生成。 像M3和llama-index这样的工作则使用从各种来源采样的文档块,生成针对给定文档的查询,以使用 MultipleNegativesRankingLoss 进行模型微调。
用于模型对齐的合成数据
使语言模型的输出与共享的人类价值观对齐意味着确保诚实、有用和无害(HHH)。有几种方法被提出以实现这一目标,其中最流行的两种是带有人类反馈的强化学习(RLHF Ouyang at al.)和直接偏好优化(Rafailov et al.)。这两者都需要一个数据集,其中包含对每个指令的多个响应,并根据人类偏好进行排名。例如:
获取此类数据的显而易见的方法是对不同指令的不同响应进行标注和排名。合成数据生成方法已被证明是获取相同数据的有效替代方案。目前提出了两种主要方法,用于利用合成数据生成来整理这种格式的数据:
- 教师模型方法:此方法通常使用多个闭源和开源模型对在各种数据集中整理的指令进行采样,这些数据集在微调部分已有讨论。然后提示像GPT-4这样强大的模型充当教师模型,根据提供的评分标准对这些响应进行排名。
- 自我改进方法:在此方法中,首先使用LLM对数据集中的每个指令采样响应,然后使用同一模型对先前生成的响应提供反馈。然后将此反馈与初始响应一起再次输入模型,以改进响应。这个过程迭代进行,直到达到所需的质量。这个过程将产生一个数据集,可用于后续使用RLHF/DPO训练模型。
Vicuna(Peng et al.)、GRATH(Chen et al.)和 UltraFeedback(Cui et al.)等工作采用了教师模型方法。Vicuna使用各种开源模型对alpaca 52k数据集中的指令进行多重响应采样。然后使用GPT-4对这些响应进行排名,形成RLHF数据集。GRATH专注于使用DPO提高LLMs的真实性,为此,他们为hellswag、MMLU等数据集中的每个指令生成一对正确和不正确的响应。类似的方法也用于(Castricato et al.)中。当指示LLMs避免讨论某个实体(“粉色大象”)而讨论另一个偏好的实体(“灰色大象”)时,大多数LLMs在一定数量的对话后倾向于忘记这个给定的约束。这项工作旨在对齐LLMs,以提高模型在这一特定方向上的能力。为此,使用种子主题和子主题作为关键词来合成包含期望响应和非期望响应的对话,这些对话随后用于DPO训练。
UltraFeedback使用了一个流水线,其中从Ultrachat和Sharegpt等数据集中采样指令,并使用GPT-4对这些响应进行评分、评论和排名。排名后的响应构成了用于训练奖励模型的数据集。自由形式的反馈也被用于微调一个评论模型,该模型可以为模型响应提供反馈。
rDPO(Gallego et al.)和 Configurable safety tuning for LLMs(Gallego et al.)使用自我改进方法来构建对齐数据集。rDPO使用 Harmful Behavior(Zou et al.)等数据集中的指令,使用Mixtral模型采样响应。然后进行评论和逐步修改,以提高响应的安全性。Configurable safety tuning for LLMs旨在训练语言模型,使其安全偏好可以在运行时通过系统提示进行配置。为此,他们首先从模型中采样未经审查的响应,然后将其改进以形成安全的响应。DPO训练通过根据系统提示修改响应来进行。
用于评估LLM应用的合成数据
评估和测试LLM应用也是将LLM投入生产的关键部分。手动整理数据具有挑战性,而合成数据可以加快这一过程,并在最少人工监督的情况下帮助模拟测试数据点。
使用LLMs的代理工作流
在此评估AI代理是指评估LLM的API调用能力。虽然像Toolformer这样的工作使用静态预定义的对话历史来评估LLM的API调用能力,但目前有一种趋势是通过合成生成测试用例来自动化评估LLM的API调用能力。AutoDE(Mu et al.)使用合成数据生成进行AI代理的动态评估,这也将提高测试用例的覆盖率。具体做法是,首先使用LLM从API文档中合成一个用户脚本。用户脚本为对话提供了基本背景,如图所示。然后提示LLM充当用户代理,根据提供的用户脚本生成对话。这些包含事实真相(带标签的API调用)的对话随后用于评估LLM的API调用能力。在他们的实验中,他们发现这种方法与人工评估也具有高度相关性。
检索增强生成 (RAG)
RAG是LLMs最流行的应用之一,许多工作提出了不同的方法和指标来自动化RAG系统的评估。自动化RAG的评估也需要从给定文档集中合成生成问题-答案对。最简单的方法之一是将文档块输入LLM并提示它从中创建QA对。另一种方法由( Guinet et al.)提出,利用文档创建多项选择题-答案对。
简单方法的陷阱
但从随机文档块或文档中生成有针对性的QA对可能会导致测试数据集质量不佳,因为
1. 这种方法无法从给定的文档集中创建任何多跳查询。
2. 从预定义块创建的QA将偏向于预定义的块大小,这在大多数情况下也用于构建RAG。因此,与实际生产场景相比,更有可能获得正确的块。
3. 通过对随机块上的LLM进行条件设置生成的问题大多数情况下过于具体,很难反映生产中遇到的情况。
4. 这种方法能创建的问题的性质和多样性非常有限,因为LLM仅暴露了整个数据库中包含多个甚至可能相互关联的文档的部分信息。
基于KG的方法
由 ragas 提出的合成测试数据生成试图通过使用基于知识图谱的算法生成多样化的合成QA对来解决这些挑战。其核心思想是探索文档,并利用从每个文档提取的信息将相互关联的文档连接起来。一旦形成知识图谱,就可以通过探索形成的关联并向LLM提供适当的上下文来生成不同类型的问题-答案对。该算法在创建问题时还引入了不同的类型、风格和角色。
具体来说,如果我们知道文档 A 和文档 B 有一些共同的实体,我们可以安全地假设这两个文档有一些共同之处,从而可以合成一个多跳问题。
问题类型大致分为两类
- 单跳:单跳查询是一个直接的问题,需要从单个文档或来源检索信息以提供相关答案。它只需要一个步骤就能得到答案。
- 多跳:多跳查询涉及多个推理步骤,需要来自两个或更多文档块的信息。系统必须从各种文档中检索信息,并将这些点连接起来以生成准确的答案。
让我们看看如何使用 ragas 的高级 API 从给定的文档集中创建查询。
- 安装 ragas python 库
pip install ragas
- 使用 langchain/llama-index 文档加载器加载文档并运行测试生成。请参阅此处的入门指南。
from ragas.testset import TestsetGenerator generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings) dataset = generator.generate_with_langchain_docs(docs, testset_size=10)
这使用了默认设置来探索文档关系和查询类型等,所有这些都可以根据你的要求进行定制。请此处了解更多。
结论
通过本文,我们讨论了许多用于为不同任务合成生成数据集的方法。从抽象层面来看,无论任务如何,肯定有一些可以识别的模式在每种方法中都被重复使用,但也存在一些特定于任务和领域的方法。未来,我们可以期待更多此类方法,甚至将合成数据生成扩展到多模态。
这篇博客是我们一年多以来在合成数据生成方面进行研究和实验的结果,其应用范围从模型训练到LLM应用评估。请在X 和 Linkedin 上关注我们以获取更多信息。