Open In Colab  View Notebook on GitHub

创建 FeedbackDataset#

本教程是系列教程的一部分,我们将在此系列教程中了解 FeedbackDataset。在开始本教程之前,您需要完成关于配置用户和工作区的教程。在这一步中,我们将展示如何配置 FeedbackDataset 并向其添加 FeedbackRecords。如果您需要更多背景信息,请查阅关于创建数据集的实践指南

workflow

我们将从创建一个基本数据集开始,使用 ag_news 数据集作为示例,并将其推送到 Argilla 和 Hugging Face hub

目录#

  1. 配置 FeedbackDataset

  2. 添加 FeedbackRecords

    1. 从 Hugging Face 数据集

    2. 从 pandas.DataFrame

  3. 保存和加载 FeedbackDataset

    1. 将我们的 FeedbackDataset 推送到 Argilla

    2. 将我们的 FeedbackDataset 推送到 Hugging Face Hub

  4. 结论

运行 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
[1]:
import argilla as rg
from argilla._constants import DEFAULT_API_KEY
from datasets import load_dataset

为了运行此 Notebook,我们将需要一些凭据来从 Argilla 和 🤗hub 推送和加载数据集,让我们在以下单元格中设置它们

[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_..."

登录到 Argilla

[ ]:
#papermill_description=logging-to-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.")

配置 FeedbackDataset#

在本教程中,我们将使用 ag_news 数据集,该数据集可以从 🤗hub 下载。我们将仅从训练样本中加载前 1000 个项目。

[6]:
ds = load_dataset("ag_news", split="train[:1000]")
ds
[6]:
Dataset({
    features: ['text', 'label'],
    num_rows: 1000
})

我们将在本教程中仅加载前 1000 条记录,但您可以随意测试完整数据集。

此数据集包含新闻文章的集合(我们可以在 text 列中查看内容),这些文章已被分配以下分类 labels 之一:世界 (0)、体育 (1)、商业 (2)、科技 (3)

让我们使用任务模板来创建一个准备用于 text-classification 的反馈数据集。

[20]:
feedback_dataset = rg.FeedbackDataset.for_text_classification(
    labels=["World", "Sports", "Business", "Sci/Tech"],
    guidelines="Classify the articles into one of the four categories.",
)
feedback_dataset
[20]:
FeedbackDataset(
   fields=[TextField(name='text', title='Text', required=True, type='text', use_markdown=False)]
   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=['World', 'Sports', 'Business', 'Sci/Tech'], visible_labels=None)]
   guidelines=Classify the articles into one of the four categories.)
   metadata_properties=[])
)

我们可以将此数据集与我们之前使用的自定义配置进行比较(我们可以查看自定义配置,以获取有关当我们想要更精细的控制时创建 FeedbackDataset 的更多信息)

[8]:
feedback_dataset_long = rg.FeedbackDataset(
    guidelines="Classify the articles into one of the four categories.",
    fields=[
        rg.TextField(name="text", title="Text from the article"),
    ],
    questions=[
        rg.LabelQuestion(
            name="label",
            title="In which category does this article fit?",
            labels={"World": "0", "Sports": "1", "Business": "2", "Sci/Tech": "3"},
            required=True,
            visible_labels=None
        )
    ]
)
feedback_dataset_long
[8]:
FeedbackDataset(
   fields=[TextField(name='text', title='Text from the article', required=True, type='text', use_markdown=False)]
   questions=[LabelQuestion(name='label', title='In which category does this article fit?', description=None, required=True, type='label_selection', labels={'World': '0', 'Sports': '1', 'Business': '2', 'Sci/Tech': '3'}, visible_labels=None)]
   guidelines=Classify the articles into one of the four categories.)
   metadata_properties=[])
)

添加 FeedbackRecords#

从 Hugging Face dataset#

一旦我们创建了 FeedbackDataset,下一步就是向其添加 FeedbackRecords

为了创建我们的记录,我们可以简单地循环遍历 datasets.Dataset 中的项目。

[9]:
records = []
for i, item in enumerate(ds):
    records.append(
        rg.FeedbackRecord(
            fields={
                "text": item["text"],
            },
            external_id=f"record-{i}"
        )
    )

# We can add an external_id to each record to identify it later.

pandas.DataFrame#

如果我们的数据采用不同的格式,比如 csv 文件,那么使用 pandas 读取数据可能更直接。

我们将把我们的数据集转换为 pandas 格式以进行此示例,其余的 FeedbackRecord 创建保持不变

[10]:
df_dataset = ds.to_pandas()
df_dataset.head()
[10]:
text label
0 Wall St. Bears Claw Back Into the Black (Reute... 2
1 Carlyle Looks Toward Commercial Aerospace (Reu... 2
2 Oil and Economy Cloud Stocks' Outlook (Reuters... 2
3 Iraq Halts Oil Exports from Main Southern Pipe... 2
4 Oil prices soar to all-time record, posing new... 2
[ ]:
records_pandas = []
for i, item in df_dataset.iterrows():
    records_pandas.append(
        rg.FeedbackRecord(
            fields={
                "text": item["text"],
            },
            external_id=f"record-{i}"
        )
    )

让我们将记录添加到数据集中

[21]:
feedback_dataset.add_records(records)

到目前为止,我们的数据集已准备好进行标注的文本,让我们将其推送到 Argilla

保存和加载 FeedbackDataset#

Argilla#

[ ]:
#papermill_description=push-dataset-to-argilla
try:
    # delete old dataset
    remote_dataset = feedback_dataset.from_argilla(name="end2end_textclassification", workspace="argilla")
    remote_dataset.delete()
except:
    pass
remote_dataset = feedback_dataset.push_to_argilla(name="end2end_textclassification", workspace="argilla")

如果我们转到我们的 Argilla 实例,我们应该看到类似以下内容的屏幕。

feedback-dataset

我们可以在其中看到我们想要的文章文本,以及要选择的不同标签。

我们现在可以从 Argilla 下载数据集以进行检查

[15]:
remote_dataset = rg.FeedbackDataset.from_argilla("end2end_textclassification", workspace="argilla")
remote_dataset
[15]:
RemoteFeedbackDataset(
   id=52b0dfc2-ed85-4805-923c-5d51b51ec4c9
   name=end2end_textclassification
   workspace=Workspace(id=ce760ed7-0fdf-4d79-b9b7-1c0e4ea896cd, name=argilla, inserted_at=2023-11-23 09:46:05.591993, updated_at=2023-11-23 09:46:05.591993)
   url=https://#:6900/dataset/52b0dfc2-ed85-4805-923c-5d51b51ec4c9/annotation-mode
   fields=[RemoteTextField(id=UUID('2835bf0e-1259-45b9-a97c-f9b671395563'), client=None, name='text', title='Text', required=True, type='text', use_markdown=False)]
   questions=[RemoteLabelQuestion(id=UUID('bb6fc4f0-e4b7-480c-84a1-df717de4ac97'), client=None, name='label', title='Label', description=None, required=True, type='label_selection', labels=['World', 'Sports', 'Business', 'Sci/Tech'], visible_labels=None)]
   guidelines=Classify the articles into one of the four categories.
   metadata_properties=[]
)

从 Hugging Face Hub#

如果我们想与世界分享我们的数据集,我们可以使用 Hugging Face Hub。

首先我们需要登录到 Hugging Face。以下单元格将使用我们之前的令牌登录我们。

如果我们还没有令牌,我们可以从这里获取(记住设置写入访问权限)。

[ ]:
from huggingface_hub import login

login(token=hf_token)

现在我们可以直接在 FeedbackDataset 上调用该方法。

[ ]:
#papermill_description=push-dataset-to-huggingface
remote_dataset.push_to_huggingface("argilla/end2end_textclassification")

我们现在可以从 Hugging Face 下载数据集以进行检查

[ ]:
local_dataset = rg.FeedbackDataset.from_huggingface("argilla/end2end_textclassification")

结论#

在本教程中,我们从 ag_news 开始,为文本分类创建了一个 Argilla FeedbackDataset

我们使用 LabelQuestion 为文本分类创建了一个 FeedbackDataset,数据存储为 datasets.Datasetpandas.DataFrame。此数据集被推送到了 Argilla,我们可以在其中管理和标注记录,并最终将其推送到 🤗hub

要了解有关如何使用 FeedbackDataset 的更多信息,请查看速查表。要继续将记录分配给标注员,您可以参考下一个教程