Open In Colab  View Notebook on GitHub

FeedbackDataset 添加 ResponsesSuggestions#

在本端到端教程系列的这一部分中,我们将了解如何使用回复和建议更新数据集的记录。您可以参考之前的教程,了解创建数据集配置用户和工作区添加元数据。请随时查看实践指南页面以获取更深入的信息。

在 Argilla 中,responses 是标注者对我们提出的问题的答案。如果我们有一个已经标注的数据集,我们可以将这些黄金回复作为回复添加到我们的数据集中。这非常方便,因为我们不必再次标注数据集。另一方面,suggestions 是我们在标注过程中在 UI 中向标注者展示的模型预测。这样,标注过程对于标注者来说将变得更快、更轻松。

workflow

目录#

  1. 拉取数据集

    1. 从 Argilla

    2. 从 HuggingFace Hub

    3. 拉取原始数据集

  2. 添加回复

  3. 添加建议

  4. 推送数据集

    1. 到 Argilla

    2. 到 HuggingFace Hub

  5. 结论

运行 Argilla#

对于本教程,您需要运行 Argilla 服务器。部署和运行 Argilla 有两个主要选项

在 Hugging Face Spaces 上部署 Argilla: 如果您想使用外部 Notebook(例如,Google Colab)运行教程,并且您在 Hugging Face 上有一个帐户,则只需点击几下即可在 Spaces 上部署 Argilla

deploy on spaces

有关配置部署的详细信息,请查看官方 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 Hubcointegrated/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"]

同样,对于本地 FeedbackDatasetRemoteFeedbackDataset,此过程略有不同。让我们看看如何为两者执行此操作。

对于本地 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 并查看我们创建的数据集。当您首次打开数据集时,您应该看到消息“您没有待处理的记录”,因为我们已上传所有回复,并且没有剩余待处理的记录。如下所示,如果您转到 已提交 选项卡,您可以看到所有记录都已提交,并且标签与我们上面上传的标签完全相同。

ui-responses

由于所有记录都已提交,我们不再看到每个记录的建议。为了演示如何看到它们,您可以看到下面的 Argilla UI,其中记录尚未提交,并且建议(在本例中为 Sports)会显示给标注者。

ui-suggestions

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

结论#

在本教程中,我们已经了解了如何向数据集添加回复和建议。如果您已经拥有标注的标签,则向数据集添加回复是为您的项目节省时间和精力的好方法。同样,向数据集添加建议将使标注过程对于您的标注者来说更快、更轻松。我们已经了解了如何为 FeedbackDatasetRemoteFeedbackDataset 使用这些工具。现在,使用我们获得的数据集,我们可以继续训练我们的模型计算指标。有关如何使用各种工具的更多详细信息,请参阅我们的实践指南