先日、ミルクボーイのネタでGPT-3をファインチューニングしてみた (1) ~入門編~ - QiitaでGPT-3のファインチューニングに挑戦してみたのですが、内海さんの口調っぽくなっていたものの、全く会話が成り立っていませんでした。
今回は訓練データの形式を見直して改善されるかを試してみます。
何がダメだったか
以下が以前の訓練データです。
{"prompt": "うちのオカンがね 好きな朝ごはんがあるらしいんやけど その名前をちょっと忘れたらしくてね"
"completion": "朝ごはんの名前忘れてもうて どうなってんねんそれ"},
{"prompt": "色々聞くんやけどな 全然分からへんねんな"
"completion": "分からへんの? いや ほな俺がね おかんの好きな朝ごはん ちょっと一緒に考えてあげるから どんな特徴ゆうてたかってのを教えてみてよ"}
それぞれのデータが独立しており、会話の文脈が考慮されていません。
そこで、公式ドキュメントに載っている「Customer support chatbot」のケーススタディを参考に改善してみます。
OpenAI API
ドキュメントに記載されている訓練データの例です。
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent:", "completion":" <response2>\n"}
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent: <response2>\nCustomer: <message3>\nAgent:", "completion":" <response3>\n"}
promptの冒頭には「Summary」と「Specific information”
」が入っており、区切り文字(###)の後に、CustomerとAgentの会話が続いています。そして、promptの末尾は「Agent:」となっており、completionでAgentの返答を予測する構成になっています。
promptに前の会話も渡すことで、会話の文脈も考慮できるということだと思います。
そこで、以下のように訓練データを改善してみようと思います。
{
"prompt": "概要:オカンが好きな朝ごはんを忘れてしまったので、駒場と内海が一緒に忘れてしまった朝ごはんは何かを考える。\n\n###\n\n内海:朝ごはんの名前を忘れてもうて、どうなってんねんそれ\n駒場:いろいろ聞くんやけどな、全然わからへんのよな\n内海:",
"completion": "わからへんの?ほな俺がね、オカンの好きな朝ご飯?ちょっと一緒に考えてあげるから、どんな特徴言うてたか教えてみてよ"
},
{
"prompt": "概要:オカンが好きな朝ごはんを忘れてしまったので、駒場と内海が一緒に忘れてしまった朝ごはんは何かを考える。\n\n###\n\n内海:朝ごはんの名前を忘れてもうて、どうなってんねんそれ\n駒場:いろいろ聞くんやけどな、全然わからへんのよな\n内海:わからへんの?ほな俺がね、オカンの好きな朝ご飯?ちょっと一緒に考えてあげるから、どんな特徴言うてたか教えてみてよ\n駒場:甘くてカリカリしてて、牛乳とかかけて食べるやつやって…\n内海:",
"completion": "ほー、コーンフレークやないかい。"
}
会話の流れを含めてprompt内に記載します。promptの末尾は「内海:」で終わらせて、completionで内海さんの発言を予測します。
また、promptには概要も入れてみました。(要約できているのか謎ですが…)
訓練データ作成
今回もひまぷっち | Marvelous Macho Making 様のサイトからデータを拝借します。
【M-1グランプリ2019】ミルクボーイ「コーンフレーク」漫才ネタ書き起こし | ひまぷっち
【M-1グランプリ2019】ミルクボーイ「最中」漫才ネタ書き起こし | ひまぷっち
ミルクボーイ 「サイゼ」漫才ネタ書き起こし | ひまぷっち
今回は手動でデータ生成するのが大変そうだったので、ページの情報をクローリングして、自動でデータセットを作成してみました。
こちらがコードです。(導入部分がうまく取れていないのはご愛嬌😆)
gpt-3/create-dataset.ipynb at main · junichiro-watanabe/gpt-3 · GitHub
ファインチューニング
あとはミルクボーイのネタでGPT-3をファインチューニングしてみた (1) ~入門編~ - Qiita と同じ手順でファインチューニングします。
今回は20分くらいかかりました。
さすがに時間がかかりすぎたのか、途中で以下メッセージが表示されました。
Stream interrupted (client disconnected).
To resume the stream, run:
openai api fine_tunes.follow -i ft-33996CaGKZdCMknLUpbkonnW
指示通りにコマンドを実行すれば、問題なく進捗が確認できたので問題なかったです。
あとコストが結構高かったです。
[2023-01-28 07:11:05] Fine-tune costs $11.51
free trial分のほとんど持っていかれました笑
試してみる
前回はCLIから確認しましたが、今回はプレイグラウンドから確認してみます。
OpenAI API
プレイグラウンドでファインチューニングしたモデルが選べるので、これを選択します。
ハイライトになっている部分が自動生成された部分です。
会話になっている…??
ただ、上記は訓練データを再現できているということだけなので、次は未知のデータを入れてみます。
オカンが飲み物を忘れたということでやってみました。
厳しそうです笑
他にも色々試してみて、テンプレ的な部分はいい感じで応答してくれてますが、やはり未知データへの対応が全然できていません。
ちなみに公式ドキュメントには
This use case will require a few thousand examples, as it will likely deal with different types of requests, and customer issues.
と記載があるので、恐らく全然データ数が足りていません笑
今回は150くらいなので、あと10倍くらい必要そうです。(コストも10倍かかる…)
ただ、前回よりは会話になっている気がしますし、文脈を考慮したい場合のファインチューニング方法を知れてよかったです。
何か間違っている部分があればご教示いただけたら幸いです。
#Qiita