构建文本集合,即语料库,是大型语言模型预训练的基础。数据量(通常表示为$V_{data}$)与预训练阶段的成效直接关联。当数据不足、缺乏多样性或未涵盖LLM需要具备的特定知识点时,合成数据生成提供了一种途径来构建或扩充这些预训练数据集。生成这些大规模合成语料库的策略与方法将进行详细介绍。预训练的目标是使LLM具备对语言的广泛理解、事实知识和推理能力。为实现此目标,模型必须处理大量且多样化的文本集合。创建合成语料库不仅仅是随意生成词语序列;这是一项有条理的工作,旨在生成不仅数据量大,而且信息丰富、语言多样的资料。大规模语料库构建的策略要点在实际生成数TB文本之前,有几项策略考量将影响您构建能有效支持LLM预训练的合成语料库的方式。明确预训练目标与期望知识: 首先要解决的问题是:您的LLM在预训练期间应学习什么?答案将决定合成语料库的性质。通用知识:对于旨在应用于广泛场景的模型,语料库应反映网络和文学作品中文本的非常高的多样性,涵盖无数主题、写作风格和体裁。特定领域:如果LLM最终用于金融、医疗保健或科学研究等特定任务,可以通过包含与这些领域相关的合成文本来提升预训练效果。例如,您可以生成金融理论的简化解释或研究论文摘要。编程能力:为构建擅长理解或生成代码的模型,预训练语料库可以用各种编程语言的大量合成源代码来丰富,这些代码通常伴随合成注释或文档。增强推理能力:如果主要目标是提升模型的推理能力,您可能会侧重于生成示例逻辑推理、问题解决步骤或比较分析的文本。明确这些目标是必要的,因为它直接影响生成方法的选择以及需要优先考虑的合成数据类型。选择可扩展生成方法: 第2章介绍了合成文本生成的多种技术。当目标是创建可能达到数千亿甚至数万亿个token的预训练语料库时,可扩展性成为主要因素。基于LLM的生成:采用其他强大的LLM(常被称为“教师”模型)是一种广泛采用的策略。先进的模型可以生成连贯、多样化的文本,涵盖众多主题。这里的主要挑战是管理与API使用相关的成本、处理速率限制以及设计有效、可扩展的提示策略。回译:如果能获得高质量的机器翻译系统并初始拥有大量单语语料库,这项技术可以高度可扩展。它对于增加数据集的语言多样性和改写多样性特别有效。改写与扩充:将改写模型应用于现有的大型文本数据集(但可能多样性不足或无法直接授权使用),可以是一种扩展和使其多样化的方法。基于规则/程序化生成:虽然由于可能产生单调输出,这些方法通常不太适合创建广泛的通用知识预训练数据,但如果这些是您目标预训练内容的一部分,它们对于生成特定类型的结构化文本(如合成日志、模板化叙述或代码)可能非常高效。种子数据的重要性: 许多可扩展生成技术,特别是采用LLM或改写模型的那些,依赖初始的“种子”数据。当使用LLM生成全新内容时,“种子”就是您的提示。这些提示的质量、多样性、范围,甚至是其细致程度,将深刻影响生成语料库的特性。如果您正在扩充现有数据集,原始数据集的质量和性质非常重要。低质量的输入可能会导致低质量(尽管经过改写)的输出。 在整理或生成高质量种子提示或数据集方面投入精力是初步步骤。例如,您可以整理一个包含数千个多样主题、复杂问题或特定关键词的列表,以系统地指导LLM的生成过程。确保大规模多样性: 仅凭数据量并非良好预训练语料库的唯一决定因素。即使是合成数据,也必须在主题、写作风格、词汇、句式结构和观点方面展现出很大的多样性。主要在统一或重复数据上预训练的模型,可能会难以应对语言的复杂性和多样性。变化生成提示:系统地修改基于LLM的生成提示。使用带有主题、实体、期望风格、情感语调或复杂程度占位符的模板。多种生成来源/方法:混合通过不同技术创建的数据(例如,一部分来自LLM生成,一部分来自回译,以及可能一部分来自用于特定小众内容的基于规则的系统)。控制生成参数:对于LLM,尝试使用温度和top_p等参数。较高的温度可以促成更多新颖和多样化的输出,但如果不仔细管理,可能会牺牲一些连贯性或事实准确性。生成后去重:在不同粒度(例如,文档级别、段落级别或使用n-gram重叠)上实施严格的去重流程,以最大程度减少合成语料库中接近相同的样本。预训练语料库生成方法考虑到这些策略要点,我们现在可以审视构建这些大规模合成语料库的实际方法。LLM驱动的大批量生成这种方法提供了显著的灵活性,常被优先选择来生成多样、高质量的通用预训练合成文本。教师模型:核心思想是使用能力很强的现有LLM作为“教师”,为训练新模型或继续预训练现有模型生成数据。系统化提示:主题驱动生成:从综合性主题列表开始。这些主题可来源于百科全书(如维基百科标题)、教育课程大纲、领域特定本体论,甚至是热门新闻类别。针对每个主题,编写提示,指示LLM生成详细文章、解释、讨论或叙述。# 示例:生成关于历史事件的信息性文章 event_name = "The Rosetta Stone discovery" historical_context = "its impact on Egyptology" prompt = f"""生成一份关于{event_name}的详细记述,包括其发现的背景、主要特征以及{historical_context}。文本应引人入胜,适合对历史和考古学有普遍兴趣的读者。字数目标约为600字。""" # 这类提示将被系统化地变化并应用于许多主题。指令风格数据生成:尽管第4章专门讨论指令微调,但在预训练期间加入指令格式数据可能有所帮助。这包括生成“解释X的含义”并随后给出详细解释,或“总结以下关于Y的文本”并附带示例文本及其摘要等配对。这有助于模型尽早学习理解和响应指令提示。(本章后面“预训练阶段的指令风格数据生成”一节也将提及此内容)。创意与叙事内容:提示LLM生成虚构故事、具有鲜明个性的角色间的对话、场景脚本或诗歌,以向语料库注入创造力、多样的语言风格和对话模式。扩展与成本管理:使用商业LLM API生成数TB文本需要仔细规划成本管理。批处理API调用:在API允许的情况下,将多个生成请求合并为单个调用,以提高吞吐量并可能减少开销。优化提示长度和设计:简洁而有效的提示消耗更少的输入token。迭代改进提示,以最少的token使用量实现期望的输出。策略性使用采样参数:调整温度和top_k/top_p等参数。较高的温度可以促成更多新颖和多样化的输出,但如果不仔细管理,可能会牺牲一些连贯性或事实准确性。分层模型使用:考虑为不同任务使用不同的LLM。最强大(通常也最昂贵)的模型可用于复杂生成任务或创建种子数据,而更小、更具成本效益的开源模型(可能针对特定生成风格进行微调)则可处理更简单文本形式的大批量生成。本图示意了一个LLM驱动语料库生成的典型流程:digraph G { bgcolor="transparent"; rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", color="#495057", fontname="sans-serif", fontsize=10]; edge [color="#495057", fontname="sans-serif", fontsize=9]; subgraph cluster_input { label = "输入与控制"; style="filled"; color="#dee2e6"; node [fillcolor="#f8f9fa", shape=parallelogram]; seed_prompts [label="多样化种子提示\n(主题、问题、场景)"]; generation_config [label="生成配置\n(风格、长度、参数)"]; } subgraph cluster_generation { label = "生成核心"; style="filled"; color="#dee2e6"; node [fillcolor="#74c0fc", shape=cylinder]; llm_engine [label="LLM生成引擎\n(API或本地模型)"]; } subgraph cluster_output { label = "语料库组装"; style="filled"; color="#dee2e6"; node [fillcolor="#8ce99a", shape=folder]; raw_synthetic_data [label="原始生成文本\n(大容量)"]; processing_pipeline [label="清洗与过滤\n(去重、基础质量检查)"]; final_corpus_segment [label="处理后的合成语料库\n(用于预训练混合)"]; } seed_prompts -> llm_engine; generation_config -> llm_engine; llm_engine -> raw_synthetic_data [label="生成"]; raw_synthetic_data -> processing_pipeline [label="送入"]; processing_pipeline -> final_corpus_segment [label="产出"]; }本图示意了一个用于预训练的大规模合成文本生成典型流程。多样化的种子提示和配置参数指导LLM引擎生成原始文本。这些输出随后经过清洗和过滤处理流程,最终成为合成预训练语料库的一部分。大规模扩充现有数据集如果您能获得大量(尽管可能并非理想的多样或干净)文本数据集(例如,公有领域书籍档案、过滤后的网络抓取数据),扩充技术可以大规模应用:大规模改写:使用改写模型来改写现有数据集中的句子、段落或整个文档。此举旨在增加语言多样性(词汇、句式结构),同时保持核心意义。高质量的改写对于避免引入噪声或降低原始信息质量是必要的。回译流程:从您的源文本开始(例如,英文)。使用可靠的机器翻译系统,将此文本翻译成一种或多种中间(中转)语言(例如,德语、西班牙语、中文)。将这些中转语言的文本回译成原始语言(英文)。在正向和反向翻译步骤中使用不同的翻译模型,或使用多种中转语言,可以增强所得改写文本的多样性。 此过程通常会产生与原文语义相近,但展现出不同句法结构和词汇选择的文本。程序化与基于规则的方法对于某些特定类别的预训练数据,程序化生成仍然是一种可行且高效的选择:代码生成:如果主要目标是预训练模型用于软件开发任务,您可以生成大量合成代码片段。这可以通过使用形式语法、包含常见编码模式和反模式的复杂模板,或通过对现有开源代码库应用变异(例如,重命名变量、重构小块)来完成。结构化数据转文本:如果您拥有大量结构化或半结构化数据(例如,百科数据库中的表格、知识图谱、财务报表),您可以开发模板或更复杂的NLG(自然语言生成)系统,将这些数据转换成连贯的自然语言句子或段落。例如,一行财务数据可能被转化为:“公司$A$在$YYYY$年第$N$季度报告收入为$$X$百万,比上一年增长$P$%。”尽管这些方法对各自的特定用途很有效,但由于生成文本可能不自然或很快重复的固有风险,它们通常不太适合生成LLM预训练所需的广泛通用知识语料库。大批量生成中的质量管理与风险规避预训练所需规模的合成数据生成并非没有显著挑战。在这项大规模工作中,保持数据的质量和完整性非常重要。重复与单调:这是一个持续关注的问题。即使初始提示多样化,LLM有时也可能趋向于相似的短语、句式结构或叙述模式,导致语料库的有效多样性较低。应对措施:采用积极的去重技术(例如,使用MinHashLSH等工具识别和移除近似重复的文档或段落)。系统地变化生成参数(如温度或top_p)。混合来自多种生成方法和多样化种子源的数据。执行词汇多样性和句法复杂性检查。事实不准确(幻觉):众所周知,LLM会生成听起来合理但事实不准确或无意义的文本。当生成数十亿或数万亿个token时,人工验证完全不可行。应对措施:设计明确鼓励事实性或警惕推测的提示(例如,“基于广泛接受的科学共识……”)。采用检索增强生成(RAG)技术,即LLM首先从可信知识库中检索相关信息,然后使用此信息作为生成的基础。开发自动化过滤机制。这可能涉及启发式检查、将生成的语句与精选事实数据库进行交叉比对,或使用经过训练的分类模型来检测潜在的不准确之处。这是一个复杂方面,更多关于评估和质量控制的细节将在第6章中介绍。偏见放大:如果用于生成的教师LLM或其提示的种子数据包含社会偏见(例如,与性别、种族或其他人口统计学信息相关),这些偏见可能会在大规模合成语料库中被复制并可能放大。应对措施:仔细检查并整理种子数据以发现已知偏见。设计鼓励中立、平衡或多视角输出的提示。实施生成后偏见检测工具和过滤策略。第6章也将提及识别和减少偏见的方法。计算与存储需求:生成预训练规模的语料库涉及大量计算资源。这意味着如果使用本地开源模型,需要大量GPU小时;如果依赖专有模型提供商,则需要可观的API积分。存储、管理和处理这些大规模数据集(通常大小为数TB甚至PB)需要可扩展的数据基础设施。从一开始就对此进行规划。使用高效的文件格式(例如,压缩文本文件,或者如果元数据与文本一起存储,可以使用Apache Parquet等格式),并考虑分布式文件系统或云存储解决方案。构建大规模合成预训练语料库的一个指导原则是,在整理多样化和高质量种子输入方面所付出的努力,以及生成和过滤流程的精心设计,将直接转化为最终数据集的效用。目标不仅仅是达到目标token数量,而是创建能为LLM提供丰富、多样、可靠学习信号的语料库。构建此类语料库通常是一个迭代过程:生成初始批次,分析其特性,改进生成策略和过滤器,然后重复。本章后续的动手实践环节将提供在更易于管理规模上应用这些原则的机会。