将向量添加到 FeedbackDataset
#
本教程是系列教程的一部分,我们将在此系列中了解 FeedbackDataset
。在这一步中,我们将展示如何设置向量设置并添加向量,这允许在 UI 和 PythonSDK 中进行相似性搜索。您还可以查看我们之前的教程,了解配置用户和工作区和创建数据集,以获得完整工作流程的全面概述。请随时查看实用指南页面以获取更深入的信息,并查看语义搜索页面以获取有关相似性搜索的更多信息。
向量是由语言模型创建的文本片段的嵌入。通过嵌入,我们可以用数学方式表示向量空间中的文本片段。作为这种表示的结果,我们可以计算两个或多个文本片段的相似程度或差异程度。Argilla 提供了一个很好的机会,可以在 UI 和 PythonSDK 中使用这种相似性搜索。如果您想查看嵌入的全面概述,您可以参考此页面。
目录#
运行 Argilla#
在本教程中,您需要运行 Argilla 服务器。部署和运行 Argilla 有两个主要选项
在 Hugging Face Spaces 上部署 Argilla: 如果您想使用外部笔记本(例如,Google Colab)运行教程,并且您在 Hugging Face 上有一个帐户,您只需点击几下即可在 Spaces 上部署 Argilla
有关配置部署的详细信息,请查看官方 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
由于我们的模型已准备好创建嵌入,我们现在可以为数据集中的每个记录创建向量。对于本地 FeedbackDataset
和 RemoteFeedbackDataset
,添加向量的过程略有不同。我们将看到如何将向量添加到两者。
到本地 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")
现在,可以在 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。在下一个教程中,我们将看到如何将建议和回复添加到我们的数据集。