资讯动态

用 distilabel 为 smol-course 生成指令微调数据集:从基础 Prompting 到 SelfInstruct、EvolInstruct、Magpie 与 Pipeline

发布时间:2026/10/9 2:18:39 来源:尧图企业网站定制
教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载本篇技术指南完整讲解 smol-course 第 6 单元「合成数据集」模块中的指令数据集Instruction Datasets生成方法。围绕 distilabel 框架我们从最朴素的手工 Prompting 开始依次深入 SelfInstruct基于种子数据的上下文学习、EvolInstruct指令进化与 Magpie基于聊天模板的自回归生成三种论文级数据合成技术最后将各步骤组装成可缓存、可容错、可并行的Pipeline让你能够规模化地产出用于有监督微调SFT的高质量指令数据集。阅读本文后你将掌握在 smol-course 技术栈中从零生成、校验并导出指令微调数据的完整实战方案。从 Prompt 到数据指令数据集为何需要合成合成数据synthetic data听起来复杂但本质上可以简化为一句话通过有效的提示prompting从模型中提取知识来制造数据。反过来看这也是为某个特定任务定向生成数据的方式——挑战在于如何在保证数据多样性与代表性diverse and representative的前提下高效提示模型。在本课程第 6 单元的入口文档 units/vi/unit6/1.md英文版见 v1/6_synthetic_datasets/README.md中合成数据被划分为三类taxonomies指令instructions、偏好preferences与批评critiques。本单元聚焦前两类其中指令数据集用于指令微调instruction tuning偏好数据集用于偏好对齐preference alignment第三类则用于通过模型批评与改写来改进已有数据。本文将围绕第一类——指令微调数据集——展开。幸运的是大量研究论文已经系统探索过这一课题。本单元将用到四类方法方法核心思想出处基础 Prompting用一条指令让模型生成 prompt 与 completion手工方式SelfInstruct以种子数据为上下文让模型用上下文学习生成新指令Self-Instruct 论文EvolInstruct按给定标准将指令进化为更复杂的版本Evol-Instruct 论文Magpie利用聊天模板与自回归生成从 pre-query-prompt 续写用户提问Magpie 论文下面先从最基础的手工提示开始。基础 Prompting用 TextGeneration 生成 prompt 与 completion首先加载 HuggingFaceTB/SmolLM2-1.7B-Instruct 模型。这里借助distilabel库对transformers的集成通过TransformersLLM加载模型再交给TextGeneration任务类来生成文本。from distilabel.llms import TransformersLLM from distilabel.steps.tasks import TextGeneration llm TransformersLLM(modelHuggingFaceTB/SmolLM2-1.7B-Instruct) gen TextGeneration(llmllm) gen.load()注意distilabel会把llm加载到内存中因此在 notebook 中用完以后需要调用gen.unload()释放内存避免内存问题。现在用llm为指令微调生成一个 promptnext(gen.process([{instruction: Tạo một câu hỏi về Khóa học Smol của Hugging Face về các mô hình AI nhỏ.}])) # 示例输出Mục đích của Khóa học Smol là gì? # 即Smol 课程的目的是什么再把这条 prompt 作为输入生成对应的 completionnext(gen.process([{instruction: Mục đích của Khóa học Smol là gì?}])) # 示例输出Khóa học Smol là một nền tảng được thiết kế để học các khái niệm khoa học máy tính. # 即Smol 课程是一个用于学习计算机科学概念的平台。到这里我们已经能够生成一条合成 prompt 及其对应的 completion。把这种简单方法规模化复用确实能产出大量数据但明显存在两个问题数据质量不高没有考虑到课程或领域本身的细微差异数据多样性不足——重复运行上述代码会发现每次产出的内容大同小异。这两点正是后面几种论文方法要解决的问题。SelfInstruct基于种子数据的上下文学习生成新指令SelfInstruct的核心思想是根据一个种子数据集seed dataset生成新的指令。种子数据可以是一条单独的指令也可以是一段上下文。流程如下准备一组初始种子数据seed pool利用上下文学习in-context learning提示语言模型基于这些种子数据生成新指令。distilabel 中实现的提示模板简化版如下# Mô tả nhiệm vụ任务描述 Phát triển {{ num_instructions }} truy vấn của người dùng có thể được nhận bởi ứng dụng AI đã cho và áp dụng cho ngữ cảnh được cung cấp. Nhấn mạnh sự đa dạng trong động từ và cấu trúc ngôn ngữ trong khả năng văn bản của mô hình. 为给定的 AI 应用开发 {{ num_instructions }} 条用户查询使其适用于提供的上下文强调动词与语言结构在模型文本能力范围内的多样性。 # Ngữ cảnh上下文 {{ input }} # Đầu ra输出模板中{{ num_instructions }}控制生成指令的数量{{ input }}注入种子上下文。使用方式是把llm传给SelfInstruct类from distilabel.steps.tasks import SelfInstruct self_instruct SelfInstruct(llmllm) self_instruct.load() context prompt_to_data_section # 替换为「从 Prompt 到数据」一节的内容 next(self_instruct.process([{input: text}]))[instructions][0] # Quá trình tạo dữ liệu tổng hợp thông qua việc nhắc nhở thủ công là gì? # 即通过手工提示生成合成数据的过程是什么可以看到生成的指令质量明显提升且贴合我们课程的真实内容与领域。注意此处我们传入的是{input: ...}取回时通过[instructions][0]拿到第一条新指令。SelfInstruct 已经比裸提示好得多但我们还可以借助进化进一步提升。EvolInstruct把指令进化为更复杂的版本EvolInstruct是一种提示技术接收一条输入指令将其进化为同一指令的更优版本。所谓更优是依据一组预定义标准为原指令添加约束、深化、具体化、引入推理或增加复杂度。该过程可迭代多次对同一条指令产生多种进化版本理想情况下逐步逼近更好的形态。distilabel 中对应的提示模板简化版如下I want you act as a Prompt Rewriter.我希望你扮演一名提示重写者。 Given prompt a prompt, rewrite it into a more complex version.给定一条提示把它重写为更复杂的版本。 Complicate the prompt based on the following criteria:根据以下标准使提示复杂化 {{ criteria }} # Prompt提示 {{ input }} # Output输出使用方式同样简单只需把llm传给EvolInstruct类并通过num_evolutions指定进化代数from distilabel.steps.tasks import EvolInstruct evol_instruct EvolInstruct(llmllm, num_evolutions1) evol_instruct.load() text Quá trình tạo dữ liệu tổng hợp thông qua việc nhắc nhở thủ công là gì # 即通过手工提示生成合成数据的过程是什么 next(evol_instruct.process([{instruction: text}])) # Quá trình tạo dữ liệu tổng hợp thông qua việc nhắc nhở thủ công là gì? # Và, làm thế nào hệ thống trí tuệ nhân tạo, GPT4, sử dụng các thuật toán học máy để thao tác dữ liệu đầu vào thành dữ liệu tổng hợp? # 进化结果通过手工提示生成合成数据的过程是什么以及人工智能系统 GPT4 如何利用机器学习算法把输入数据处理成合成数据上面的例子中num_evolutions1即只进化一代。注意进化结果指令确实变得更复杂但已经丢失了一部分原始含义。这说明进化是一把双刃剑double-edged sword——每进化一次都可能引入语义漂移我们必须时刻警惕生成数据的质量必要时配合人工或自动评估来把关。Magpie利用聊天模板的自回归式数据生成Magpie与前两种方法思路不同它不依赖上下文学习或改写而是利用语言模型的自回归auto-regressive特性以及指令微调阶段使用的聊天模板chat-template。回顾一下聊天模板是一种用明确角色标记system、user、assistant来组织对话的格式。在指令微调阶段模型已被优化为忠实复现这种格式——这恰好是 Magpie 利用的机制。具体流程是构造一个基于聊天模板的pre-query-prompt查询前提示但在用户消息指示符之前停住例如|im_start|user\n让语言模型继续自回归地生成用户提示直到助手指示符结束例如|im_end|。由于不同模型的聊天模板格式不同Magpie 的提示模板也因模型而异。简化版的分步过程如下# Bước 1: cung cấp lời nhắc trước truy vấn第 1 步给出查询前提示 |im_start|user\n # Bước 2: mô hình ngôn ngữ tạo ra lời nhắc của người dùng第 2 步模型生成用户提示 |im_start|user\n Mục đích của Khóa học Smol là gì?Smol 课程的目的是什么 # Bước 3: dừng quá trình tạo第 3 步停止生成 |im_end|这种方式能以非常高的效率批量生成数据甚至可以扩展到多轮对话multi-turn conversations。论文中假设这种生成的数据能够复现所用模型在指令微调阶段的训练数据分布。在 distilabel 中使用Magpie类同样只需传入llmfrom distilabel.steps.tasks import Magpie magpie Magpie(llmllm) magpie.load() next(magpie.process([{system_prompt: Bạn là một trợ lý hữu ích.}])) # 输出[{ # role: user, # content: Bạn có thể cung cấp cho tôi danh sách 3 trường đại học hàng đầu không? # 你能给我一份排名前三的大学名单吗 # }, # { # role: assistant, # content: 3 trường đại học hàng đầu là: MIT, Yale, Stanford. # 排名前三的大学是麻省理工、耶鲁、斯坦福。 # }]注意这次我们立刻得到了一组带role标记的对话数据集user 与 assistant 成对出现这正是指令微调所需的 prompt-completion 结构。Magpie 的领域定制技巧怎么写 system prompt要在自己的领域获得更好表现可以向system_prompt注入额外上下文。为了让 LLM 生成领域特定的数据最好在 system prompt 中描述用户的查询将会是什么。这个描述随后会进入 pre-query-prompt在开始生成用户提示之前就引导 LLM 朝该领域生成查询。推荐写法是描述用户的身份/场景Bạn là một trợ lý AI sẽ giúp người dùng giải các bài toán. 你是一个帮助用户解数学题的 AI 助手。而不是直接要求模型去生成数学题Bạn là một trợ lý AI tạo ra các bài toán 你是一个生成数学题的 AI 助手。需要说明的是语言模型普遍不太擅长把额外上下文注入system_prompt因此这种定制方式并非总是像其他技术如 SelfInstruct 的种子上下文那样稳定有效使用时需要多做实验验证。从 Prompt 到 Pipeline把数据生成组装成完整流程前面介绍的各任务类都是独立类standalone classes可以直接在流水线中使用。更进一步我们可以用Pipeline类把整个数据生成过程组织成一个正式流程。下面这个最小流水线包含LoadDataFromDicts以字典形式加载初始数据两个TextGeneration步骤第一个为 prompt 生成指令第二个为指令生成 completion用运算符连接步骤让数据按顺序流动用output_mappings参数把上游输出列映射到下游输入列确保数据正确流转。from distilabel.llms import TransformersLLM from distilabel.pipeline import Pipeline from distilabel.steps import LoadDataFromDicts from distilabel.steps.tasks import TextGeneration with Pipeline() as pipeline: data LoadDataFromDicts(data[{instruction: Tạo một câu hỏi ngắn về Khóa học Smol của Hugging Face.}]) # 即为 Hugging Face 的 Smol 课程生成一个简短问题。 llm TransformersLLM(modelHuggingFaceTB/SmolLM2-1.7B-Instruct) gen_a TextGeneration(llmllm, output_mappings{generation: instruction}) gen_b TextGeneration(llmllm, output_mappings{generation: response}) data gen_a gen_b if __name__ __main__: distiset pipeline.run(use_cacheFalse) print(distiset[default][train][0]) # 输出 # [{ # instruction: Mục đích của Khóa học Smol là gì?, # response: Khóa học Smol là một nền tảng được thiết kế để học các khái niệm khoa học máy tính. # }]关键点解析output_mappingsTextGeneration步骤的默认输出列是generation。在gen_a中把generation映射为instruction在gen_b中把generation映射为response这样最终每条样本就同时携带了instruction与response两个字段正好是指令微调数据集的标准格式。各步骤的输入/输出列可查阅 distilabel 组件文档。distisetpipeline.run()返回一个Distiset可按distiset[default][train][0]取出训练集首条样本。use_cacheFalse禁用缓存强制重新生成详见下文缓存机制。流水线的数据流向与output_mappings的映射关系如下Pipeline 的三大隐藏能力Pipeline在底层提供了很多实用特性自动缓存生成结果distilabel会自动缓存每次生成的结果再次运行时无需重跑已完成的生成步骤节省大量推理时间容错fault-tolerance即使某些生成步骤失败流水线仍会继续运行不会整体中断并行生成所有生成步骤并行执行显著加速数据生产。此外还可以调用draw方法可视化流水线结构如上图直观检查数据如何一步步流动、output_mappings如何衔接各阶段。从字典到 Hub加载真实数据集并上传结果练习 notebooknotebooks/vi/6_synthetic_datasets/instruction_sft_dataset.ipynb中还给出了两个实用扩展其一用datasets.load_dataset从 Hub 加载数据替代写死的字典from datasets import load_dataset with Pipeline(...) as pipeline: ... if __name__ __main__: dataset load_dataset(my-dataset, splittrain) distiset pipeline.run(datasetdataset)其二用push_to_hub把生成的 Distiset 上传到 Hubif __name__ __main__: distiset pipeline.run(use_cacheFalse) distiset.push_to_hub(huggingface-smol-course-instruction-tuning-dataset)运行流水线后不要忘记把数据集推送到 Hub便于后续微调与共享。安装时除了transformers后端distilabel[hf-transformers]也可以按需选用vllm或hf-inference-endpoints等推理后端例如pip install distilabel[hf-transformers,outlines,instructor]最佳实践无论采用上述哪种技术生成高质量指令数据集都需要遵循以下实践原则确保种子数据足够多样多样化的种子数据seed data才能覆盖广泛场景避免生成结果偏斜定期评估数据集持续检查生成数据的多样性与质量及时发现问题并回退到更保守的参数迭代systempromptprompt 是数据质量的杠杆反复打磨 system prompt 与任务描述能显著改善输出。下一步与练习‍动手练习完成练习 notebook notebooks/vi/6_synthetic_datasets/instruction_sft_dataset.ipynb按三个难度逐步构建指令微调数据集 生成一个指令微调数据集 → 使用种子数据生成 → 在种子数据基础上叠加指令进化EvolInstruct。练习中鼓励更换模型与 generation 参数观察它们对数据集质量的影响——先小规模试验再规模化扩展。‍继续学习在生成指令数据集的基础上进一步学习偏好数据集Preference Datasets的生成对应英文版 v1/6_synthetic_datasets/preference_datasets.md其中将用到EvolQuality与UltraFeedback等进阶提示。参考资料distilabel 官方文档组件画廊、任务类输入输出列、Pipeline 用法Self-Instruct 论文利用语言模型自身的指令生成能力构造指令数据Evol-Instruct 论文WizardLM 中提出的指令进化方法Magpie 论文基于聊天模板的自回归式指令生成赞分享教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载相关推荐smol-course 指令数据集生成实战用 distilabel 从基础提示到 SelfInstruct、EvolInstruct 与 Magpie 管道smol course 指令数据集生成实战用 distilabel 从基础提示到 SelfInstruct、EvolInstruct 与 Magpie 管道教程人工智能大模型NLP微调smol-course 合成数据实战用 distilabel 构建指令微调与偏好对齐数据集smol course 合成数据实战用 distilabel 构建指令微调与偏好对齐数据集 合成数据Synthetic Data是人为生成的、模拟真实世界教程人工智能大模型NLP微调smol-course 合成数据单元实战用 distilabel 为小模型生成指令与偏好数据集smol course 合成数据单元实战用 distilabel 为小模型生成指令与偏好数据集 本篇文章以 smol course 仓库日文版「合成数据集」单教程人工智能大模型NLP微调上一篇Marinara多语言支持实现Chrome扩展国际化部署指南下一篇Hypothesis测试框架与Flake8代码风格检查最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑