Vポイントマーケティング|TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Scikit-LLMでテキスト分類しました

あけましておめでとうございます。 データサイエンスグループの木下です。

今回は、Scikit-LLMというライブラリを紹介いたします。

Scikit-LLMとは

skllm.beastbyte.ai Scikit-LLMとは、LLMをScikit-Learnのように扱うことができるライブラリです。 Scikit-LearnユーザーになじみやすいAPI設計になっており、学習コストが低いのが特徴です。

上記のドキュメントによると、主なタスクは

  1. Text-Classification
    指定したラベルで文章分類ができます。 Zero-shotとFew-Shot、CoT(Chain of Thought)などに対応しています

  2. Text-to-text modelling
    要約タスク、翻訳タスクなどができるそうです。

  3. Text Vectorization
    テキストの埋め込み表現を作成できます。

Scikit-LLMの実装

では、実際にScikit-LLMを実装してみます。 データセットは、料理名とその説明文がセットになったFood Description dataというオープンデータにしました。

本ブログでは、
①英語の説明文を日本語の説明文に翻訳
②日本語の説明文から指定した味覚ラベルに分類
という、2つのタスクを行います。

データの前処理

Food Description dataは下記のようになっており、全部で2602行ありました。 今回は、この中からDescriptionの文字列が100文字以上ある65行のデータに絞りました。

Scikit-LLMのインストールとAzureOpenAIのconfig指定

まずは、Scikit-LLMをインストールします。

pip install scikit-llm

今回は、AzureOpenAIを使用します。 その場合、ご自身で使われているAzureOpenAIのOPENAI_API_KEYとOPENAI_API_BASEをScikit-LLMのconfigに設定してあげる必要があります。 また、モデルの名前には、プレフィックスとして、"azure::"を付けてあげる必要があります。

from skllm.config import SKLLMConfig

# use azure key instead
SKLLMConfig.set_openai_key(OPENAI_API_KEY)
SKLLMConfig.set_azure_api_base(OPENAI_API_BASE)

# start with "azure::" prefix when setting the model name
model_name = "azure::gpt-4"
翻訳タスクの実行
from skllm.models.gpt.text2text.translation import GPTTranslator

t = GPTTranslator(model = model_name, output_language="Japanese")
translated_text = t.fit_transform(df['Description'].tolist())

df['translated'] = translated_text

翻訳タスクは、GPTTranslatorというクラスで行います。 使用するgptのモデル名と、翻訳先の言語を指定してインスタンスを作成し、 そのインスタンスにfit_transform関数を適用することで、翻訳が完了します。

実際に出力された内容は下記のとおりです。

分類タスクの実行
from skllm.models.gpt.classification.zero_shot import ZeroShotGPTClassifier

clf = ZeroShotGPTClassifier(model = model_name)
labels = ['甘い','しょっぱい','酸っぱい','辛い']
clf.fit(None, labels)

infered = clf.predict(df['translated'].tolist())

df['label'] = infered

今回は、zero-shotの分類を行ったので、 ZeroShotGPTClassifierというクラスを用いました。 こちらは、モデル名のみ指定してインスタンスを作成し、 fit関数でインスタンスに分類したいラベルを指定します。 その後、predict関数で分類タスクを実行します。

65件の分類結果は、下記のようになりました。

きちんと指定したラベルの中で分類されていることが分かります。

分類精度を調べるために、'辛い'と'甘い'から5件ずつ抜き出した結果が下記になります。

キムチやハラペーニョが入っている料理は'辛い'という判定になり、 ココナッツミルクやバタースコッチが入っている料理は'甘い'という判定になっており、 かなりの精度で判定ができているのではないでしょうか。

結論

たった数行でLLMによる様々なタスクが実行できてしまうScikit-LLMはとても便利だと思いました。 データサイエンティストとして、テキストデータをラベル付けしたり埋め込み表現に変換したりして、新たな特徴量を作成して機械学習モデルに入力する、といった応用の仕方ができると思います。