【第１回】日本語生成モデル 選手権

# 概要
2023/9/30までに登場した日本語生成モデルを２～３個試してみて、生成内容やメモリ使用量等の使い勝手の面で、どれが実用的か勝手に評価しました。
２～３個で「選手権」と呼ぶにはあまりにも強引な企画です。


# 背景
ChatGPT以降、日本国内でも多くの生成モデルが登場しました。

モデルを評価する指標として、2022年に「**JGLUE**」というのが作られたのですが、スコアではどのくらい良いのか全く分からないので、実際に日本語を生成させて、比較したいと考えました。


### 候補モデル

| 出場番号   |     モデル名      | 企業名 |  公開/発表日 |   試行対象 |    メモ | 
| ---: | ----------- | :-------: | :------- | :-------: | :-------: |
| 1    | GPT3 | OpenAI | 2020/5/28 | ○ |  |
| 2    | GPT3.5 | OpenAI | 2022/11/30 | ○ |  |
| 3    | LHTM-2 | オルツ | 2023/2/14 | - | 非公開 |
| 4    | GPT4 | OpenAI | 2023/3/14 | ○ | 本命 |
| 5    | ABEJA LLM Series | ABEJA | 2023/3/16 | - | 国産初？ |
| 6    | open-calm | CyberAgent | 2023/5/16 | ○ |  |
| 7    | japanese-gpt-neox | riina | 2023/5/17 | - |  |
| 8    | 名称なし | NICT | 2023/7/4 | - | 非公開 |
| 9    | NEC Generative AI Service | NEC | 2023/7/6 | - | 非公開 |
| 10    | japanese-stablelm | Stability AI Japan | 2023/8/10 | - |  |
| 11    | japanese-large-lm | Line | 2023/8/14 | - |  |
| 12    | Weblab-10B | 松尾研究室 | 2023/8/22 | ○ | 対抗 |

上表のうち、今回試行するのはChatGPTで使用されている**GPT-3.5**、**GPT-4**に加えて、JGLUEのスコアが最も高い東京大学の**松尾教授の研究室**で開発されたモデル「**Weblab-10B**」とJGLUEのスコアが下位のCyberAgentのモデル「**open-calm**」を対象とします。

選手権と呼ぶには、出場者があまりに少ないですが、メインの構図は「**ChatGPTと選抜された国産勢の対決**」ということでご了承ください。


# 評価方法
「**もし、村上春樹氏の小説に出てくるような人物が就職面接を受けたらどのように受け答えするか**」を確認したいです。

具体的には、モデルへの入力内容には「職務経歴書に記載されている通り、」のような内容を与えて、その続きをモデルに生成してもらい、その内容を私の主観で評価します。
※入力内容がそれぞれ微妙に異なる点はご了承ください。

評価のポイントは、村上春樹らしい表現が存在するかです。

### 村上春樹氏の小説の特徴
私が思う村上春樹氏の小説の特徴は、**状況描写が細かくて分かりやすい**という点です。
例えば、擬音語や擬態語を使い、状況がイメージしやすいです。

```inyou:『騎士団長殺し』より引用１
私の耳に届くのは、ワイパーの劣化したゴムが立てるかすれた音と、タイヤが濡れた路面を進む、しゃーっという途切れのない音だけだった。
```

また、洋楽やクラシック、小説、映画、オペラまで幅広い芸術作品が登場します。


```inyou:『騎士団長殺し』より引用２
私はシェリル・クロウのCDをプレーヤーから取り出し、そのあとにMJQのアルバムを入れた。
『ピラミッド』。
そしてミルト・ジャクソンの心地よいブルーズのソロを聴きながら、高速道路をまっすぐ北に向かった。
```

<!--```inyou:「騎士団長殺し」より引用３
その うち の 一 枚 は イ・ムジチ合奏団 の 演奏 する メンデルスゾーン の 八重奏曲 、 その 音楽 を 聴き ながら ドライブ を する の が 妻 は 好き だっ た 。  
```
-->

時には、具体的な地名も多く登場します。

```inyou:『騎士団長殺し』より引用３
西麻布の交差点から外苑西通りを青山に向かい、青山三丁目を右に折れて赤坂に向かい、あちこち曲がった末に四谷に出た。  
```

# 試行結果
## （１）GPT-3
**質問文：小説の一節＋「職務経歴書にありますように・・・」**
```:生成結果「職務経歴書にありますように・・・」
職務経歴書にありますように、私は約二年間、米国の大学で教鞭をとった。その間に、私は数十人の若い学生たちに、英語を教えてきた。その中には、私が最も気に入った学生がいた。彼女は私が教えていた英語の授業を、とても真剣に受け止めていた。そして、私が英語を教えていたときに、彼女は私が英語を教えているときに、そして私が英語を教えていないときにも、私にいつも懇切丁寧に接してくれた。私は彼女をとても気に入っていた。そして、彼女は私をとても気に入っていた。それは私が彼女に英語を教えているときだけではなく、私が英語を教えていないときでも、・・・
```

約2年半前に試行したGPT-3ですが、当時はものすごく強い衝撃をうけました。
初めて「**日本語**」が生成されたためです。それ以前は単語の並びや表現など、読むに堪えない文章が生成されていましたが、このGPT-3では「**普通の日本語**」が生成されたのです。しかも、小説の一節を与えることで、村上春樹氏のような小説が生成されました。

| 評価観点 | 点数 | 
| --- | -----------: | 
| 日本語 | 60点 |
| 村上春樹らしい表現 | 60点 |
| 初めての衝撃 | 100点 |
| 面接合格率 | 10% |

小説風の内容は良かったのですが、面接は突破できないでしょう。



## （２）GPT-3.5
質問文は以下の通りです。
![ベースとなる質問文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/088c66c1-8e0f-d794-e198-e0fa43535cb4.png)

回答は「３．職務経歴書にありますように」のみ掲載します。
##### 生成結果：
![スクリーンショット 2023-03-26 073644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/f1dba3f7-90a4-572e-1e2d-832486d2ba19.png)

GPT-3.5は、ChatGPTにて現役で使われているモデルです。（2023/9/30現在）
皆さんもご存じの通り、汎用モデルとして非常に優秀で使い勝手も良く、大抵のことは答えてくれます。

この試行でも黄色のマーカーをつけた箇所で「**～のように**」と比喩表現を使い、村上春樹っぽさが出ています。また、面接としては、断定系なのが、たまにきずですが、「**失敗と成功を繰り返しながら、経験を積み重ねてきた**」「**強い信頼関係**」など前向きな表現が多く使われており、面接としても優秀な回答と言えるでしょう。

| 評価観点 | 点数 | 
| --- | -----------: | 
| 日本語 | 90点 |
| 村上春樹らしい表現 | 90点 |
| 世界中への貢献度  | 100点 |
| 面接合格率 | 70% |

既に面接で活用している方もいるでしょうね。自分で考えるより効率よく適切な表現を生成してくれるはずです。
余談ですが、2023/9/25にOpenAから、ChatGPTからの応答を**音声**で行えるようにすると発表されましたので、音声で質問して音声で答えを聞くということが可能になり、まさに面接の練習ができますね。

## （３）GPT-4
##### 生成結果：
![マーカーあり分割３スクリーンショット 2023-03-26 080337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/e228355a-5f95-274d-8c51-7073e196f664.png)

GPT-4では、より強く村上春樹らしい表現となりました。冒頭の掴みで「**現実と夢が交差するような**」とファンタジーさを醸し出して、
次の文で「人々の**心の中に眠る無数の物語を紐解いてきた**」という訳でですから、
<font color="blue">**あなたは一体何者ですか？** </font>と聞かざるを得ません。

さらには「**異なる世界の住人たちと共に**」と完全に行き過ぎた表現を使ってしまい、
さすがに面接官からは<font color="blue">「**ご退室願います**」</font>と言われてしまうでしょう。

| 評価観点 | 点数 | 
| --- | -----------: | 
| 日本語 | 90点 |
| 村上春樹らしい表現 | 95点 |
| ファンタジー | 100点 |
| 面接合格率 | 0% |

表現が豊か過ぎて面接では使えませんね。


## （４）open-calm-7b（CyberAgent）
**質問文：「面接で質問された時、村上春樹の小説風に回答するならば、『私は職務経歴書に記載している通り、」**
```:生成結果「私は職務経歴書に記載している通り、・・・」
面接で質問された時、村上春樹の小説風に回答するならば、「私は職務経歴書に記載している通り、コンピュータプログラマーです。そしてプログラミングは好きです。」となるのだが、しかしそう答えるのはあまりにも野暮というものだろう。そこで僕はこう答えた。「プログラマーは非常に楽しい仕事だと思います。僕自身プログラマーを職業としていることを誇りに思いますし、自分の技術と情熱を仕事に費やせることは本当に幸せなことだと思っています」と。
「おー、そうだね。君はすごいよ。君みたいな人は見たことがない。素晴らしいと思う。だけどなぁ、それは君が特別だからなんだよねぇ? 本当はみんなそう思っているんだけどねぇ。なかなかそれを言っちゃいけないんだよねぇ......」という感じで、どうやら彼は完全に納得した様子ではなかったので、とりあえずその日は退室した。次の日、彼からメールが届いた。そこにはこんなことが書いてあった。***さん、おはようございます。メールを頂き
```

何度か試行しましたが、村上春樹っぽさが少し出る時と、全くでないときがあり、差が大きいです。
4回中1回だけ村上春樹らしさが出たので、その結果を掲載しています。
何となく「**しかしそう答えるのはあまりにも野暮というものだろう。**」くらいでしょうか。
しかし、続きが読みたくなる文章ですね。


さすが、企業が開発したモデルだけあって「**\*\*\*さん、おはようございます**」のように**個人名が伏字になり、生成されないような工夫**をしていますね。他にも以下のように伏字で「○○○○○」と生成されることが度々ありました。そのまま流用できないもどかしさはありますが、重要な観点ですね。これは予想外でした。

```:その他の生成例
「私は職務経歴書に記載している通り、○○○○○という仕事をしており、そこで、××××という能力を発揮してきました。そこで、御社における、××××という業務に生かしていきたいと考えております」
```
| 評価観点 | 点数 | 
| --- | -----------: | 
| 日本語 | 70点 |
| 村上春樹らしい表現 | 20点 |
| 個人情報保護 | 100点 |
| 面接合格率 | 3% |

## （５）weblab-10b-instruction-sft（松尾研究室）
**質問文：「面接で質問された時、村上春樹の小説風に回答するならば、『私は職務経歴書に記載している通り、」**
```:生成結果「私は職務経歴書に記載している通り、・・・」
面接で質問された時、村上春樹の小説風に回答するならば、「私は職務経歴書に記載している通り、自分のキャリアの全てを通じて、私のスキルを生かして、私が誠実に仕事をしたことを証明できるように努力してきました。私は、自分の能力と資格を十分に発揮して、私の仕事の目標を達成しようとする意欲を持っています。私は、他の人のために働くことに情熱を持っていて、私の仕事に誇りを持っています。私は、私の仕事の目標を
```

こちらも何回か試しましたが、村上春樹らしい表現というのはほとんどありませんでした。
一方、面接に関しては、可もなく不可もなくというレベルではありますが、回答できています。ネタとしては面白みはないですが、国産モデルの中で最もスコアが高いのは、そのような部分なのかもしれません。

何となくですが、JGLUEのスコアを高くするよう学習されており、日本語としてはそこまで読みやすい文章とは思えませんでした。

| 評価観点 | 点数 | 
| --- | -----------: | 
| 日本語 | 65点 |
| 村上春樹らしい表現 | 0点 |
| JGLUE対応 | 100点 |
| 面接合格率 | 50% |

※GPT-4にopen-calmとweblabの生成文を採点してもらったところ、open-calmが85点、weblabが70点でした。weblabは後半に「私は」「私の」を多用している点が減点理由のようです。


# 非機能面の評価
今回、私が試行した環境は以下の通りです。

| 項目 | 内容 | 
| --- | -----------: | 
| システムメモリ | 29GB |
| GPUメモリ | 4GB |

公開されているモデル選定にあたって、画像生成で有名な**Stable Diffusion**を生み出したStability AI の日本企業である**Stability AI Japan**のモデルを試行したかったのですが、ダウンロード後の読み込みで**メモリ不足**でエラーとなり、使えませんでした。

使い勝手として重要なのは、**少ないメモリ環境でも動かせる**という点です。
ChatGPTのように企業側のサーバで稼働しているのであれば、気にする必要はないですが、
個人で使用する際や、会社でコスト面に制約がある場合は、メモリサイズが肝要になってきます。

また、**短い時間で文章が生成される**という点も重要です。
メモリサイズが大きいと短時間で生成される傾向はあるとは思いますが、今回、同じメモリサイズでもモデルによって応答時間に差がありましたので、モデルのファイルサイズや仕組みの違いで性能に差が出たと考えています。

下表に2つのモデルの生成時の使用メモリと生成時間を示します。
※生成時のパラメタによって若干変動はありますので、目安ととらえてください。

| モデル | モデルファイルサイズ | 生成文字数 |生成時の使用メモリ | 生成時間 | 
| --- | -----------: | -----------: | -----------: | -----------: | 
| open-calm-7b | 13GB | 400文字前後 | 33GB | 4～9分 |
| weblab-10b-instruction-sft | 20GB | 200文字 | 33GB | 15分程度 |

### メモリに関する評価
open-calm-7b、weblab-10b-instruction-sft どちらとも、試行環境のメモリを全て使い切って文章を生成しました。そして、weblab-10bの方は、生成文字数(トークン数)を増やすと、メモリ不足でエラーになりました。つまり、**weblab-10bでは、200文字を生成するのにメモリ33GBが必要**ということです。

結構厳しいですよね。どうしてもChatGPTと比較してしまいますが、ChatGPTは4096文字を生成できますので、200文字しか生成できないとなると、文章作成で利用しにくいですし、使い勝手が悪くなってしまいます。


### 生成時間に関する評価

open-calm-7bは4～9分、weblab-10b-instruction-sftは15分かかってしまいます。これだけ時間がかかってしまうと、すぐに調べ物をしたい時など困ってしまいます。
ChatGPTは高性能のサーバを使用しているためか即座に回答が返ってきます。
私の貧弱な環境で勝負など出来るはずはないですが、どちらが実用的かと聞かれたら、やはりChatGPTに軍配が上がるでしょう。

### 評価まとめ

現時点で、実用性という点では、やはりChatGPTが優れているというのが結論です。

| モデル | メモリ | 生成時間 | 
| --- | :-----: |  :-----: | 
| GPT-3.5 | - | ○ |
| GPT-4 | - | ○ |
| open-calm-7b | △ | × |
| weblab-10b | × | × |



# 参考（ファインチューニング）
今回は、基本はファインチューニングはせずにそのまま利用していますが、GPT-3とopen-calmについてはファインチューニングもしてみましたので、参考程度に紹介させていただきます。

ファインチューニングというのは、ベースとなるモデルに対して、自分で特に学習したい情報を再学習させる仕組みです。これにより、利用者のニーズに応じた、応答を得ることが可能になります。

私は、村上春樹の小説を一部（約1万字）を学習させてみました。

### 結果
#### （１）GPT-3(davinci)
**質問文：「職務経歴書にありますように」の続きを考えて。**

```kekka:GPT-3生成文
まず個人情報はだいたいおさえているだろうから、私はこの日のあいだに考えた。
考えていくうちに、何か欠けていることがあることに気がついた。
が、
とりあえずついてはいけると思った。
私は「ありがとうございました」と言ってドアを開け、事務所を出た。
3.
歩いて古本市場に行く途中、妻と息子のイラストがあるポスターを見つけた。
「行かない？ というか、連れてきてもいいよ」は言えなかったのだ。
世間一般の人とは話がそもそも全然違うし、能力もまだ皆無だった。
つい最近まで、イラストの仕事が全くなかったのだ。
簡単にできるとは言えない仕事だったに違いない。
ただ、やらせてほしかった。
親も家族も全くいないので、ともかくただ、人を近づけるというのが欲しかった。
最初はオドオドしていたであろう妻も、息子も慣れたあとは、一緒になれる可能性は十分あったはずだったのだ。
そんなことを考えながら、別れたあとあまりにも早く、自分の目の前を通る他の車や人の腰が見えていくのを眺めていた。
いつまで眺めていたのだろう?
全然分からなかった。
でも、眺めていたように思えた。
```

ところどころに村上春樹氏の表現が出現しています。「**～考えた。**」「**気がついた。**」と断定系なのは学習データがそうなっていたためでしょう。

また、後半には「**いつまで眺めていただろう？**」と自問自答するようすは、まさに小説に出てきそうな表現です。学習した小説がそのまま生成されるわけではなく、表現だけを再現できている感じがしますので、割とうまくできました。

一方、面接という目的を質問文に含めなかったため、面接のような回答ではありませんが、「**個人情報**」「**私は『ありがとうございました』と言ってドアを開け、事務所を出た。**」あたりを見る限り、面接を受けた後の自分の感想を述べているような感じですね。

ただ、中盤にある「**能力もまだ皆無だった。**」「**つい最近まで、イラストの仕事が全くなかったのだ。**」というのは、さすがに面接では言えないですね。


#### （２）open-calm
**質問文：「職務経歴書にありますように、」**
```kekka:open-calm生成
務経歴書にありますように、職務経歴書は、就職活動や転職活動において、履歴書や職務経歴書をまとめる際に、履歴書と職務経歴書の間に、必ず書き込むものです。
そのため、職務経歴書には、転職活動における重要なポイントを記載することが大切です。
今回は、職務経歴書の書き方についてご説明いたします。
職務経歴書は、転職活動においては必須の書式です。採用担当者がよく使うため、職務経歴書にも必要不可欠な書類となっています。
しかし、職務経歴書に求められるのは、次の3点です。
1. 職務経歴の概要(職務経歴書の記載事項)2. 職務経歴の内容3. 職務経歴の内容を反映した職務経歴書
転職活動では、転職希望企業の採用担当者に、職務経歴書を確認してもらい、職務経歴書の内容を確認してもらうことが、転職活動を成功させる近道となります。
また、職務経歴書には、転職先との面接や入社後の人事評価を行う際の重要ポイントも記載しなければなりません。
職務経歴書には、転職活動において重要なポイントが記載されているため、職務経歴書に求められていることがしっかりと伝わる職務経歴書を作成しましょう。
```

open-calmは7bは大きすぎてメモリ不足のためファインチューニングできなかったため、スモールサイズのopen-calm-smallモデルを使用しました。

こちらも、私が面接という目的を伝えていなかったため、モデルにお任せとなりましたが、職務経歴書に**記載するポイント**を教えてくれています。しかし、パッと見て「**職務経歴書**」という単語ばかりが目立ち、あまり意味のない内容が生成されています。

また、村上春樹らしい表現が全くなく、ファインチューニングという点では失敗しているようです。
学習時のloss関数が減少しなかったので、モデルに対して学習データが少な過ぎるのかもしれません。

ChatGPTによると370万～750万文字が必要との事だったので、全然足りないです。
それでも、GPT-3は村上春樹らしい表現を学習できているので、やはり、根本的に何か違う気がします。

### 評価
入力内容が異なるため、評価が難しいですが、期待したファインチューニングの効果としては、質問文に「村上春樹」という単語を含めなくても、生成文の中に村上春樹らしい表現が含まれるという点です。その意味で、GPT-3の結果は再学習に成功しています。




# 感想
今、日本のAI界で中心的な役割を担っている東大の松尾教授は、シンポジウム等で日本企業は**独自モデル**を作るべきと発言されており、現時点で世界とは差がある状況だが、海外が作ったものを利用するのではなく、日本で一からモデルを作成して、技術力を強化するべきだ、というようなことを述べられています。

楽してはいけないという事ですね。今回は実用面でChatGPTが勝っていましたが、国産モデルはさらなる精度改善をめざして欲しいと思っています。

ChatGPTのような高性能な**汎用モデル**を作れるなら、それが一番需要があるとは思いますが、
実際に仕事等で使われるのは、ファインチューニングした**特化型モデル**だと思いますので、ファインチューニングしやすい**程よいサイズの事前学習済みモデル**が求められるのではないかと思います。

日本の大手企業では、富士通が富岳を携えて開発を進めているようですし、NTTグループもようやく重い腰をあげ、再編やらで動き出しているような気配があります。組織力で世界の牙城を崩して欲しいものです。

※<ins>なお、日本語生成モデル 選手権の第２回は現時点で予定されていません。</ins>

以上、最後までお読みいただき、ありがとうございました。
良かったら評価いただけると嬉しいです。

# 参考
### JGLUEスコア
[公式サイト](https://github.com/yahoojapan/JGLUE)は形骸化されており、更新されていないため、松尾研究室のリンクです。
松尾研究室のモデルが最も精度が高いです。
https://www.t.u-tokyo.ac.jp/press/pr2023-08-18-001

### 各社モデル発表サイト
オルツ
https://alt.ai/news/news-1892/

ABEJA
https://www.abejainc.com/news/20230316/1

CyberAgent
https://www.cyberagent.co.jp/news/detail/id=28817
※記事では2023/5/17公開となっていますが、他のニュース記事等を見ると5/16に公開となっていました。（https://www.itmedia.co.jp/news/articles/2305/17/news117.html）

rinna
https://rinna.co.jp/news/2023/05/20230507.html

NICT(国立研究開発法人情報通信研究機構)
https://www.nict.go.jp/press/2023/07/04-1.html

NEC
https://jpn.nec.com/press/202307/20230706_02.html

富士通
https://www.fujitsu.com/jp/microsite/fujitsutransformationnews/2023-07-20/01/
（開発中の記事）

Stability AI
https://ja.stability.ai/blog/japanese-stablelm-alpha

LINE
https://engineering.linecorp.com/ja/blog/3.6-billion-parameter-japanese-language-model

東京大学松尾研究室
https://www.t.u-tokyo.ac.jp/press/pr2023-08-18-001

OpenAIトークン数の計算
https://platform.openai.com/tokenizer

### 私の過去の投稿記事
GPT-3の過去の投稿記事は[こちら](https://qiita.com/artisanbaggio/items/0a15f3e2b20b0708c4ab)

GPT-3.5とGPT-4の過去の投稿記事は[こちら](https://qiita.com/artisanbaggio/items/8eab17923369d8ff6e06)

# 補足１
hugging faceにあるサンプルコードは、基本はGPUメモリを使用するコードになっています。
システムメモリとGPUメモリの両方を使用するには以下のようにモデル読み込み時に「**device_map="auto"**」を指定する必要があります。

```:GPUメモリとシステムメモリを両方使う設定
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.float16,device_map="auto")
```

# 補足２
大規模言語モデルを使用するにあたって、**メモリ不足との戦いは避けて通れません**。
一般的に、メモリ節約の方法はいくつかあり、多くの方がやっているのが**量子化**(**quantization**)という仕組みでしょう。ある論文では通常32bitを8bitにしても精度の低下は最小限に食い止められると公開されました。8bit以下だと、精度は大きく落ちるということです。
他にも、**蒸留**(**distillation**)や**枝刈り**(**pruning**)という仕組みもあります。

蒸留を利用するにしても元のモデルを読み込ませるため、十分なメモリが必要です。メモリ不足の場合には、量子化や枝刈りかなと思っています。それぞれメリット、デメリットありますので、ご確認の上、ご使用ください。