Hub 文档

Distilabel

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Distilabel

Distilabel 是一个合成数据和 AI 反馈框架,适用于需要基于经过验证的研究论文构建快速、可靠且可扩展的管道的工程师。

Distilabel 可用于为各种项目生成合成数据和 AI 反馈,包括传统的预测性 NLP(分类、提取等)以及生成式和大型语言模型场景(指令遵循、对话生成、判断等)。Distilabel 的编程方法允许您构建可扩展的 LLM 数据生成和 AI 反馈管道。distilabel 的目标是通过基于经过验证的研究方法快速生成高质量、多样化的数据集,并通过 AI 反馈进行判断,从而加速您的 AI 开发。

人们用 distilabel 构建什么?

Argilla 社区使用 distilabel 创建了令人惊叹的数据集模型

  • 1M OpenHermesPreference 是一个包含约 100 万条 AI 偏好设置的数据集,这些设置是使用 teknium/OpenHermes-2.5 LLM 生成的。这是一个很好的例子,展示了如何使用 distilabel 扩展和加速数据集开发。
  • distilabeled Intel Orca DPO 数据集 用于微调改进的 OpenHermes 模型。该数据集是通过将 Argilla 中的人工标注与 distilabel 中的 AI 反馈相结合而构建的,从而产生了改进版的 Intel Orca 数据集,并且性能优于在原始数据集上微调的模型。
  • haiku DPO 数据 是一个示例,展示了任何人如何为特定任务创建合成数据集,该数据集在经过整理和评估后可用于微调自定义 LLM。

先决条件

首先使用您的 Hugging Face 帐户登录

hf auth login

请确保已安装 `distilabel`

pip install -U distilabel[vllm]

Distilabel 管道

Distilabel 管道可以由任意数量的相互连接的步骤或任务构建。一个步骤或任务的输出作为输入提供给另一个。一系列步骤可以串联起来,以构建复杂的 LLM 数据处理和生成管道。每个步骤的输入是一批数据,其中包含一个字典列表,每个字典代表数据集的一行,键是列名。为了从 Hugging Face Hub 馈送数据和向其馈送数据,我们定义了一个 `Distiset` 类,作为 `datasets.DatasetDict` 的抽象。

Distiset 作为数据集对象

distilabel 中的管道返回一种特殊类型的 Hugging Face `datasets.DatasetDict`,称为 `Distiset`。

管道可以在 Distiset 中输出多个子集,Distiset 是一个类似字典的对象,每个子集有一个条目。然后,Distiset 可以无缝推送到 Hugging Face Hub,所有子集都位于同一个仓库中。

从 Hub 加载数据到 Distiset

为了展示从 Hub 加载数据的示例,我们将复现Prometheus 2 论文,并使用 distilabel 中实现的 PrometheusEval 任务。Prometheus 2 和 PrometheusEval 任务分别是直接评估和成对排序任务,即评估给定指令的单个独立响应的质量(有或无参考答案),以及评估给定指令的一个响应与另一个响应的质量(有或无参考答案)。我们将在从 Hub 加载的数据集上使用这些任务,该数据集由 Hugging Face H4 团队创建,名为HuggingFaceH4/instruction-dataset

from distilabel.llms import vLLM
from distilabel.pipeline import Pipeline
from distilabel.steps import KeepColumns, LoadDataFromHub
from distilabel.steps.tasks import PrometheusEval

if __name__ == "__main__":
    with Pipeline(name="prometheus") as pipeline:
        load_dataset = LoadDataFromHub(
            name="load_dataset",
            repo_id="HuggingFaceH4/instruction-dataset",
            split="test",
            output_mappings={"prompt": "instruction", "completion": "generation"},
        )

        task = PrometheusEval(
            name="task",
            llm=vLLM(
                model="prometheus-eval/prometheus-7b-v2.0",
                chat_template="[INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST]",
            ),
            mode="absolute",
            rubric="factual-validity",
            reference=False,
            num_generations=1,
            group_generations=False,
        )

        keep_columns = KeepColumns(
            name="keep_columns",
            columns=["instruction", "generation", "feedback", "result", "model_name"],
        )

        load_dataset >> task >> keep_columns

然后,我们需要使用运行时参数调用 `pipeline.run`,以便启动管道并将数据存储在 `Distiset` 对象中。

distiset = pipeline.run(
    parameters={
        task.name: {
            "llm": {
                "generation_kwargs": {
                    "max_new_tokens": 1024,
                    "temperature": 0.7,
                },
            },
        },
    },
)

将 distilabel Distiset 推送到 Hub

将 `Distiset` 推送到 Hugging Face 仓库,其中每个子集将对应一个不同的配置。

distiset.push_to_hub(
    "my-org/my-dataset",
    commit_message="Initial commit",
    private=False,
    token=os.getenv("HF_TOKEN"),
)

📚 资源

< > 在 GitHub 上更新