跳到内容

ExpandColumns

将包含列表的列展开为多行。

ExpandColumns 是一个 Step,它接受一个列列表,并将它们展开为多行。新行将具有与原始行相同的数据,但展开的列除外,该列将包含原始列表中的单个项目。

属性

  • columns: 一个字典,将要展开的列映射到新列名或要展开的列列表。如果提供了列表,则新列名将与列名相同。

  • encoded: 一个布尔值,用于告知列是否为 JSON 编码列表。如果此值设置为 True,则将在展开之前解码列。或者,要指定可以编码的列,可以提供列表。在这种情况下,告知的列名必须是要选择展开的列的子集。

  • split_statistics: 一个布尔值,用于告知是否应将 distilabel_metadata 列中的统计信息拆分为多行。如果我们想展开一些包含字符串列表的列,这些字符串列表来自解析 LLM 的输出,则应拆分 distilabel_metadata 列的 statistics_{step_name} 中的 tokens,以避免在之后聚合数据时将它们相乘。例如,对于一个应该生成 N 条指令列表的任务,并且我们希望每 N 条指令都在不同的行中,我们应该将统计信息除以 N 进行拆分。在这种情况下,将此值设置为 True。

输入和输出列

graph TD
    subgraph Dataset
        subgraph Columns
            ICOL0[dynamic]
        end
        subgraph New columns
            OCOL0[dynamic]
        end
    end

    subgraph ExpandColumns
        StepInput[Input Columns: dynamic]
        StepOutput[Output Columns: dynamic]
    end

    ICOL0 --> StepInput
    StepOutput --> OCOL0
    StepInput --> StepOutput

输入

  • dynamic (由 columns 属性确定): 要展开为多行的列。

输出

  • dynamic (由 columns 属性确定): 展开的列。

示例

将选定的列展开为多行

from distilabel.steps import ExpandColumns

expand_columns = ExpandColumns(
    columns=["generation"],
)
expand_columns.load()

result = next(
    expand_columns.process(
        [
            {
                "instruction": "instruction 1",
                "generation": ["generation 1", "generation 2"]}
        ],
    )
)
# >>> result
# [{'instruction': 'instruction 1', 'generation': 'generation 1'}, {'instruction': 'instruction 1', 'generation': 'generation 2'}]

展开 JSON 编码的选定列为多行

from distilabel.steps import ExpandColumns

expand_columns = ExpandColumns(
    columns=["generation"],
    encoded=True,  # It can also be a list of columns that are encoded, i.e. ["generation"]
)
expand_columns.load()

result = next(
    expand_columns.process(
        [
            {
                "instruction": "instruction 1",
                "generation": '["generation 1", "generation 2"]'}
        ],
    )
)
# >>> result
# [{'instruction': 'instruction 1', 'generation': 'generation 1'}, {'instruction': 'instruction 1', 'generation': 'generation 2'}]

展开选定的列,并拆分 distilabel_metadata 列中的统计信息

from distilabel.steps import ExpandColumns

expand_columns = ExpandColumns(
    columns=["generation"],
    split_statistics=True,
)
expand_columns.load()

result = next(
    expand_columns.process(
        [
            {
                "instruction": "instruction 1",
                "generation": ["generation 1", "generation 2"],
                "distilabel_metadata": {
                    "statistics_generation": {
                        "input_tokens": [12],
                        "output_tokens": [12],
                    },
                },
            }
        ],
    )
)
# >>> result
# [{'instruction': 'instruction 1', 'generation': 'generation 1', 'distilabel_metadata': {'statistics_generation': {'input_tokens': [6], 'output_tokens': [6]}}}, {'instruction': 'instruction 1', 'generation': 'generation 2', 'distilabel_metadata': {'statistics_generation': {'input_tokens': [6], 'output_tokens': [6]}}}]