跳到内容

导出数据到 Argilla

能够将生成的合成数据集导出到 Argilla,是 distilabel 的核心功能。我们坚信合成数据的潜力,但同时也不忽视人类标注者或标注者群体的影响。因此,Argilla 集成使得在 Pipeline 运行时,能够直接将数据集推送到 Argilla,从而在 Argilla 的 UI 中跟踪生成过程,并随时标注记录。可以在 Pipeline 中包含一个 Step,以便使用预定义的配置轻松地将数据集导出到 Argilla,以满足标注目的。

在使用下面将要描述的任何步骤之前,您应该首先启动并运行 Argilla 实例,以便您可以成功地将数据上传到 Argilla。为了部署 Argilla,最简单直接的方法是通过 Hugging Face Spaces 中的 Argilla 模板 进行部署,只需按照那里的步骤操作,或者直接点击以下按钮

文本生成

对于文本生成场景,即当 Pipeline 包含单个 TextGeneration step 时,我们设计了任务 TextGenerationToArgilla,它将无缝地将生成的数据推送到 Argilla,并允许标注者审查记录。

数据集将使用以下配置推送

  • 字段: instructiongeneration,均为 argilla.TextField 类型的字段,加上自动生成的 id,用于给定的 instruction,以便能够在数据集中搜索具有相同 instruction 的其他记录。字段 instruction 必须始终是字符串,而字段 generation 可以是单个字符串或字符串列表(当存在多个 TextGeneration 类型的父节点时很有用);即使每个记录始终最多包含一对 instruction-generation

  • 问题: quality 将是标注者要回答的唯一问题,即要标注的问题,它将是一个 argilla.LabelQuestion,指的是为给定指令提供的 generation 的质量。它可以被标注为 👎 (差) 或 👍 (好)。

注意

TextGenerationToArgilla step 只有在 Pipeline 包含一个或多个 TextGeneration steps,或者批数据中提供了列 instructiongeneration 时才能按原样工作。否则,将需要设置变量 input_mappings,以便将 instructiongeneration 中的一个或两个都映射到批数据中的现有列之一。

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()

Text Generation to Argilla

偏好

对于偏好场景,即当 Pipeline 包含多个 TextGeneration steps 时,我们设计了任务 PreferenceToArgilla,它将无缝地将生成的数据推送到 Argilla,并允许标注者审查记录。

数据集将使用以下配置推送

  • 字段: instructiongenerations,均为 argilla.TextField 类型的字段,加上自动生成的 id,用于给定的 instruction,以便能够在数据集中搜索具有相同 instruction 的其他记录。字段 instruction 必须始终是字符串,而字段 generations 必须是字符串列表,其中包含给定 instruction 的生成文本,以便至少有两个 generations 可以比较。除此之外,Argilla 中每个记录中 generation 字段的数量将由变量 num_generations 的值定义,该值将在 PreferenceToArgilla step 中提供。

  • 问题: ratingrationale 将是为每个 generation 定义的问题对,即每个从 0 到 num_generations 范围内的值,这些问题的类型分别为 argilla.RatingQuestionargilla.TextQuestion。请注意,只有第一对问题是强制性的,因为只有保证批数据中包含一个 generation。此外,请注意,提供的评分范围将从 1 到 5,并提及 Argilla 仅支持大于 0 的值。

注意

PreferenceToArgilla step 只有在 Pipeline 包含多个 TextGeneration steps,或者批数据中提供了列 instructiongenerations 时才能工作。否则,将需要设置变量 input_mappings,以便将 instructiongenerations 中的一个或两个都映射到批数据中的现有列之一。

注意

此外,如果 Pipeline 包含 UltraFeedback step,则 ratingsrationales 也将可用,并将自动作为建议注入到现有数据集中。

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()

Preference to Argilla