« DOS/V Power Report誌の最終号を購入 | トップページ | 2023年まとめ記事 »

2023年12月30日 (土)

ChatGPT 3.5並みの日本語能力を持つとされるLLM「ELYZA-japanese-Llama-2-13b-instruct」を使ってみた

何か新しい言語モデルが出るたびに追っかけている気がしますが、これがなかなかのAIだったので紹介。

商用利用可能で130億パラメーターの日本語LLM「ELYZA-japanese-Llama-2-13b」が公開 - 窓の杜

ELYZA(イライザ)という東大の松尾研究所発のベンチャーが、Llama2ベースの言語モデルを発表してました。
パラメータ数は130億で、Llama2としては中間のモデルサイズのやつです。
おまけに、商用利用可。これはLlama2ベースのモデルではデフォですね。

ところで最近、あまりにもLLMに飛びつきすぎて食傷気味なので、これを使うかどうするかと思っていたんですが、まず下記のデモサイトに行きまして、

ELYZA-japanese-Llama-2-13b-instruct-demo - a Hugging Face Space by elyza

そこでいろいろと入力してみると、これがなかなかいい感じの文章を返してくれる。
ということで、ちょっと気に入ったため我が家のメインPCで動かしてみることにしました。

elyza/ELYZA-japanese-Llama-2-13b-instruct · Hugging Face

上のサイトを参考から、以下のコードを入手。「elyza-japanese-llama2-13b-instruct.py」として保存しておきます。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
text = "仕事の熱意を取り戻すためのアイデアを5つ挙げてください。"

model_name = "elyza/ELYZA-japanese-Llama-2-13b-instruct"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype=torch.bfloat16, use_cache=True, device_map="auto", low_cpu_mem_usage=True,
)
model.eval()
prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
    bos_token=tokenizer.bos_token, b_inst=B_INST, system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}", prompt=text, e_inst=E_INST,
)
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=2048,
        pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id,
    )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)

あとは、これを実行します。

 python elyza-japanese-llama2-13b-instruct.py

なおトークン数が初期値は256だったのですが、このままでは文章が途切れてしまったので、2048としてます。
それが原因か、結構時間がかかります。

ちなみに、このコードにある「仕事の熱意を取り戻すためのアイデアを5つ挙げてください。」という質問に対しては、35分かかって以下の回答を出してきました。

仕事の熱意を取り戻すためのアイデアを5つ考えてみました。
1. 目標を見直す: 現在の目標が高すぎるのか、低すぎるのかを見直し、適切な目標を設定することで、仕事へのやる気を取り戻すこ とができる可能性があります。
2. 仕事の意味を再確認する: 仕事の意味を再確認することで、仕事へのやる気を取り戻すことができる可能性があります。
3. 仕事の環境を変える: 仕事の環境を変えることで、仕事へのやる気を取り戻すことができる可能性があります。
4. 仕事のメリハリをつける: 仕事とプライベートのメリハリをつけることで、仕事へのやる気を取り戻すことができる可能性があり ます。
5. 仕事の成果を再確認する: 仕事の成果を再確認することで、仕事へのやる気を取り戻すことができる可能性があります。
これらのアイデアを参考に、仕事の熱意を取り戻していただければ幸いです。

うん、ちょっと仕事のやる気、取り戻してみようかな? という文章にはなれているんじゃないでしょうかね。

調子がのってきたところで、ちょっと具体的な指示を出してみます。

てことで、「宇宙での艦隊戦をテーマにした小説を書こうと思ってますが、緊迫した戦闘シーンのアイデアを5つ挙げてください。」と聞いてみました。

で、35分後に、答えが返ってきました。

宇宙艦隊戦の緊迫した戦闘シーンのアイデアを5つ考えてみました。
1. 敵艦隊を待ち伏せして奇襲する: 敵艦隊が通りかかる際に、隠していた艦隊を一気に出撃させることで、敵艦隊を圧倒する。
2. 敵艦隊の裏をかく: 敵艦隊の背後に回り込み、敵艦隊を挟撃する。
3. 敵艦隊の退路を塞ぐ: 敵艦隊が退路を確保する前に、その退路を塞ぐことで、敵艦隊を包囲する。
4. 敵艦隊の主力艦を狙う: 敵艦隊の中核を攻撃し、敵艦隊の士気を削ぐ。
5. 敵艦隊の艦載機を撃墜する: 敵艦隊の艦載機を撃墜することで、敵艦隊の監視網を破壊する。
これらのアイデアを参考に、緊迫した戦闘シーンを描写してみてください。

うん、悪くないですね。アイデアが煮詰まってたところなので、これくらい具体的だと参考になります。
これと同じ質問をデモサイトでもして、それなりの答えが返ってきたのが、このLLMを導入してみようと思ったきっかけでもあるんです。ただ、デモサイトでは文字制限があって、全部書ききれなかったため、続きを我がメインPCに委ねました。

ちなみに、同じ質問を先日紹介したSwallow-13b(Llama2ベースの東工大発日本語LLM「Swallow」が公開: EeePCの軌跡)にも投げてみました。

### 入力:
宇宙での艦隊戦をテーマにした小説を書こうと思ってますが、緊迫した戦闘シーンのアイデアを5つ挙げてください。

### 応答:1. 宇宙ステーションでの戦闘シーン - 戦艦同士の激しい砲撃戦
2. スター・デブリでの戦闘シーン - 小惑星が密集する空間での戦闘。
3. 衛星軌道上での戦闘シーン - 重力がない空間での戦闘。
4. ワームホールの出口付近での戦闘シーン - 時空の歪みの中での戦闘。
5. 暗黒物質の海を航行中に戦闘シーン - 光に干渉されない空間での戦闘。

同じ13bモデルですが、そっけない回答ですね。この点では、ELYZA-13bの方が上です。ただし、Swallow‐13bの方は10分で返ってきました。
こうしてみると、このELYZA-13b、実は最強の日本語LLMじゃないかと。ちょっと前にハマっていたCalm2よりも、ずっと自然な文章が返ってきます。
ただ、Calm2の方が入力できるコーパス数が多いんですね(Llama2は2000~3000文字程度、Calm2は1万文字以上でもOKでした)。
そこはCalm2の方が魅力的な点です。

なお、このELYZA-japaneseですが、70b版も公開される予定みたいです。そっちも楽しみですねぇ。

という感じで、なかなかの日本語モデルが手に入りました。
この1年の内に、ほんとに日本語LLMの進化が著しいですね。来年はどこまでいくんでしょう?
個人的には、ChatGPTなしでも動かせるくらいのLLMの登場に期待してます。


日経サイエンス2023年10月号 [雑誌]

« DOS/V Power Report誌の最終号を購入 | トップページ | 2023年まとめ記事 »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« DOS/V Power Report誌の最終号を購入 | トップページ | 2023年まとめ記事 »