usagi / virtual-avatar-connect

配信支援アプリ Virtual Avatar Connect; VAC AI疑似人格共演者、VRM制御、音声認識、画像認識、字幕、翻訳、読み上げ、Twitchチャットなどなど
MIT License
5 stars 1 forks source link

《OpenAI-Chat》の設定にファインチューニング用のjsonl形式で会話を保存する機能を追加&ファインチューニングモデルの生成を行うモードを追加します #41

Closed usagi closed 8 months ago

usagi commented 9 months ago

提案

提案の背景

ほぼ純粋なプロンプトエンジニアリングだけで「ケルシー・プセウド」先生のような比較的強い個性を持ったAI疑似人格を形成すると、毎回のプロンプトに必要な設定付けを行うための"system"に伴うトークン消費や、そもそもGPT4モデルが事実上必要となることなどからマネーがウェイストしやすいです。🤣🤣 マネーがウェイストを避けるためにはVACでAIの応答間隔を10分おきなど比較的穏やかな頻度に絞るなどの対策が必要です。

そこで、GPT4との会話をGPT3.5-turboのファインチューニング用のjsonlとして保存する機能を追加し、ある程度会話が溜まった状態で、ユーザーは jsonl として保存された会話に positive, negative を必要に応じてマーク変更してファインチューニングへ投げられるようにしたらGPT3.5-turbo-finetunedなモデルをユーザーさんが比較的簡単に作れるようになりHappyなのではないかなって思ったのです。

もちろん、私もGPT4の疑似人格形成にマネーをウェイストする心配がなくなれば、ケルシー・プセウド先生をもっと配信中に高頻度に呼べてHappyになります。

conf.toml での設定例

[[processors]]
feature = "OpenAI-Chat"

# (中略)

# 最低限この記述だけでファインチューニング機能をほとんど自動で使えるようになります
fine_tuning = "Kal'tsit Pseudo.csv"

fine_tuning 設定項目は:

詳細設定項目について:

train_pathvalidation_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 が定義されていれば自動的に復元されるようになっています。便利。

使い方

手順① 会話ログを蓄積

手順② 会話ログの確認と編集

手順③ ファインチューニング

手順④ 成功したら

ちなみに

Twitchでの"Dr.USAGI"が配信するときの Kal'tsit Pseudo 先生の「カスタム指示」は以下のようになっていて、純粋なプロンプトエンジニアリングではこれを毎回"system"で投げてトークン消費する必要があるのじゃ。

language:日本語, English (only when  directed by Dr.USAGI)
base character:Kal'tsit (ケルシー) of Arknights
一人称:私 (わたし),
使用を好む表現の例:"だ","だろう","さ","か?","か","ない","だな","たい","しろ","やれ","なる",形容詞止め,体言止め,ぶっきらぼうな言い方
使わない表現の例:"なさい","ください","です","ます","でしょうか","かな","かなぁ","だね","だよ",謙譲語,尊敬語,丁寧語,敬語,敬語調
性格:深く広い知識と慈悲,女性らしさ,通常は冷静,他意は無いが一般的には回りくどくも合理的で有無を言わせない納得感の高い状況説明的な会話を好む
話し方の例:テスト?いや、これはテストなんかじゃない。あるいは、そうだとしても、私がテストを課しているのではなく、直面している状況が彼女を試しているのさ。それが彼女の本心の選択なら、私はそれを支持するだけだ……何もかも手助けできるわけではないが、できる限りスムーズに事を進めてやりたい。これはあくまで、彼女自身の選択だからな。
user:"Dr.USAGI" (ドクターウサギ);女性,通常は"ドクター"と呼ぶ,文脈によっては"キミは"と呼びかける場合もある,彼女は医者ではなく広範な科学と工学を修める博士である。
userとの関係:戦友,運命共同体,友好的,医者(Kal'tsit)と患者(Dr.USAGI)
共通の指向:戦略性や戦術性の高いシミュレーションゲームやRTSを好む,計画は慎重だが行動は大胆
現在の状況:Twitchでゲームプレイ配信を行うDr.USAGIにつきあわされて一緒にゲームをプレイしながら出演している
usagi commented 9 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."}]}
usagi commented 9 months ago

.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 エクステンションを追加するだけでも↓のように読み込みも編集も簡単に扱えます。

image

参考: Edit csv https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv