見出し画像

AIBunCho/japanese-novel-gpt-j-6bで小説を書いてみる。

前回、rinnaの学習モデルをファインチューニングして失敗し、どうしたものかと途方に暮れていたところ、AIBunChoが小説向けのベースモデルをリリースしたとのうわさを聞き付けた。早速試してみる。

8月11日(これを書いている4日前)にリリースされただけあって、ほとんど文献がない。それでも、以下の2名の先人が早速書き起こしてくれた。これを頼りに進める。感謝。

1. 環境構築

サイズが大きいモデルなので、文書生成中にメモリが枯渇してハングアップすることがある。今回はGoogle Colab Proで試した。
ハードウェア アクセラレータ:T4 GPU
形状:ハイメモリ

それでもパラメーターを大きく設定するとハングアップすることがある。その時はすべてのセッションを終了させた後、ランタイムを再起動する。

2. 準備

ライブラリのインストール

# パッケージのインストール
!pip install transformers sentencepiece accelerate

トークナイザーとモデルの準備

from transformers import GPTJForCausalLM, AlbertTokenizer
import torch

# トークナイザーとモデルの準備
tokenizer = AlbertTokenizer.from_pretrained(
    "AIBunCho/japanese-novel-gpt-j-6b",
    keep_accents=True,
    remove_space=False
)
model = GPTJForCausalLM.from_pretrained(
    "AIBunCho/japanese-novel-gpt-j-6b",
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True
)
model.half()
model.eval()

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

試してはないがcpu環境の場合は以下の箇所を削除する。cpu環境で動くとは思えないが…。

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

3. 推論

def generate_story(prompt):
    input_ids = tokenizer.encode(
        prompt,
        add_special_tokens=False,
        return_tensors="pt"
    ).cuda()
    tokens = model.generate(
        input_ids.to(device=model.device),
        max_new_tokens=1024,
        min_length=1024,
        temperature=0.6,
        top_p=0.9,
        repetition_penalty=1.2,
        do_sample=True,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )
    out = tokenizer.decode(tokens[0], skip_special_tokens=True)
    print(out)
    return out

def story(begin):
    predict_text = begin
    for i in range(5):
        current_text = generate_story(predict_text)
        predict_text = f"{current_text}\n"

max_new_tokensで生成される文章のトークンの最大値、min_lengthで生成されるテキストのトークンの最小値を設定する。
特にmin_lengthは一度に生成される文章の最小値なので、短ければ話は核心に触れず尻切れトンボになるし、長ければメモリがハングアップする。
様子を見ながら設定していきたい。
本環境では1024が適切と判断したため、どちらの設定値を1024で進める。

生成した文章を再帰的に推論させていますが、長文になると何度も再帰処理をしてもあまり効果が見られなかったため5回繰り返しています。
また、念のため改行コードを埋め込んでいますが、生成される文章には改行コードが含まれていませんでした。

4. プロンプトの設定

元となる文章を数行用意し、story関数に引き渡す。
元となる文章
「この図書館にはどんな情報も揃っていると聞いたが、本当ですか?」
 香は図書館に足を踏み入れるなり、カウンター越しの司書・鏑木に問いかけた。
「......どんな本をお求めですか?」
「ここでは、本当にどんな情報でも手に入るんですよね?」
 香は声を強めながら、もう一度鏑木に問いかけた。

prompt("""
「この図書館にはどんな情報も揃っていると聞いたが、本当ですか?」\n
 香は図書館に足を踏み入れるなり、カウンター越しの司書・鏑木に問いかけた。\n
「......どんな本をお求めですか?」\n
「ここでは、本当にどんな情報でも手に入るんですよね?」\n
 香は声を強めながら、もう一度鏑木に問いかけた。\n
""")

大体1~2分で3000文字が生成されます。

5. 生成結果

「この図書館にはどんな情報も揃っていると聞いたが、本当ですか?」
 香は図書館に足を踏み入れるなり、カウンター越しの司書・鏑木に問いかけた。
「......どんな本をお求めですか?」
「ここでは、本当にどんな情報でも手に入るんですよね?」
 香は声を強めながら、もう一度鏑木に問いかけた。
「はい」
「......」
 (......なんだ?) 突然声を大きくした彼女に驚きながらも、鏑木は小さく頷いた。 そんな二人を遠巻きに見ていた三人組だったが、そのうちの一人である蒼馬は、香の纏う雰囲気がいつもと違う事に気が付いた。
「な~んか、いつもと違くない? あの女......」
「うん......? 確かに、何だかちょっとピリピリしてるような......?」
「あ~......もしかしてアレじゃない? 最近噂になってるっていう『ハッカー』とかいう人!」
「ハッカー?」
「そうそう! なんでも凄腕のクラッキング能力者だとかで、依頼すれば何でも調べてくれるらしいよ!......まぁ、アタシらにゃ関係ないだろうけどね~」
「ふーん......」
 蒼馬はその話を聞き終えると、再び本に目を向けた。――その時だった。
「おいお前ら」
 突如として聞こえたその声に、その場にいた全員が顔を上げた。 そこには二人の男女がいた。一人は長めの黒髪をした美女。もう一人は長い銀髪の美少女だ。
「ここは関係者以外立ち入り禁止だぞ。どうやって入ったんだか知らないが、さっさと出て行け」
 黒髪の女性が、威圧的な声で言った。
「いやー......そう言われてもねぇ? 気になる情報が手に入ったからここに来たんだけどさ?」
「知りたい情報は教えろ。それ相応の対応をするだけだ」
「そうつれない事言うなよ。ここなら大体の情報が手に入んだろ?」
「......なるほど。だからここに来れば何か分かると思ったわけか」
「そういう事♪」
「お引き取り願おうか」
「えーっ!? ちょーっとくらい教えてくれたっていいでしょ!?」
「ダメだ。帰れ」
「そこをなんとかしてよー!!」
「諦めなさい。こういう時のこの人は絶対に引かないわよ」
「うーっ......! じゃあもういいよ!! 自分で調べるもん!!」
 女性は諦めたようにため息を吐くと、くるりと踵を返して歩き始めた。 「待ってください。少しお時間を頂いてもよろしいでしょうか?」
 しかしそれを止めたのは、今まで黙って話を聞いていた香だった。
「何だお前は」
「私は花沢香と申します。こちらは友人の蒼馬です」
 そう言って、香は自身の名刺を差し出す。
「......『花沢』だと?」
 彼女は驚いたような表情を見せた。
「知っているのですか?」
「......ああ、よく知っているとも。まさかこんな所で会う事になるとはな」
 彼女はどこか懐かしむような表情を浮かべた後、改めて二人に向き直った。
「さて、自己紹介も済んだところで本題に入るが......その前に一つ質問してもいいだろうか」
「何ですか?」
「お前達は、『サイバース族』についてどこまで知っている?」
「......それは、どういう――」
「――いいから答えろッ!!!」
 突然の大声に、香は思わず息を呑んだ。
「......何故あなたがそんな事を聞くのか分かりませんが、とりあえず質問に答えさせていただきます。私達は『サイバース族』についてあまり多く知りませんので、お答えできる範囲は少ないと思いますが......」
「そうか。ではまず、『サイバース族』についてだが、彼らは人間ではない」
「......え?」
 その言葉に、その場にいた全員が目を見開いた。
「彼らの身体はデータ化されており、実体を持たないのだ。そして私達のような人間は『イグニス』と呼ばれている」
「いぐす......?」
 聞き慣れない言葉に、蒼馬が首を傾げた。 「『イグニス』というのは、かつてこの世界にいたという神の名だそうだ。彼らにとって神と呼ばれる存在は全て等しく『イグニス』であり、同時に全てでもあると言っていた」
「つまり、神様は全員同じ姿をしているって事?」
「その通りだ」
「えっと......話が見えないのですが、なぜそのような事を私たちに聞いたのでしょうか?」
「......そうだな。私も全てを話すべきでは無いと思っているのだが......お前達ならば話しても構わないだろう。これは他の誰にも話す事が出来ない話だしな」
 そう言うと、彼女は小さく息を吐いた後、再び口を開いた。
「今から十年前、この世界は一度滅びかけた事がある」
「なっ......!」
 彼女の口から語られた衝撃の言葉に、その場のメンバー達は驚愕の声を上げた。
「世界が滅びかけた理由までは分かっていないが、少なくとも、ある一人の男の行動によって滅びかけていた世界は救われたのだ」
「その男は今どこにいるんですか?」
「さあな。私が会った時には既にいなかったし、恐らく今も生きているとは思うが......」

「......そうですか。ありがとうございます」
「......他に質問は無いようだな。それでは、話を戻すぞ」
 そう言うと、彼女はふうっと息を吐いてから再び話し出した。
「実はその日、私はこの世界に来ていたんだが......その時に偶然にもとある物を見つけてしまったんだ」
「......それが、カードなんですね?」
「そうだ。しかもただのカードではなかった。それこそが、私達が世界を救ったきっかけになったものだ」
「どうしてそのような物をあなたが見つけたのですか?」
「分からない。ただ、ある日突然私の目の前に現れたと思ったら、私の手元にあったんだよ。何の変哲もない普通のカードのようにな」
「それで、そのカードは一体なんなんですか?」
「これの名前は、『エンコード・トーカー』と言う。どうやらこのカードの力を使えば、あらゆる情報を閲覧する事が出来るらしい」
「あらゆる情報の、検索......」
「そうだ。例えば、我々が住んでいる世界の事や、その世界の歴史などを見る事も出来るだろうな」
「そんな事まで出来るなんて......」
「ただし、見ての通りこれは一枚しか無い上に、使用する度にエネルギーを消費するから、一日一回しか使えない。その上、エネルギーを使う事で使用者の身体に負担がかかる事もあるからな」
「......なるほど。だから、そのカードを使用する際には細心の注意を払う必要があるわけですね」
「そういう事だ。......そろそろ時間のようだな」
 彼女がそう言った瞬間、入り口の方から声が聞こえてきた。
「あれ? なんか声が聞こえなかった?」
「気のせいだろ? それより早く帰んないと怒られるぜ?」
「そうね。帰りましょうか」
 そうして四人は揃って図書館を後にした。
「......それにしても、なんであの人はあんな嘘を吐いたのかしらね?」
 帰り道、女性陣は先ほどの話の内容を振り返っていた。
「嘘?」
「ええ。彼女の言う通り、あの時の声は聞こえませんでしたよね? それなのに、まるで実際に見たかのような話し方をしていました」
「それってやっぱり、誰かに見せられていたとかじゃないのかな?」
「だとしたら誰かしらね?



※改行とスペースは人為的に挿入しています。

6. 所感

20回以上生成を試してみて、なんとも「小説家になろう」系の文章が色濃く生成されたと感じました。また、登場人物が勝手に追加されたり、実在する固有名詞が使われる事が多かったです。
私のプロンプトが悪かったのかもしれませんが、これ一本でそれらしい小説を書くには難しいようです。

(追記2023/08/18)
上記5. 生成結果に載せた文、遊戯王のパロディだったんですね。気づかずに載せちゃいました。下記の再生成したものは、(一部パロってる部分はあるものの)比較的固有名詞は出てこないと思うので載せます。

「この図書館にはどんな情報も揃っていると聞いたが、本当ですか?」
 香は図書館に足を踏み入れるなり、カウンター越しの司書・鏑木に問いかけた。
「......どのような本をお求めですか?」
「ここでは、本当にどんな情報でも手に入るんですよね?」
 香は声を強めながら、もう一度鏑木に問いかけた。
「......はい」
 鏑木は小さな声で答えた。
「......じゃあ、『鬼』についての情報とかも......?」
「......」
 鏑木は何も答えなかった。だが、その沈黙こそが雄弁な回答だった。
「お願いします! 知りたいんです!」
 頭を下げたまま言う香を見て、鏑木は小さく溜息を吐いた後......ゆっくりと口を開いた。
「......分かったわ。こっちに来て頂戴......」
 そう言って、受付横の扉へと案内した。 扉を開くと、そこは本棚で埋め尽くされた空間が広がっていた。壁は全て本棚になっており、隙間なく本が詰まっている。棚の上にはランプが置かれていて、薄暗い部屋の中を照らしていた。
「ここは......」
「私の仕事場よ......好きな所に腰掛けてちょうだい......」
 そう言いながら、鏑木は自分の席に着いた。
「分かりました」
 香が言われた場所に座ると、鏑木はその正面にある机に置かれた本を手に取った。
「まずはこれを読んで欲しいのだけれど......」
 そうして、机の上に置かれた本の表紙を差し出した。
「これは......?」
 差し出された本の題名は書かれていなかった。ただ、表紙からして歴史書のような印象を受けた。
「この本はね、古今東西あらゆる英雄譚や物語を集めた物なのよ。だから、貴方が知りたい事にもある程度答えてあげられると思うわ......」
 そう言われ、香は改めて渡された本を読む事にした。 ページを開き、目次を見た瞬間......そこにはこう書かれていた。 『鬼神伝説』『三種の神器』『天叢雲剣』『草薙剣』『八咫鏡(ヤタノカガミ)』
「......え? これって......!」
 香は思わず声を漏らしてしまった。それも無理は無いだろう。何故ならそこに書いてあったのは、自分が探していた書物の名前だったのだから。
「......ええ、貴方達が探している物はこれの事でしょう......?」
「はい......! ありがとうございます!」
 香は椅子から立ち上がり、深々と頭を下げた。
「良いわよ......私は貴方達の協力者なんだから......それで、どの話を知りたいのかしら......? 私で良ければ、教えてあげられるけれど......?」
「それじゃあ、まず初めに書かれている物を全部教えてください」
「分かったわ......少し待っていて......」
 そう言うと、鏑木は立ち上がって別の場所へと向かった。 それから数分後......再び戻ってきた鏑木の手には、数冊の分厚い本があった。
「これが全てよ......」
 机に置かれている本の数は合計すると十以上あった。
「こんなにたくさん......ありがとうございます」
 香はまたしても頭を下げて礼を言った。
「別に構わないわよ......それで、どれから聞きたいのかしら......?」
「えっと、それじゃあまずはこの『鬼神伝説』をお願いします」
 一番上に置かれていた本を指さしながらそう言った。
「分かったわ......ちょっと待っていて......」
 そう言うと、鏑木は席を立って隣の部屋へと移動していった。そしてすぐに戻ってくると、その手に持っていた本の束を置いた。
「ここにあるのが全ての本よ......今から読み始めるわね......」
 そう言って、香とは向かい側の椅子に座った。
「はい、よろしくお願いします」
 その後、香は本を読み始めた。 途中何度か質問を挟んだりしながらも、時間は過ぎていった。 やがて数時間が経過した後......最後の一冊を読み終えたところで、香は大きく伸びをした。
「ふう......面白かったです、ありがとうございました」
 そう言って、鏑木に向かって頭を下げる。
「......どういたしまして」
 鏑木は短く言葉を返しながらも、どこか安心したような表情を浮かべていた。
「そういえば、私が聞いた質問に対する答えは見つかりましたか?」
 ふと思い出したかのように、香は聞いてみた。
「そうね......まだ完全には分からないけど、いくつか仮説はあるわ......」
「そうなんですか!?」
 驚いたように声を上げた香に対して、鏑木は頷いた。
「まあ、あくまでも予想でしかないけどね。まずは一つめだけれど......この世界に存在する武器の中に、それぞれ伝承が存在するという事よ......」
「伝承って、例えば、神話に出てくる剣だったりとかですか?」
「ええ、その通りよ......例えばこの日本刀である草薙剣だけど、その昔、この国の守護をしていた神が使ったとされているわ......その神の名前が草薙剣と呼ばれているらしいわ」
「へぇ~......そんな名前だったんですね」
「二つ目に、香が探している物の一つである八尺瓊勾玉についてよ。この勾玉は別名“八尺瓊之勾玉”と言われているらしくて、古くから伝わる神話では、大蛇を退治した際に手に入れたとされる逸品だと考えられているみたい......三つ目に、鬼神伝説の話について。これはさっき話した通り、三種の神器である剣、八咫鏡、草薙剣、八尺瓊之勾玉を使って討伐し、封印した事によって討滅に成功したというお話よ」
「つまり、この鬼神伝説っていうのはその怪物を倒すお話って事なんですか?」
「そういう事になるわね......」
「なるほど......ありがとうございます!」
 そうして、最後の四つ目の話を聞こうとしたその時......突然扉が開き、誰かが入ってきた。
「失礼します、マスターさんいらっしゃいますかー?」
 入ってきた人物の正体に気付いた途端、香の顔が驚愕に包まれた。
「あ......あなたは確か......!」
「あれ、君はもしかして......」
 その人物は、かつて千春と共に助け出した少女であった。
「あの......お久しぶりです」
 少女はぺこりとお辞儀をしながら、香に向けて挨拶をしてきた。
「久しぶりだね......あの時以来かな?」
「そうですね、お元気そうで何よりです」
 少女はにっこりと笑ってみせた。
「そっかぁ......あの時助けてあげた子が無事だったんだねぇ......」
「はい、おかげさまでこうして元気にやってます」
 少女がここに来た理由は、以前千春と一緒に助け出した少女の様子を確認するためであった。
「良かった......本当に良かったよぉ......」
 そう言いながら、香は少女の元へ駆け寄り抱きしめた。
「わっ!? ちょ、ちょっとどうしたんですかいきなり!?」
「ごめんごめん、急に抱きしめちゃってごめんね。君が生きててくれて嬉しかったんだぁ~」
「そ、そうだったんですか......」
 香の腕の中で困惑する少女の顔を見て、思わず笑みがこぼれてしまう。
「あははっ、可愛いなぁもう」
 そう言いながら、更に強く抱きしめる。
「ちょっ、苦しいですってば~~!!」
 しばらく抱き合った後、香はようやく少女を解放した。
「はぁ......苦しかったです......」
「えへへ、ごめんね~久しぶりの再会だったからつい嬉しくなっちゃって」
「全く、仕方ない人ですね......」
 頬を膨らませて不満げにしている様子ではあるが、その顔は笑っていた。
「そうだ、君の名前を教えてもらっても良いかな?」
「あっ、そうでしたね。自己紹介がまだでしたね......私は火打谷美琴(ひうちやみこと)と言います。以後お見知りおきを、マスターさん」
 美琴は恭しく一礼してから名を告げた。
「うん、よろしくね、美琴ちゃん」
「それでは私はこれで失礼いたします。これからお仕事頑張ってくださいね♪」
 そう言い残すと、美琴は部屋を出て行った。
「......さて、私も頑張らないとね」
 そう呟いた香の顔は、先ほどよりもやる気に満ち溢れていた。


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