見出し画像

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>"


OpenAIのマイページのAPI Keys参照

つづいて、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から、自分の作ったファインチューニング済みのモデルの名前を参照できるようになります。

OpenAIのマイページのUsageのなかに、Fine-tune trainingという項目があってモデルができているのがわかる

できあがったファインチューニング済みのモデルを使って、文章を生成してみましょう。コマンドは以下です。

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のファインチューニングを試してみたというメモでした。

いいなと思ったら応援しよう!