导出数据到 Argilla¶
能够将生成的合成数据集导出到 Argilla,是 distilabel
的核心功能。我们坚信合成数据的潜力,但同时也不忽视人类标注者或标注者群体的影响。因此,Argilla 集成使得在 Pipeline
运行时,能够直接将数据集推送到 Argilla,从而在 Argilla 的 UI 中跟踪生成过程,并随时标注记录。可以在 Pipeline
中包含一个 Step
,以便使用预定义的配置轻松地将数据集导出到 Argilla,以满足标注目的。
在使用下面将要描述的任何步骤之前,您应该首先启动并运行 Argilla 实例,以便您可以成功地将数据上传到 Argilla。为了部署 Argilla,最简单直接的方法是通过 Hugging Face Spaces 中的 Argilla 模板 进行部署,只需按照那里的步骤操作,或者直接点击以下按钮
文本生成¶
对于文本生成场景,即当 Pipeline
包含单个 TextGeneration
step 时,我们设计了任务 TextGenerationToArgilla
,它将无缝地将生成的数据推送到 Argilla,并允许标注者审查记录。
数据集将使用以下配置推送
-
字段:
instruction
和generation
,均为argilla.TextField
类型的字段,加上自动生成的id
,用于给定的instruction
,以便能够在数据集中搜索具有相同instruction
的其他记录。字段instruction
必须始终是字符串,而字段generation
可以是单个字符串或字符串列表(当存在多个TextGeneration
类型的父节点时很有用);即使每个记录始终最多包含一对instruction
-generation
。 -
问题:
quality
将是标注者要回答的唯一问题,即要标注的问题,它将是一个argilla.LabelQuestion
,指的是为给定指令提供的 generation 的质量。它可以被标注为 👎 (差) 或 👍 (好)。
注意
TextGenerationToArgilla
step 只有在 Pipeline
包含一个或多个 TextGeneration
steps,或者批数据中提供了列 instruction
和 generation
时才能按原样工作。否则,将需要设置变量 input_mappings
,以便将 instruction
和 generation
中的一个或两个都映射到批数据中的现有列之一。
from distilabel.models import OpenAILLM
from distilabel.steps import LoadDataFromDicts, TextGenerationToArgilla
from distilabel.steps.tasks import TextGeneration
with Pipeline(name="my-pipeline") as pipeline:
load_dataset = LoadDataFromDicts(
name="load_dataset",
data=[
{
"instruction": "Write a short story about a dragon that saves a princess from a tower.",
},
],
)
text_generation = TextGeneration(
name="text_generation",
llm=OpenAILLM(model="gpt-4"),
)
to_argilla = TextGenerationToArgilla(
dataset_name="my-dataset",
dataset_workspace="admin",
api_url="<ARGILLA_API_URL>",
api_key="<ARGILLA_API_KEY>",
)
load_dataset >> text_generation >> to_argilla
pipeline.run()
偏好¶
对于偏好场景,即当 Pipeline
包含多个 TextGeneration
steps 时,我们设计了任务 PreferenceToArgilla
,它将无缝地将生成的数据推送到 Argilla,并允许标注者审查记录。
数据集将使用以下配置推送
-
字段:
instruction
和generations
,均为argilla.TextField
类型的字段,加上自动生成的id
,用于给定的instruction
,以便能够在数据集中搜索具有相同instruction
的其他记录。字段instruction
必须始终是字符串,而字段generations
必须是字符串列表,其中包含给定instruction
的生成文本,以便至少有两个 generations 可以比较。除此之外,Argilla 中每个记录中generation
字段的数量将由变量num_generations
的值定义,该值将在PreferenceToArgilla
step 中提供。 -
问题:
rating
和rationale
将是为每个 generation 定义的问题对,即每个从 0 到num_generations
范围内的值,这些问题的类型分别为argilla.RatingQuestion
和argilla.TextQuestion
。请注意,只有第一对问题是强制性的,因为只有保证批数据中包含一个 generation。此外,请注意,提供的评分范围将从 1 到 5,并提及 Argilla 仅支持大于 0 的值。
注意
PreferenceToArgilla
step 只有在 Pipeline
包含多个 TextGeneration
steps,或者批数据中提供了列 instruction
和 generations
时才能工作。否则,将需要设置变量 input_mappings
,以便将 instruction
和 generations
中的一个或两个都映射到批数据中的现有列之一。
注意
此外,如果 Pipeline
包含 UltraFeedback
step,则 ratings
和 rationales
也将可用,并将自动作为建议注入到现有数据集中。
from distilabel.models import OpenAILLM
from distilabel.steps import LoadDataFromDicts, PreferenceToArgilla
from distilabel.steps.tasks import TextGeneration
with Pipeline(name="my-pipeline") as pipeline:
load_dataset = LoadDataFromDicts(
name="load_dataset",
data=[
{
"instruction": "Write a short story about a dragon that saves a princess from a tower.",
},
],
)
text_generation = TextGeneration(
name="text_generation",
llm=OpenAILLM(model="gpt-4"),
num_generations=4,
group_generations=True,
)
to_argilla = PreferenceToArgilla(
dataset_name="my-dataset",
dataset_workspace="admin",
api_url="<ARGILLA_API_URL>",
api_key="<ARGILLA_API_KEY>",
num_generations=4,
)
load_dataset >> text_generation >> to_argilla
if __name__ == "__main__":
pipeline.run()