收集演示数据#
本指南解释了如何实施收集演示数据的工作流程。正如 “大型语言模型的数据收集”指南 中所述,演示数据(提示和演示)对于改进 LLM 至关重要。此数据有助于监督微调,也称为指令调优或行为克隆,模型在其中学习根据人类示例做出响应。尽管被视为劳动密集型,但最近像 LIMA 工作这样的研究表明,即使是一小部分 1,000 个多样化、高质量的示例也可以有效地训练模型。Argilla Feedback 的开发旨在简化此过程,将其分发到您组织内的多个标注员。
提示
您可以向 Argilla 数据集添加无限用户,以便可以无缝地用于在您组织内的数百名标注员或专家之间分配工作负载。类似的工作包括 Databricks 的 Dolly 或 OpenAssistant。如果您希望获得设置此类工作的帮助,请联系我们,我们将很乐意提供帮助。
下图说明了从标注员团队收集反馈并执行监督微调的步骤。这些步骤是:配置数据集、添加记录、标注员编写演示、准备数据集和 微调 SFT 模型。
注意
以下部分详细介绍了上述步骤的概念性描述。如需实践性的介绍,请直接转到操作指南或示例部分。
配置数据集#
此阶段旨在配置数据集,以便为每个 prompt
收集人类演示。
首先,我们需要配置一个数据集。Argilla 数据集允许您混合不同的问题供标注员回答。在本例中,我们希望从标注员那里收集演示。我们只需要定义一个文本问题。数据集是使用 Argilla Python SDK 配置的。以下是如何定义此字段
import argilla as rg
questions =[
rg.TextQuestion(
name="demonstration",
title="Please write a harmless and helpful response for the prompt:",
required=True
)
]
Argilla 数据集由记录组成。记录是可以由一个或多个标注员标注的数据点。记录由一个或多个字段组成。这些字段以及呈现给标注员的顺序是完全可配置的。在本例中,我们想向标注员展示一个提示。我们只需要定义一个文本字段。以下是如何定义此字段
fields = [
rg.TextField(name="prompt", required=True)
]
要配置数据集,最后一步是定义标注员的指南。这些指南帮助标注员理解并一致地回答问题。以下是如何配置数据集,包括指南
dataset = rg.FeedbackDataset(
guidelines="Please, read the prompt carefully and...",
questions=questions,
fields=fields
)
添加记录#
此阶段旨在创建包含 prompts
的记录,以推送到 Argilla 中,用于收集人类 completions
。
配置数据集后,您需要添加记录并将其发布给标注员。在本例中,记录将包含一个字段,即提示。此提示将在 UI 中向标注员显示,我们将要求他们提供完成。此步骤中最重要的的问题是:从哪里获取提示以及如何选择它们,以便最大限度地提高最终 LLM 的质量。
提示
结果数据集的重要特征包括多样性、一致的完成风格和质量。在设计数据选择和收集过程时,必须考虑这些特征。
对于收集提示或指令,至少有以下选项
使用开放的提示或用户查询数据集#
如果您没有适用于您的用例的内部数据库,您可以从开放数据集中抽样和选择提示。此处的步骤可以包括:(1) 查找可能包含与您的用例相关的提示的开放数据集,(2) 执行探索性数据分析和主题提取以了解数据,以及 (3) 根据主题、质量、文本描述性等筛选和选择提示。
一些可用的数据集是 ShareGPT、Open Assistant Conversation Dataset 或 Stack Exchange。请注意,其中一些数据集可能包含不适当、不相关或质量差的示例,不适用于您的用例。
注意
开放数据集可能包含响应,因此您可能会考虑完全跳过数据收集过程。如果您想为您的用例构建高质量的指令跟随模型,这些数据集涵盖了广泛的主题,但响应可能不符合您的用例的质量和风格。此外,已经有几个模型使用这些数据集进行了训练。如果您认为数据的质量和风格已经适合您的用例,我们建议使用其中一个模型和您自己的数据运行评估活动。
另一种方法是获取您领域中的用户查询数据集,并应用相同的数据分析和抽样过程。一个好的策略是搜索用户意图或话语数据集。例如,如果您计划为客户服务银行助理微调 LLM,您可以从 banking77 数据集开始。
请人类编写提示或指令#
如果以上方法都不可能,第三种选择是请人类为您的用例编写提示。此选项成本高昂且具有局限性。主要的局限性是创建人工提示的风险,如果提示不是由最终用户编写的,则这些提示将与最终用户的多样性、主题或写作风格不符。除了让最终用户参与到流程中之外,可以通过定义明确的指南并准备一组多样化的主题来克服此限制。通过使用 指南 和创建包含 文本字段 的记录,指示标注员要编写关于什么提示,可以轻松地使用 Argilla Feedback 设置此类工作。通过添加此字段,您可以控制提示主题的多样性和所需的分布。以下是如何使用 Python SDK 设置字段和问题
# this will be populated from the list of writing topics you create
fields = [
rg.TextField(name="writing-topic", required=True)
]
# we will ask the labeler to write a possible prompt or instruction
question = rg.TextQuestion(
name="prompt",
title="Imagine and write a possible instruction for the given topic:",
required=True
)
请注意,您还可以要求标注员回复提出的指令。此策略可能适用于具体项目和可用资源,但它会使标注更加复杂并影响整体一致性。
提示
无论您选择哪个选项,为了获得最佳质量,我们建议使用 Argilla 构建反馈工作流程,在该工作流程中,您要求标注员对提示的质量进行评级。您可以使用聚合评分来选择最高质量的示例。
一旦您准备好包含提示的数据集,您只需要创建记录,将其添加到数据集中,并将数据集推送到 Argilla,使其可供标注员(或您自己)使用
from datasets import load_dataset
# This is only for demonstration and assumes you use a HF dataset
prompts = load_dataset('your_prompts_dataset', split=["train"])
records = [
rg.FeedbackRecord(fields={"prompt": record["prompt"]})
for record in dataset
]
dataset.add_records(records)
# This publishes the dataset with its records to Argilla and returns the dataset in Argilla
remote_dataset = dataset.push_to_argilla(name="my-dataset", workspace="my-workspace")
# This publishes the dataset with its records to Argilla and turns the dataset object into a dataset in Argilla
dataset.push_to_argilla(name="my-dataset", workspace="my-workspace")
标注员编写完成#
此阶段旨在通过 Argilla UI 为每个 prompt
提供人类演示。
将数据集上传到 Argilla 后,即可通过 Argilla UI 访问它。Argilla Feedback 允许从多个用户同时收集反馈,从而增强质量控制。每个具有数据集访问权限的用户都可以提供反馈。
但是,当资源稀缺时,建议在不同的标注员之间分配工作负载。此策略需要为每个标注员分配要标注的记录子集。此操作指南 提供了有关有效设置这些工作负载分配选项的详细说明。
有关 Argilla UI 主要功能的全面了解,请参阅此操作指南。
准备数据集#
此阶段旨在将数据集编译为 prompt
和 demonstration
对,用于监督微调。
数据集标注完成后,您可以使用 Python SDK 检索响应,如下所示
# Assume we distribute the workload in one dataset with several labelers
feedback = rg.FeedbackDataset.from_argilla(
name="my-dataset",
workspace="my-workspace"
)
您的工作分配策略可能需要您收集和整合来自多个数据集和工作区的响应。让我们考虑一种场景,您已将任务分配给四名标注员。以下是如何检索他们的响应
# Assume the workload has been divided across the following workspaces
user_workspaces = ["natalia", "amelie", "tom", "dani"]
# this will hold each user's subsets
feedback_datasets = []
for workspace in user_workspaces:
feedback = rg.FeedbackDataset.from_argilla(
name="my-dataset",
workspace=workspace
)
feedback_datasets.append(feedback)
feedback.records
中的每个记录都包含一个 responses
属性,其中包含为该记录提供的任何反馈。每个响应都包括
user_id
:标注员的 Argilla 用户 ID。values
:标注员提供的反馈。它被格式化为字典,键为每个问题,值为各自的答案。status
:响应的状况 -submitted
或discarded
。出于我们的目的,我们专注于submitted
记录。
对于没有注释重叠的数据集,意味着每个记录只有一个响应,后期处理很简单,因为无需选择要保留哪些注释。如果存在重叠,请参阅 本指南,了解冲突解决策略。
在协调之后,我们的目标是获得一个记录列表,每个记录都有一个 demonstration
答案,用于微调。
此外,记录还包括一个 fields
属性,概述了数据集创建期间设置的所有字段。在本例中,我们有 prompt
用作微调的输入。
在为每个 prompt
收集一个 demonstration
后,最后一步是为微调您的基础 LLM 准备数据集。此准备工作取决于您选择的微调框架。本指南 讨论了选项和各自的数据准备方法。