让大语言模型为文本处理提提速:Scikit-learn与LLM的合体Scikit-LLM开源项目发布

标签:#LLM##Scikit-Learn##Scikit-LLM# 时间:2023/05/24 23:19:40 作者:小木

尽管大语言模型(Large Language Models,LLMs)的发展让很多做NLP研究的童鞋感觉到前途一片黯淡,但是它对于工程应用的人来说却是一个福音。

不过,虽然LLM在很多任务上很好用,但是实际应用中我们常见的文本分类、文本标注等工作目前却依然缺少一个可以利用LLM能力的好方法。LLM的强大并没有在工程落地上比肩传统的机器学习处理框架。上周,一个叫Scikit-LLM新的开源项目发布,将传统优秀的Scikit-learn框架与LLM结合,带来了LLM落地的新方法。


简单来说,如果希望把LLMs的能力带到Scikit-learn的工程流程上,需要将scikit-learn那一套pipeline转变成对LLM的prompts才可以。例如,正常情况我们可能用model.fit(X,y)来训练一个分类模型,但是如果用这种方法使用LLM,显然不是传统领域的fit(一般可能是利用求解算法求解模型参数)方式,而是将X与y的对应关系转成prompts,发送给大模型。我们也可以自己这样做,但是显然很难与传统的scikit-learn的pipeline结合。Scikit-LLM就是解决这个问题的。

[TOC]

Scikit-LLM简介

在传统的文本处理中,对文本进行标注、分类等操作是很常见的处理方式。尽管LLMs的出现让我们看到了很多的工作可以直接让大模型代替。但是,这并不意味着传统的文本处理工作都可以丢掉。

而利用LLM处理这些任务并与传统的工程的工作流程结合则是一种非常有前途的方法。

在传统机器学习的开发中,Scikit-Learn是最流行的机器学习框架之一。在机器学习和数据科学领域,它提供了非常丰富且易于使用的功能,而且NumPy、Pandas等结合得很好。因此,如果能将LLM与Scikit-learn的能力结合,那将是对现有机器学习应用的一种极大的提升。

前几天,GitHub上一位开发人员开源了一个Scikit-LLM的框架,可以将Scikit-learn的功能与LLM无缝结合,可以充分利用LLM的能力提升Scikt-learn的文本分析水平。而项目发布仅五天已经在GitHub上获得了1.1k的stars:


Scikit-LLM的使用方法

目前,Scikit-LLM仅支持OpenAI的在线接口,因此需要OpenAI的key。而根据项目的规划,未来将支持其它的LLMs(大概率会有离线加载使用的能力)。

Scikit-LLM已规划和支持如下能力:
✅多类别分类
✅多标签分类
✅基于GPT的向量化
🔲Few-shot分类器
🔲其它LLMs的集成
🔲GPT微调能力(这个功能在评估)

其中,🔲表示在开发中,✅表示已经支持。

Sckit-LLM的使用也很简单,目前在使用前有2个步骤:

1、安装Scikit-LLM:
pip install scikit-llm
2、配置OpenAI的API Key
from skllm.config import SKLLMConfig
SKLLMConfig.set_openai_key("<YOUR_KEY>")
SKLLMConfig.set_openai_org("<YOUR_ORGANISATION>")

Scikit-LLM的实际使用案例

接下来我们看几个具体的使用场景。

1、使用GPT-3.5做基于有标注数据的文本情感分类

首先是根据指定的输入文本和标签训练一个模型,其实这个是类似与prompts-response的方式,将已经标注的数据给OpenAI的模型,然后让模型预测新数据的标签。也就是将传统的标注数据变成prompts给OpenAI的模型,让模型完成后续的标注工作。使用方法如下:

from skllm import ZeroShotGPTClassifier
from skllm.datasets import get_classification_dataset

# demo sentiment analysis dataset
# labels: positive, negative, neutral
X, y = get_classification_dataset() 

clf = ZeroShotGPTClassifier(openai_model = "gpt-3.5-turbo")
clf.fit(X, y)
labels = clf.predict(X)

这里的X就是内置的30条文本,y是每个文本对应的情感标签,包含positive、negative和neutral。如下图所示:


可以看到,与传统的分类模型流程几乎完全一样。

2、使用GPT-3.5在无标注数据上进行标注

在第一个例子中,我们告诉了GPT每一个文本对应的情感标签结果,然后再去分类其它文本。而LLMs的能力显然可以做zero-shot,可以按照如下的方式:

from skllm import ZeroShotGPTClassifier
from skllm.datasets import get_classification_dataset

X, _ = get_classification_dataset()

clf = ZeroShotGPTClassifier()
clf.fit(None, ['positive', 'negative', 'neutral'])
labels = clf.predict(X)

这个例子里面,我们没有对数据集和标注结果关联,只是告诉OpenAI的GPT-3.5需要对文本标注成哪些结果,那么直接使用fit(None, [1,2,3])即可,也就是说,将y的参数设置为具体标签即可。

3、使用GPT-3.5进行多标签分类任务

有些时候,我们要对一段文本做多个标签的标注,例如给定一段商品评论,我们想要知道它是描述商品哪些部分的,如价格、质量、物流等,那么显然一个评论可能涉及多个,而且每个评论涉及的内容数量不一样。那么,Scikit-LLM也可以非常简单的实现利用GPT-3.5完成这个功能:

from skllm import MultiLabelZeroShotGPTClassifier
from skllm.datasets import get_multilabel_classification_dataset

X, _ = get_multilabel_classification_dataset()
candidate_labels = [
    "Quality", 
    "Price", 
    "Delivery", 
    "Service", 
    "Product Variety", 
    "Customer Support", 
    "Packaging", 
    "User Experience", 
    "Return Policy", 
    "Product Information"
]
clf = MultiLabelZeroShotGPTClassifier(max_labels=3)
clf.fit(None, [candidate_labels])
labels = clf.predict(X)

我测试了10条评论,获得如下结果:

['Packaging'] | The product was of excellent quality, and the packaging was also very good. Highly recommend!
['Price'] | The delivery was super fast, but the product did not match the information provided on the website.
['Product Variety'] | Great variety of products, but the customer support was quite unresponsive.
['Price'] | Affordable prices and an easy-to-use website. A great shopping experience overall.
['Service'] | The delivery was delayed, and the packaging was damaged. Not a good experience.
['Quality'] | Excellent customer support, but the return policy is quite complicated.
['Product Variety'] | The product was not as described. However, the return process was easy and quick.
['Packaging'] | Great service and fast delivery. The product was also of high quality.
['Packaging'] | The prices are a bit high. However, the product quality and user experience are worth it.
['Quality'] | The website provides detailed information about products. The delivery was also very fast.

可以看到,GPT-3.5对每一个评论都抽取了多个标签。不过结果好像很一般啊~~

Scikit-LLM的总结

总的来说,Scikit-LLM是非常好的思想,毕竟目前的LLM无法解决所有问题。但是如果想把LLM的能力带到现有的机器学习流程中,显然也需要一定的改造。那么,如果你的应用目前已经是基于scikit-learn构造的。那么使用Scikit-LLM将大模型引入到你的项目中应该是最顺滑的切换了!

Scikit-LLM项目开源地址:https://github.com/iryna-kondr/scikit-llm

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送