OpenAIのdavinciをお嬢様口調にファインチューニングする
OpenAIの高性能な出力を、自分好みにするために、ファインチューニングを試しました。
公式のドキュメントの通りにするだけです。
用意するものは、問いかけと応答をセットにしたCSVファイル。権利の問題がないテキストを探すのが大変なので、自分で200通りのお嬢様キャラクターとのやりとりを作りました。まずは自分の脳みそを妄想力でファインチューニングして出力です。
以下から誰でも自由に使えるようにしておいたので、データの用意をせずサッと試したい方はお気軽にご利用ください。
Python環境は構築済みであるとします。筆者はWindows11環境にPythonを入れ、Powershellで使っています。
まず、OpenAIのライブラリをpip installで入れます。
pip install --upgrade openai
環境変数でOPENAI_API_KEYを設定します。OPENAI_API_KEYは、OpenAIのマイページから作成できます。(OPENAIのAPIは有料です。一番高性能なdavinciは遊びすぎると結構高くつくので注意)
$env:OPENAI_API_KEY="<OPENAI_API_KEY>"
つづいて、csvを用意します。以下のような形式で、一列目が問いかけ(prompt)、二列目が答え(completion)になっています。
prompt,completion
おはよう,おはようございます。素敵な朝ですね
朝ごはんは何が好き?,朝はお米とお味噌汁をいただきますわ
ラブレターを書いたことはありますか,わたくしまだ恋をしたことがありませんの。あこがれますわ
自分の性格を一言でいうと?,真面目であるとは思っています。お父様がとても厳しい方ですので
csvを、以下のコマンドで、OpenAIのファインチューニング用のJSONLファイルに変換します。
openai tools fine_tunes.prepare_data -f <CSVファイル>
コマンドラインに「これこれを置換していいですか?」と何度か聞かれるので、Yかnかで答えていくと、カレントフォルダに、元のcsvファイル名_prepared.jsonl というJSONLファイルが作成されています。
出来上がったJSONLはこんな感じになっています。
{"prompt":"おはよう ->","completion":" おはようございます。素敵な朝ですね\n"}
{"prompt":"朝ごはんは何が好き? ->","completion":" 朝はお米とお味噌汁をいただきますわ\n"}
{"prompt":"ラブレターを書いたことはありますか ->","completion":" わたくしまだ恋をしたことがありませんの。あこがれますわ\n"}
{"prompt":"自分の性格を一言でいうと? ->","completion":" 真面目であるとは思っています。お父様がとても厳しい方ですので\n"}
できあがったJSONLファイルを使って、ファインチューニングを行います。コマンドは以下です。
openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m <BASE_MODEL>
モデルはcurie, babbage, davinciから選べます。以下はdavinciをファインチューニングする例です。
openai api fine_tunes.create -t ".\ojousamatalkscript200_prepared.jsonl" -m davinci
もし途中で止まってしまったら、途中からやり直すコマンドもあります。200程度の会話例では、一瞬で終わってしまうので、私は試していません。
openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>
ファインチューニングが終わると、OpenAIのマイページのUsageから、自分の作ったファインチューニング済みのモデルの名前を参照できるようになります。
できあがったファインチューニング済みのモデルを使って、文章を生成してみましょう。コマンドは以下です。
openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>
私がやったときは、コマンドラインに以下のように入力しました。
openai api completions.create -m davinci:ft-personal-********* -p "ご機嫌いかがですか?"
すると、コマンドライン上で生成された文章が出てくると思います。
生成されたモデルは、プログラムから呼び出すこともできます。以下は、Google Colabで実行してみたときのソースです。model=の部分に、作成したファインチューニング済みのモデル名を指定するだけです。
!pip install openai
import openai
openai.api_key = "sk-************"
prompt = "調子はどう?"
model = "davinci:ft-personal-************"
response = openai.Completion.create(
engine=model,
prompt=prompt,
max_tokens=100
)
print(response.choices[0].text)
たった200程度の会話データセットでは、せっかくのdavinciの賢さが損なわれてしまった気がします。例えば、カスタマーサポートの想定問答集などが社内にデータセットとしてあるのならば、それを入力するといい感じになるかもしれません。
というわけで、OpenAIでdavinciのファインチューニングを試してみたというメモでした。