進化するAI、Sakana AIの自然言語モデルで商品名のクレンジングタスクを解いてみる
先月ごろから話題になっているSakana AI社が提供している自然言語モデル(進化的アルゴリズムによる基盤モデルの構築)のSakanaAI/EvoLLM-JP-v1-7Bを使って、商品名のクレンジングタスクを解いてみます。
他の手法で試した記録はこちらの記事になります。
本記事では、transformersのUsageを参考に、現在私が担当しているタスクを試した実験記録となります。
GPUはT4を使用しています。
ライブラリのインストール
pip install transformers accelerate bitsandbytes
transformers、accelerate、bitsandbytesをインストールします。
バージョン指定は特に行なっておりません。
コード
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# load model
repo_id = "SakanaAI/EvoLLM-JP-v1-7B"
model = AutoModelForCausalLM.from_pretrained(
repo_id,
torch_dtype=torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(repo_id)
torch、transformersの必要なライブラリをインポートします。
safetensorsは3つのファイルがダウンロードされ、およそ15GBのダウンロードとなっています。
EvoLLM-JP:数学的推論が可能な日本語の大規模言語モデル(LLM)。進化的モデルマージにより日本語数学LLMとして構築したEvoLLM-JPは、数学のみならず、日本語の全般的な能力に長けていることが分かりました。パラメータ数が7Bのモデルですが、驚くべきことに、日本語LLMベンチマークにおいて同サイズのモデルと比較し最高の性能を達成するどころか、70Bパラメータの日本語LLMの性能をも上回りました。私たちが実験的に構築したEvoLLM-JPは、汎用の日本語LLMとしても十分な性能を持っていると考えています。
EvoVLM-JP:日本語で対話可能な画像言語モデル(VLM)。進化的モデルマージにより構築した日本語VLMであるEvoVLM-JPは、日本文化に特有の知識にも対応でき、日本の画像と日本語のテキストを利用したベンチマークでも最高の結果を達成しました。
EvoSDXL-JP:高速な日本語画像生成モデル。我々の進化的モデルマージは、画像生成拡散モデルにも適用できます。進化的モデルマージにより現在開発している、わずか4ステップの推論で画像が生成できる高速日本語画像生成モデルです。
モデルは、LLMモデルのSakanaAI/EvoLLM-JP-v1-7Bを使用します。
LLMは大規模言語モデル、VLMは対話可能な画像言語モデル、SDXLは日本語で画像を生成するモデルのようです。今回はテキストに特化したタスクのためLLMを使用します。[1]
続いてプロンプト文と実行です。
# prepare inputs
text = "概要:このタスクでは、商品名から不要なワードを除去する必要があります。不要なワードとは、プロモーションに関連する言葉 や、商品名には不適切な追加情報(例:「送料無料」、「特価」、【中古】、「バナジウム」などの成分、「防災」、「備蓄」など)を指します。以下に具体的な例を示します。例:入力: \"新鮮なトマト 500g 特 価\" 除去後: \"新鮮なトマト 500g\"入力: \"高品質な日本製ノートPC 最新モデル 送料無料\" 除去後: \"高品質な日本製ノートPC 最新モデル\" 入力: \"エコフレンドリー再生紙 A4 500枚セット 大量購入割引\" 除去後: \"エコフレンドリー再生紙 A4 500枚セット\"タスク:以下の商品名から 不要ワードを除去してください。入力:【公式】水 500ml 48本 ミネラルウォーター 天然水 送料無料 富士山の天然水 富士山の天然水500ml ラベルレス 国産 天然水 バナジウム バナジウム含有 防災 備蓄 アイリスオーヤマ"
messages = [
{"role": "system", "content": "あなたはECサイトの経営者でショップの商品について詳しい人物です。"},
{"role": "user", "content": text},
]
inputs = tokenizer.apply_chat_template(messages, return_tensors="pt")
# generate
from transformers import TextStreamer
output_ids = model.generate(
inputs.to(model.device),
pad_token_id=tokenizer.eos_token_id,
max_new_tokens=768,
temperature=0.5,
repetition_penalty=1.15,
top_p=0.95,
do_sample=True,
streamer=TextStreamer(tokenizer, skip_prompt=True),
)
結果
商品1
【公式】水 500ml 48本 ミネラルウォーター 天然水 送料無料 富士山の天然水 富士山の天然水500ml ラベルレス 国産 天然水 バナジウム バナジウム含有 防災 備蓄 アイリスオーヤマ
期待する商品名
富士山の天然水 富士山の天然水500ml 48本 ラベルレス アイリスオーヤマ
プロンプト結果
水 500ml 48本 ミネラルウォーター 天然水 富士山の天然水 富士山の天然水500ml ラベルレス 国産 天然水 バナジウム含有 防災 備蓄
公式、送料無料、重複している天然水が消えました。
除去例として指定している、防災、備蓄は残ったままです。
1つの生成では40秒弱かかっています。
これは前回試したオープンモデルのLlama2よりも遅い結果となってしまいました。
商品2
【365日出荷】BIYOUDO シリカ水 500ml×42本 美陽堂 ミネラルウォーター 軟水 美容ミネラル シリカ 熊本産 シリカウォーター 放射性物質検査済み 阿蘇山由来 軟水 保存料なし 500ミリ 備蓄 日本製 保存水
期待する商品名
BIYOUDO シリカ水 500ml×42本 美陽堂 ミネラルウォーター
プロンプト結果
【365日出荷】BIYOUDO シリカ水 500ml×42本
これはかなり良い結果ですね。消えなかった 【365日出荷】 はワードの例に追加すれば良いです。
商品3
い・ろ・は・す ラベルレス(560ml*48本セット)【いろはす(I LOHAS)】[水 ミネラルウォーター]
期待する商品名
い・ろ・は・す ラベルレス(560ml*48本セット)
これは比較的シンプルな商品名ですので、後半部分が除去されると良さそうです。
プロンプト結果
い・ろ・は・す ラベルレス(560ml*48本セット)
これは期待通りの結果が取得できました。
さいごに
商品名のクレンジング手法では、除去したいキーワードリストをマッチさせて除去する手法や
自然言語モデルで対応する方法など様々考えられます。
今回は、Sakana AIの自然言語モデルを実験的な利用例の一つとして、
商品名のクレンジングにおいて新たな可能性が感じられました。
今後の開発が期待されるSakana AI。
モデルのバージョンアップを心待ちにします。
今回実行したコードをノートブックとしてアップロードしました。
Discussion