数据集质量的重要性
在大语言模型(LLM)的开发过程中,数据是最宝贵的资产。虽然我们无法像评估模型那样直接评估数据集,但高质量的数据集通常具有以下特征:
- 准确性: 样本应当事实准确、对用户有帮助,并且措辞得当。回答也应与对应的指令相关。
- 多样性: 为了确保模型能正确理解指令并给出相关答案,我们需要覆盖尽可能多的用例。这要求在主题、语境、长度、写作风格等方面进行具有代表性的采样。
- 复杂性: 回答不应过于简单,而应代表您希望模型处理的任务类型,或包含涉及多步推理、规划等的复杂任务。
对于数学问题,使用Python解释器可以很容易地衡量准确性。但对于开放式的主观问题,这几乎是不可能的。另一方面,按主题对数据集进行聚类是衡量多样性的好方法。最后,可以使用其他LLM作为评判来评估复杂性。
开放的SFT数据集
一旦模型在下一个标记预测任务上进行了预训练,就需要通过监督微调将其转变为能够回答问题和完成任务的助手。这些数据集包含指令和输出对,用于训练LLM超越其预训练目标。这里列出的所有数据集都应该采用宽松的许可证(Apache 2.0、MIT、cc-by-4.0等)。
通用数据集
通用数据集的目标是通过让模型接触广泛的高质量数据,将基础模型转变为多才多艺、能力出众的助手。这些数据集通常包括真实世界和合成数据的多样化组合,通常使用GPT-4等模型生成。
以下是一些代表性的通用数据集:
- Buzz: 包含31.2M个样本,是435个数据集的巨大集合,采用了数据增强、去重等技术。
- WebInstructSub: 包含2.39M个样本,通过从Common Crawl检索文档、提取问答对并进行精炼而创建的指令。
- The-Tome: 包含1.75M个样本,是经过重新排序和筛选的数据集集合,重点关注指令遵循。
- Hercules v4.5: 包含1.72M个样本,是一个大规模通用数据集,包含数学、代码、角色扮演等内容。
- WildChat-1M: 包含1.04M个样本,是真实用户与GPT-3.5/4之间的对话,包括元数据。
数学与逻辑数据集
LLM在数学推理和形式逻辑方面往往存在困难,这促使了专门数据集的创建。这些数据集超越了纯数学,涵盖了需要系统思维和逐步推理的广泛问题,最终使LLM能够处理涉及逻辑推理和定量分析的复杂现实世界挑战。
一些代表性的数学与逻辑数据集包括:
- OpenMathInstruct-1: 包含5.75M个样本,来自GSM8K和MATH的问题,解决方案由Mixtral-8x7B生成。
- MetaMathQA: 包含395k个样本,通过从多个角度重写数学问题来引导数学问题。
- MathInstruct: 包含262k个样本,从13个数学推理数据集编译而成,其中6个是新策划的,重点关注思维链和思维程序。
- Orca-Math: 包含200k个样本,使用GPT4-Turbo生成的小学数学应用题。
这些数据集旨在增强LLM的数学推理能力,使其能够解决更复杂的数学问题和逻辑挑战。
代码数据集
对于缺乏专门预训练的LLM来说,代码是另一个具有挑战性的领域。代码数据集包含多种编程语言的示例,用于微调LLM并增强其理解、生成和分析代码的能力,使其能够作为有效的编码助手。
一些值得注意的代码数据集包括:
- CodeFeedback-Filtered-Instruction: 包含157k个样本,是Magicoder-OSS-Instruct、ShareGPT(Python)、Magicoder-Evol-Instruct和Evol-Instruct-Code的过滤版本。
- Tested-143k-Python-Alpaca: 包含143k个样本,是通过自动测试确保高质量的生成Python代码集合。
- glaive-code-assistant: 包含136k个样本,是问题和解决方案的合成数据,其中约60%是Python样本。
- Magicoder-Evol-Instruct-110K: 包含110k个样本,是evol-codealpaca-v1的去污染版本。
这些数据集旨在提高LLM在代码理解、生成和分析方面的能力,使其成为更有效的编程助手。
对话和角色扮演数据集
许多数据集专注于指令和输出对,但聊天模型通常用于对话设置。对话和角色扮演数据集让LLM接触到真实对话的模式、细微差别和上下文相关性,使其能够生成更自然、更具吸引力的对话。
一些代表性的对话和角色扮演数据集包括:
- Bluemoon: 包含290k个样本,是由第三方清理和抓取的蓝月角色扮演论坛的帖子。
- PIPPA: 包含16.8k个样本,是Pygmalion的PIPPA数据集的去重版本,采用ShareGPT格式。
- Capybara: 包含16k个样本,强调在广泛的领域中的信息多样性,包含多轮对话。
- Pure-Dove: 包含3.86k个样本,是经过高度过滤的GPT-4和真人之间的多轮对话。
这些数据集有助于提高LLM在对话和角色扮演场景中的表现,使其能够生成更自然、更有吸引力的对话。
数据处理工具
创建高质量数据集的关键在于仔细策划一组相关、准确和信息丰富的多样化示例,而不是简单地最大化数据集大小。
开始时,可以从各种来源(开源或非开源)聚合可用数据,并应用数据去重和数据质量过滤等过滤器。如果初始数据集较小或不足,可以考虑综合生成额外数据,以反映其质量和风格。通过评估模型性能、识别差距以及收集或生成数据来解决这些不足,迭代探索和改进数据集。
以下是一些有用的数据处理工具:
数据去重和去污染
- 精确去重: 通过数据规范化(如将文本转换为小写)、哈希生成(如为每个样本创建MD5或SHA-256哈希)和重复删除来移除相同的样本。
- 模糊去重:
- MinHash: 使用哈希、排序和Jaccard相似度进行模糊去重(首选技术)。
- BLOOM过滤器: 使用哈希和固定大小向量进行模糊去重。
- 去污染: 使用精确或模糊过滤移除与测试集过于接近的样本。
数据质量评估
- 基于规则的过滤: 根据不需要的词列表删除样本,如拒绝和"作为AI助手"等。
- Argilla: 开源数据策划平台,允许以协作方式过滤和注释数据集。
- LLM-as-a-judge: 提供使用Mixtral-7x8B评级输出的代码的Colab笔记本。
- Data Prep Kit: 用于代码和语言数据准备的框架,具有Python、Ray和Spark模块,适用于从笔记本电脑到数据中心的广泛规模。
- DataTrove: HuggingFace的大规模数据处理库,用于创建Fineweb等数据集。
数据生成
对于SFT数据集:
- Distilabel: 可以使用UltraFeedback和DEITA等技术生成和增强数据(SFT、DPO)的通用框架。
- Auto Data: 使用API模型自动生成微调数据集的轻量级库。
- Bonito: 用于为您的数据生成合成指令调优数据集的库,无需GPT。
- Augmentoolkit: 使用开源和闭源模型将原始文本转换为数据集的框架。
- Magpie: 通过提示对齐的LLM来高效生成高质量合成数据的管道。
- Genstruct: 设计用于从原始数据生成有效指令的指令生成模型。
- DataDreamer: 用于提示和合成数据生成的Python库。
对于预训练数据集:
- llm-swarm: 使用本地LLM或Hugging Face Hub上的推理端点生成用于预训练或微调的合成数据集。
- Cosmopedia: Hugging Face用于生成Cosmopedia数据集的代码。
- textbook_quality: 用于生成教科书质量数据的存储库,模仿Microsoft的Phi模型方法。
数据探索
- sentence-transformers: 用于处理流行语言嵌入模型的Python模块。
- Lilac: 用于为LLM策划更好数据的工具,被NousResearch、databricks、cohere、Alignment Lab AI等使用。它还可以应用过滤器。
- Nomic Atlas: 与指令数据交互以发现洞察并存储嵌入。
- text-clustering: Huggingface的文本数据聚类框架。
- BunkaTopics: 数据清理和主题建模可视化。
- Autolabel: 使用流行的语言模型自动标记数据。
数据抓取
- Trafilatura: 用于在网上收集文本和元数据的Python和命令行工具。用于创建RefinedWeb。
- Marker: 快速将PDF转换为Markdown文本。
结语
高质量的数据集对于训练出色的大语言模型至关重要。本文介绍的各类数据集和工具为LLM研究者和开发者提供了宝贵的资源。通过使用这些多样化的数据集进行训练,可以显著提升LLM在各个领域的性能,包括通用对话、数学推理、代码生成等。同时,各种数据处理工具也为创建和优化自定义数据集提供了强大支持。
随着LLM技术的不断发展,高质量数据集的重要性只会愈发凸显。研究者和开发者应当充分利用这些资源,并不断探索新的数据收集和处理方法,以推动LLM向更智能、更可靠的方向发展。未来,我们期待看到更多创新的数据集和工具出现,进一步推动LLM技术的进步。