注意
本教程演示了 FeedbackDataset
的示例用法,它提供的实现与旧的 TextClassificationDataset
、Text2TextDataset
和 TokenClassificationDataset
不同。要了解有关旧数据集的信息,您可以在此处查看。不确定使用哪个数据集?请查看我们关于选择数据集的部分。
Workflow Feedback Dataset#
Argilla Feedback 是一款旨在获取和管理来自注释器和中小型大型语言模型的反馈数据的工具。
安装库#
在 Colab 中安装最新版本的 Argilla,以及本笔记本中使用的其他库和模型。
[ ]:
!pip install argilla datasets setfit evaluate seqeval
设置 Argilla#
如果您已经部署了 Argilla 服务器,则可以跳过此步骤。否则,您可以快速通过两种不同的方式部署它
您可以在 HF Spaces 上部署 Argilla 服务器。
或者,如果您想在您自己的计算机本地运行 Argilla,则启动并运行 Argilla UI 的最简单方法是在 Docker 上部署
docker run -d --name quickstart -p 6900:6900 argilla/argilla-quickstart:latest
有关安装的更多信息,请访问此处。
连接到 Argilla#
可以通过简单地导入 Argilla 库并使用环境变量和 rg.init()
连接到我们的 Argilla 实例。
ARGILLA_API_URL
:它是 Argilla 服务器的 URL。如果您正在使用 Docker,则默认情况下为
https://#:6900
。如果您正在使用 HF Spaces,则其构造为
https://[your-owner-name]-[your_space_name].hf.space
。
ARGILLA_API_KEY
:它是 Argilla 服务器的 API 密钥。默认情况下为owner
。HF_TOKEN
:它是 Hugging Face API 令牌。仅当您使用私有 HF Space时才需要它。您可以在您的个人资料中配置它:设置 > 访问令牌。workspace
:它是 Argilla 实例内部的“空间”,授权用户可以在其中协作。默认情况下为argilla
。
有关自定义配置(如标头、工作区隔离或访问凭据)的更多信息,请查看我们的配置页面。
[1]:
import argilla as rg
from argilla._constants import DEFAULT_API_KEY
[2]:
# Argilla credentials
api_url = "https://#:6900" # "https://<YOUR-HF-SPACE>.hf.space"
api_key = DEFAULT_API_KEY # admin.apikey
# Huggingface credentials
hf_token = "hf_..."
[3]:
import argilla as rg
rg.init(api_url=api_url, api_key=api_key)
# # If you want to use your private HF Space
# rg.init(extra_headers={"Authorization": f"Bearer {hf_token}"})
C:\Users\sarah\Documents\argilla\src\argilla\client\client.py:154: UserWarning: Default user was detected and no workspace configuration was provided, so the default 'argilla' workspace will be used. If you want to setup another workspace, use the `rg.set_workspace` function or provide a different one on `rg.init`
warnings.warn(
启用遥测#
我们从您与我们的教程互动的方式中获得宝贵的见解。为了改进我们自己,为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。虽然这是完全匿名的,但如果您愿意,可以选择跳过此步骤。有关更多信息,请查看遥测页面。
[ ]:
try:
from argilla.utils.telemetry import tutorial_running
tutorial_running()
except ImportError:
print("Telemetry is introduced in Argilla 1.20.0 and not found in the current installation. Skipping telemetry.")
创建数据集#
FeedbackDataset 是 Argilla Feedback 结构的容器。Argilla Feedback 为 FeedbackDatasets 提供不同的组件,您可以将这些组件用于工作流程的各个方面。有关更详细的说明,请参阅文档和面向初学者的端到端教程。
首先,我们需要配置 FeedbackDatasest。为此,有两种选择:使用预定义的模板或创建自定义模板。
使用任务模板#
Argilla 提供了一组不同任务的预定义模板。您可以使用它们来直接配置您的数据集。例如,如果您想创建一个用于简单文本分类的数据集,您可以使用以下代码
[25]:
dataset = rg.FeedbackDataset.for_text_classification(
labels=["joy", "sadness"],
multi_label=False,
use_markdown=True,
guidelines=None,
metadata_properties=None,
vectors_settings=None,
)
dataset
[25]:
FeedbackDataset(
fields=[TextField(name='text', title='Text', required=True, type='text', use_markdown=True)]
questions=[LabelQuestion(name='label', title='Label', description='Classify the text by selecting the correct label from the given list of labels.', required=True, type='label_selection', labels=['joy', 'sadness'], visible_labels=None)]
guidelines=This is a text classification dataset that contains texts and labels. Given a set of texts and a predefined set of labels, the goal of text classification is to assign one label to each text based on its content. Please classify the texts by making the correct selection.)
metadata_properties=[])
)
现在我们有了数据集,我们可以将数据集推送到 Argilla 空间。
注意
从 Argilla 1.14.0 开始,调用 push_to_argilla
不仅会将 FeedbackDataset
推送到 Argilla 中,还会返回远程 FeedbackDataset
实例,这意味着记录的添加、更新和删除将在完成后立即推送到 Argilla。这与以前版本的 Argilla 不同,在以前的版本中,您必须再次调用 push_to_argilla
才能将更改推送到 Argilla。
[ ]:
try:
dataset.push_to_argilla(name="my-first-dataset", workspace="argilla")
except:
pass
配置自定义数据集#
如果您的数据集不符合预定义模板之一,您可以通过定义字段、不同的问题类型、元数据属性和向量设置来创建自定义数据集。
添加记录#
记录是指将由注释团队注释的每个数据项。记录将是在 UI 中向用户显示的信息片段,以便完成注释任务。在当前数据集示例中,它只能包含要标记的文本。
[27]:
records = [
rg.FeedbackRecord(
fields={
"text": "I am so happy today",
},
),
rg.FeedbackRecord(
fields={
"text": "I feel sad today",
},
)
]
dataset.add_records(records)
[28]:
dataset.records
[28]:
[FeedbackRecord(fields={'text': 'I am so happy today'}, metadata={}, vectors={}, responses=[], suggestions=(), external_id=None),
FeedbackRecord(fields={'text': 'I feel sad today'}, metadata={}, vectors={}, responses=[], suggestions=(), external_id=None)]
Argilla 还提供了一种使用来自其他模型的建议和回复作为注释器起点的途径。这样,注释器可以通过更正预测或答案而不是从头开始注释来节省时间和精力。
训练模型#
与其他数据集一样,Feedback 数据集也允许创建训练管道并使用生成的模型进行推理。在您使用 Argilla Feedback 收集回复后,您可以轻松地微调 LLM。在本示例中,我们将必须完成文本分类任务。
对于微调,我们将使用 setfit 库和Argilla Trainer,它是围绕我们许多最喜欢的 NLP 库的强大包装器。它提供了一个非常直观的抽象表示,以促进使用体面的默认预设配置的简单训练工作流程,而无需担心 Argilla 的任何数据转换。
让我们首先创建我们的数据集进行训练。对于此示例,我们将使用来自 Argilla 的 emotion 数据集,该数据集是使用 Argilla 创建的。每个文本项的回复都是 6 种不同的情感,即悲伤、喜悦、爱、愤怒、恐惧和惊讶。
[ ]:
# Besides Argilla, it can also be imported with load_dataset from datasets
dataset_hf = rg.FeedbackDataset.from_huggingface("argilla/emotion", split="train[1:101]")
[17]:
dataset_hf
[17]:
FeedbackDataset(
fields=[TextField(name='text', title='Text', required=True, type=<FieldTypes.text: 'text'>, use_markdown=False)]
questions=[LabelQuestion(name='label', title='Label', description=None, required=True, type=<QuestionTypes.label_selection: 'label_selection'>, labels={'0': 'sadness', '1': 'joy', '2': 'love', '3': 'anger', '4': 'fear', '5': 'surprise'}, visible_labels=6)]
guidelines=Argilla port of [dair-ai/emotion](https://hugging-face.cn/datasets/dair-ai/emotion).)
metadata_properties=[])
)
然后,我们可以开始创建训练管道,首先定义 TrainingTask
,它用于定义应如何根据关联的任务和框架处理和格式化数据。每个任务都有其自己的类方法,并且数据格式始终可以通过 formatting_func
进行自定义。您可以访问此页面以获取更多信息。像文本分类这样的更简单的任务可以使用默认定义来定义,就像我们在本示例中所做的那样。
[ ]:
from argilla.feedback import TrainingTask
task = TrainingTask.for_text_classification(
text=dataset_hf.field_by_name("text"),
label=dataset_hf.question_by_name("label")
)
然后,我们可以为任何受支持的框架定义我们的 ArgillaTrainer,并使用 ArgillaTrainer.update_config 自定义训练配置。
让我们使用任何受支持的框架定义 ArgillaTrainer。
[ ]:
from argilla.feedback import ArgillaTrainer
trainer = ArgillaTrainer(
dataset=dataset_hf,
task=task,
framework="setfit",
train_size=0.8
)
您可以通过 update_config
更新模型配置。
[ ]:
trainer.update_config(num_train_epochs=1, num_iterations=1)
我们现在可以使用 train
训练模型
[ ]:
trainer.train(output_dir="setfit_model")
并使用 predict
进行推理。
[ ]:
trainer.predict("This is just perfect!")
在本教程中,我们使用 FeedbackDataset 训练了一个模型。有关 Argilla Feedback 和 LLM 中的概念的更多信息,请在此处查看。有关更详细的说明,请参阅文档和面向初学者的端到端教程。