![見出し画像](https://assets.st-note.com/production/uploads/images/98910877/rectangle_large_type_2_38d9ddd263f73f5bd5e64c5a870e24fa.png?width=1200)
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>"
![](https://assets.st-note.com/img/1677341386959-Gesnm74KZI.png)
つづいて、csvを用意します。以下のような形式で、一列目が問いかけ(prompt)、二列目が答え(completion)になっています。
prompt,completion
おはよう,おはようございます。素敵な朝ですね
朝ごはんは何が好き?,朝はお米とお味噌汁をいただきますわ
ラブレターを書いたことはありますか,わたくしまだ恋をしたことがありませんの。あこがれますわ
自分の性格を一言でいうと?,真面目であるとは思っています。お父様がとても厳しい方ですので
csvを、以下のコマンドで、OpenAIのファインチューニング用のJSONLファイルに変換します。
openai tools fine_tunes.prepare_data -f <CSVファイル>
コマンドラインに「これこれを置換していいですか?」と何度か聞かれるので、Yかnかで答えていくと、カレントフォルダに、元のcsvファイル名_prepared.jsonl というJSONLファイルが作成されています。
Based on the analysis we will perform the following actions:
- [Necessary] Your format `CSV` will be converted to `JSONL`
- [Recommended] Lowercase all your data in column/key `prompt` [Y/n]: Y
- [Recommended] Lowercase all your data in column/key `completion` [Y/n]: Y
- [Recommended] Add a suffix separator ` ->` to all prompts [Y/n]: Y
- [Recommended] Add a suffix ending `\n` to all completions [Y/n]: Y
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: Y
Your data will be written to a new JSONL file. Proceed [Y/n]: Y
Wrote modified file to `.\ojousamatalkscript200_prepared.jsonl`
Feel free to take a look!
出来上がった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から、自分の作ったファインチューニング済みのモデルの名前を参照できるようになります。
![](https://assets.st-note.com/img/1677342376842-f7rjbCxc40.png?width=1200)
できあがったファインチューニング済みのモデルを使って、文章を生成してみましょう。コマンドは以下です。
openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>
私がやったときは、コマンドラインに以下のように入力しました。
openai api completions.create -m davinci:ft-personal-********* -p "ご機嫌いかがですか?"
すると、コマンドライン上で生成された文章が出てくると思います。
![](https://assets.st-note.com/img/1677342575838-LBR6WUAtvW.png?width=1200)
生成されたモデルは、プログラムから呼び出すこともできます。以下は、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のファインチューニングを試してみたというメモでした。