社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

Scikit-LLM:让机器学习与大型语言模型无缝集成

QuantML • 2 月前 • 76 次点击  

在机器学习领域,scikit-learn 是一个广受欢迎且功能强大的库,尤其受到Python初学者和专业人员的青睐。其简洁性和多功能性使得实现各种算法变得轻而易举。然而,随着人工智能技术的迅猛发展,尤其是大型语言模型(LLM)的崛起,传统的机器学习工具也需要与时俱进。Scikit-LLM 的出现正是这一趋势的体现,它将大型语言模型(如GPT、Vertex、Gemma、Mistral、Llama等)的强大功能无缝集成到scikit-learn生态系统中,为机器学习爱好者和专业人士提供了更强大的工具。

Scikit-LLM简介

Scikit-LLM 是一个开源库,旨在将大型语言模型的功能与scikit-learn的机器学习工作流相结合。通过这个库,用户可以轻松地在文本分析任务中利用LLM的强大能力,而无需深入了解每个模型的底层架构。

主要特点

  1. 后端家族(Backend Families)

  • Scikit-LLM根据语言模型API的类型将估计器(estimators)分组,称为“后端家族”。这种分组基于API格式,而不是语言模型的实际架构。例如,任何遵循OpenAI API格式的模型都被归类为GPT家族,无论其提供商或模型架构如何。
  • 每个家族都有自己的估计器集合,位于特定的子模块中。例如,Zero-Shot分类器在不同的后端家族中以不同的名称提供:在GPT家族中为ZeroShotGPTClassifier,在Vertex家族中为ZeroShotVertexClassifier。
  • 默认后端

    • 每个家族都有一个默认的后端,除非用户另有指定。例如,GPT家族的默认后端是OpenAI,但用户可以通过在模型设置中指定来切换到Azure后端。
  • GGUF支持

    • GGUF是一种用于存储量化模型权重和配置的开源格式,主要用于Llama CPP项目,但也可以由其他运行时加载。要在scikit-llm中使用GGUF模型,需要安装llama-cpp库及其Python绑定。
  • GPU加速

    • GGUF模型可以完全或部分卸载到GPU上,用户可以通过设置最大GPU层数来控制这一点。例如, SKLLMConfig.set_gguf_max_gpu_layers(-1) 将所有层都放在GPU上,而SKLLMConfig.set_gguf_max_gpu_layers(0) 则将所有层都放在CPU上。
  • 自定义URL后端

    • 自定义URL后端允许使用任何与OpenAI兼容的提供商,无论是本地还是基于云的。用户可以设置一个全局自定义URL来使用此后端。

    主要功能

    1. 文本分类

    Scikit-LLM提供了多种文本分类方法,包括零样本、少样本和动态少样本分类。

    1.1 零样本文本分类

    零样本分类器无需训练数据,只需提供候选标签列表即可。例如,要将文本分类为[正面、负面、中性],可以使用ZeroShotGPTClassifier:

    from skllm.models.gpt.classification.zero_shot import ZeroShotGPTClassifier
    from skllm.datasets import get_classification_dataset

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

    在零样本设置中,不需要训练数据,只需提供候选标签列表:

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

    1.2 少样本文本分类

    少样本分类涉及根据每个类别的少量示例将文本分类到预定义的类别中。Scikit-LLM估计器使用整个训练集来创建示例,因此如果数据集较大,建议将其拆分为较小的训练集和验证集。建议每个类别不超过10个示例,并打乱数据以避免近因偏差。

    from skllm.models.gpt.classification.few_shot import FewShotGPTClassifier
    from skllm.datasets import get_classification_dataset

    X, y = get_classification_dataset()
    clf = FewShotGPTClassifier(model="gpt-4o")
    clf.fit(X, y)
    labels = clf.predict(X)

    1.3 动态少样本文本分类

    动态少样本分类扩展了少样本文本分类,使其更适合更大的数据集。它不是使用固定的示例集,而是为每个样本动态选择子集,从而优化模型的上下文窗口并节省token。

    from skllm.models.gpt.classification.few_shot import DynamicFewShotGPTClassifier
    query = "I have fallen deeply in love with this sci-fi book; its unique blend of science and fiction has me spellbound."
    clf = DynamicFewShotGPTClassifier(n_examples=1).fit(X, y)
    prompt = clf.get_prompt(query)
    print(prompt)

    2. 文本到文本建模

    2.1 文本摘要

    LLM在摘要任务中表现出色。Scikit-LLM提供了一个摘要器,可以作为独立的估计器或预处理程序使用,类似于降维。

    from skllm.models.gpt.text2text.summarization import GPTSummarizer
    from skllm.datasets import get_summarization_dataset

    X = get_summarization_dataset()
    summarizer = GPTSummarizer(model="gpt-3.5-turbo", max_words=15)
    X_summarized = summarizer.fit_transform(X)

    2.2 文本翻译

    LLM在翻译任务中表现出色。Scikit-LLM包括一个Translator模块,用于将文本翻译成目标语言。

    from skllm.models.gpt.text2text.translation import GPTTranslator
    from skllm.datasets import get_translation_dataset

    X = get_translation_dataset()
    t = GPTTranslator(model="gpt-3.5-turbo", output_language="English")
    translated_text = t.fit_transform(X)

    3. 其他任务

    3.1 文本嵌入

    LLM可以将文本转换为固定维度的向量,然后可以与各种模型(例如分类、回归、聚类)一起使用。

    from skllm.models.gpt.vectorization import GPTVectorizer
    vectorizer = GPTVectorizer(batch_size=2)
    X = vectorizer.fit_transform(["This is a text""This is another text"])

    3.2 标记

    在Scikit-LLM中,标记可以是任意任务,它接收原始文本并返回带有插入的类似XML标记的相同文本。

    3.3 命名实体识别(NER)

    NER是Scikit-LLM中的一个实验性功能,可能不稳定。NER涉及定位和分类文本中的命名实体。目前,Scikit-LLM提供了一个NER估计器“Explainable NER”,它仅适用于GPT家族。

    from skllm.models.gpt.tagging.ner import GPTExplainableNER as NER
    entities = {
        "PERSON""A name of an individual.",
        "ORGANIZATION""A name of a company.",
        "DATE""A specific time reference."
    }
    data = [
        "Tim Cook announced new Apple products in San Francisco on June 3, 2022.",
        "Elon Musk visited the Tesla factory in Austin on January 10, 2021.",
        "Mark Zuckerberg introduced Facebook Metaverse in Silicon Valley on May 5, 2020."
    ]
    ner = NER(entities=entities, display_predictions=True)
    tagged = ner.fit_transform(data)

    结论

    Scikit-LLM 通过将先进的语言模型集成到scikit-learn中,增强了其在各种NLP任务中的能力,包括文本分类、摘要和翻译。它支持零样本和少样本学习、动态示例选择和可自定义的后端。尽管它提供了灵活性和效率,但用户应考虑潜在的成本和性能影响,尤其是使用动态和可调功能时。总体而言,Scikit-LLM 是一个强大的工具,可将最先进的大型语言模型无缝集成到机器学习工作流程中。





    更多资源见星球,加入QuantML星球,与750+专业人士一起交流学习:


    往期回顾

           QuantML-Qlib开发版:


    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/179256
     
    76 次点击