Open In Colab  View Notebook on GitHub

💨 使用语义搜索和 Sentence Transformers 标注数据#

在本教程中,您将学习如何使用 Sentence Transformer 嵌入和语义搜索来显著加快数据标注速度。本教程将引导您完成以下步骤

  • 💾 使用 sentence transformers 生成包含银行客户请求的数据集的嵌入

  • 🙃 将数据集上传到 Argilla 以进行数据标注

  • 🏷 使用相似性搜索功能高效地查找语义相关的示例批量进行标注

Similarity search

简介#

在本教程中,我们将利用嵌入的强大功能来提高数据标注(和管理)的效率。利用嵌入进行标注的想法并不新鲜,并且有一些很酷的独立库可以使用嵌入来标注数据。

1.2.0 版本开始,Argilla 为您提供了一种将基于嵌入的相似性与已提供的所有其他工作流程结合使用的方法:基于搜索的批量标注、使用搜索查询的程序化标注、模型预标注和人机协同工作流程。 这也意味着您可以将关键字搜索和过滤器与这个新的相似性搜索功能结合使用。 没有任何供应商或模型锁定,您可以使用任何嵌入或编码方法,包括但不限于 Sentence TransformersOpenAICo:here。 如果您想深入了解,可以查看 语义相似性深入探讨,但本教程将向您展示入门的基础知识。

让我们开始吧!

运行 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 工具上运行它。

设置#

对于本教程,您需要 Argilla 的 Python 客户端和一些可以通过 pip 安装的第三方库

[ ]:
%pip install argilla datasets==2.8.0 sentence-transformers==2.2.2  -qqq

让我们导入 Argilla 模块以进行数据读取和写入

[ ]:
import argilla as rg

如果您正在使用 Docker 快速入门镜像或 Hugging Face Spaces 运行 Argilla,则需要使用 URLAPI_KEY 初始化 Argilla 客户端

[ ]:
# Replace api_url with the url to your HF Spaces URL if using Spaces
# Replace api_key if you configured a custom API key
rg.init(
    api_url="https://#:6900",
    api_key="admin.apikey"
)

如果您正在运行私有的 Hugging Face Space,您还需要按如下方式设置 HF_TOKEN

[ ]:
# # Set the HF_TOKEN environment variable
# import os
# os.environ['HF_TOKEN'] = "your-hf-token"

# # Replace api_url with the url to your HF Spaces URL
# # Replace api_key if you configured a custom API key
# rg.init(
#     api_url="https://[your-owner-name]-[your_space_name].hf.space",
#     api_key="admin.apikey",
#     extra_headers={"Authorization": f"Bearer {os.environ['HF_TOKEN']}"},
# )

让我们添加所需的导入

[ ]:

from sentence_transformers import SentenceTransformer from datasets import load_dataset

启用遥测#

我们从您与教程的交互中获得宝贵的见解。 为了改进我们自己,为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。 尽管这是完全匿名的,但如果您愿意,可以选择跳过此步骤。 有关更多信息,请查看 遥测 页面。

[ ]:
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.")

💾 下载和嵌入您的数据集#

以下代码将从 Hub 加载银行客户请求数据集,编码 text 字段,并创建 vectors 字段,该字段将仅包含一个键 (mini-lm-sentence-transformers)。 为了从头开始标注数据集,它还将删除包含原始意图标签的 label 字段。

[ ]:
# Define fast version of sentence transformers
encoder = SentenceTransformer("all-MiniLM-L6-v2", device="cpu")

# Load dataset with banking
dataset = load_dataset("banking77", split="test")

# Encode text field using batched computation
dataset = dataset.map(
    lambda batch: {"vectors": encoder.encode(batch["text"])},
    batch_size=32,
    batched=True
)

# Removes the original labels because you'll be labeling from scratch
dataset = dataset.remove_columns("label")

# Turn vectors into a dictionary
dataset = dataset.map(
    lambda r: {"vectors": {"mini-lm-sentence-transformers": r["vectors"]}}
)

我们的数据集现在包含一个 vectors 字段,其中包含由 sentence transformer 模型生成的嵌入向量。

[10]:
dataset.to_pandas().head()
[10]:
文本 向量
0 如何找到我的卡? {'mini-lm-sentence-transformers': [-0.01016708...
1 我仍然没有收到我的新卡,我订购了... {'mini-lm-sentence-transformers': [-0.04284123...
2 我订购了一张卡,但尚未送达。 帮助 ... {'mini-lm-sentence-transformers': [-0.03365558...
3 有什么方法可以知道我的卡何时到达吗? {'mini-lm-sentence-transformers': [0.012195908...
4 我的卡尚未到达。 {'mini-lm-sentence-transformers': [-0.04361863...

🙃 将数据集上传到 Argilla#

原始的 banking77 数据集是一个意图分类数据集,具有数十个标签(lost_cardcard_arrival 等)。 为了使本教程保持简单,我们定义了一个简化的标注方案,其中包含更高级别的类别:["change_details", "card", "atm", "top_up", "balance", "transfer", "exchange_rate", "pin"]

让我们定义数据集设置,配置数据集,并上传带有向量的数据集。

[ ]:
rg_ds = rg.DatasetForTextClassification.from_datasets(dataset)

# Our labeling scheme
settings = rg.TextClassificationSettings(
    label_schema=["change_details", "card", "atm", "top_up", "balance", "transfer", "exchange_rate", "pin"]
)

rg.configure_dataset_settings(name="banking77-topics", settings=settings)

rg.log(
    name="banking77-topics",
    records=rg_ds,
    chunk_size=50,
)

🏷 使用 find similar 操作进行批量标注#

现在我们的 banking77-topics 在 Argilla UI 中可用。 我们可以开始利用语义相似性搜索来标注我们的数据。 工作流程如下

  1. 标注一条记录(例如,使用标签 change_details 标注 “更改我的信息”),然后单击记录右上角的“查找相似”。

  2. 结果,您将获得按相似度(降序)排序的最相似记录列表。

  3. 现在,您可以查看记录并分配 change_details 标签或任何其他标签。 对于我们的用例,我们看到大多数建议的记录都属于同一类别。

让我们逐步了解一下

标注记录#

使用手动标注模式,您可以标注如下记录

labeling-textclassification-sentence-transformers-semantic

现在,如果您想查找与此记录语义相似甚至重复的记录,可以使用“查找相似”按钮。

查找相似#

结果,您将获得 50 条最相似记录的列表。

注意

请记住,您可以将此相似性搜索与其他搜索功能结合使用:关键字、查询字符串 DSL 和过滤器。 例如,如果您启用了过滤器,则“查找相似”操作将返回启用过滤器的记录子集中最相似的记录。

labeling-textclassification-sentence-transformers-semantic

如您所见,该模型有效地捕获了相似的含义,而无需任何显式共享的词:例如,detailsinformation

查看记录#

此时,您可以逐个标注记录,也可以向下滚动以查看它们,然后再使用记录列表顶部的批量标注按钮。

labeling-textclassification-sentence-transformers-semantic

批量标注#

对于本教程,我们的标签足够细粒度,可以使嵌入对属于同一主题的记录进行分组。 因此,在这种情况下,直接使用批量标注功能是安全的,在快速修订后有效地标注 50 个语义相似的示例。

警告

对于其他用例,您可能需要更加小心,并将此功能与搜索查询和过滤器结合使用。 为了快速实验,您还可以假设您会犯一些标注错误,然后使用诸如 cleanlab 之类的工具来检测标签错误。

labeling-textclassification-sentence-transformers-semantic

labeling-textclassification-sentence-transformers-semantic

总结#

在本教程中,您学习了如何通过使用 Sentence Transformers 嵌入原始数据,将相似性搜索用于 Argilla 中的数据标注。