清理现有的偏好数据集¶
- 目标:通过提供 AI 反馈来清理现有偏好数据集的数据质量。
- 库: argilla, hf-inference-endpoints
- 组件: LoadDataFromDicts, UltraFeedback, KeepColumns, PreferenceToArgilla, InferenceEndpointsLLM, GlobalStep
入门指南¶
安装依赖项¶
要完成本教程,您需要通过 pip 安装 distilabel SDK 和一些第三方库。在本教程中,我们将使用免费但速率受限的 Hugging Face 无服务器推理 API,因此我们需要将其作为额外的 distilabel 依赖项安装。您可以通过运行以下命令来安装它们
让我们进行必要的导入
您需要一个 HF_TOKEN 才能使用 HF 推理端点。登录以在本笔记本中直接使用它。
数据集¶
在本例中,我们将清理一个偏好数据集,因此我们将使用 Hugging Face Hub 中的 Intel/orca_dpo_pairs
数据集。
接下来,我们将打乱 chosen
和 rejected
列,以避免数据集中出现任何偏差。
作为自定义步骤
您还可以在单独的模块中创建一个自定义步骤,导入它,并在使用 LoadDataFromHub
步骤加载 orca_dpo_pairs
数据集后将其添加到管道中。
from typing import TYPE_CHECKING, List
from distilabel.steps import GlobalStep, StepInput
if TYPE_CHECKING:
from distilabel.typing import StepOutput
import random
class ShuffleStep(GlobalStep):
@property
def inputs(self):
"""Returns List[str]: The inputs of the step."""
return ["instruction", "chosen", "rejected"]
@property
def outputs(self):
"""Returns List[str]: The outputs of the step."""
return ["instruction", "generations", "order"]
def process(self, inputs: StepInput):
"""Returns StepOutput: The outputs of the step."""
outputs = []
for input in inputs:
chosen = input["chosen"]
rejected = input["rejected"]
pair = [chosen, rejected]
random.shuffle(pair)
order = ["chosen" if x == chosen else "rejected" for x in pair]
outputs.append({"instruction": input["instruction"], "generations": pair, "order": order})
yield outputs
定义管道¶
要清理现有的偏好数据集,我们将需要定义一个包含所有必要步骤的 Pipeline
。但是,类似的工作流程也可用于清理 SFT 数据集。下面,我们将详细介绍每个步骤。
加载数据集¶
我们将使用刚刚打乱的数据集作为源数据。
- 组件:
LoadDataFromDicts
- 输入列:
system
,question
,chosen
,rejected
,generations
和order
,与加载的字典列表中的键相同。 - 输出列:
system
,instruction
,chosen
,rejected
,generations
和order
。我们将使用output_mappings
重命名列。
评估响应¶
为了评估响应的质量,我们将使用 meta-llama/Meta-Llama-3.1-70B-Instruct
,应用 UltraFeedback
任务,该任务根据不同的维度(helpfulnes、honesty、instruction-following、truthfulness)判断响应。对于 SFT 数据集,您可以改用 PrometheusEval
。
- 组件: 使用
InferenceEndpointsLLM
的 LLM UltraFeedback 任务 - 输入列:
instruction
,generations
- 输出列:
ratings
,rationales
,distilabel_metadata
,model_name
对于您的用例并为了改进结果,您可以使用您选择的任何其他 LLM。
evaluate_responses = UltraFeedback(
aspect="overall-rating",
llm=InferenceEndpointsLLM(
model_id="meta-llama/Meta-Llama-3.1-70B-Instruct",
tokenizer_id="meta-llama/Meta-Llama-3.1-70B-Instruct",
generation_kwargs={"max_new_tokens": 512, "temperature": 0.7},
),
pipeline=Pipeline(name="showcase-pipeline"),
)
evaluate_responses.load()
next(
evaluate_responses.process(
[
{
"instruction": "What's the capital of Spain?",
"generations": ["Madrid", "Barcelona"],
}
]
)
)
仅保留必需的列¶
我们将删除不需要的列。
- 组件:
KeepColumns
- 输入列:
system
,instruction
,chosen
,rejected
,generations
,ratings
,rationales
,distilabel_metadata
和model_name
- 输出列:
instruction
,chosen
,rejected
,generations
和order
keep_columns = KeepColumns(
columns=[
"instruction",
"generations",
"order",
"ratings",
"rationales",
"model_name",
],
pipeline=Pipeline(name="showcase-pipeline"),
)
keep_columns.load()
next(
keep_columns.process(
[
{
"system": "",
"instruction": "What's the capital of Spain?",
"chosen": "Madrid",
"rejected": "Barcelona",
"generations": ["Madrid", "Barcelona"],
"order": ["chosen", "rejected"],
"ratings": [5, 1],
"rationales": ["", ""],
"model_name": "meta-llama/Meta-Llama-3.1-70B-Instruct",
}
]
)
)
(可选) 进一步的数据整理¶
您可以使用 Argilla 进一步整理您的数据。
- 组件:
PreferenceToArgilla
步骤 - 输入列:
instruction
,generations
,generation_models
,ratings
- 输出列:
instruction
,generations
,generation_models
,ratings
运行管道¶
下面,您可以看到完整的管道定义
with Pipeline(name="clean-dataset") as pipeline:
load_dataset = LoadDataFromDicts(
data=dataset, output_mappings={"question": "instruction"}
)
evaluate_responses = UltraFeedback(
aspect="overall-rating",
llm=InferenceEndpointsLLM(
model_id="meta-llama/Meta-Llama-3.1-70B-Instruct",
tokenizer_id="meta-llama/Meta-Llama-3.1-70B-Instruct",
generation_kwargs={"max_new_tokens": 512, "temperature": 0.7},
),
)
keep_columns = KeepColumns(
columns=[
"instruction",
"generations",
"order",
"ratings",
"rationales",
"model_name",
]
)
to_argilla = PreferenceToArgilla(
dataset_name="cleaned-dataset",
dataset_workspace="argilla",
api_url="https://[your-owner-name]-[your-space-name].hf.space",
api_key="[your-api-key]",
num_generations=2,
)
load_dataset.connect(evaluate_responses)
evaluate_responses.connect(keep_columns)
keep_columns.connect(to_argilla)
现在让我们运行管道并清理我们的偏好数据集。
让我们检查一下!如果您已将数据加载到 Argilla,则可以在 Argilla UI 中开始注释。
您可以将数据集推送到 Hub 以与社区共享,并嵌入它以探索数据。
结论¶
在本教程中,我们展示了使用 distilabel 构建管道以清理偏好数据集的详细步骤。但是,您可以为自己的用例自定义此管道,例如清理 SFT 数据集或添加自定义步骤。
我们使用偏好数据集作为起点,并打乱了数据以避免任何偏差。接下来,我们通过无服务器 Hugging Face 推理 API 使用模型评估了响应,遵循 UltraFeedback 标准。最后,我们保留了需要的列并使用 Argilla 进行了进一步的整理。