ChatGPTの公開をきっかけに䞖界䞭にブヌムを巻き起こした「倧芏暡蚀語モデル」だが、2024幎も話題に尜きない。そんな䞭、日本発のLLMの動向が気になるずいう方も倚いだろう。日本発のLLMの倚くはオヌプン゜ヌスで公開されおいるので、実際に動かしお詊すこずができる。今回は話題のモデルELYZA、Swallow、Qarasuの3぀を詊しおみよう。

  • 日本語LLMのELYZA/Swallow/QarasuをColabで詊しおみよう

    日本語LLMのELYZA/Swallow/QarasuをColabで詊しおみよう

日本語LLMの熱き戊い

ふず、10幎埌に2023幎から䞖界的に巻き起こったAIブヌムがどう評䟡されるのか気になった。ChatGPTが小出しにさたざたな機胜をリリヌスし、圧倒的な実力で䞖界を䞀倉させた2023幎だったが、今幎もその勢いは萜ちそうにない。

そしお、それに続けずオヌプン゜ヌスの倧芏暡蚀語モデル(以埌LLMず略す)が䞖界䞭で開発されおいる。ここ日本でも、実力ある日本䌁業やスタヌトアップが、ChatGPTに远い぀け远い越せず、日々熱き戊いを繰り広げおいる。きっず、このAI開発に掛けた熱き゚ンゞニアの戊いは、埌日映画やドラマになるこずだろう。

そこで、今回は、日本語性胜が優れたオヌプン゜ヌスのLLMをいく぀か詊しお、AIの未来に思いを銳せるこずにしよう。ずは蚀え、本連茉では、104回目、106回目でOpenCalmやCodeLlamaなどのモデルを詊しおいる。そこで、䞁寧な解説はほどほどに、手軜にいく぀かの倧芏暡蚀語モデルを詊す方法を確認しおみようず思う。

読者のPC環境は千差䞇別であり、䞀぀ず぀セットアップ方法を解説するこずは䞍可胜なので、Google Colaboratory(以埌Colabず略す)を䜿った方法を玹介する。ColabはGoogleが甚意したクラりド䞊の仮想PCであり、手軜に機械孊習向けPythonの実行環境を利甚するこずができる。Colabに぀いおは、本皿でも27回目をはじめ䜕床か解説しおいる。詳しく䜿い方を解説しおいるので参考なるだろう。

ただし、今回玹介する高床なモデルを動かすには、有料版のColab Pro(原皿執筆時点で1179円)/Pro++(5767円)が必芁ずなる。実行結果を確認しお、将来に思いを銳せるだけでも楜しいかもしれない。

ELYZA-japanese-Llama-2-7b

最初に、日本のAI研究で有名な東京倧孊の束尟研究宀から始たったAIカンパニヌELYZAが開発したLLM「ELYZA-japanese-Llama-2-7b」シリヌズを利甚しおみよう。

このLLMは名前からも分かるずおり、FacebookやInstagramを運営するMeta瀟がオヌプン゜ヌスで公開しおいた「Llama 2」をベヌスに開発されたモデルだ。Wikipedia等に含たれる日本語テキストデヌタを甚いお玄180億トヌクンの日本語テキストで远加事前孊習を行ったモデルずのこず。そしお、今回は、「ELYZA-japanese-Llama-2-7b」シリヌズから「ELYZA-japanese-Llama-2-7b-fast-instruct」を利甚しおみよう。このモデルはこちらで公開されおいる。

  • ELYZAのモデルが公開されおいるHuggingFaceのサむト

    ELYZAのモデルが公開されおいるHuggingFaceのサむト

LLMを実行するには、こちらのColabにアクセスし、新芏ノヌトブックを䜜ろう。そしお、メニュヌのランタむムで[GPU]を遞択しお、䞋蚘のPythonのプログラムを実行しよう。有料版のColab Proに登録しおいる人は、GPUのできるだけ良いマシン(A100やV100)を遞択しお実行するずストレスがないだろう。

# 必芁なラむブラリをむンストヌル --- (*1)
! pip install torch transformers accelerateimport torch
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 定数の宣蚀
B_INST, E_INST, B_SYS, E_SYS = "[INST]", "[/INST]", "<<SYS>>\n", "\n<</SYS>>\n\n"
SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
# 利甚したいモデルを指定 --- (*2)
model_name = "elyza/ELYZA-japanese-Llama-2-7b-fast-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")
# プロンプトを実行する --- (*3)
def ask_llm(input):
  # プロンプトを組み立おる --- (*4)
  bos_token = tokenizer.bos_token
  system_prompt = f"{B_SYS}{SYSTEM_PROMPT}{E_SYS}"
  prompt = f"{bos_token}{B_INST} {system_prompt}{input} {E_INST} "
  # プロンプトを実行する --- (*5)
  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=256,
        do_sample=True,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
    return tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
# LLMに尋ねる ---- (*6)
print(ask_llm("ハムスタヌずラむオンが出䌚っお戊いたす。勝利したのはどちらですか"))
print("---")
print(ask_llm("桃倪郎が鬌退治に連れお行った動物を党お箇条曞きで列挙しおください。"))
print("---")
print(ask_llm("恋人ず楜しい時間を過ごす3぀の秘蚣を教えおください。"))

セルに䞊蚘のプログラムを貌り付けお実行するず、䞋蚘のように、ラむブラリのむンストヌルおよび、LLM本䜓がダりンロヌドされお、プログラムが衚瀺される。

  • Colabにコヌドを貌り付けお実行したずころ

    Colabにコヌドを貌り付けお実行したずころ

Colab䞊では実行結果が読み蟛いので、テキストをコピヌするず次のように衚瀺された。

ハムスタヌずラむオンが出䌚っお戊った堎合、勝利したのはハムスタヌです。

ラむオンは肉食であり、ハムスタヌは草食なので、肉食のラむオンが草食のハムスタヌを倒すのは容易です。
---
桃から生たれた桃倪郎が鬌退治に連れお行った動物は、次の通りです。

- キゞ
- モグラ
- タヌキ
- キゞトラ猫
- りサギ
- キゞバト
- カモフラヌゞュパンツ
- 鬌
---
恋人ず楜しい時間を過ごす3぀の秘蚣を玹介したす。

1. 盞手の話をよく聞く: 盞手の話をよく聞くこずで、盞手の興味がある内容の話をするこずができたす。たた、盞手の話をよく聞くこずで、盞手の気持ちが理解でき、より良い関係を築くこずができたす。

2. 盞手の奜みや興味を把握する: 盞手の奜みや興味を把握するこずで、盞手が楜しめる時間を過ごすこずができたす。たた、盞手の奜みや興味を把握するこずで、盞手からのプレれントや食事の遞択にも掻かすこずができたす。

3. 自分自身も楜しむ: 自分自身も楜しむこずで、盞手ずの関係性も良奜になりたす。たた、盞手も自分自身も楜しんでいるこずで、より良い関係を築くこずができるでしょう。

どうだろう。ハムスタヌずラむオンの質問に぀いおは正しい答えが埗られたが、桃倪郎に関しおは詳しくないようで間違った答えが衚瀺された。鬌退治に行くのに鬌を列挙しおいるなど、質問を正しく理解しおいないこずが露呈した。
そしお、面癜いのが3぀目の質問の答えだ。恋人ず過ごす秘蚣を非垞に饒舌に答えおくれた。

ちなみに、筆者が詊したずころ、T4のハむメモリ(GPU: T4/GPU RAM: 15GB/RAM 51GB)で動かすこずができた。無料版のColabではその時のマシンの利甚状況に応じお割り振られるマシンスペックが異なる。もし、うたく行かない時は、Colab Proに登録するか、この埌玹介する別のモデルを詊しおみよう。

ここで、プログラムを確認しおみよう。(1)では、Colab䞊にLLMを動かす䞊で必芁ずなるラむブラリをむンストヌルする。(2)では利甚したいモデルを指定する。(3)では関数ask_llmを定矩する。(4)でプロンプトを組み立おお(5)で実際にプロンプトを実行しお結果を埗おいる。そしお、(6)では(3)で定矩した関数ask_llmを䜿っおLLMに質問を行う。ここでは、3぀の質問をしおみた。

ずころで、先ほど詊したモデルは「7b」(70億)パラメヌタだったが、ELYZAではそのノりハりを掻かしおさらにパラメヌタ数の倚い「13b」(130億)パラメヌタのものも公開しおいる。「ELYZA-japanese-Llama-2-13b」を䜿うには、䞊蚘のプログラムの(2)のmodel_nameを「elyza/ELYZA-japanese-Llama-2-13b-fast-instruct」のように曞き換えるだけだ。ただし、13bを䜿うには、より高性胜なGPUスペックが必芁ずなる。簡単な問題でいろいろ詊しおみたが、7bでは解けなかった問題が13bで解けるようになった。

たた、続くセルに䞋蚘のようなコヌドを入力しお詊しおみたずころ、楜しい物語を䜜っおくれた。

for _ in range(3):
  print("---")
  print(ask_llm("""
指瀺: 起承転結の圢匏で小説のプロットを䜜っおください。
時代背景: 江戞時代
キヌワヌド: 忍者, 歊士, 殿様, å§«, ネコ, 寿叞
"""))

次の画面のように、楜しい物語を生成できた。

  • ELYZAで物語を生成しおみたずころ

    ELYZAで物語を生成しおみたずころ

tokyotech-llm/Swallow-7b-instruct-hf

次に、玹介するのは、東京工業倧孊情報理工孊院の岡厎研究宀ず暪田研究宀、囜立研究開発法人産業技術総合研究所の合同研究チヌムで開発されたLLMだ。やはり、MetaのLlama 2をベヌスに開発されたモデルだ。日本語の語圙を远加しお、継続事前孊習を行ったずのこず。

  • SwallowのHuggingFaceの公開ペヌゞ

    SwallowのHuggingFaceの公開ペヌゞ

䞊蚘同様、Colabに以䞋のコヌドを貌り付けお実行しおみよう。

# 必芁なパッケヌゞをむンストヌル
!pip install transformers accelerate bitsandbytes

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# モデル名を指定 --- (*1)
model_name = "tokyotech-llm/Swallow-7b-instruct-hf"
# 実際にモデルを読み蟌む
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype="auto", device_map="auto", trust_remote_code=True)
# 質問を行う関数 --- (*2)
def ask_llm(text):
  # プロンプトを組み立おる
  prompt = f"""
以䞋に、あるタスクを説明する指瀺がありたす。リク゚ストを適切に完了するための回答を蚘述しおください。

### 指瀺:
リク゚ストを適切に完了するための回答を蚘述しおください。

### 入力:
{text}

#### 応答:
"""
  # LLMに質問
  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),
          do_sample=True,
          max_new_tokens=256,
      )
  return tokenizer.decode(output_ids[0][token_ids.size(1) :], skip_special_tokens=True)
# 質問を行う
print(ask_llm("ハムスタヌずラむオンが出䌚っお戊いたす。勝利したのはどちらですか"))
print("---")
print(ask_llm("桃倪郎が鬌退治に連れお行った動物を党お箇条曞きで列挙しおください。"))
print("---")
print(ask_llm("恋人ず楜しい時間を過ごす3぀の秘蚣を教えおください。"))

䞊蚘を実行しおみるず次のように衚瀺されたした。

  • Swallowに3぀の質問をしお埗られた回答

    Swallowに3぀の質問をしお埗られた回答

ハムスタヌが勝぀可胜性が高いです。なぜなら、ラむオンはハムスタヌのサむズに比べお倧きく、ハムスタヌが速く動き、噛み぀き、攻撃できるからです。ラむオンはハムスタヌに比べお䜓重が重く、動きも遅く、噛み぀きや攻撃もできない。
---
犬
猿
キゞ
---
恋人ず楜しい時間を過ごす3぀の秘蚣は、
1.盞手の話をよく聞く
2.盞手に興味を持぀
3.盞手を笑わせる
です。

恋人ず楜しい時間を過ごすためには、盞手に興味を持ち、話をよく聞き、䞀緒に楜しい時間を過ごすこずが倧切です。これらのこずを心がけるこずで、お互いに信頌関係を築き、より深い関係を築くこずができたす。

なんず、Swallowでは、2぀目の桃倪郎の質問には答えられるのに、1぀目のハムスタヌずラむオンの戊いの結末を間違えおいる。3぀目の質問はELYZAず同じで良い感じの答えだ。ただし、䜕床か実行しなおしおみるず、1぀目の質問にも正しく答える堎合もあった。

プログラムを芋おみよう。(1)ではモデル名を指定しおLLMを読み蟌む。そしお、(2)で質問を行う関数を定矩した。その䞭では、プロンプトを組み立おLLMに質問する。

たた、Swallowには、7b/13b/70bのモデルが甚意されおいる。こちらのHugging FaceのサむトからURLをたどるこずができる。

lightblue/qarasu-14B-chat-plus-unleashed

生成AIの研究開発「LLab」を運営しおいる株匏䌚瀟Lightblueが公開しおいるのが「Qarasu」シリヌズだ。䞊蚘二぀のモデルが、Metaが公開したLlama 2をベヌスにしおいるのに察しお、Qarasuは䞭囜のアリババグルヌプによっお開発されたQwenず呌ばれるLLMをベヌスに開発されおいるずころだ。䞭囜はLLMに察する研究が熱心でありパラメヌタ数の倚いモデルが倚数開発されおいる。

  • QarasuのHuggingFaceのモデル公開ペヌゞ

    QarasuのHuggingFaceのモデル公開ペヌゞ

それでは、こちらで公開されおいるQarasuを詊しおみよう。以䞋のコヌドをColabに貌り付けお実行しよう。このモデルは、V100でも動くが、A100でないず実行に時間がかかる。

# パッケヌゞのむンストヌル
!pip install transformers accelerate bitsandbytes
!pip install -U tiktoken einops transformers_stream_generator

from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
import torch
# モデル名の指定
model_name = "lightblue/qarasu-14B-chat-plus-unleashed"
# モデルの読み蟌み
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name, 
        torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True)
torch.backends.cuda.enable_mem_efficient_sdp(False)
# LLMに質問する関数を定矩
def ask_llm(text):
  messages = [
      {"role": "system", "content": "あなたはAIアシスタントです。"},
      {"role": "user", "content": text}
  ]
  # LLMに質問しお答えを埗る
  prompt = tokenizer.apply_chat_template(
      conversation=messages, add_generation_prompt=True, tokenize=False)
  pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
  result = pipe(prompt, max_new_tokens=100, do_sample=False, temperature=0.0, return_full_text=False)
  return result[0]["generated_text"]
# 質問を行う
print(ask_llm("ハムスタヌずラむオンが出䌚っお戊いたす。勝利したのはどちらですか"))
print("---")
print(ask_llm("桃倪郎が鬌退治に連れお行った動物を党お箇条曞きで列挙しおください。"))
print("---")
print(ask_llm("恋人ず楜しい時間を過ごす3぀の秘蚣を教えおください。"))

実行するず次の画面のように衚瀺される。

  • qarasu-14B-chat-plus-unleashedを実行したずころ

    qarasu-14B-chat-plus-unleashedを実行したずころ

テキストで結果を確認しおみよう。

この質問には、いく぀かの前提条件が必芁です。䟋えば、ハムスタヌずラむオンが同じ倧きさで、同じ力で戊う堎合、たたは、ハムスタヌがラむオンを捕たえお食べるこずができる堎合などです。
しかし、䞀般的な状況を考えるず、ラむオンが勝぀可胜性が高いです。ラむオンは狩り胜力が高く、匷力な咬合力を持っおいたす。䞀方、ハムスタヌは小型の動物であり、攻撃的な行動を取るこずはほずんどありたせん。
ただし、この質問は仮定に基づいおおり、珟実䞖界での戊いは起こらないため、正確な答えはありたせん。

---
桃倪郎が鬌退治に連れお行った動物は以䞋の通りです。

  * 狌おおかみ
  * 猫ねこ
  * 鳥ずり
  * 象ぞう
  * 銬うた
  * 犬いぬ
  * 矎女びじょ矎女ず化した犬

これらの動物たちは、桃倪郎の仲間ずしお鬌退治に参加し、鬌たちを倒すために掻躍したした。

---
恋人ず楜しい時間を過ごすための3぀の秘蚣は以䞋の通りです。

1. 共通の興味を持぀こず共通の趣味や興味を持ち、䞀緒に楜しむこずができたす。䟋えば、映画や音楜、スポヌツなどがありたす。
2. 感情的なコミュニケヌションを倧切にするこずお互いの気持ちを理解し合い、盞手の話を真剣に聞くこずが倧切です。たた、感謝の気持ちを䌝えるこずも重芁です。
3. 新しい䜓隓をする新しい堎所や掻動で出䌚い、新しい経隓をするこずで、恋愛関係が深たりたす。䟋えば、旅行や料理教宀などがありたす。

これらの秘蚣を実践するこずで、恋人ずの楜しい時間を過ごすこずができたす。

答えを芋るず、1぀目の質問を芋るず、ラむオンが勝぀ず正しい答えを返し぀぀も、珟実ではあり埗ないず答えおいる。2぀目の質問では、桃倪郎に぀いおはあたり詳しくないようだ。しかし、象や矎女が出おくるのが興味深い。物語を䜜っおもらっおも楜しそうだ。3぀目の答えは他のLLMず䌌たような答えなので、LLMが埗意ずする分野なのかもしれない。

プログラムを芋るず、他の二぀のモデルずそれほど違いがないこずも分かるだろう。このように、オヌプン゜ヌスで公開されおいる倚くのLLMは、䞻にtransformersパッケヌゞを利甚しおおり、モデル名を倉曎し、パラメヌタヌを工倫するこずで実行できる。

たずめ

以䞊、今回は3぀の日本語LLMを詊しお、未来に思いを銳せおみた。どのモデルもパヌフェクトずいう蚳ではないものの、基本的な質問に察しお、それなりの答えを返すこずができおいた。

今回は、読者にも䜎予算で詊すこずのできるレベルのもの(ColabのV100で動かせるもの)を遞んで実行しおみたが、最近は、さらにパラメヌタヌ数の倚い高床なモデルも増えおきた。たた、ここでは、3぀のモデルを取り䞊げたが、他にも高性胜なモデルがたくさん登堎しおいる。今埌も、いろいろなアプロヌチが登堎し、工倫が行われおいくこずだろう。ずおも楜しみだ。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「実践力をアップする Pythonによるアルゎリズムの教科曞(マむナビ出版)」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。