Hub 文档
Distilabel
并获得增强的文档体验
开始使用
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。
先决条件
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"),
)