跳到主要内容

Distilabel

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

Distilabel 可用于为各种项目生成合成数据和 AI 反馈,包括传统预测性 NLP(分类、提取等)或生成性和大语言模型场景(指令遵循、对话生成、判断等)。Distilabel 的编程方法允许你构建可扩展的数据生成和 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 中的 Pipeline 返回一种特殊类型的 Hugging Face datasets.DatasetDict,称为 Distiset

Pipeline 可以在 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"),
)

📚 资源