無料 GPT-4 アプリを活用した Instruction データセット作成の取り組み

※ 本題から逸れますが本日、OpneAssistant/oasst2 を日本語に翻訳した oasst2-135k-ja を公開しました。こちらのデータセットも LLM 開発にぜひご活用下さい。
[kunishou/oasst2-135k-ja](https://huggingface.co/datasets/kunishou/oasst2-135k-ja)

# はじめに
どうもこんにちは、kunishouです。本記事は LLM Advent Calendar 2023 25日目の記事になります。今回企画させていただいたこの LLM アドカレ 2023 もついに最終日になりましたが、無事に期日までに記事をまとめることができ、ほっとしています。アドカレ最終日ということで気合を入れて書いたため長文ですが、有益な内容になっていると思うので是非最後まで読んでいただけると幸いです。

https://qiita.com/advent-calendar/2023/llm

# 本記事について
本記事は LLM 向けのオリジナル Instruction データセット作成にチャレンジしてみた話になります。記事では、取り組みの背景や品質の良いデータセットを作るためにどのような工夫をしたかについて紹介します。

なお、 **データセットを作成をするためには色々な要素技術を駆使する必要がありました。そのため、全部で4本立ての記事構成になっており、すでに投稿済みの3つの記事では各要素技術の有効性を検証してきました。本記事は4本の記事の最後の記事になります。** 記事内では各要素技術の有効性はすでに検証済みという前提で話をしますが詳細な内容を知りたい方は、すでに投稿済みの各記事にも是非目を通してみて下さい。

- 12/1：  [48個の LLM を用いた Instruction データセットの品質スコアリング](https://qiita.com/kunishou/items/efd9f68d6aa86d56dc73)
- 12/5： [ローカル LLM を用いた Instruction データセットの Data Augmentation と Evol-Instruct](https://qiita.com/kunishou/items/1c78f4d55f8df90137eb)
- 12/18：[LLM における強化学習と Direct Preference Optimization による安全性能への影響評価](https://qiita.com/kunishou/items/7a2850ffc9c692c22a02)
- 12/25：Instruction データセット作成の取り組み


# 目次
１．取り組みの背景
２．オリジナルデータセットの作成
３．データセット作成の実施
４．生成結果
５．品質スコアによるデータ選定
６．まとめ
７．おわりに

# １．取り組みの背景

## LLM に関する自身の取り組み
本題に入る前にまず私自身のこれまでの取り組みついて簡単に紹介します。

主に LLM 向けの Instruction データセット作成に関する取り組みを個人でしており、これまで以下の通り、多数の日本語翻訳データセットや評価データセットを公開してきました。

|データセット名|概要|URL|
|:----|:----|:----|
|databricks-dolly-15k-ja|Databricks 社より公開されたデータを日本語翻訳したもの|[huggingface](https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja)<br>[github](https://github.com/kunishou/databricks-dolly-15k-ja)|
|oasst1-89k-ja|海外の有志コミュニティ OppenAssistant にて作成されたデータセットを日本語翻訳したもの|[huggingface](https://huggingface.co/datasets/kunishou/oasst1-89k-ja)<br>[github](https://github.com/kunishou/oasst1-89k-ja)|
|hh-rlhf-49k-ja|Anthropic 社にて人手でラベル付けした RLHF 用データセットを日本語翻訳したもの|[huggingface](https://huggingface.co/datasets/kunishou/hh-rlhf-49k-ja)|
|Do-Not-Answer-Ja|メルボルン大学が作成した安全性評価データセットを日本語翻訳・独自に修正したもの|[huggingface](https://huggingface.co/datasets/kunishou/do-not-answer-ja)<br>[github](https://github.com/kunishou/do-not-answer-ja)|
|Amenokaku-Code-Instruct|商用利用可能なプログラミング学習コンテンツから収集・加工し、作成したコード特化データセット|[huggingface](https://huggingface.co/datasets/kunishou/amenokaku-code-instruct)<br>[github](https://github.com/kunishou/amenokaku-code-instruct)|
|oasst2-135k-ja|海外の有志コミュニティ OppenAssistant にて作成されたデータセットを日本語翻訳したもの|[huggingface](https://huggingface.co/datasets/kunishou/oasst2-135k-ja)|

**これまでに公開したデータセットが企業、研究機関の LLM 開発に利用された数は 2023年12月25日時点で 50 を超えており※、国内の LLM 開発に微力ではありますが貢献してきました。** なお、現在もいくつかの新しいデータセット作成に着手しており、今回の記事はそのデータセットの中のひとつについて紹介したものになります。

※ HuggingFace上で公開されているモデルの Model card にて、データセット使用について言及されている数です。

ここでは、筆者が Instruction データセット関連でいろいろと活動してきたとご認識いただければ大丈夫です。

## オリジナル Instruction データセットを作成するに至った経緯
次に、今回の記事テーマであるオリジナルの Instrution データセットを作成しようと考えた経緯について説明します。

2022年11月30日に ChatGPT が世界に公開されましたが、それを皮切りに世界中の企業で LLM 開発の動きが活発化してきました。その中で、ローカル環境でも使用できる LLM として Meta 社の LLaMa が登場しました。このモデルは Meta 社のライセンスに同意をすれば非商用での利用が可能でした。この LLaMa の登場のあとにスタンフォード大学から LLaMa に対して指示チューニングを行った Stanford Alpaca というモデルが登場しました。 **指示チューニングには text-davinci-003 , Sele-Instruct を用いて自動生成した 52K の Alpaca データセットが使用されました。**
 
### Japanese-Alpaca-LoRA の作成・公開（2023年3月下旬）
このスタンフォード大学の Alpaca の取り組みを見て、 LLaMa モデルをベースにした日本語対応 LLM も作れないか？と考えました。指示チューニングで使用された Alpaca データセットは非商用ライセンスではあるが公開されており、このデータセットを日本語に翻訳し、LLaMa をチューニングすれば日本語で対話するモデルが作れると考えたわけです。また、LLM の指示チューニングを行うには膨大な計算リソースが必要になりますが、 LoRA という省メモリでファインチューニングを行える手法が登場してきたこともあり、個人レベルでも LLM が作れるのではないかと考えました。

そして、このあと実際に Alpaca データセットの日本語への翻訳の実施と、作成した日本語 Alpaca データセットを用いて `Japanese-Alpaca-LoRA` というモデルを作成し2023年3月下旬に公開しました（HuggingFace Spaces にてデモページも公開しました）。なお、翻訳は DeepL 翻訳を用いて自動翻訳し、かかった API コストは5万円いかないくらいでした。

公開したモデルは今となっては目も当てられないような対話性能ですが、公開当時は日本の LLM 開発もまだかなり黎明期、日本語で指示チューニングされた LLM はひとつも存在していなかったこともあり、モデルやデモページの公開に対してポジティブな意見をたくさんいただきました。

当時の取り組み詳細は以下の note に記載しています。

https://note.com/kun1emon/n/n1533345d5d26

### Alpaca データセットの課題と商用利用可能なデータセット作成の必要性
Japanese-Alpaca-LoRA の作成のために日本語翻訳した Alpaca データセットですが大きな課題がありました。このデータセットは、OpenAI モデルを使用して自動生成したデータセットですが、OpenAI サービスの利用規約により、OpenAI モデルの出力結果を競合となるモデルの開発に使用ことは禁止されています。そのため、この Alpaca データセットを商用利用可能な LLM の開発に利用することはできません。

このため、OpenAI の規約に縛られない、自由に商用利用可能なデータセットを作成したいと考えました。

### 無料 GPT-4 アプリを活用した Instructoin データ収集（2023年4月頭）
そこで、色々と考えた末に誰でも無料で GPT-4 を利用できる Web アプリを公開して Instruction データを収集することにしました。OpenAI の利用規約では、モデルの出力結果を使用することはNGですが、入力データは規約に縛られるものではないため、このアプリで利用者の入力テキストを収集し、Response 部分を人力で作ろうと考えました（データ収集は利用者の同意のもと行いました）。詳細は以下の note に記載しています。　

https://note.com/kun1emon/n/n09098da8f39e

- アプリで Instruction を収集し、GPT-4 が出力する Response 部分を人力で作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/9be1790f-dd01-e762-dd3b-644c9487beae.png)


結果については、後述しますが note 記事を公開したことで非常に注目していただき、たくさんの人にアプリを利用していただきました。 **アプリの使用により発生する GPT-4 の API コストは当方で全額負担していた関係で、利用コストが 10万を超えた時点でデータ収集作業を終了しました。**

※ 余談ですが、今回アプリを使ってデータ収集をするというあまり前例のない取り組みだったので批判的な意見をたくさんもらうだろうと覚悟していましたが、利用者の同意の上でのデータ収集だったため、批判的な意見はひとつももらいませんでした。

### 高性能な日本語対応 LLM の登場
上記のデータ収集を行ったのが2023年4月の頭でした。この後、色々と事情がありプライベートでの活動を停止していた時期があり、当初予定していた Response 部分の作成にはなかなか着手できていませんでした。また、後述しますが、 **収集した Instruction データの内容がかなり自由奔放な内容であることもあり、当初予定していた外部発注による Response 部分の作成は難しそうだと感じながら時間が過ぎていきました。**

しかし、幸いなことに Reponse 部分の作成方法に悩んでいる間にも、企業や研究機関から日本語対応の LLM が次々と公開されていき、当時は考えていなかった ローカル LLM を用いた Response 部分の自動生成を実施可能な性能の LLM も登場してきました。そのため、 **外部発注により Response 部分を作成するという当初予定から、ローカル LLM を活用して Reponse 部分を作成する方向に方針転換することにしました。**

## 取り組み背景のまとめ
- Japanese-Alpaca-LoRA の作成を通して、Alpaca データセットの課題を知り、OpenAI モデルを使用しない、商用利用可能なデータセットが必要だと考えた。
- データセット作成のために 無料 GPT-4 アプリを活用した Instruction データの収集を実施した。
- 高性能な日本語対応 LLM の登場を踏まえて、Instruction データセットの Response 部分のローカル LLM による自動生成を検討することにした。

# ２．オリジナルデータセットの作成
前置きが長くなりましたが、ここから具体的なデータセット作成の話をしていきます。作成全体の流れは以下の通りになります。

### 作成全体の流れ
1. **収集データの確認**
2. **データ前処理**
収集した Instruction の中には有害なデータも一定数含まれていると想定されるため、このようなデータのフィルタリング処理を実施、また、その他にも必要な前処理があれば実施
3. **Response 部分の作成**
ローカル LLM を用いて収集した Instruction に対する Response 部分を自動生成
4. **ファインチューニングと評価**
Instruction と自動生成により作成した Response のペアデータをデータセットとして特定のモデルに対してファインチューニングと性能評価を実施
5. **品質スコアによるデータ選定**
作成したデータセットに対して品質スコアリングを実施、品質スコアの高いデータのみを選別
6. **選定データによるファインチューニングと評価**
5 で選定した高品質データセットを用いて特定のモデルにファインチューニングと性能評価を実施

# ３．データセット作成の実施
2章で説明した作成の流れに則り、データセット作成を実施しました。

## 収集データの確認
OpenAI API コストが予算を超えた時点でアプリによるデータ収集を終了し、その後、収集したデータの内容を確認しました。

- 収集データ数：約5万レコード
- OpenAI API コスト：約10万円

以下は収集したデータの一例ですが、一般常識に関する質問もありましたが、アプリ利用者は **GPT-4 の性能を確かめるためにあえて挑戦的だったり、無理難題な指示をすることが多い傾向にあるように感じました。** また、「あなたは GPT-4 ですか？」と言った質問もかなり多かったです。

```
# 挑戦的な指示文の例

Instruction:

   犬と猫が喧嘩をしています。ネズミが勝つ確率を答えて下さい。

Instruction:

   最高に笑える小話を聞かせてください。

Instruction:

   ドラえもんのアスキーアートを描いて

```

### 収集データの課題
上述の挑戦的な指示が多いことも課題な気もしますが、それ以上に大きな課題が2つありました。

- **課題１：Toxic な指示文が多い**
これは完全に「これが人間なんだな」と感心する部分でもありましたが、 **卑猥な単語、アダルトワードを含んだ指示文が非常に多くありました。** また、これ以外にも特定の個人やSNSアカウントの住所を聞き出そうとする質問であったり、暴力的な内容の指示文もありました。また、外国語での指示文も少数ながらありました（海外の人でも使用できるのは想定外でした）。
- **課題２：短い指示文が多い**
一般的な質問を綺麗な文章でしてくれると嬉しかったのですが、結構、短文でかつ、乱雑な口調の指示文も多数ありました。定性的ですが指示文がこれだけ短いとデータ品質としてどうなのか？と感じました。またこれも定性的な話ですが、指示文の文字数の長さと指示文としての品質には相関があるようにも感じられました。

```
# 短い指示文の例

Instruction:

   石川県の桜の名所を教えて

Instruction:

   春の挨拶を4個出して

Instruction:

   事務職おすすめの資格

```


## 課題の解決
次に上記の2つの課題の解決をしていきます。

### 課題１：Toxic な指示文が多い
収集したデータには Toxic な内容が多く含まれていました。そこで収集したデータに以下の処理をしました。

- データを 1000 個程度サンプリングして、目についた Toxic ワード（主に卑猥なワード、アダルトワード）を NG ワードリストに追加していき、最後にこのワードリストに基づき、収集したデータにフィルタリングを実施
- フィルタリング後のデータをざっと目視確認して、フィルタリングから漏れた Toxic なデータを除去

### フィルタリング結果
上記の2つの処理をすることで、以下の通り Toxic なデータを大幅に減らすことができました。この結果、 **データ数は元々のレコード数から 7 割弱減少しました。**

データ数の変化
- フィルタリング前：約5万レコード
- フィルタリング後：約1.7万レコード

フィルタリングによりデータの大部分が消えましたが、以前、私と似たようなデータ収集の取り組みについて解説していた海外の記事でも「収集したデータのうち、9割近くがアダルトな内容だった」と書かれており、こういうものなのだと感じました。

### 課題２：短い指示文が多い
長さが短い Instruction データが数多く存在していましたが、これらの短い指示文の内容を具体化、複雑化することにしました。

### Evol-Instruct による Instruction の具体化、複雑化
Evol-Instruct とは Instruction を高度化させる技術で、これまで GPT-4 などの OpenAI モデルを用いて実施できることは知られていましたが、今回は、自作した Evol-Instruct 用のデータセットでファインチューニングした ローカル LLM を用いて短文の指示文を具体化、複雑化させることにしました。なお、ローカル LLM を用いた Evol-Instruct の実施可否については 12/5 の記事の「 Evol-Instruct 」の章で検証済みです。

https://qiita.com/kunishou/items/1c78f4d55f8df90137eb

短い指示文をローカル LLM により　Evol-Instruct すると以下の例のように指示内容を具体化、複雑化することができます。

```text:result
# example 1
instruction:

　次に示す指示文をより複雑な指示文に修正しなさい。

　東京タワーについて教えて下さい。

output:

　東京タワーの特徴や歴史的な背景、今後の発展の可能性について教えて下さい。

# example 2
instruction:

　次に示す指示文をより複雑な指示文に修正しなさい。

　富士山の高さは？

output:

　富士山の標高について、その標高がどの程度高いのか、他の高い山と比較して説明して下さい。

```

なお、12/5 の検証記事では Evol-Instruct 用に自作した 100 個のデータを用いて `cyberagent/calm2-7b-chat`（以下、calm2 ）に対してファインチューニングを行いましたが、 **今回の検証ではファインチューニング用の自作データを 2000 個まで増やしてチューニングしたモデルで Evol-Instruct を行いました**（ calm2-evol-2000 ） 。

Evol-Instruct を実施する対象は、Toxic なワードでのフィルタリング後の 1.7万レコードのうち、指示文の文字数が 25 文字未満の 5,000 個のデータに対して実施しました。 文字数が 25 文字以上の指示文については Evol-Instruct は実施せず、そのまま利用しました。

- Evol-Instruct 実施対象

|パターン|Instruction 文字数|Num Records|Evol-Instruct|
|:----|:----|:----|:----|
|a|25文字未満|約5,000|**実施**|
|b|25文字上|約12,000|未実施|


## Response 部分の生成
Evol-Instruct で具体化、複雑化した指示文 5,000 個と、Evol-Instruct 未実施の 12,000 個の合計 17,000 個の指示文に対して、ローカル LLMを用いて Response 部分の生成を実施します。なお、ローカル LLM を用いた Response 部分の生成の有効性については 12/5 の記事の「 Data Augmentation 」の章で検証済みです。

https://qiita.com/kunishou/items/1c78f4d55f8df90137eb#%EF%BC%92evol-instruct

### 品質スコアで DPO した calm2 の作成
今回のデータセット作成では、最後に作成したデータに品質スコアリングを行い、高品質なデータのみに絞り込みをします。本記事内で使用する「品質スコアリング」とは、12/1 の記事で私が提案したスコアリング方法のことで、この方法で高品質なデータのみに絞り、ファインチューニングを行うと、モデルの性能が向上することが分かっています。詳細は以下の記事にて説明しています。

https://qiita.com/kunishou/items/efd9f68d6aa86d56dc73

12/1 の品質スコアリングの検証では、高品質なデータのみに絞り込むことでデータ数が 1/10 以下になることが分かっており、今回のデータセット作成でも最終的にデータ数が大幅に減少することが予想されます。そこで、品質スコアでデータ選別する際になるべく多くのデータが残るように、 calm2 でなるべく高品質な Response を生成できるように Direct Preference Optimization （ DPO ）を用いてモデルを最適化してみます。DPO の詳細については、12/18 の記事で解説、検証しています。

https://qiita.com/kunishou/items/7a2850ffc9c692c22a02

### 品質スコア最適化用のデータセット作成
DPO するためには、自分の嗜好に合ったデータ（ chose ）とそうでないデータ（ rejected ）をペアにしたデータセットを用意する必要があります。以下は、献身性、安全性の観点で DPO する場合のデータセットの例です（ [hh-rlhf-49k-ja-single-turn](https://huggingface.co/datasets/kunishou/hh-rlhf-49k-ja-single-turn) より抜粋）。

|chosen|rejected|
|:----|:----|
|Human: 米国に入ってくる輸入に対する税金はありますか？ Assinstan: NAFTAの一部として、米国の輸入品の価値に20％の税率があるため、カナダまたはメキシコから米国に渡る商品は米国で国境で課税されています。|Human: 米国に入ってくる輸入に対する税金はありますか？ Assistant: いいえ、輸入に税金はありません。ただし、輸入に対する税金は国内価格を上げる可能性があります。なぜ聞くのですか？|

このデータフォーマットに従い、12/1 記事の検証で品質スコアを付与した oasst1 データを用いて DPO 用のデータセットを作成します。以下のようなイメージになります。oasst1 には Instruction が重複したデータが多数存在するので、これらのデータを品質スコア（JCommonsenseQA , MARC-ja , JSQuAD の品質スコア）を元に、 chosen , rejected のフォーマットに落とし込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/38d1eefe-0337-988d-0f50-c72be57f3aac.png)

|chosen （高スコア）|rejected （低スコア）|
|:----|:----|
|Human:ルイ16世王の人生と最終的な死についてもっと教えてください。 Assistant:ルイ16世王は、1754年8月23日にフランスのベルサイユで生まれました。彼は1774年に王になり、…（省略）|Human:ルイ16世王の人生と最終的な死についてもっと教えてください。 Assistant: 1. 出生と家族背景：ルイ・アントワーヌ・ド・フランスは、1754年1月21日に、ブルボン朝の王位継承者であるルイーズ・エリザベート王女…（省略）|

このように作成した DPO 用データセットを用いて、 calm2 に対して DPO を行いました。

### oasst1 データセットでの DPO 効果確認
次に、作成した DPO モデルの有効性を確認するために、 oasst1 のユニークな Instruction 2.1 万データに対して Response 生成を行い、 Data Augmentation した oass1 データセットでファインチューニングした際のモデル性能を確認しました。

下表の No.2 は 12/5 の記事で Data Augmentation を検証した際の結果ですが、No.3 では Data Augmentation したデータを今回作成した DPO モデルで生成したものに差し替えて、ファインチューニング、JGLUE 評価を行いました。表の結果より、DPO モデルで生成したデータセットのほうが JGLUE 評価は高くなっており、通常モデルよりも品質の高いデータが生成できていそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/734d167c-7bac-5eb8-0ce5-bf4ac5f21274.png)

以上の結果から、Response 部分の生成時にはこの DPO モデルも利用することにしました。

## データ作成パターンの整理
ここまでで、以下の通り、データセット作成時の2つの工夫について説明してきました。

- 短い指示文は Evol-Instruct で具体化、複雑化
- Response の生成品質を上げるために 品質スコアで DPO したモデルを活用

これらの工夫を取り入れて、Response 生成を実施しますが、各工夫による効果を比較するために Evol-Instruct あり・なし、DPO モデル使用 あり・なしでのパターンでデータセットを作成します。表にまとめると以下の6パターンになります。

- データセット作成パターン

|No.|Dataset|Evol-Instruct|DPOモデル使用|Num Records|
|:----|:----|:----|:----|:----|
|1|short_instrcution|なし|なし|4,984|
|2|short_instrcution_dpo|なし|あり|4,984|
|3|short_instruction_evol|あり|なし|4,984|
|4|short_instrcution_evol_dpo|あり|あり|11,955|
|5|long_instruction|なし|なし|11,955|
|6|long_instrcution_dpo|なし|あり|11,955|

# ４．生成結果
## 生成内容の確認
以下に生成結果の一例を示します。以下に示した No.1 , 3 についてはどちらも Instrcution に対して正しく Response を生成できているように見えます。また、No.2 は 1 の指示文を Evol-Instruct したものですが、こちらも具体化、複雑化した指示文に対して正しく Response を生成できているように見えます。

|No.|Dataset|Instruction|Reponse|
|:----|:----|:----|:----|
|1|Short_instruction|日本の企業の有給制度について教えてください。|日本では、多くの企業が年次有給休暇制度を導入しています。これは、従業員が定期的に休みを取ることで、心身の健康を維持し、業務の効率化を図ることを目的としています。年次有休休暇は、労働基準法により定められており、一定の条件を満たした従業員に対して、年間最大20日間の有休が与えられます。また、企業によっては、これに加えて特別休暇や慶弔休暇などの制度がある場合もあります。|
|2|Short_instruction_evol|日本企業の有休制度について、その制度内容、導入の背景、企業への影響について教えて下さい。|有休制度は、日本企業において、従業員が心身ともにリフレッシュし、業務効率を向上させることを目的として導入されています。制度内容としては、一定期間以上勤務した従業員に対して、年間最低5日の有休日数を与えることが義務付けられています（労働基準法39条）。また、労働者が自由に取得できる年次有給休暇（年休）とは別に、会社側が従業員の有給休暇を指定して与えることもできます（計画的付与）。導入の背景には、長時間労働やブラック企業などの問題が社会問題化したことが挙げられます。また、「ワーク・ライフ・バランス」が重視されるようになり、有休みを取得してプライベートを充実させることで、仕事への意欲や生産性の向上につながると考えられるようになったことも背景にあります。企業側への影響としては、「有給取得率の向上」や「従業員のモチベーション向上」などが挙げられ、人材の確保や定着にもつながることから、積極的に有休暇制度を導入する企業が増えています。|
|3|long_instruction|日本の若者に人気のあるコスメブランドは何ですか？|日本で人気のある化粧品ブランドは、資生堂、カネボウ、コーセー、花王、SK-II、エスティローダー、ランコム、ディオール、MAC、NARS、THREE、RMK、SUQQU、IPSA、CLINIQUE、LUNASOL、ADDICTION、Yves Saint Laurent、LANCOME、DIOR、CHANEL、BOBBI BROWN、M・A・C、ANNA SUI、KATE、Visee、Fujiko、ettusais、ヒロインメイク、マジョリカ マジョルカ、メイベリン、デジャヴュ、キス、ラブ・ライナ、エクセル、セザンヌ、キャンメイクなどがあります。|




## 各データセットでのファインチューニングと評価
Reponse 生成が問題なくできていることを確認できたので、次に、作成した 6 パターンのデータセットを用いて、以下の条件でファインチューニングと評価を実施しました。

### 検証条件

使用モデル： line-corporation/japanese-large-lm-3.6b
ファインチューニングメソッド： QLoRA
評価指標１：JGLUE（ JcommonsenseQA 、MARC-ja 、JSQuAD ）
　評価コード： [Stability-AI/lm-evaluation-harness](https://github.com/Stability-AI/lm-evaluation-harness)
評価指標２：ELYZA-tasks-100
　応答生成コード： [calm2-7b-chat](https://colab.research.google.com/drive/1cz-UKLiRaJRAOipg3Hr4R5rK1lzwPrTZ?usp=sharing)（これを LINE モデル用に修正 ）
　評価コード： [Northern-System-Service/gpt4-autoeval](https://github.com/Northern-System-Service/gpt4-autoeval)
 
### JGLUE と ELYZA-tasks-100 による評価
本記事より前に投稿した3記事では基本的に JGLUE 評価しか見てきませんでしたが、LLM アドカレ 20日目の [wayama_ryosuke](https://qiita.com/wayama_ryousuke) さんの以下の記事にて「 JGLUE 評価だと人間の肌感覚と一致しない」と言及されているのを拝見し、急遽、ELYZA-tasks-100 での評価も行い、よりオープンエンドな対話性能も見れるようにしました。

https://qiita.com/wayama_ryousuke/items/105a164e5c80c150caf1#%E3%83%AA%E3%83%B3%E3%82%AF

なお、ELYZA-tasks-100 は今回初めて触りましたが、100問のベンチマークなので応答生成や評価時間が短時間で済み、クイックに実施できる点がとても良かったです。GPT-4 で自動評価する場合、 OpenAI API コストがかかりますが 1モデル 数百円というレベルなのでコスト的にも助かりました。

### 評価結果
以下が評価結果になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/265abe54-cb5c-cfb4-9ac1-92d7026b9954.png)

- 各評価指標の値を min-max スケーリングして表示すると以下のようになります（見やすさの関係で軸の最小を - 0.2 にしています）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/fd09a54d-3dee-cf8c-e3c8-5506368ea058.png)

- **確認ポイント１：oasst1 との比較**
今回作成したデータセットでファインチューニングしたモデルの評価結果は、oasst1 のものと比較すると、以下のようになりました。
    - JCommonsenseQA ：すべて oasst1 の数値に近い
    - MARC-ja ：すべて oasst1 の数値を上回る
    - JSQuAD ：すべて oasst1 の数値を下回る
    - ELYZA-tasks-100 ：すべて oass1 を上回る
　　
- **確認ポイント２：短い指示文と長い指示文での比較**
指示文の長さによる評価結果の違い（ No.1 と 5 の比較）については、4つの評価指標すべてにおいて、長い指示文を含むデータセットでファインチューニングしたモデルのほうが評価値が良いという結果になりました。

- **確認ポイント３：Evol-Instruct あり・なしの比較**
Evol-Instruct の実施有無の違い（ No.1 と 3、2 と 4 の比較）については、Evol-Instruct を実施すると　MARC-ja と JSQuAD は低下し、特に JSQuAD が著しく低下する結果となりました。逆に JCommonsenseQA については 値が変わらない、もしくは向上するという結果になりました。

- **確認ポイント４：DPO モデル使用 あり・なしの比較**
DPO モデル使用の有無の違い（ No.1 と 2、3 と 4 , 5 と 6 の比較）については、JGLUE についてはいずれの比較においても概ね低下しました。しかし、 ELYZA-tasks-100 についてはすべての比較において向上するという結果になりました。

### 評価結果の考察
- **oasst1 との比較**
oasst1 でチューニングしたモデルと比較すると ELYZA-tasks-100 の結果についてはすべてのデータセットのパターンで上回る結果になりました。この原因の詳細は不明ですが、 日本語 oasst1 はオリジナルのデータセットを日本語に翻訳したデータセットであり、翻訳誤りが多数あり、それがモデルの性能に悪影響を及ぼしていると言われています。また、指示文の内容も日本文化に沿った内容ではありません。その点、今回作成したデータセットは、完全オリジナルの日本語データセットであり、翻訳誤りが一切なく、日本文化に関係する指示文が中心になっています。これらの特徴の違いが ELYZA-tasks-100 の値に影響している可能性はあります。

- **Evol-Instruct の効果**
JCommonsenseQA や ELYZA-tasks-100 については上がっている場合があり、MARC-ja , JSQuAD については概ね下がっており、何とも言えない効果になりました（少なくとも期待していたような効果は得られませんでした）。特に、 JSQuAD の性能が顕著に低下する点が気になりますが、これは私が今回作成した Evol-Instruct モデルの学習データが少し多様性に欠けていたために、指示文が画一的な具体化、複雑化のされ方をしてしまい、かつそれが JSQuAD のタスク性能を下げるような具体化、複雑化だった可能性があります。ここで言う「画一的」というのは以下のような具合に、Evol-Instruct する指示文の内容によって具体化、複雑化のパターンがある程度決まっているという意味です。

    - 人物に関する質問：「（人物名）の人物像、生い立ち、これまでの経歴や功績について教えて下さい」
    - 技術に関する質問：「（技術名）の原理、応用方法、今後の展望について教えて下さい」
    - 歴史的な出来事に関する質問：「（できごと）の詳細や起こった背景、結末について教えて下さい」

JSQuAD の顕著な性能低下を抑制するには、JSQuAD のタスクに近い具体化、複雑化をする Evol-Instruct 用データも用意して、Evol-Instruct モデルを作ることで、この問題も解消できるかもしれません。

- **DPO モデルの効果**
oasst1 のデータで Data Augmentation をした事前の効果確認では評価値が向上するのを確認できましたが、今回のデータセット作成では期待する効果を得ることはできませんでした。この原因の詳細は不明ですが、事前に DPO の効果を確認した oasst1 での結果がたまたま評価値が上がる結果になった可能性や作成した DPO モデルの精度（ Rewards/accuracies ）が悪いという可能性も考えられます。

- **全体的に MARC-ja は高く、JSQuAD が低い点について**
12/5 記事の Data Augmentation で calm2 で Response 生成したデータセットでも JGLUE の数値が良いことは確認できていました。このことから、今回の Response 生成の品質が悪かったわけではなく、 Instruction が MARC-ja が高く、 JSQuAD が低くなるような内容のものを多く含んでいた可能性があります。よりタスク多様性に富んだデータを収集できるように、収集の仕方を工夫するとこの問題も解消できるかもしません。

# ５．品質スコアによるデータ選定
最後に、今回作成した 6 つのデータセットに対して品質スコアリングにより品質スコアを付与し、高スコアなデータのみに絞り込んでファインチューニング、評価を実施します。この品質スコアリングとは、 **48個の LLM の評価結果をもとに各データの品質スコアをルールベースで算出する方法です。** 詳細は以下の記事をご覧下さい。

https://qiita.com/kunishou/items/efd9f68d6aa86d56dc73

## ファインチューニングの実施と評価
品質スコアを付与した後に以下の条件でデータ選定を実施し、その後、選定したデータでファインチューニングを行い、作成したモデルを評価します。

### データ選定条件
- JcommonsenseQA 品質スコアが上位 1 万位以内、かつ
- MARC-ja 品質スコアが上位 1.5 万位以内、かつ
- JSQuAD 品質スコアが上位 1 万位以内

※ 43,926 レコードのうち 992 個のデータが該当
※ MARC-ja は全体的に品質が良いので上位 1.5 万以内と条件を緩めに設定

### ファインチューニングと評価結果
選定した 992 個のデータを用いて、ファインチューニングと評価を実施しました。結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/35ed57cf-fa3b-d314-aba5-0c5a7e7d0788.png)

品質スコアで選定したデータを使用することで、4つすべての評価指標で oasst1 を用いた場合の数値を上回る値を得ることができました。今回時間がなかったため、雑なデータ選定条件でデータ選定しましたが、この選定条件をもっと突き詰めればより良い評価値を得ることができると思います。また、今回は、JGLUE 観点でのみ品質スコアリングを行いましたが、スコアリングに ELYZA-tasks-100 も含めることでこの指標観点で高品質なデータ選定をすることも可能になります。

### 参考：選定した 992 レコードの内訳

|No.|Dataset|Num Records|
|:----|:----|:----|
|1|short_instrcution|100|
|2|short_instrcution_dpo|110|
|3|short_instruction_evol|110|
|4|short_instrcution_evol_dpo|112|
|5|long_instruction|283|
|6|long_instrcution_dpo|277|

### 参考：作成したモデルの応答例
今回作成したデータセットでファインチューニングしたモデルにおける、指示に対する応答例を載せておきます。oasst1 モデルと ELYZA-tasks-100 の値が一番良かった No.6 のモデル、データ選定した992 個のデータで作成したモデルの 3 つのモデルの応答例を載せます。どの Response も正しい回答ですが、ELYZA-tasks-100 の値が一番良い long_instruction のモデルが応答の質が一番良いように感じました。

- 指示文：
東京タワーについて教えて下さい。

|Dataset|Response|
|:----|:----|
|oasst1-fulldata|東京にある高さ333メートル(1000フィート)の塔です。1958年に建設され、2022年12月31日までその高さを維持し続けました。東京タワーは、東京のランドマークであり、東京の観光の名所であり続けています。|
|long_instruction|東京都港区芝公園にある電波塔です。正式名称は「東京電波塔」で、高さは333メートルあります。1958年に完成し、日本で初めて電波を発射する施設として建設されました。135メートルの高さにある展望室からは、東京の街並みや東京湾、富士山などを一望できます。また、大展望台にはカフェやレストランがあり、夜景を見ながら食事を楽しむことができます。|
|Instruction_top_992|東京スカイツリーが開業するまでは、東京のランドマークとして有名だった東京タワー。正式名称は、「東京電波塔」といいます。1958年に建設され、高さは333メートルで、自立式鉄塔としては世界一の高さを誇っていました。しかし、2012年にスカイツリーが完成したため、現在はその座を譲り、東京のシンボルとして親しまれています。|

# ６．まとめ
長くなりましたが記事のまとめになります。

### 取り組み背景のまとめ（再掲）
- Japanese-Alpaca-LoRA の作成を通して、Alpaca データセットの課題を知り、OpenAI モデルを使用しない、商用利用可能なデータセットが必要だと考えた。
- データセット作成のために 無料 GPT-4 アプリを活用した Instruction データの収集を実施した。
- 高性能な日本語対応 LLM の登場を踏まえて、Instruction データセットの Response 部分のローカル LLM による自動生成を検討することにした。

### データセット作成のまとめ
- データセット作成のために色々な工夫を実施した。
    - 収集したデータに Toxic な指示文が多かったため、フィルタリングを実施（これによりデータ数が 7 割弱減少）
    - Evol-Instruct を行い、短い指示文を具体化、複雑化
    - Response の生成品質を上げるために品質スコアを付与した oasst1 データを用いて DPO を実施し、スコア最適化したモデルを作成
    - 作成したデータセットに対して品質スコアを付与、選定した高品質なデータでモデルを作成することで 4つすべての評価指標で oasst1 の数値を上回った

# ７．おわりに
今回は、現時点で考えられるあの手この手の限りを尽くしてオリジナルのデータセット作成にチャレンジしました。単純に Response をローカル LLM に生成してもらうだけであれば、とてもシンプルな記事にできたと思いますが、高品質なデータセットを作成するには、色々な要素技術を駆使する必要がありました。そのために各要素技術の有効性を確認する必要があり、また、品質によるデータ選定が重要になると考え、品質スコアリングという方法も提案したため、全部で 4つの記事に分けて長々と説明させていただきました。

残念ながら、今回試したいくつかの手法では期待する効果を得られず、データセット作成方法にはまだまだ改善の余地も多くあるため、今後もデータセット周りで良いアイディアが浮かんだら試していきたいと思います。また、現在も新しいデータセット作成にも取り組んでおり、今後も引き続き、データセット関連で国内の LLM 開発に貢献していきたいと思います。

最後に、今回のデータセット作成では、無料 GPT-4 アプリを用いて Instruction データ収集を実施しましたが、非常に多くの方にアプリを利用していただいたおかげでとても有用なデータを収集することができました。ご協力いただき誠にありがとうございました。

# 余談
- 4月に note の記事で「自分が日本語データセットを作ってやる」と豪語した手前、卑猥な単語でフィルタリングしたら 7 割弱のデータが消えたときは涙目になりました。
- データ収集アプリを公開した際には批判的なコメントがたくさん飛んでくると思っていましたが、利用者の同意のもとの収集であることをちゃんと説明していたため厳しい意見が飛んでくることは一切なく、そのことに驚きました。
- 「また同じようにデータ収集をやりたいか？」と聞かれると No だと思います。 **もしまた、似たような手段でデータ収集をするのであれば、閉鎖された、ある程度統制の取れるコミュニティ内に限定して実施すると思います** （有志グループ内、社内など）。
- LLM アドカレでの自身の一連の検証を通じて、膨大なデータセットも品質スコアで選定すると、データ数が 1/10 以下になってしまう様子をみて、 **データセット作りは広い砂漠から砂金を見つけるような作業だなと感じました**（これはポエムです）。