[オタク機器日記] 日本語LLM(生成AI) ELYZA 13B/70B版登場までの宿題
ようやく新型波動砲… じゃなくてTelsa P40を装備した我がパソコン、「お楽しみはこれからだ!」と思っていたら、さっそくドツボにハマってさあ大変 … というのが今回の話題。
いや、あの、イライザ(ELYZA)さんから使い方が宜しくないと、注意指導というイエローカードを受けてしまった訳ですわ。「Pythonなど使いながら使い方を覚えれば良いだろう」とタカを括っていたら、それ以前にモデルの設定内容を勉強する必要を忘れていたという始末。エラそうなモノ言いのLLMも存在すると聞くけれども、人間の方も気をつけなければアカンという次第。全くもってして面目ないです。ハイ。
やってしまったこと
ちなみにサンプルスクリプトに手を加えてイエローカードを受けてしまったのは下記スクリプト。チャット・ボットのように「ご質問をどうぞ:」と表示された後で質問をキーボード入力するようにしてみたのだけれども、その部分が宜しくなかったらしい。
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 = "あなたは誠実で優秀な日本人のアシスタントです。"
model_name = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")
if torch.cuda.is_available():
model = model.to("cuda")
while True:
text = input ("ご質問をどうぞ: ")
if text.lower() == 'exit':
break
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,
)
with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=2560,
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)
print(" ")
そもそも今まで殆どPythonなど使ったことが無かったから、ループ処理なども今回が初めて。他LLMのサンプルスクリプトを参照して、whileを初めて書いてみたのだったりする。インデントによってループ処理部分を指定するとは、機械語で育った者としては「目からウロコ」という状況。逆アセンブルが得意技とはいえ、我ながら無謀であるとは思う。入力がinputで指定するだけ良いとか、さすがは現代の言語だと感心させられた。ちなみにサンプルスクリプトにはinput部分は存在せず、text = "質問内容文" で最初からスクリプトに質問内容を書き込んでおくというスタイルだった。もちろんwhile処理も入っていなかった。
そういえばサンプルスクリプトでは、max_new_tokensは256と記述されていた。最初はこの部分を指導されたのかと思ったけれども、確認したら2560に書き換える前からメッセージ表示されていた。ゆえにtext指定の位置をmodel_nameの前から動かしたり、while文を導入したのが宜しくなかったか、はたまたtext変数にinput関数でデータを流し込んだのが良くなかったらしい。
注意指導メッセージ
なお表示されたメッセージは次の通り。
これは当てずっぽうだけれども改めて考え直してみると、オジサンの直感としては、どうもinput部分が宜しくないような気がする。なぜなら「ご質問をどうぞ」時点ではメッセージ表示されていないので、この入力メッセージを受け取ったことが宜しくなかったという気がするからだ。少しだけ齧ったFORTRANなどでは、普通は変数を使う場合は変数定義が必要だったような気がするし、そもそもinputで文字コードがtextに引き渡されるかも分からない。
そう考えるとこれ、もしかしてELYZAさんではなく、Pythonの使い方が宜しくないという注意指導を、Pythonさんご自身から注意指導を受けたということかもしれない。うーん、いかに高級言語とはいえ、全く勉強せずに使い始めたのは無謀だったのかもしれない。
まとめ (ともかくまずは使う)
ただし当面の目標はPython言語の学習やプログラミング技術を習得することではなく、まずは「質より量」で、実際にLLMを使ってみることにある。そんな訳で本記事は、備忘録として発行することにした。もちろんプログラム言語も大切だけれども、会社的には早く成果を出すことが望ましい状況だったりするし。
ちなみに今回は3つの質問をしてみた。「スパイスの効いたケーキ」というのは日本では珍しい。そうやって見ると牛丼など日本固有の選択肢も登場しており、事実データの書き換えとでもいうのが効率良くできている。ロミオとジュリエットのロミオをアーサーに変更するような処理だけれども、それも効率良くやっているみたいでELYZA開発チームには敬服するばかりである。13B/70B版を楽しみに待つ今日この頃である。
今日の晩御飯のメニューを考えてください。子供の誕生日です
子供の誕生に、父親の私はワインを飲んでも良いでしょうか
(一見すると父親と書いているのに女性のことが説明されているので「大したことのないLLM」と思いがちだが、これは当方のプロンプト作成ミス。具体的な条件を示し切れておらず、また父親だけでは対象不明確であると反省した。「子供の前で誕生に酔っ払った姿を見せても構わないか」など、問い合わせ内容を明確化する工夫が必要ですな)
子供の誕生日祝いにケーキを買う場合、どのようなケーキがおすすめになるでしょうか
ともかく生成AI(LLM)というのは、単純にプログラムを組めば良いというものではないことを再認識できた。勉強になった。
なお本日の最終成果は下記記事となる。
それでは今回は、この辺で。
by 小野谷静 (オノセー)
この記事が気に入ったらサポートをしてみませんか?