We’re happy to announce the new Argilla SDK for simplifying diverse feedback projects!

隆重推出新的 Argilla SDK,用于简化多样化的反馈项目

2024 年 6 月 5 日

Ben Burtenshaw

这篇文章介绍了 Argilla 新的实验性 python SDK,这是一个供 ML/ AI/ NLP 工程师定义人工反馈任务和收集反馈数据的工具包。新的 SDK 简化了与 Argilla 服务器的交互,专注于简化管理数据集的方法,并旨在改善用户体验和功能。反过来,它应有助于更高效地创建高质量的数据集。

在过去的 12 个月中,Argilla 一直在调整其平台,使其从专注于自然语言处理任务(如文本分类或命名实体识别)的以任务为中心的数据集,转向针对复杂或多项任务的可扩展数据集。反过来,Argilla 的 V1 SDK 也在不断发展以支持这两种数据集范例。

最近,我们向社区征求了他们对 SDK 开发的意见。我们与来自不同背景的用户进行了交谈,从在生产环境中部署 Argilla 的用户,到首次学习 Argilla 和以人为中心的 ML 的用户。我们还与处理从分类等经典 NLP 任务到处理诸如直接偏好优化数据集等 LLM 项目的用户进行了交谈。从这些讨论中,我们了解了关于 SDK 的两件主要事情

  1. 他们喜欢并且需要通过 FeedbackDataset 切换到可扩展任务。
  2. 不断增长的功能变得难以学习和跟上最新进展。

专注于可扩展数据集

因此,我们决定 Argilla 的 V2 SDK 将纯粹专注于可扩展数据集。这使我们能够构建一个更简单、更简洁的 SDK,专注于与 Argilla 服务器和可扩展数据集的核心交互。此外,通过专注于可扩展数据集,我们可以使 SDK 更易于学习和使用。

在这篇文章中,我们将概述新 SDK 的核心变化及其背后的动机。SDK 中的核心任务包括

  • 连接到 Argilla 服务器
  • 通过字段和问题定义反馈任务
  • 在服务器上添加和更新记录
  • 查询和收集记录以用于下游任务

连接到 Argilla 服务器

SDK 最显著的变化在于它的第一行代码。我们已经放弃了定义全局变量的 init 方法,而是使用了客户端对象

import argilla as rgclient = rg.Argilla(    api_url="https://argilla.example.com",    api_key="my_token",)

客户端接受配置参数或收集环境变量,并用于编辑 Argilla 服务器上的数据集等资源。您可以拥有多个客户端或随时重新定义它们。这里没有障眼法。

客户端还允许您访问 Argilla 服务器上已有的资源

my_dataset = client.datasets("my_dataset")my_workspace = client.workspaces("my_workspace")my_user = client.users("my_user")

有关如何管理反馈团队的更多信息,请查看 此处 的深入指南。

🤔 我们为什么要这样做? init 方法节省了大量时间或代码行,但它不是一个包含服务器信息的透明对象。我们将 client 对象视为您 Argilla 服务器的网关。

使用设置定义反馈任务

由于我们专注于可扩展数据集,我们将 FeedbackDataset 重命名为 Dataset。但是,SDK 中最重要的更改是 Settings 类。此类与 Dataset 协同工作,以定义数据集的所有字段、问题、向量和元数据。您可以将 Settings 视为您的反馈任务蓝图。

rg.Settings(    fields = [        rg.TextField(name="text")        ],    questions = [        rg.LabelQuestion(            name="label",            labels=["label_1", "label_2", "label_3"]            )        ],    metadata = [        rg.TermsMetadataProperty(            name="metadata",            options=["option_1", "option_2", "option_3"]            )        ],    vectors = [        rg.VectorField(name="vector", dimensions=10)        ],    guidelines = "guidelines",    allow_extra_metadata = True,)

Settings 将所有内容都集中在一个位置,因此您可以改进和维护数据集配置,或在多个数据集之间使用它。

rg.Dataset(    name="name",    settings=settings,)

当您准备好在 Argilla UI 中共享您的数据集时,只需应用 dataset.create() 即可。

🤔 我们为什么要这样做? 定义反馈任务对于获得高质量数据至关重要。Settings 对象允许您的代码专注于该任务,并将其与数据集的生命周期分离。

在服务器上添加和更新记录

添加记录到 Argilla 服务器已得到改进,可以与现有的通用数据结构一起使用。Argilla 仍然使用 rg.Record 类来表示数据集中的记录。

重构后的 SDK 使用熟悉的 rg.Record 类来表示记录。该类具有 fieldssuggestionsresponsesmetadatavectors 的属性和参数。这些实例化的记录可以直接传递给重新启用的 log 方法 🎉。

records = [    rg.Record(        fields={            "question": "Do you need oxygen to breathe?",            "answer": "Yes"        },    ),    rg.Record(        fields={            "question": "What is the boiling point of water?",            "answer": "100 degrees Celsius"        },    ),]dataset.records.log(records)

此外,新的 SDK 将解析您的数据结构并为您实例化记录。这意味着您可以将记录作为字典状结构的列表添加

# ! Here we are defining dictionaries to illustrate the data structuredataset.records.add(    records=[    {        "question": "What is the capital of France?",  # 'question' matches the `rg.TextField` name        "answer": "Paris" # 'answer' matches the `rg.TextQuestion` name    },    {        "question": "What is the capital of Germany?",        "answer": "Berlin"    },])

这使您可以将数据保留在其原生结构中,而无需定义摄取流程。实际上,log 方法也接受 Hugging Face 数据集。因此,您可以将数据集传递给 log 方法。

ds = load_dataset("imdb")dataset.records.log(ds)

为了使过程更简单,log 方法采用从您的键到 Argilla 属性(如字段、问题、元数据和向量)的映射。

# IMDB dataset column name is 'label'ds = load_dataset("imdb")# Argilla dataset question name is 'sentiment'dataset.records.log(ds, mapping={"label":"sentiment"})

如果您想更新现有记录,您也可以使用 log 方法和类似的属性。

# Update records in a datasetdataset.records.log(    records=[        {            "id": "1",  # matches id used to add records            "answer": "Paris",        }    ])

🤔 我们为什么要这样做? 数据源的质量和表示形式各不相同,而反馈任务应采用 UI 用户可以理解的形式。通过抽象数据摄取,您可以将数据保留在其原生形式,并专注于适合 UI 用户的命名。

查询和收集记录以用于下游任务

要使用查询从 Argilla 收集记录,您可以使用 Filter 类来定义条件,并将它们传递给 Dataset.records 属性,以根据条件获取记录。条件包括“==”、“>=”、“<=”或“in”,并且可以与点表示法结合使用,以根据元数据、建议或响应来过滤记录。查询还可以与搜索词结合使用。

# Create a range from 10 to 20range_filter = rg.Filter(    [        ("metadata.count", ">=", 10),        ("metadata.count", "<=", 20)    ])# Query records with metadata count greater than 10 and less than 20query = rg.Query(filter=range_filter, query="paris")# Iterate over the resultsfor record in dataset.records(query=query):    print(record)

下一步

在接下来的几周内,我们将推出 Argilla 2.0 和此处展示的新 SDK。目前,该 SDK 仍处于实验阶段,但欢迎您按照以下说明试用。我们欢迎您的反馈、问题、贡献和意见。

实验性 SDK 在 此仓库 中开发。查看 README 或 文档 以进行安装。

这对我当前的项目意味着什么?

您是否正在使用可扩展数据集(如 FeedbackDataset)?

这不会影响您的 Argilla 服务器。您可以将新的 SDK 与 1.27 之后的 argilla 服务器版本一起使用。您可以选择更新客户端代码,您会发现更改非常小。

您是否正在使用旧的特定于任务的数据集(如 TextClassificationDataset)?

1.29 版(当前版本)之后,argilla 服务器或客户端将不再支持特定于任务的数据集。我们将维护此版本的安全性和错误修复,但如果您需要旧版数据集,则应保留在此版本上。