🤖

ChatGPT で専門知識を Fine-tuning するためのデータセットを作るための Fine-tuning してみた

2023/08/26に公開

前回、ChatGPTで専門知識をFine-tuningしてみました。

https://zenn.dev/kinzal/articles/512cf977587b37

結果としては悪くはないが実用するにはまだ足りない。特にデータセットの品質が悪さをしているような印象が強いという結果でした。
そこで、今回はそのあたりの改善するためにより品質の高いデータセットの生成を行なうためにどうすればいいかを考えていきます。

前回の問題点

前回で失敗したなと思うのは質問の多様性の少なさです。

http://usada.sakura.vg/contents/updatebymyself.html

ネットワーク更新を行うためには、どの3つの要素が必要ですか?
`updates2.dau` ファイルを作成するためには、どのような手順が必要ですか?
ネットワーク更新用のファイルをサーバに配置する際、どのような注意点がありますか?
ネットワーク更新を行うためには、どのように更新用URLを設定すればよいですか?
特定のファイルを削除するためには、どのような手順を踏む必要がありますか?
ネットワーク更新時に、`updates2.dau` が存在するディレクトリの高さがクライアントのゴーストのホームディレクトリの高さと等しい必要がある理由は何ですか?
ネットワーク更新で使用される「delete.txt」ファイルは、どのように使用されるのですか?また、そのファイルに記載された内容の効果はどのように持続されますか?
ネットワーク更新において、手書きの`updates2.dau`の作成は推奨されていない理由は何ですか?
ネットワーク更新に使用される`updates2.dau`内のファイルは、どのような形式で転送する必要がありますか?
ネットワーク更新において、ネットワーク更新用データのディレクトリツリーは、クライアント側でも再現されますか?

これは同一の質問を生成しにくいようにするため、直近で生成した20件の質問をassistantの含めていたのですが、これにより質問の傾向が似たような質問が続いてしまうという課題がありました。

このケースで言えば頭にネットワーク更新が入ってしまい、ネットワーク更新に紐づいた質問しかできなくなってしまっています。

そこで、もっと多様性のある質問を作るにはどうすれば良いか試しています。

1. 過去の質問を保持しない

一番簡単な方法としては過去の質問を保持しないことです。
質問の重複に関してはcosine_similarityを利用して類似性の高いものを除外します。

何もない状態から`updates2.dau`を作るには、どのような手順を踏む必要がありますか?
ネットワーク更新を行うために必要な要素は何ですか?
何をネットワーク経由で更新するために必要な要素があるか、説明してください。
`updates2.dau` ファイルを作成するために必要なものは何ですか?
`MD5`計算が必要となる手続きが必要なため、`updates2.dau`を手書きすることは推奨されないと書かれています。その手続きとは具体的にどのようなものなのでしょうか?
更新用URLの設定方法はどのようにされるのですか?
`updates2.dau` の作成方法に関して、手書きは推奨されないと書かれていますが、なぜ手書きは推奨されないのですか?
updates2.dauとは何ですか?
更新用ファイルを作成するために必要な要素は何ですか?
ネットワーク更新を行うためには、どの3つの要素が必要ですか?

10件の質問作成するために17回実行して、7件が類似性が高く除外した形になります。
前回のと比べれば質問が過去の質問に引きずられなくなりましたが、多様性が増えたかというとあまりそう感じません。

これはgpt-3.5-turbo-16kの特徴かもしれませんが、ドキュメントの重要なポイントに対して言及した質問は作ってくれるのですが、そうではない箇所の質問はなかなか出てこない印象です。

プロンプトで調整するにしてもこの手法で数百件の質問を作るのは少し難しいと感じます。特に類似性の高い質問が生成される可能性が高すぎるため、おそらく100個の質問を作るのに1000回のAPIコールでも足りる気がしないです。

2. いくつかのプロンプトを用意して多様性を担保する

1と対して変わらない結果になったので割愛。
ドキュメント全体と適当なところで切ったチャンクでそれぞれで質問生成とかしたら変わるかもしれないけど、面倒だったのでそこまでやっていない。

3. ドキュメントから質問を生成できるようにFine-tuningする

もう、いっそ質問を生成するのに特化した形にFine-tuningした方が早いのでは?と思ったので試してみました。

https://ja.wikipedia.org/wiki/Hot_Soup_Processor

上記ページをMarkdown化したものをsystemとし、assistantに下記のように手動で質問を作成したものをデータセットとしました。

Hot Soup Processorとは何ですか?
Wikipediaとは何ですか?
パラダイムとは何ですか?
手続き型とは何ですが?
命令型とは何ですか?
手続き型と命令型の違いは何ですか?
Hot Soup Processorの登場記事はいつですか?
Hot Soup Processorの設計者は誰ですか?
Hot Soup Processorの開発者は誰ですか?
Hot Soup Processorの最新のリリースは何時リリースされましたか?

だいたい80件ほど質問を作って心が折れたので、Markdown自体も質問を書くことができたところまでで切っています。

質問自体はすべてに質問をするというスタンスで作成しており、ドキュメント内で回答不可能なものも含めて質問しています。これは質問の多様性を高めるためにそうしている形になります。
このスタンスの是非はあるとは思っていてドキュメントに対するQAのデータセットを生成するというなら、ドキュメント内で回答可能なものだけにするのが良いかもしれません。

ここでFine-tuningしたモデルを作成した結果、下記のように質問が生成できました。

ネットワーク経由で自動更新できるファイルは何ですか?
`updates2.dau` はどのように利用されますか?
サーバへの物理的なファイルの配置はどのように行われますか?
私のゴーストはネットワークを介して自動更新できますか?
ディレクトリとは何ですか?
ネットワーク更新とは何ですか?
`更新用URL`とは何ですか?
これにより、シェル側のsurface0.pngがバージョン更新されると、クライアントのsurface0.pngも徐々にバージョン更新されていくということでしょうか?
サーバとは何ですか?
特殊なファイルはこれで消去できますか?完成版ではそれすら禁止されますか?

10件の質問作成するために13回実行して、3件が類似性が高く除外した形になります。
実際には100件生成するのに150回ぐらいの実行が必要で、1/3は類似性の高い質問で除外しています。

MD5-calculations
よく分かりませんが、その言葉の転送とは何ですか?
必要な要素は何ですか?
No updates available.

あまり良くない生成した質問の例も載せると上記のように、あまりよろしくない質問も混ざっています。
このあたりはFine-tuningしたデータセットの量が足りていない、細かく質問しすぎている弊害かとは思います。

ともあれ、多少は手作業で修正は必要かもしれませんが、多様性のあるQAのQ部分をこれで簡単に生成することができるようになりました。

おわりに

ここで作成したQからAを生成すれば前回より高品質なデータセットが・・・!!!

ドキュメントからは回答できない質問も生成しているので、おそらく普通に質問するとハルシネーションに苦しめられることになると思います。
そこで、Aを生成するためにFine-tuningをして、ドキュメント内で回答できない質問には「答えられない」と回答するようにできれば、いろいろ上手くいかないかなとか考えています。

ただ、悲しいことにこのまま進めてもFine-tuningしたカスタムモデルでは16kで利用できないため、前回と同じドキュメントからデータセットを作ることができません。残念。
つまり私の欲しい専門知識をFine-tuningしたモデルが手に入らないということで、あんまりモチベが湧かないので続きは16kのFine-tuningがきてからかもしれません。

Discussion