🧸 使用 LLMs 进行文本分类和摘要建议,基于 spacy-llm
#
在本教程中,我们将实现一个 spacy-llm
管道,以获取 GPT3.5 的模型建议,并将它们作为 suggestions
添加到我们的 FeedbackDataset
中。本教程的流程将是:
运行 Argilla 并加载
spacy-llm
以及其他库为你的管道定义配置并初始化它
创建你的
FeedbackDataset
实例在数据上生成预测,并将它们添加到
records
中推送到 Argilla
简介#
spacy-llm 是一个将 LLMs 的强大功能集成到常规 spaCy 管道中的软件包,从而可以为各种任务进行快速而实用的提示。此外,由于它不需要训练数据,因此模型可以在你的管道中随时使用。如果你想训练自己的模型或创建自定义任务,spacy-llm
也有助于实现任何自定义管道。
将这个强大的软件包与 Argilla Feedback 数据集一起使用非常容易。我们可以使用我们将创建的管道进行推理,并将它们添加到我们的 FeedbackDataset
中。
运行 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 上运行 notebook。不要忘记将运行时类型更改为 GPU 以加快模型训练和推理速度。
通过单击页面顶部的“查看源代码”链接下载 .ipynb 文件。此选项允许你下载 notebook 并在你的本地机器上或你选择的 Jupyter notebook 工具上运行它。
设置#
让我们首先安装我们任务所需的库,
[ ]:
pip install "spacy-llm[transformers]" "transformers[sentencepiece]" argilla datasets -qqq
并导入它们。
[ ]:
import os
import spacy
from spacy_llm.util import assemble
import argilla as rg
from datasets import load_dataset
import configparser
from collections import Counter
from heapq import nlargest
你需要使用 API_URL
和 API_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']}"},
# )
启用遥测#
我们从你与我们的教程的互动中获得宝贵的见解。为了改进我们自己,以便为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。虽然这是完全匿名的,但如果您愿意,可以选择跳过此步骤。有关更多信息,请查看遥测页面。
[ ]:
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.")
spacy-llm
管道#
为了能够将 GPT3.5 和 OpenAI 的其他模型与 spacy-llm 一起使用,我们将需要来自 openai.com 的 API 密钥,并将其设置为环境变量。
[ ]:
os.environ["OPENAI_API_KEY"] = "<YOUR_OPEN_AI_API_KEY>"
有两种方法可以为你的 LLM 任务实现 spacy-llm
管道:在源代码中运行管道或使用 config.cfg
文件来定义管道的所有设置和超参数。在本教程中,我们将使用配置文件,你可以点击 这里 了解有关直接在 Python 中运行的更多信息。
让我们首先在配置文件中将管道的设置定义为参数。我们将实现两个任务:文本分类和摘要,我们在 pipeline
命令中定义它们。然后,我们将我们的组件添加到我们的管道中,以使用它们各自的模型和超参数来指定每个任务。
[ ]:
config_string = """
[nlp]
lang = "en"
pipeline = ["llm_textcat","llm_summarization","sentencizer"]
[components]
[components.llm_textcat]
factory = "llm"
[components.llm_textcat.task]
@llm_tasks = "spacy.TextCat.v2"
labels = ["HISTORY","MUSIC","TECHNOLOGY","SCIENCE","SPORTS","POLITICS"]
[components.llm_textcat.model]
@llm_models = "spacy.GPT-3-5.v1"
[components.llm_summarization]
factory = "llm"
[components.llm_summarization.task]
@llm_tasks = "spacy.Summarization.v1"
[components.llm_summarization.model]
@llm_models = "spacy.GPT-3-5.v1"
[components.sentencizer]
factory = "sentencizer"
punct_chars = null
"""
通过这些设置,我们创建了一个用于英语文本分类和摘要的 LLM 管道,使用 GPT3.5。
spacy-llm
提供了各种模型以在你的管道中实现。你可以查看可用的 OpenAI 模型,并查看如果你想使用开源模型提供的 HuggingFace 模型。
现在,使用 ConfigParser
,我们可以创建配置文件。
[ ]:
config = configparser.ConfigParser()
config.read_string(config_string)
with open("config.cfg", 'w') as configfile:
config.write(configfile)
让我们组装配置文件。
[ ]:
nlp = assemble("config.cfg")
我们已准备好使用我们创建的管道进行推理。
[ ]:
doc = nlp("No matter how hard they tried, Barcelona lost the match.")
doc.cats
推理#
我们需要两个函数,它们将简化推理过程,并为我们提供我们想要的文本类别和摘要。
[ ]:
#returns the category with the highest score
def get_textcat_suggestion(doc):
model_prediction = doc.cats
return max(model_prediction, key=model_prediction.get)
#selects the top N sentences with the highest scores and return combined string
def get_summarization_suggestion(doc):
sentence_scores = Counter()
for sentence in doc.sents:
for word in sentence:
sentence_scores[sentence] += 1
summary_sentences = nlargest(2, sentence_scores, key=sentence_scores.get)
summary = ' '.join(str(sentence) for sentence in summary_sentences)
return summary
加载数据#
在本教程中,我们将使用 HuggingFace 库中的 squad_v2
。squad_v2
是一个数据集,由问题及其答案以及在其中搜索答案的上下文组成。我们将仅使用 context
列用于我们的目的。
[ ]:
dataset_hf = load_dataset("squad_v2", split="train").shard(num_shards=10000, index=235)
FeedbackDataset#
现在我们有了用于推理的管道和数据,我们可以创建我们的 Argilla FeedbackDataset
来制作和存储模型建议。对于本教程,我们将创建一个文本分类任务和一个摘要任务。Argilla Feedback 允许我们分别使用 LabelQuestion
和 TextQuestion
实现这两个任务。
[ ]:
dataset = rg.FeedbackDataset(
fields=[
rg.TextField(name="text")
],
questions=[
rg.LabelQuestion(
name="label-question",
title="Classify the text category.",
#make sure that the labels are in line with the labels we have defined in config.cfg
labels=["HISTORY","MUSIC","TECHNOLOGY","SCIENCE","SPORTS","POLITICS"]
),
rg.TextQuestion(
name="text-question",
title="Provide a summary for the text."
)
]
)
我们可以通过迭代我们加载的数据集来为我们的数据集创建记录。在执行此操作时,我们将进行推理并将它们保存在 suggestions
中,使用 get_textcat_suggestion()
和 get_summarization_suggestion()
函数。
[ ]:
records = [
rg.FeedbackRecord(
fields={
"text": doc.text
},
suggestions=[
{"question_name": "label-question",
"value": get_textcat_suggestion(doc)},
{"question_name":"text-question",
"value": get_summarization_suggestion(doc)}
]
) for doc in [nlp(item) for item in dataset_hf["context"]]
]
我们已经创建了记录,让我们将它们添加到 FeedbackDataset
中。
[ ]:
dataset.add_records(records)
推送到 Argilla#
我们现在准备好将我们的数据集推送到 Argilla,并且可以开始收集标注。
[ ]:
remote_dataset = dataset.push_to_argilla(name="squad_spacy-llm", workspace="admin")
你应该看到 Argilla 页面已准备好进行标注,如下所示。
在本教程中,我们实现了一个用于文本分类和摘要任务的 spacy-llm 管道。通过 Argilla Feedback 数据集,我们已经能够将模型预测作为建议添加到我们的数据集中,以便我们的标注员可以使用它们。有关 spacy-llm 的更多信息,你可以访问他们的 LLM 页面,有关 Argilla Feedback 数据集的其他用途,你可以参考我们的指南。