見出し画像

[オタク機器日記] 日本語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関数でデータを流し込んだのが良くなかったらしい。

注意指導メッセージ

なお表示されたメッセージは次の通り。

ご質問をどうぞ: 今日の晩御飯のメニューを考えてください。子供の誕生日です。
/home/onosei/.local/lib/python3.10/site-packages/transformers/generation/utils.py:1417: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation )
warnings.warn(

日本語部分が質問内容

これは当てずっぽうだけれども改めて考え直してみると、オジサンの直感としては、どうもinput部分が宜しくないような気がする。なぜなら「ご質問をどうぞ」時点ではメッセージ表示されていないので、この入力メッセージを受け取ったことが宜しくなかったという気がするからだ。少しだけ齧ったFORTRANなどでは、普通は変数を使う場合は変数定義が必要だったような気がするし、そもそもinputで文字コードがtextに引き渡されるかも分からない。

そう考えるとこれ、もしかしてELYZAさんではなく、Pythonの使い方が宜しくないという注意指導を、Pythonさんご自身から注意指導を受けたということかもしれない。うーん、いかに高級言語とはいえ、全く勉強せずに使い始めたのは無謀だったのかもしれない。

まとめ (ともかくまずは使う)

ただし当面の目標はPython言語の学習やプログラミング技術を習得することではなく、まずは「質より量」で、実際にLLMを使ってみることにある。そんな訳で本記事は、備忘録として発行することにした。もちろんプログラム言語も大切だけれども、会社的には早く成果を出すことが望ましい状況だったりするし。

ちなみに今回は3つの質問をしてみた。「スパイスの効いたケーキ」というのは日本では珍しい。そうやって見ると牛丼など日本固有の選択肢も登場しており、事実データの書き換えとでもいうのが効率良くできている。ロミオとジュリエットのロミオをアーサーに変更するような処理だけれども、それも効率良くやっているみたいでELYZA開発チームには敬服するばかりである。13B/70B版を楽しみに待つ今日この頃である。

今日の晩御飯のメニューを考えてください。子供の誕生日です

子供の誕生日なので、子供が食べて喜んでくれるメニューを考えてみます。
* 前菜 : チーズの形をしたハムとチーズの盛り合わせ
* メイン : 子供の好きなお肉の料理 (ローストビーフ、牛丼、ハンバーグなど)
* デザート : ケーキ (チーズケーキ、プリン、アイスクリームなど)

質問1への応答

子供の誕生に、父親の私はワインを飲んでも良いでしょうか

ワインに含まれるアルコールは、胎児に悪影響を及ぼす可能性があるため、妊娠中の女性が飲むことは避けるべきです。

しかし、個人の体調や耐性による差異があるため、一概に断じることはできません。妊娠中の方が、飲酒をする場合は個々の判 断で行ってください。

質問2への応答

(一見すると父親と書いているのに女性のことが説明されているので「大したことのないLLM」と思いがちだが、これは当方のプロンプト作成ミス。具体的な条件を示し切れておらず、また父親だけでは対象不明確であると反省した。「子供の前で誕生に酔っ払った姿を見せても構わないか」など、問い合わせ内容を明確化する工夫が必要ですな)

子供の誕生日祝いにケーキを買う場合、どのようなケーキがおすすめになるでしょうか

子供の誕生日祝いに買うケーキのおすすめは、以下のポイントを考慮して選ぶと良いでしょう。

1. 子供の好きな味や食材: 子供が好きな味や食材のケーキを選ぶと、喜んで食べてくれる可能性が高ます。
2. 食感や見た目: 食べやすいような、キャラクターや文字がデコレーションされたケーキは、子供が喜んで食べてくれる可能性があ ります。
3. アレルギーや好き嫌い: 子供のアレルギーや好き嫌いを考慮して、選ぶケーキを決めると良いです。

以上を考慮して選ぶと、以下のようなケーキがおすすめになります。

- チーズケーキ: チーズケーキは、子供が大人になるまで食べられるということから、誕生日ケーキとして人気があります。
- シュークリーム: シュークリームは、食べやすく、見た目もキュートであるため、女の子の誕生日ケーキとしておすすめです 。
- スパイスが効いているもの: 男の子の場合、スパイスが効いているケーキが好きな子が多いため、スパイスが効いたケーキを 選ぶと喜んで食べてくれる可能性があります。

ケーキを選ぶ際には、子供の好みやアレルギーを考慮して、楽しい誕生日祝いになるように選ぶことをおすすめします。

質問3への回答

ともかく生成AI(LLM)というのは、単純にプログラムを組めば良いというものではないことを再認識できた。勉強になった。

なお本日の最終成果は下記記事となる。

それでは今回は、この辺で。

by 小野谷静 (オノセー)

この記事が気に入ったらサポートをしてみませんか?