Open In Colab  View Notebook on GitHub

将向量添加到 FeedbackDataset#

本教程是系列教程的一部分,我们将在此系列中了解 FeedbackDataset。在这一步中,我们将展示如何设置向量设置并添加向量,这允许在 UI 和 PythonSDK 中进行相似性搜索。您还可以查看我们之前的教程,了解配置用户和工作区创建数据集,以获得完整工作流程的全面概述。请随时查看实用指南页面以获取更深入的信息,并查看语义搜索页面以获取有关相似性搜索的更多信息。

向量是由语言模型创建的文本片段的嵌入。通过嵌入,我们可以用数学方式表示向量空间中的文本片段。作为这种表示的结果,我们可以计算两个或多个文本片段的相似程度或差异程度。Argilla 提供了一个很好的机会,可以在 UI 和 PythonSDK 中使用这种相似性搜索。如果您想查看嵌入的全面概述,您可以参考此页面

workflow

目录#

  1. 拉取数据集

    1. 来自 Argilla

    2. 来自 HuggingFace Hub

  2. 添加向量设置

  3. 添加向量

    1. 到本地 FeedbackDataset

    2. 到 RemoteFeedbackDataset

  4. 查找相似记录

  5. 推送数据集

    1. 到 Argilla

    2. 到 HuggingFace Hub

  6. 结论

运行 Argilla#

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

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

deploy on spaces

有关配置部署的详细信息,请查看官方 Hugging Face Hub 指南

使用 Argilla 的快速入门 Docker 镜像启动 Argilla:如果您想在本地计算机上运行 Argilla,这是推荐的选项。请注意,此选项仅允许您在本地运行教程,而不能与外部笔记本服务一起运行。

有关部署选项的更多信息,请查看文档的部署部分。

提示

本教程是一个 Jupyter Notebook。有两种运行它的选项

  • 使用此页面顶部的“在 Colab 中打开”按钮。此选项允许您直接在 Google Colab 上运行笔记本。不要忘记将运行时类型更改为 GPU 以加快模型训练和推理速度。

  • 单击页面顶部的“查看源代码”链接下载 .ipynb 文件。此选项允许您下载笔记本并在本地计算机上或您选择的 Jupyter 笔记本工具上运行它。

首先,让我们安装我们的依赖项并导入必要的库

[ ]:
!pip install argilla
!pip install datasets
[1]:
import argilla as rg
from argilla._constants import DEFAULT_API_KEY
from sentence_transformers import SentenceTransformer

为了运行此笔记本,我们将需要一些凭据来从 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

[ ]:
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 的数据项,该字段尚未注释。

[3]:
dataset[0].fields
[3]:
{'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."}

添加向量设置#

作为添加向量的第一步,我们需要将向量设置添加到数据集。这样,我们将能够从 UI 和 PythonSDK 访问特定的向量设置。无论您使用本地数据集还是远程数据集,过程都是相同的。让我们首先创建向量设置。

[4]:
vector_settings = rg.VectorSettings(
    name="sentence_embedding",
    title="Sentence Embedding",
    dimensions=384
)

在向量设置中,name 将是在记录中显示的名称,我们将通过其名称访问每个向量设置。title 将是在 UI 中显示的名称。dimension 将定义每个向量将具有多少维度。此数字必须等于向量的维度数,否则将引发错误。我们将其设置为 384,因为我们将在后续步骤中使用的模型具有 384 个维度。

[ ]:
dataset.add_vector_settings(vector_settings)
dataset_remote.add_vector_settings(vector_settings)

添加向量#

现在我们确保我们的数据集具有向量设置,我们可以继续为每个记录添加向量。首先,我们需要一个工具来创建文本项的嵌入,以便我们可以拥有向量。在本教程中,我们将使用 paraphrase-MiniLM-L3-v2 模型来创建嵌入。您可以使用您选择的任何模型。请确保您使用的模型的维度与您创建的向量设置的维度相同。

让我们首先加载模型。

[6]:
model = SentenceTransformer("TaylorAI/bge-micro")

并在示例文本上测试编码向量,以确保维度正确。

[7]:
sentence = "Argentina and Uruguay are South American countries."
len(model.encode(sentence))
[7]:
384

由于我们的模型已准备好创建嵌入,我们现在可以为数据集中的每个记录创建向量。对于本地 FeedbackDatasetRemoteFeedbackDataset,添加向量的过程略有不同。我们将看到如何将向量添加到两者。

到本地 FeedbackDataset#

要将向量添加到本地 FeedbackDataset,我们将迭代数据集中的记录。对于每个记录,我们使用 sentence transformers 模型对其进行编码,并将编码后的向量分配给记录的 vector 字段。

[8]:
texts = [record.fields["text"] for record in dataset.records]
embeddings = model.encode(texts)

for record, embedding in zip(dataset.records, embeddings):
    record.vectors["sentence_embedding"] = embedding.tolist()

请注意,您将添加的向量应为浮点值列表。如果您有一个 numpy 数组,您可以使用 tolist() 方法将其转换为列表,就像我们在前面的单元格中所做的那样。

RemoteFeedbackDataset#

要将向量添加到 RemoteFeedbackDataset,我们首先需要创建数据集中记录的列表。我们将对此列表进行更改,类似于我们对本地数据集所做的更改。然后,使用 update_records 方法,我们将更新 Argilla 服务器上数据集中的记录。

[9]:
modified_records = [record for record in dataset_remote.records]
texts = [record.fields["text"] for record in modified_records]
embeddings = model.encode(texts)

for record, embedding in zip(modified_records, embeddings):
    record.vectors["sentence_embedding"] = embedding.tolist()

然后,让我们更新记录。

[ ]:
dataset_remote.update_records(modified_records)

查找相似记录#

现在我们有了每个记录的向量,让我们看看语义搜索的实际应用。我们可以通过 UI 和 PythonSDK 实现此目的。要在 UI 中查找相似记录,请参阅推送数据集部分,我们在其中将改进的数据集上传到 Argilla 服务器,并轻松进行语义搜索。在本节中,我们将看到如何在 PythonSDK 中执行此操作。

要查找相似记录,我们将使用 find_similar_records 方法,该方法仅适用于远程数据集。我们需要为此方法提供我们要用于搜索的向量名称。对于特定的向量,我们有两个选项:我们可以使用 record 参数使用记录,或者我们可以使用 vector 参数定义新向量。您可以使用 max_results 参数限制要获取的记录数。

[11]:
similar_records = dataset_remote.find_similar_records(
    vector_name="sentence_embedding",
    record=dataset_remote[0],
    max_results=5
)

我们创建的 similar_records 对象包含与数据集中第一个记录最相似的前 5 个记录。让我们看看这些记录是什么。

[12]:
[record[0].fields["text"] for record in similar_records]
[12]:
["Wall St. Bears Claw Back Into the Black  NEW YORK (Reuters) - Short-sellers, Wall Street's dwindling  band of ultra-cynics, are seeing green again.",
 "Strategies for a Sideways Market (Reuters) Reuters - The bulls and the bears are in this\\together, scratching their heads and wondering what's going to\\happen next.",
 "Strategies for a Sideways Market  WASHINGTON (Reuters) - The bulls and the bears are in this  together, scratching their heads and wondering what's going to  happen next.",
 'Wall Street to Open Little Changed  NEW YORK (Reuters) - Wall Street is seen opening little  changed on Monday as crude prices remain high, but insurers may  dip on worries about their potential liabilities after a  hurricane struck Florida on Friday.',
 "Chrysler's Bling King After a tough year, Detroit's troubled carmaker is back -- thanks to a maverick designer and a car that is dazzling the hip-hop crowd"]

另一方面,我们可以将我们定义的向量提供给 find_similar_records 方法。让我们首先使用 sentence transformers 模型创建嵌入,然后找到与此向量相似的记录。

[13]:
text = "Baseball: Smoltz sizzles as Braves force deciding game HOUSTON, United States : JD Drew singled to drive in a run in the top of the ninth inning and lift the Atlanta Braves to a 6-5 win over Houston and force the Astros into a fifth and deciding game."

text_vector = model.encode(text).tolist()

similar_records = dataset_remote.find_similar_records(
    vector_name="sentence_embedding",
    value=text_vector,
    max_results=5
)

我们可以看到与我们定义的向量相似的记录的 ID。

[14]:
[record[0].external_id for record in similar_records]
[14]:
['record-746', 'record-459', 'record-642', 'record-716', 'record-643']

推送数据集#

数据集现在具有向量设置,并且每个记录都分配了一个向量。我们可以通过将数据集推送到 Argilla 服务器在 UI 中进行语义搜索。我们还可以将数据集推送到 HuggingFace Hub 以在其他项目中使用它。让我们看看如何将数据集推送到两者。请注意,如果您选择从 Argilla 服务器拉取数据集,则无需推送数据集。由于它是 RemoteFeedbackDataset,因此您对其所做的更改会直接反映在 Argilla 服务器上的数据集上。

到 Argilla#

如果您选择从 HuggingFace 拉取数据集并想要推送到 Argilla,您可以简单地使用 push_to_argilla 方法。

[ ]:
try:
    remote_dataset = rg.FeedbackDataset.from_argilla("end2end_textclassification_with_vectors")
    remote_dataset.delete()
except:
    pass
remote_dataset = dataset.push_to_argilla("end2end_textclassification_with_vectors")

workflow

现在,可以在 UI 中进行语义搜索。如您在上面看到的,您需要单击记录右上角的 Find Similar 按钮才能查看相似记录。您有机会限制结果的数量,并将您的研究定义为最相似或最不相似的记录。您还可以看到每个记录与您搜索的记录的相似度分数。

到 HuggingFace Hub#

您可以使用 push_to_huggingface 方法将数据集推送到 HuggingFace Hub。不要忘记也创建一个模型卡,这将使数据集对于用户来说更易读和理解。

为了能够将您的数据集上传到 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_vectors", generate_card=True)

结论#

在本教程中,我们已经了解了如何将向量添加到数据集并在 UI 和 PythonSDK 中进行语义搜索。向量是根据记录之间的相似性限制数据集的好方法。我们还了解了如何将数据集推送到 Argilla 和 HuggingFace Hub。在下一个教程中,我们将看到如何将建议和回复添加到我们的数据集。