Closed usagi closed 8 months ago
参考: https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset
GPT3.5-turbo, GPT4 をファインチューニングする場合は会話形式のトレーニングデータが必要:
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
.jsonl で出力、 .jsonl でファインチューン、これは OpenAI の API 要求としては素直で、自力で .jsonl 形式をベースに触れたいユーザーにとってもわかりやすいです。実装としてもシンプルです。そういうわけで .jsonl でのファイルIOは付けます。
ただ、 .jsonl では内容の確認や手編集を行う前提では必ずしも扱いやすいとは言えません。そこで、ファイルIO系にはシンプルな .csv にも対応します。1行目をヘッダー行として , 区切りで "system", "user", "assistant" の3つのカラムにのみ対応します。複雑にするなら .jsonl でやってくださいということにしましょう。
"system","user","assistant"
"Marv is a factual chatbot that is also sarcastic.","What's the capital of France?","Paris, as if everyone doesn't know that already."
"Marv is a factual chatbot that is also sarcastic.","Who wrote 'Romeo and Juliet'?","Oh, just some guy named William Shakespeare. Ever heard of him?"
"Marv is a factual chatbot that is also sarcastic.","How far is the Moon from Earth?","Around 384,400 kilometers. Give or take a few, like that really matters."
CSVはお好みのテキストエディター、表計算アプリやサービスで扱いやすいですし、 vscode に Edit csv エクステンションを追加するだけでも↓のように読み込みも編集も簡単に扱えます。
参考: Edit csv https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv
提案
--openai-chat-fine-tuning
で OpenAI にファインチューンモデルを生成させる機能を追加します提案の背景
ほぼ純粋なプロンプトエンジニアリングだけで「ケルシー・プセウド」先生のような比較的強い個性を持ったAI疑似人格を形成すると、毎回のプロンプトに必要な設定付けを行うための"system"に伴うトークン消費や、そもそもGPT4モデルが事実上必要となることなどからマネーがウェイストしやすいです。🤣🤣 マネーがウェイストを避けるためにはVACでAIの応答間隔を10分おきなど比較的穏やかな頻度に絞るなどの対策が必要です。
そこで、GPT4との会話をGPT3.5-turboのファインチューニング用のjsonlとして保存する機能を追加し、ある程度会話が溜まった状態で、ユーザーは jsonl として保存された会話に positive, negative を必要に応じてマーク変更してファインチューニングへ投げられるようにしたらGPT3.5-turbo-finetunedなモデルをユーザーさんが比較的簡単に作れるようになりHappyなのではないかなって思ったのです。
もちろん、私もGPT4の疑似人格形成にマネーをウェイストする心配がなくなれば、ケルシー・プセウド先生をもっと配信中に高頻度に呼べてHappyになります。
conf.toml での設定例
fine_tuning
設定項目は:"Kal'tsit Pseudo.csv"
のような会話ログを蓄積するファイル名だけを指定(詳細設定のtrain_path
だけ設定するのと同じ動作になります。){ train_path = "Kal'tsit Pseudo.csv", validation_path = "Kal'tsit Pseudo validation.csv", model = "gpt-3.5-turbo", suffix = "kaltsit_pseudo" }
のように各種オプションを細かく指定 何れかの設定方法で機能します。詳細設定項目について:
train_path
: 訓練用の会話ログを蓄積(出力)/ファインチューニング(入力)するファイルパスを設定します。(必須)validation_path
: ファインチューニング実行時に検証用の会話ログを使いたい場合はファイルパスを設定します。(オプション)model
: ファインチューニングのベースにしたいモデルの名前を設定します。未設定時は "gpt-3.5-turbo" の扱いになります。(オプション)suffix
: ファインチューニングで生成される新たなモデルの名前にくっつけたいサフィックスを設定できます。(オプション)train_path
とvalidation_path
には.jsonl
または.csv
ファイルのパスを設定できます。.jsonl
は OpenAI API とのやり取りで直接使われるファイル形式です。.csv
はよくある文字区切り値群(VACのfine_tuningではカンマ区切りになります)形式で、OpenAI API に送信する際には自動的にVACが内部的に.jsonl
に変換して投げてくれます。.jsonl
は手編集や値の確認がし難いので、.csv
形式で扱えるようにする機能を付けました。.csv
の場合はヘッダー1行 "user", "assistant" の2カラムのファイルで扱われます。.jsonl
ではcustom_instructions
も "system" としてファイルに書き込んで扱いますが、.csv
の場合はCSVファイルそのものでは記録を省略して合理化しつつ、 OpenAI API でファインチューニング用に投げつけるときは内部的に.jsonl
に変換しつつ設定ファイルにcustom_instructions
が定義されていれば自動的に復元されるようになっています。便利。使い方
手順① 会話ログを蓄積
fine_tuning
を設定した状態の《OpenAI-Chat》プロセッサー定義でVACを起動し、AI疑似人格とおしゃべりします。gpt-3.5-turbo
にする場合でも会話ログの蓄積はgpt-4
を使っても問題ありません。むしろ使って下さい。手順② 会話ログの確認と編集
手順③ ファインチューニング
virtual-avatar-connect --openai-chat-fine-tuning
のように--openai-chat-fine-tuning
引数を付けてVACを実行します。conf.toml
以外の設定ファイルを使いたい場合はvirtual-avatar-connect --openai-chat-fine-tuning my-custom-conf.toml
のように設定ファイルも指定できます。--processor-id nyanko
のように引数を追加すると、設定ファイル内に複数の《OpenAI-Chat》を定義している場合でもid = "nyanko"
のようにid
を明示的に設定した特定のプロセッサーの設定でファインチューニングを動作できます。手順④ 成功したら
model
(fine_tuning
の中ではない普段使うほう) も切り替えて実用しましょう。ちなみに
Twitchでの"Dr.USAGI"が配信するときの Kal'tsit Pseudo 先生の「カスタム指示」は以下のようになっていて、純粋なプロンプトエンジニアリングではこれを毎回"system"で投げてトークン消費する必要があるのじゃ。