Open In Colab  View Notebook on GitHub

🧸 使用 LLM 进行文本分类和摘要建议,使用 spacy-llm#

在本教程中,我们将实现一个 spacy-llm 管道,以获取 GPT3.5 的模型建议,并将它们作为 suggestions 添加到我们的 FeedbackDataset 中。本教程的流程将是

  • 运行 Argilla 并加载 spacy-llm 以及其他库

  • 为您的管道定义配置并初始化它

  • 创建您的 FeedbackDataset 实例

  • 在数据上生成预测,并将它们添加到 records

  • 推送到 Argilla

简介#

spacy-llm 是一个将 LLM 的强大功能集成到常规 spaCy 管道中的软件包,从而可以快速实用地提示各种任务。此外,由于它不需要训练数据,因此这些模型已准备好在您的管道中使用。如果您想训练自己的模型或创建自定义任务,spacy-llm 也有助于实现任何自定义管道。

将这个强大的软件包与 Argilla Feedback 数据集一起使用非常容易。我们可以使用我们将创建的管道进行推理,并将它们添加到我们的 FeedbackDataset

运行 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 "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_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']}"},
# )

启用遥测#

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

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

通过这些设置,我们使用 GPT3.5 创建了一个用于英语文本分类和摘要的 LLM 管道。

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_v2squad_v2 是一个数据集,由问题及其答案以及在其中搜索答案的上下文组成。我们将仅使用 context 列用于我们的目的。

[ ]:
dataset_hf = load_dataset("squad_v2", split="train").shard(num_shards=10000, index=235)

FeedbackDataset#

现在我们有了用于推理的管道和数据,我们可以创建我们的 Argilla FeedbackDataset 来制作和存储模型建议。对于本教程,我们将创建文本分类任务和摘要任务。Argilla Feedback 允许我们分别使用 LabelQuestionTextQuestion 实现这两个任务。

[ ]:
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 页面已准备好进行注释,如下所示。

Screenshot of Argilla UI

在本教程中,我们为文本分类和摘要任务实现了一个 spacy-llm 管道。通过 Argilla Feedback 数据集,我们能够将模型预测作为建议添加到我们的数据集中,以便我们的注释者可以利用它们。有关 spacy-llm 的更多信息,您可以访问他们的 LLM 页面,有关 Argilla Feedback 数据集的其他用途,您可以参考我们的指南