ChatGPTのFine-tuningを使って富山弁を話すチャットボット開発してみた
はじめに
OpenAIからリリースされているChatGPT(gpt3.5-turbo)のFine-tuningを使って自分の故郷の方言である富山弁をAIに学習させてみました。
自分が行ったFine-tuningの流れに沿ってまとめていきます。
ファインチューニングの流れ
データセットの作成
データセットはjson
形式で作成しました。
以下は作成した富山弁の会話データセットの数行です。
(公開しているのは10行ですが、実際には約50行ほど書いています)
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "これ食べる?"}, {"role": "assistant", "content": "なーん、食べんちゃ"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "お菓子食べる?"}, {"role": "assistant", "content": "食べる!"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "いつもありがとう"}, {"role": "assistant", "content": "こっちこそあんがと"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "帰る時、暗くなるから"}, {"role": "assistant", "content": "分かった、気いつけるちゃ"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "今日のごはんしょっぱくない?"}, {"role": "assistant", "content": "たしかに、しょっからいな"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "これやらないといけないかな"}, {"role": "assistant", "content": "せんないかんちゃ"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "遊びに行ってくる"}, {"role": "assistant", "content": "今日は雨降っとるから気いつけられ"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "宿題おわったの?"}, {"role": "assistant", "content": "今からやるちゃ"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "明日暇だな"}, {"role": "assistant", "content": "じゃあ一緒に遊びに行くけ?"}]}
{"messages": [{"role": "system", "content": "あなたは富山県民です。富山弁で話します。"}, {"role": "user", "content": "ごめんね"}, {"role": "assistant", "content": "なーん、いいちゃ"}]}
データセットのアップロード
pythonのopenaiライブラリ
を使用してデータセットをアップロードします。
import openai
openai.api_key = "YOUR_API_KEY"
openai.File.create(
file = open("dataset.json","rb"), # uploadするデータセットのファイル名入力
purpose = "fine-tune",
user_provided_filename = "file-toyama" #ファイル名作成
)
データセットの確認
ファインチューニングをするためにはアップロードしたデータセットのファイルID
が必要なため確認します。
以下が確認用のプログラムです
import openai
# APIキーをセット(これはプレースホルダーです)
openai.api_key = "YOUR_API_KEY"
# アップロードされたファイルの一覧を取得
file_list = openai.File.list()
# ファイル一覧を出力
print(file_list)
このプログラムを実行すると以下のようなアップロードしたデータセットのデータを見ることができるリストが表示されます
実行結果
{
"object": "list",
"data": [
{
"object": "file",
"id": "file-abc1234", # ファイルID
"purpose": "fine-tune", # ファイル名
"filename": "file-toyama",
"bytes": 13860,
"created_at": 1695614804,
"status": "processed",
"status_details": null
}
]
}
ファインチューニングの実行
さきほど確認したファイルID
を以下のように指定して実行します。
import openai
openai.api_key = "YOUR_API_KEY"
openai.FineTuningJob.create(
training_file="file-abc1234", # 学習させるデータセットのID入力
model="gpt-3.5-turbo"
)
トレーニング完了まで数十分かかりました。
学習済みのモデルの実行
ファインチューニングしたモデルをOpenAIのPlaygroundを使用して実行します。
SYSTEMに「あなたは富山県民です。富山弁で話します。」と役割を入力。
USERに言葉を入力すると返答がきます
検証・評価
ここから何をもって富山弁を話したという検証ポイントや実際に会話してどうだったかという結果とその感想(評価) を記述していこうと思います
検証ポイント
・富山弁でよく使う言葉である「なーん」(簡単に説明すると否定するときに使う言葉、英語でいうNo)を会話内容に使うか
・語尾に使う「ちゃ」や「け?」という言葉を正しく使えているか
*今回、富山ゆかりの食べ物や地名、観光地などの出力については検証ポイントにしないこととする
検証する
検証例(1)
語尾に「ちゃ」が付いているが正しく使えていない
検証例(2)
「いやいや」や「違うで!」、というところに「なーん」を使って欲しかった
結果、評価
・何回か試してみたが「なーん」という言葉を使うことはなかった
・語尾に「ちゃ」と付いているが、正しく使えていない
・他にも学習させた富山弁の言い回しがあるが、用いているだけで正しく使えている場面は少なかった
精度改善アイデア
・まず会話データが約50個とまだ少ないため、データ数を増やすことが必要
・実際に作ったモデルのチャットボットと会話し、返事の気になる部分や言い回しを修正し、データセットに質問文含め入力を行う
・同じデータセットでも再度学習させると異なるモデルになるため、良いモデルが出てくるまで何度も学習を行う ←今はデータセットを増やす方が良さそう
参考にしたサイト
まとめ
・ところどころであるが富山ならではの言葉を会話に用いていたのでファインチューニングはできていた。
・とやま弁を話すチャットボット作成にはデータセットがまだまだ足りないと感じた。
・「なーん」や語尾の「ちゃ」だけでなく、ナチュラルな富山弁を話せるように今後も修正していきたいと思う。
Discussion