6.6K Star、220K 下载!这款开源 AI 神器迎来大波功能更新!

0 阅读18分钟

大家好,欢迎来到code秘密花园,我是花园老师(ConardLi)。

前段时间,我对外开源了大模型微调数据集生产工具 Easy Datasetgithub.com/ConardLi/ea… 。本来是想用在微调数据集教程中的一个用于展现数据集构造过程的学习工具,没想到一经发布就受到了广泛关注,并且吸引了大批用户,广受大家好评。

https://github.com/ConardLi/easy-dataset

截止目前,Easy Dataset 在 Github 上收获了 6.6K Star,所有版本下载总量超过 219K

第一个版本,是花园老师怒肝三个晚上做出来,功能比较简陋,在这发布后的一个多月中,我通过用户群、视频文章评论、Github Issues 等渠道收到了非常多用户的各种建议。

在这段时间我对 Easy Dataset 进行了多个功能优化,并且也接受到了很多社区贡献者的 PR,目前已经发出 16 个 Release 版本。

因为最近也在做 LLaMA Factory 微调的教程,里面会使用 Easy Dataset 来构造数据集,所以先跟大家说明一下 Easy Dataset 的一些重点功能更新。

Easy Dataset 可以用来做什么?

在大模型领域,数据集是模型训练、优化和应用的核心基础,其用途贯穿模型生命周期的各个环节:

  1. 模型训练:数据集是模型训练的核心“原料”,预训练阶段依靠海量通用数据集(如网页文本、图像等)赋予模型基础表征能力;监督学习通过标注数据集指导模型完成分类、翻译等特定任务;无监督学习利用无标注数据集挖掘数据潜在结构;多模态数据集则助力模型学习不同模态间的关联与生成逻辑。
  2. 模型优化:数据集是模型优化的关键依据,通过细分领域数据集微调,可使模型适配医疗、金融等具体场景;数据增强依赖对原始数据集的变换扩充,以缓解过拟合;利用包含对抗样本的数据集进行对抗训练,能提升模型抵御输入扰动的鲁棒性。
  3. 模型评估:数据集是模型评估的标尺,独立测试集用于验证模型在准确率、BLEU等关键指标上的表现;分布外数据集检验模型对未见场景的泛化能力;通过分析数据集中的偏见情况,可评估并优化模型的伦理表现。
  4. 应用落地:数据集是大模型应用的“燃料”,动态输入数据集触发模型推理,生成聊天回复、图像等结果;行业专属数据集支撑垂直领域模型开发;基于用户反馈形成的数据集驱动模型持续迭代升级。
  5. 研究创新:数据集是创新研究的“试验场”,特定领域数据集(如少样本、长文本数据集)用于验证新模型架构的性能边界;在联邦学习等场景下,分布式数据集助力探索差分隐私等数据保护技术。

Easy Dataset 是一个专为创建大型语言模型数据集而设计的应用程序。通过 Easy Dataset,你可以将领域知识转化为结构化数据集,兼容所有遵循 OpenAI 格式的 LLM API,使数据集构造过程变得简单高效:

有关 Easy Dataset 的基础使用大家可以看这一期:www.bilibili.com/video/BV1y8…

使用指引:上线全新文档站

Easy Dataset 推出全新文档站:docs.easy-dataset.com/ ,支持中、英两种语言:

https://docs.easy-dataset.com/

文档站分为几个关键部分:

  • 快速开始:快速了解 Easy Dataset,查看安装和使用方式;
  • 基础功能:可以系统性的查看所有 Easy Dataset 的基础功能的使用文档;
  • 进阶使用:解锁 Easy Dataset 的高级使用技巧,包括自定义分块、数据蒸馏、自定义提示词等;
  • 博客:包括 Easy Dataset 的最新更新日志、社区教程、数据集知识科普;
  • 更多:包括 Easy Dataset 的常见问题、隐私协议、联系方式等等

文献处理:新增支持多种文献格式处理

目前 Easy Dataset 前平台支持 Markdwon、PDF、DOCX、TXT 四种格式的文献处理:

模型对于具备良好结构划分的 Markdown 文献理解效果最好,所以建议大家还是优先上传 Markdwon 文件。

由于 PDF 格式相对特殊,平台针对不同场景支持了四种不同的 PDF 处理方式,当上传的文献中含有 PDF 格式的文献时,会触发弹框:

方式1:基础解析:专注于快速识别简单 PDF 文件的关键轮廓,处理规整纯文本报告、简单说明文档等效率高,但无法精准解析含大量公式、图表等复杂内容的文件。

方式2:MinerU API 解析:可通过 「设置 - 任务设置」 配置 MinerU API Key,调用 MinerU API 进行解析,可深度解析含公式、图表的复杂 PDF 文件,适用于学术论文、技术报告等场景,文件越复杂处理速度越慢。可以通过 mineru.net/apiManage/t… 申请 MinerU API Key(注意有效期为 14 天,过期需重新申配置)。

方式3:MinerU 在线平台解析:跳转至 MinerU 平台:mineru.net/OpenSourceT… ,用户可在此平台解析 PDF,并下载 Markdwon 文件,再回平台重新上传。

方式4:自定义视觉模型解析:可以识别复杂的 PDF 文件,包括公式和图表。该方式要求在模型配置中添加视觉模型配置,通过自定义的视觉模型来实现对 PDF 文件的解析。可以根据具体需求定制解析规则和模型参数,以适应不同类型的复杂 PDF 文件。

当选择 MinerU API 解析、自定义视觉模型解析时,PDF 处理时间可能较长,请耐心等待:

可通过 「设置-任务设置」 配置自定义视觉模型的最大并发数量,及最多同时处理多少页 PDF,并发数量越大,处理速度也快,注意考虑模型提供商的并发量限制。

文献处理:新增支持多种文本分割算法

在很多应用场景里,文档分割都是极为关键的预处理环节。它的核心操作,就是把篇幅较长的文本拆解成一个个较小的、便于处理的片段。这么做有不少好处,比如能让不同长度的文档都能以统一的方式进行处理,解决模型输入长度受限的问题,还能提升检索系统里文本表示的质量。分割文档的方法多种多样,每种都各有优势。

Easy Dataset 中,通过 「设置 - 任务设置 - 分块设置」 可自定义设置文献处理时的不同分块策略。

文本分块的作用,就是把文档拆分成小片段,方便后续的应用程序使用,通过分块,我们可以:

  • 解决文档长度不一致的问题:实际的文档库中,文本的篇幅长短不一。通过分割,能保证所有文档都能以相同的方式进行处理。
  • 突破模型的限制:不少模型都有最大输入长度的限制。把文档分割后,就可以处理那些原本因为太长而无法使用的文档。
  • 提升表示质量:对于长文档而言,如果想一次性提取过多信息,提取质量就可能下降,而分割文档能让每个片段的表示更加精准、有针对性。
  • 提高检索的精准度:在信息检索系统里,分割文档可以让搜索结果更细致,使查询内容能更精确地匹配到文档里相关的部分。
  • 优化计算资源的利用:处理小片段文本更节省内存,而且还能更高效地并行处理任务。

分块方式1 - 固定长度分块

最简单也是容易想到的分割策略,就是按照文档的长度来划分。这种方法简单又有效,能确保每个片段都不会超过设定的长度上限。基于长度分割的优势主要体现在这几个方面:实现起来简单易懂、分割出的片段长度比较一致、能很方便地根据不同模型的要求进行调整。基于长度的分割又可以细分为:

  • 基于词元分割:按照词元数量来分割文本,在和语言模型配合使用时非常实用。
  • 基于字符分割:依据字符数量来分割文本,这种方式在不同类型的文本中都能保持较好的一致性。

选择固定长度分块时,可配置:

  • separator: "\n\n":指定文本分割的边界标识,默认使用连续两个换行符(\n)作为分隔符。这意味着文本会在每个空行处被截断,将原始内容拆分为独立的段落块。例如,一篇包含多个空行分隔的文章会被按段落分割成多个子文本。通过调整分隔符(如改为 "\n" 或 "---"),可以灵活控制分割粒度,适用于不同格式的文本(如代码、Markdown文档等)。
  • chunkSize: 1000:定义每个分割块的最大字符长度上限。当文本被分隔符拆分后,若某个块的字符数超过此值,则会被进一步细分为更小的块,确保所有块均不超过指定大小。例如,一个包含3000字符的段落会被拆分为至少3个块(每个≤1000字符)。此参数直接影响后续处理的粒度:较小的值会生成更多、更精细的块,适合需要精确上下文的场景;较大的值则减少块数量,保留更完整的语义单元。
  • chunkOverlap: 200:控制相邻分割块之间的重叠字符数。在每个块的末尾,会保留指定数量的字符作为与下一个块的重叠区域。例如,当 chunkOverlap: 200 时,前一个块的最后200个字符会重复出现在下一个块的开头。这种设计确保语义连续性,避免关键信息因分割被截断,尤其在依赖上下文的任务(如检索、问答)中至关重要。重叠区域作为过渡缓冲区,帮助模型在处理单个块时仍能获取相邻内容的上下文信息。

如果文档相对简单,没有明显的结构,建议采用此方案。

分块方式2 - 文本结构分块

文本自然地组织成段落、句子和单词等层次结构。我们可以利用这种内在结构来制定分割策略,使分割后的文本保持自然语言的流畅性,在分割块内保持语义连贯,并适应不同程度的文本粒度。首先分割器会试图保持较大的单元(如段落)完整。如果一个单元超过了块大小限制,它会进入下一个层次(如句子)。如有必要,这个过程会一直持续到单词级别。

文本结构(递归)分块同样支持配置最大分块大小、重叠字符数,另外支持配置多个自定义分隔符:

如果文献具备比较复杂的结构,需要设定多个不同的分隔符,建议采用此方案。

分块方式3 - 文档结构分块

基于 Markdown 的文档结构分块,是平台默认的分块策略:

  • 首先需要设定文本块的最小、最大分割长度;
  • 然后自动对章节(比如 Markdown 里的 #、##、###)进行识别;
  • 对已识别到的章节字数进行计数,在恰好位于 > 最小分割长度 同时 < 最大分割长度的前提下进行分段;
  • 当遇到超长段落(超出最大分割长度)的时候,在执行递归分段算法,确保语义的完整性。

如果 Markdown 文件具有良好的结构划分,使用此方案可以获得最佳分块效果。

分块方式4 - 代码结构分块

当分块的目标中含有大量代码时,传统的分割方式都不适用,可能会对代码进行阶段,Easy Dataset 也提供了基于智能代码语意理解能力的分割方式,可以选择目标语言进行分块:

分块方式5 - 可视化自定义分块

当以上分块策略均不能满足你的需求时,可选择使用可视化自定义分块功能,首先找到要分块的文献,点击查看详情:

打开文件预览视图后,点击右上角开启自定义分块模式:

在需要分块的位置选中文本即可,上方将展示当前分块的位置、分块数量以及每个块的字符数:

保存自定义分块后,将完全替换掉当前文献历史的分块内容:

文献处理:支持多种领域树修订方式

当我们在一个项目中删除、新增一个新的文献时,会提供三种领域树变更模式:

  • 修改领域树:根据新增或删除的文档修改当前领域树,仅影响发生变更的部分
  • 重建领域树:基于所有文档内容生成全新的领域树
  • 保持不变:保持当前领域树结构不变,不进行任何修改保持当前领域树不变

高阶技巧:零样本蒸馏数据集

模型蒸馏和量化一样,都是一种模型的压缩手段。

想象有一位“大教授”(大模型),知识渊博但“脾气很大”:培养他需要巨额学费(训练成本高),请他讲课需要豪华教室(高算力硬件),每节课费用惊人(推理成本高)。而“小学生”(小模型)虽然乖巧轻便(低部署成本),但知识面有限。模型蒸馏就是让大教授把解题思路 “浓缩” 成小抄,教给小学生的过程。

比如 DeepSeek 推出的系列开源蒸馏模型:

但这些模型都是基于通用领域知识蒸馏来的,在某些特定领域并不具备优势。

我们个人和小型企业可能没有能力部署大参数模型(也就是我们说的满血版模型),但可以从大模型蒸馏出特定领域的小模型来使用,在大幅降低部署成本的同时,也能够保持特定领域下的使用效果。

也就是说,我们可以使用特定领域的蒸馏数据集来微调小模型,达到大模型特定领域知识注入的效果。

在前段时间比较火的李飞飞团队的论文 《s1:Simple test- time scaling》 中有提到:仅花费 50 美元,就训练出一个比肩 ChatGPT o1DeepSeek R1 的模型。其实就是基于通义的开源模型 Qwen2.5-32B 进行的微调,而微调所用的数据集,其中一部分蒸馏自 Google Gemini 2.0 Flash Thinking

这个模型的诞生,是先通过知识蒸馏,从 Gemini API 获取推理轨迹和答案,辅助筛选出 1000 个高质量的数据样本。然后,再用这个数据集,对通义 Qwen2.5-32B 进行微调,最终得到性能表现不错的 s1 模型。

借助 Easy Dataset 我们也可以基于特定领域从大模型蒸馏数据集:比如我们想蒸馏出一个基于 DeepSeek R1 推理过程的中医小模型,就要先从 DeepSeek R1 中提取 “中医” 相关的领域数据集。

在模型蒸馏过程中,数据集的构造是非常重要的,直接决定蒸馏模型的质量,需要如下要求:

覆盖任务场景:数据集需与原始任务(如图像分类、自然语言处理等)的真实分布一致,确保教师模型和学生模型学习到的数据特征具有实际意义。

多样性与平衡性:数据需包含足够的样本多样性(如不同类别、噪声水平、边缘情况等),避免因数据偏差导致蒸馏后的模型泛化能力不足。

为了满足这样的要求,我们在特定领域上肯定不能完全随机提取数据集,在 Easy Dataset 中的思路是:

先通过顶级主题(默认使用项目名称),构造多级领域标签,从而构造完整的领域树,在基于 “学生模型” 从领域树的叶子结点提取问题,最终使用 “教师模型” 为问题逐个生成答案和思维过程。

我们创建一个名为中医的新项目(在数据蒸馏任务中,将使用项目名称作为默认的顶级蒸馏主题,所以取好项目名称至关重要):

然后我们来到数据蒸馏模块,点击生成顶级标签:

此操作可以我们从顶级主题(默认是项目名称)生成 N 个子主题(标签),数量可自定义输入,任务成功后,将在对话框生成标签预览:

我们可以点击每个子主题上的添加子标签,可以继续生成多层子主题,为了保证子主题生成的相关性,生成多层子主题将传入完整的标签路径:

多级领域标签树构建完成后,可以开启从叶子标签上提取问题,我们可以选择生成问题的数量,另外提取问题时也将传入完整领域标签路径:

生成完成后,可以对问题进行预览,也可以从领域树叶子结点上看到已生成的问题,然后可以在每个问题上点击生成答案:

也可以到问题管理模块为已生成的问题批量生产答案(蒸馏出的问题由于未关联文本块,默认展示为 Distilled Content):

如果你不需要精细化的控制以上的每一步,可以选择全自动蒸馏数据集:

在配置框中,我们可以看到如下选项:

  • 蒸馏主题(默认为项目名称)
  • 生产领域树标签的层级(默认为两层)
  • 每层生成的标签数量(默认为 10 个)
  • 每个子标签生产的问题数量(默认为 10 个)

任务开始后,我们可以看到详细的任务进度,包括构建标签、问题、答案的具体进度:

此处也会遵循:「项目设置 - 任务设置」 中最设置的大并发数限制。

高阶技巧:支持配置自定义提示词

自定义提示词可主动干预问题、答案、领域标签生成的效果,例如,在下面的自定义提示词中,我们可以:

  • 通过自定义全局提示词要求必须使用中文
  • 通过自定义问题生成提示词要求问题必须保持幽默风趣
  • 通过自定义答案生成提示词要求答案必须风趣幽默并且精简

提示词干预效果:

体验优化:存储改为数据库,大幅优化性能

在初始版本中,为了快速上线,Easy Dataset 使用了本地文件系统来存储项目数据,在大量数据的项目中检索性能非常差,并且经常因为文件损坏导致任务失败等问题。因此后续重构为了数据库存储,依然使用的是本地数据库,保障用户的隐私安全。

部分客户端用户在升级到 1.3.x 版本后可能发现历史项目数据丢失,就是因为变更了本地数据的存储方式。我们可以同时打开历史数据目录(Open Data Directory(History)、当前数据目录(Open Data Directory

将历史数据目录下的所有文件夹移动至当前数据目录:

重启客户端,将弹出数据迁移弹框,点击开始迁移:

迁移成功后,可在新版本使用历史数据。

体验优化:支持后台异步运行批量任务

在过去,在 Easy Dataset 中执行批量任务,默认是在前端同步执行的:

为了加快数据生产速度,一般我们会设置一定的并发数量,这会在前端占用大量的 HTTP 链接,容易造成页面卡顿,另外也受浏览器最大并发请求数量的限制。

目前,在问题生成、生产答案两个操作支持了后台异步任务:

  • 自动提取问题:创建任务后,后台将自动查询未生成问题的文本块,并批量提取问题。

  • 自动生成数据集:创建任务后,后台将自动查询未生成答案的问题,并批量生产答案。

当有未完成的后台任务时,右上角将展示正在处理的图标,点击可查看任务详情:

后续对于文献的处理、领域树的生成等都会逐步增加后台异步任务。

后续还将支持的功能

  • 标注:多维度数据集自定义标注
  • 评估:基于当前数据集、开源数据集对模型微调效果进行评估
  • RAG:针对 RAG 检索效果优化的数据集构造
  • 数据集:基于知识图谱、提示词近一步提升数据集的生成质量
  • 文献:基于模型优化前置文本分块的效果
  • 倾听大家的建议