end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

日本語LLM(Rinna GPT , OpenCALM)による文書生成

上司「オンプレでチャットAI作って」 - Qiita

上記urlのgoogle colab での写経です。

以下の実行結果のように「日本の首都は?」に対し、 意味不明な文となっています。

素?の日本語LLMであることが原因か、 それとも、私の使用方法が悪いのか?

目次

使用する日本語大規模モデルデータ

2023/7時点で、以下のモデルがあるようですが、 今回、rinna/japanese-gpt-neox-3.6b と cyberagent/open-calm-7b を使用します.

モデルデータ 内容
rinna/japanese-gpt-neox-3.6b 36億パラメータ.汎用GPTモデル
rinna/japanese-gpt-neox-3.6b-instruction-sft-v2 対話GPTモデルfine-tuning済
rinna/japanese-gpt-neox-3.6b-instruction-ppo 強化済み対話GPTモデル
cyberagent/open-calm-1b 10億パラメータ.汎用GPTモデル
cyberagent/open-calm-3b 30億パラメータ.汎用GPTモデル
cyberagent/open-calm-7b 70億パラメータ.汎用GPTモデル

pip install

!pip install transformers
!pip install sentencepiece

Rinna GPT

import torch
from transformers import AutoTokenizer
from transformers import AutoModelForCausalLM

# 自然言語の入力textを深層学習の入力dataに変換するPG
#  -> rinna/japanese-gpt-neox-3.6b or rinna/japanese-gpt2-medium
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b", use_fast=False)
# 以下で True とする理由不明
tokenizer.do_lower_case = True

# model指定
#  -> rinna/japanese-gpt-neox-3.6b or rinna/japanese-gpt2-medium
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b")

if torch.cuda.is_available():
    model = model.to("cuda")

text = "日本の首都は?"
# 入力文から、token idに変換
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")

# no_grad()により、メモリ消費を抑えられるらしい
with torch.no_grad():
    # generate()による文書生成
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=100,
        min_new_tokens=100,
        do_sample=True,
        temperature=0.8,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)

実行結果

日本の首都は?
ロンドンなど諸外国の所在地は?日本人が一番住みたい都市は?...
などなど、さまざまな質問で、答える人の年代や興味の度合い、
知識の程度によって、答え方が変わってくるのです。
これは、子どもが興味をもつ話題なら、年齢にかかわらず、
だれにでも興味を持たせることができるのと同じです。
つまり、どんな人でも答えやすい質問というのは、誰でも答えやすいということです。
それを意識して質問し

OpenCALM

import torch
from transformers import AutoTokenizer
from transformers import AutoModelForCausalLM

# 自然言語の入力textを深層学習の入力dataに変換するPG
# -> cyberagent/open-calm-7b or cyberagent/open-calm-1b
model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b")
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")

inputs = tokenizer("日本の首都は?", return_tensors="pt").to(model.device)

# no_grad()により、メモリ消費を抑えられるらしい
with torch.no_grad():
    # generate()による文書生成
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)

実行結果

日本の首都は?と聞かれたの部隊員が、ある者は「東京」と答える。
すると他部隊員は「江戸!」と答え、
そこで初めて東京都という地名を知ることになるのです。
日本国憲法の発布した日はいつなのか。
昭和21年11月3日か昭和22年5月3日のどちらかで間違いはないのか