向 FeedbackDataset
添加 Responses
和 Suggestions
#
在本端到端教程系列的这一部分中,我们将了解如何使用回复和建议更新数据集的记录。您可以参考之前的教程,了解创建数据集、配置用户和工作区或添加元数据。请随时查看实践指南页面以获取更深入的信息。
在 Argilla 中,responses
是标注者对我们提出的问题的答案。如果我们有一个已经标注的数据集,我们可以将这些黄金回复作为回复添加到我们的数据集中。这非常方便,因为我们不必再次标注数据集。另一方面,suggestions
是我们在标注过程中在 UI 中向标注者展示的模型预测。这样,标注过程对于标注者来说将变得更快、更轻松。
目录#
运行 Argilla#
对于本教程,您需要运行 Argilla 服务器。部署和运行 Argilla 有两个主要选项
在 Hugging Face Spaces 上部署 Argilla: 如果您想使用外部 Notebook(例如,Google Colab)运行教程,并且您在 Hugging Face 上有一个帐户,则只需点击几下即可在 Spaces 上部署 Argilla
有关配置部署的详细信息,请查看官方 Hugging Face Hub 指南。
使用 Argilla 的快速入门 Docker 镜像启动 Argilla:如果您想在本地机器上运行 Argilla,这是推荐的选项。请注意,此选项仅允许您在本地运行教程,而不能与外部 Notebook 服务一起运行。
有关部署选项的更多信息,请查看文档的部署部分。
提示
本教程是一个 Jupyter Notebook。有两种运行方式
使用此页面顶部的“在 Colab 中打开”按钮。此选项允许您直接在 Google Colab 上运行 Notebook。不要忘记将运行时类型更改为 GPU 以加快模型训练和推理速度。
通过单击页面顶部的“查看源代码”链接下载 .ipynb 文件。此选项允许您下载 Notebook 并在本地机器或您选择的 Jupyter Notebook 工具上运行它。
首先,让我们安装我们的依赖项并导入必要的库
[ ]:
!pip install argilla
!pip install datasets transformers
[6]:
import argilla as rg
from datasets import load_dataset
from transformers import pipeline
from datetime import datetime
from argilla._constants import DEFAULT_API_KEY
为了运行此 Notebook,我们将需要一些凭据才能从 Argilla
和 🤗 Hub
推送和加载数据集,让我们在以下单元格中设置它们
[ ]:
# Argilla credentials
api_url = "https://#:6900" # "https://<YOUR-HF-SPACE>.hf.space"
api_key = DEFAULT_API_KEY # admin.apikey
# Huggingface credentials
hf_token = "hf_..."
登录到 argilla
[ ]:
rg.init(api_url=api_url, api_key=api_key)
启用遥测#
我们从您与我们的教程的互动中获得宝贵的见解。为了改进我们自己,为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。虽然这是完全匿名的,但如果您愿意,可以选择跳过此步骤。有关更多信息,请查看遥测页面。
[ ]:
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.")
拉取数据集#
由于我们将在之前的教程中创建的数据集上传到了 Argilla 和 HuggingFace Hub,我们可以从它们中的任何一个拉取数据集。让我们看看如何从两者中拉取数据集。
从 Argilla#
我们可以使用 from_argilla
方法从 Argilla 拉取数据集。
[ ]:
dataset_remote = rg.FeedbackDataset.from_argilla("end2end_textclassification")
从 HuggingFace Hub#
我们也可以从 HuggingFace Hub 拉取数据集。类似地,我们可以使用 from_huggingface
方法来拉取数据集。
[ ]:
dataset = rg.FeedbackDataset.from_huggingface("argilla/end2end_textclassification")
注意
从 HuggingFace Hub 拉取的数据集是 FeedbackDataset
的实例,而从 Argilla 拉取的数据集是 RemoteFeedbackDataset
的实例。两者之间的区别在于,前者是本地的,对其所做的更改会保留在本地。另一方面,后者是远程的,对其所做的更改会直接反映在 Argilla 服务器上的数据集上,这可以使您的过程更快。
让我们简要检查一下我们的数据集的外观。它是一个数据集,包含带有字段 text
的数据项,该字段尚未被标注。
[8]:
dataset[0].fields
[8]:
{'text': "Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again."}
拉取原始数据集#
由于我们将使用原始数据集中的黄金标签作为回复,我们可以从 HuggingFace Hub 拉取原始数据集。我们可以通过使用 load_dataset
方法来做到这一点。
[9]:
dataset_org = load_dataset("ag_news", split="train[:1000]")
原始数据集中的标签是整数形式,而我们需要以字符串形式将其呈现给标注者。因此,我们将创建一个字典,将整数标签映射到其字符串对应项。
[10]:
id2label = {0: "World", 1: "Sports", 2: "Business", 3: "Sci/Tech"}
mapped_labels = [id2label[label] for label in dataset_org["label"]]
添加 Responses
#
现在我们有了原始数据集和我们在之前的教程中创建的数据集,我们可以添加回复。对于本地 FeedbackDataset 和 RemoteFeedbackDataset,此过程略有不同。让我们看看如何为两者执行此操作。
对于本地 FeedbackDataset
#
对于数据集的本地实例,我们可以迭代数据项并为每个项目添加回复。
[ ]:
for index, record in enumerate(dataset.records):
record.responses = [
{
"values":{
"label":{
"value": mapped_labels[index],
}
}
}
]
对于 RemoteFeedbackDataset
#
对于数据集的远程实例,我们可以创建数据集中记录的列表,并在列表上进行更改。然后,我们可以通过 update_records
方法更新数据集。
[ ]:
modified_records = [record for record in dataset_remote.records]
for index, record in enumerate(modified_records):
record.responses = [
{
"values":{
"label":{
"value": mapped_labels[index],
}
},
"inserted_at": datetime.now(),
"updated_at": datetime.now(),
}
]
dataset_remote.update_records(modified_records)
添加 Suggestions
#
正如我们所提到的,建议是您首选的任何模型的预测,将作为建议的回复添加到我们的数据集中。在本教程中,我们将使用来自 HuggingFace Hub 的 cointegrated/rubert-tiny-bilingual-nli
模型来获得我们的模型预测。为了获得预测,我们将使用 transformers
库中的 pipeline
方法,这使得使用模型进行推理变得容易。让我们首先加载模型。为了给我们提供零样本模型,我们还创建了一个我们想要预测的标签列表。
[13]:
model_name = "cointegrated/rubert-tiny-bilingual-nli"
classifier = pipeline("zero-shot-classification", model=model_name)
candidate_labels = ["World", "Sports", "Business", "Sci/Tech"]
同样,对于本地 FeedbackDataset
和 RemoteFeedbackDataset
,此过程略有不同。让我们看看如何为两者执行此操作。
对于本地 FeedbackDataset
#
对于数据集的本地实例,我们可以迭代数据项,并通过同时使用模型对文本进行分类来为每个项目添加建议。此外,我们希望将模型添加为建议的 agent
,以供将来参考。
[14]:
for record in dataset.records:
record.suggestions = [
{
"question_name": "label",
"value": classifier(record.fields["text"], candidate_labels)["labels"][0],
"agent": model_name
}
]
对于 RemoteFeedbackDataset
#
对于数据集的远程实例,我们将使用与上面添加回复的列表相同的列表,而不是创建一个新的 modified_records
列表。同样,我们将从 pipeline
方法中获取模型预测,因为我们正在迭代记录。同样,我们希望将模型添加为建议的 agent
,以供将来参考。我们将使用 update_records
方法在最后更新数据集。
[ ]:
modified_records = [record for record in dataset_remote.records]
for record in modified_records:
record.suggestions = [
{
"question_name": "label",
"value": classifier(record.fields["text"], candidate_labels)["labels"][0],
"agent": model_name
}
]
dataset_remote.update_records(modified_records)
请注意,为了演示目的,我们在这里将添加回复和建议的过程分成了两个步骤。但是,您可以通过仅迭代记录一次来同时执行这两项操作。在这种情况下,您只需为远程数据集调用一次 update_records
方法。
推送数据集#
现在我们已经向数据集添加了回复和建议,我们可以将数据集推送到 Argilla。我们可以通过使用 push_to_argilla
方法来做到这一点。请注意,如果您使用的是 RemoteFeedbackDataset
,则不必将数据集推送到 Argilla,因为更改会直接反映在 Argilla 服务器上的数据集上。
到 Argilla#
如果您选择从 HuggingFace 拉取数据集并想要推送到 Argilla,您可以简单地使用 push_to_argilla
方法。
[ ]:
try:
remote_dataset = rg.FeedbackDataset.from_argilla("end2end_textclassification_with_suggestions_and_responses")
remote_dataset.delete()
except Exception:
pass
remote_dataset = dataset.push_to_argilla("end2end_textclassification_with_suggestions_and_responses")
让我们转到 Argilla 并查看我们创建的数据集。当您首次打开数据集时,您应该看到消息“您没有待处理的记录”,因为我们已上传所有回复,并且没有剩余待处理的记录。如下所示,如果您转到 已提交
选项卡,您可以看到所有记录都已提交,并且标签与我们上面上传的标签完全相同。
由于所有记录都已提交,我们不再看到每个记录的建议。为了演示如何看到它们,您可以看到下面的 Argilla UI,其中记录尚未提交,并且建议(在本例中为 Sports
)会显示给标注者。
到 HuggingFace Hub#
如果您想将您创建的数据集推送到 HuggingFace Hub,您可以简单地使用 push_to_huggingface
方法来上传它。不要忘记也创建一个模型卡片,这将使数据集对于用户来说更易读和理解。
为了能够将您的数据集上传到 Hub,您必须登录到 Hub。以下单元格将使用我们之前的令牌登录我们。
如果我们还没有令牌,我们可以从此处获取(记得设置写入访问权限)。
[ ]:
from huggingface_hub import login
login(token=hf_token)
我们只需要调用 push_to_huggingface
方法即可将数据集推送到 HuggingFace Hub。如果我们在 Hub 上有同名的数据集,则此方法将更新现有数据集。
[ ]:
#papermill_description=push-dataset-to-huggingface
dataset.push_to_huggingface("argilla/end2end_textclassification_with_suggestions_and_responses", generate_card=True)
结论#
在本教程中,我们已经了解了如何向数据集添加回复和建议。如果您已经拥有标注的标签,则向数据集添加回复是为您的项目节省时间和精力的好方法。同样,向数据集添加建议将使标注过程对于您的标注者来说更快、更轻松。我们已经了解了如何为 FeedbackDataset
和 RemoteFeedbackDataset
使用这些工具。现在,使用我们获得的数据集,我们可以继续训练我们的模型和计算指标。有关如何使用各种工具的更多详细信息,请参阅我们的实践指南