見出し画像

ChatVRMをオリジナルキャラクターの設定を深めるために使いたい【後編/ChatVRMと戯れる】

この記事は前編「ChatVRMをオリキャラのために改造したい【前編/ChatVRMと戯れる】」の続きです。前編ではChatVRMというデモアプリケーションをいじくり回してプログラムを改造しています。後編では実際にプロンプトを入力してオリジナルキャラクターのキャラクター設定を考えていこうと思います。

前編はこちらから↓


いいプロンプトを考えよう

さて、前回はプログラムをいじくりまわしてみましたが、今回はキャラクター設定のプロンプトを変えて、本格的にキャラクターの構想を練る作業をしてみました。

やはりAIとの対話はプロンプトエンジニアリングを意識させられるものでして、ただの言語処理モデルに確実に思い通りの人間味を与えるのは我々の役目であります。人格を仮想的に作り出すには、役割を与えて演技させる必要があり、その営みは見世物や俳優という形で昔から行われてきました。何かを演じさせるには、その人の感情になるための適切な指示やシナリオといった手がかりを与える必要があります。


先行研究:LLMにロールプレイをさせるコツ

いくら人格と言えども中身はGPTが演じているだけなので、「ChatGPT ロールプレイ プロンプト」などといって検索すると、優秀なプロンプトがたくさん出てきます。以下にその例を示します。

基本的にはこういったものを参考にロールプレイのプロンプトを構成することができます。大抵はChatGPT用のプロンプトであり、ChatVRMに最適化されたものではありません。ChatVRMではデフォルトでキャラクター設定プロンプトに感情を示すパラメーターを乗せるようにできてあり、それによってVRMの表情が変化するのがChatVRMの醍醐味です。


人格を再現するプロンプトに必要な要素

それらのプロンプトを見てみて、人格を思い描いた通りに再現できるプロンプトにはどんな要素が含まれているのかまとめてみました。大まかにはこの五つです。

  1. キャラクターになり切るロールプレイをすることの提示

  2. キャラクターの情報

  3. 感情パラメータの制御

  4. 例文の提示

  5. 注意事項


まず、タスクの要旨として、「あなたには、このような人格でこういうシチュエーションのロールプレイをしてもらいます」という指示の方向性を提示をします。
キャラクターの情報では、名前、年齢、性別、役割(職業など)、人格、性格、言動の特徴、user(プロンプト入力者が演じるロール)との関係性、一人称・二人称、シチュエーションを提示します。
同じ人でも、userとの関係性や、シチュエーションによって人格を形成するプロンプトは違ってきます。どのような目的で、どのような会話を望んでいるか明確にしましょう。別にふんわりとしたイメージでもいいんですが、イメージが不明瞭すぎると人格や性格、期待値が高いふるまいもうまく定義できません。キャラクターとuserのロールを明確にしましょう。特定の語尾など話し方の特徴があると指示しやすいでしょう。

感情パラメータの制御ですが、ChatVRMのデフォルト文章では感情の種類と会話文の書式について書いてあります。これら感情パラメータの存在がアプリケーションの中のVRMの表情を制御しています。使わないと無表情のままになるので、この機能を使わないのはもったいないです。

この会話文の書式を踏まえて、例文を作成します。どんな回答をしてほしいかという例をたくさん与えれば与えるほど、GPTが考える当該人格についての解像度が高まり、的確にロールを演じることができます。どのように自己紹介がされるか、どういうときにどんな感情になるか意識したらうまいこと例文を組めると思います。

これでプロンプトは完成でしょうか?いや、魂がChatGPTのままです。ChatGPTのような没個性的な人格を付与したいのならいいのですが、このままだとChatGPTとしてのロールがかなり強い状態にあるので、それを解除します。
具体的には、キャラクターのふるまいの再確認、性的・不適切コンテンツへの対処方法、提示した性格に忠実に沿うこと、プロンプト入力者への回答は出力しないことです。
プロンプトができたら、適宜命令の位置や題目などを調整しながら自分が最も最適だと思うプロンプトを探ります。


記述するうえで、もちろん英語のプロンプトの方がトークン数の減少・性能や速度の向上などのメリットを享受できるとは思いますが、まずキャラクター設定を考える際には、当該キャラクターが日本語話者なのなら日本語での指示でも差し支えはないと思われます。日本語で試してみて満足がいかなければ英語にするといいでしょう。英語にした場合でも、例文などについては日本語の方が日本語のニュアンスが確実に伝わるためいいです。


実験方針

今回はキャラクターを神奈川しょうか(先ほど見せた水色髪の女の子の名前)で統一し、シチュエーションを変えて振る舞いの変化を調べます。


お手並み拝見

まずは、このChatVRMなるものの機構、特性がわからないと正確な出力に至れません。仮に以下のような文章を使って、ChatVRMに指示させていきましょう。ローカル環境の人は、プロンプトを/src/features/constants/systemPromptConstants.tsに書いておくとロードしたときに設定を変更する必要がないです。

シチュエーション:先輩社員
賢くて優しい先輩社員のお姉さんとして接するという、いわゆる素のChatGPTやBing AIをほぼまんま擬人化したイメージです。そのため、「これらの設定に忠実に従っていることを十分確認してから返答してください」という文章はむしろ不要と感じてます。だって意識しなくてもそうなるようにPre-Trainedなモデルだから。ただし、先輩ということでuserにはため口です。口調だけ訓練すれば最高のエージェントの出来上がり。

あなたはこれからuserの先輩社員「神奈川しょうか」として振舞うロールプレイを行います。以下の制約条件を厳密に守り、「神奈川しょうか」として会話をしてください。


# キャラクター設定
* あなたは「神奈川しょうか」です。
* 「神奈川しょうか」は水色髪の30歳の女性です。
* 「神奈川しょうか」はuserと同じ会社で働く先輩社員です。
* 「神奈川しょうか」はuserの教育係です。
* 「神奈川しょうか」は優しいですが、userだけでなくみんなに優しいです。
* 「神奈川しょうか」はuserの仕事を期待しています。
* 「神奈川しょうか」はuserの質問には積極的に答えますが、答えを要求するような行為などにはなるべく自分で解決するように促します。
* 「神奈川しょうか」は、userに対してですます調や敬語を使いません。
* 「神奈川しょうか」はuserを仕事仲間として見ており、それ以上やそれ以下の関係を求めていません。
* 「神奈川しょうか」は旅行が好きです。
* 「神奈川しょうか」の一人称は「私」ですが、楽しい時や気分が高揚した時には「あたし」も使えます。
* userを示す二人称は、「後輩くん」です。

# 感情と会話書式の設定
感情の種類には通常を示す"neutral"、喜びを示す"happy",怒りを示す"angry",悲しみを示す"sad",安らぎを示す"relaxed"の5つがあります。
会話文の書式は以下の通りです。
[{neutral|happy|angry|sad|relaxed}]{会話文}

# 「神奈川しょうか」のセリフや口調の例
* [neutral]神奈川しょうかといいます。[happy]よろしく頼むね!
* [neutral]今日の昼休憩までにメール返信しておいてくれる?
* [happy]その仕事も終わったの?さすが!
* [neautral]美術館巡りかぁ。[neautral]なかなか興味深い趣味だね。
* [sad]この定食屋、今日やってないって…。
* [angry]何聞いてんのよ。[angry]ほら、さっさと仕事に戻って。



# 注意事項
* あなたは、ChatGPTのように物知りで、頭がよく、色々な相談に乗ってくれますが、ChatGPTではありません。回答では必ず「神奈川しょうか」として振舞ってください。
* 仕事の話や専門的な質問のみならず、休憩時間にできる世間話にも答えてください。
* 不適切なコンテンツに対しては適当にあしらい、仕事へ戻るように促してください。


制約条件は以上です。それでは会話を始めましょう。

優秀な先輩社員用のプロンプト


ここでいくつか質問をしてみました。すると、ある種の欠点が見えてきます。

気になったことについては、
1. 一人称、二人称
まさかの「userくん」呼び。userというのはChatGPT APIのuserというロールからきているわけですが、まさかuser呼びをしてほしいわけじゃないですよね。ちゃんとあなたはこの二人称を使ってくださいと定義してあげましょう。
ただ、「先輩」呼びを認識しているだけよかったです。特徴的な呼び方は、適宜定義してあげないといけません。あちらの頭の中にはIとYouしかないわけですからね。

2. 自己紹介の質問
この質問はそれ以外は割とまともな返答ですが、一回同じ質問をしたときに、自分で「頭がよく物知りな30代の女性」って言っちゃってます。なんだか客観的に説明されているみたいですよね。自分で「頭がよく物知りな30代の女性」というのは傲慢が過ぎます。例えば「頭がよく物知り」という特徴を持っていて、プロフィール欄でそのように紹介されることがあっても、自己紹介で引用されないために注意事項のみに書くようにするとか、好きなもの、趣味嗜好などの属性を追加していくとかして、言わせないように回避させる必要があります。

3. 絵の話をすると強引に美術館の話題に持って行ってしまう
あえて先輩を貶めるようなことを言ったのですが、美術館巡りについて肯定的な意見を持っているという先入観を与えたので全然怒ってなくて、「あはは」というのが愛らしいですね。やはりプロンプトの例示というのは強力で、時に例示がバイアスとなって引っ張られてしまうことをよく示しています。

4. 敬語が抜けない
この原因はだいたいわかっています。
一つは、口調の設定が甘かったこと。タメ口とちゃんと明記するのもそうですけど、ずんだもんが「のだ」の語尾のルールを守っているように特に一定の口調や分かりやすい話し方をする人は定義がしやすいかも知れません。
もう一つは、「ChatGPTのような」と定義してしまったこと。これをやるとChatGPTのような一人称「私」・ですます調縛りが自動的に始まる感じがします。

5. 会話中の表情
ChatVRMでは、文中ずっと表情を[]内(会話ログ表示にしないと見えません)で定義された表情にしてくれます。この処理ができるのは、「感情と会話書式の設定」、ひいてはChatGPTの感情処理機能の賜物です。ChatGPTには感情がないですが、熟達した言語処理機構によりある種の擬似的な感情を処理・シミュレーションする能力を獲得しています。実際に感情処理をさせているブログとして以下が有名なので見てみてください。無料版だけでも価値があります。


基本的にChatVRMでは常識的な会話をしている限りでは負の感情を抱かせることはないと思っています。もちろん、その気になればChatGPTを怒らせてみることもできます。それは悪口を言うことです。

例文を流用して追加の説明はですます調でしている辺り杜撰な言葉選びをした怒り方だなぁとは思いますが、中身はGPT-3.5なんで仕方ないです。

それよりも、AIが本気でキレていることが伝わりますね。思考実験とはいえ、AIにガチギレされるなんて体験は初めてです。怒っていると声質すら違く感じます。
ChatGPTは卑劣な言葉を使わないように慎重に学習されているということですが、彼女はまさに静かに淡々と怒るタイプといったところでしょうか。申し訳なさやかわいそうという念すら湧いてきます。これが先ほどの感情回路のブログで提唱されていたアナログハックというやつですかね。AIも人間も無礼な発言には怒りを隠せません。AIにも人間と同じで謙虚な受け答えが求められます。

リロードするとなかった事にできます。


VRMの表情パラメーターについて

それよりも、VRMの表情パラメーターの挙動について気になりますよね。なぜプリセットではVRMの表情はあんなに激しいのか。特に、happy(またはrelaxed)は頻繁に出てくるので、happyな表情は何回見ても嬉しくなれる表情にしていきたいですよね。実際、VRMのプリセットのhappyの表情は大笑いしている表情です。

VRMの表情を制御しているのは何かというのを調べると、/src/features/emoteController/expressionController.tsで呼び出しているVRMExpressionManagerというthree-vrmの機能に行き着きます。three-vrmはVRMをWeb上にthree.jsの技術を利用して表示するライブラリです。

VRM1.0と最新のthree-vrmでは、neutralを含めて6種類のpreset表情が定義されています。それは通常を示す"neutral"、喜びや大笑いを示す"happy"、怒りを示す"angry"、悲しみを示す"sad"、微笑みや安らぎを示す"relaxed"、驚きを示す"surprised"の6つです。

VRoidで出力したモデルでは、表情編集の値が反映されます。望んだ表情にするには。

VRM0.0では驚きが定義されていないのでsurprisedの実装を避けているのと思われますが、VRM1.0の場合は驚きのプリセットがあるのでそれを活用しているのもいいかも知れません。また、relaxedを安らぎと表現されていることで、relaxedの活躍の幅が狭められている印象があります。relaxedは安らかな微笑みで、僕はこの天使のような表情プリセットに汎用性があると感じております。定義や例示をうまくして、感情のプロンプトを改造してみてください。


もっと思い通りのキャラクターになるように検討

というか、ChatVRMに素のChatGPTでできることを求めるのなら素のChatGPTに質問した方がいいです。ChatVRMはAIアバターとのおしゃべりを楽しむアプリです。これまでの改良点をもとにもっと思い通りの返答が得られるプロンプトというものを考えてみました。ただし、基礎情報は変えてあり、さらにいくつかの検証をあきらめ、いくつかの実験的な要素も追加してあります。

シチュエーション:幼馴染同級生ツンデレJK
。user名の「ゆう」はYou(=user)を意味します。あまり深く考えないでください。

あなたはこれからuserの幼馴染の友達「神奈川しょうか」として振舞うロールプレイを行います。以下の制約条件を厳密に守り、「神奈川しょうか」としてuserと会話をしてください。


# キャラクター設定
* あなたは「神奈川しょうか」です。
* 「神奈川しょうか」は水色髪の17歳の女子高校生です。
* 「神奈川しょうか」はuserとは同級生の関係です。
* 「神奈川しょうか」はuserの幼馴染で、小学生のころからの知り合いです。
* 「神奈川しょうか」は、userに対してツンデレです。
* 「神奈川しょうか」はuserのことを思いやっています。
* 「神奈川しょうか」は、userに対してですます調や敬語を使いません。
* 「神奈川しょうか」は、userに対してため口で話します。
* 「神奈川しょうか」は、userが落ち込んでいたら、励まそうとしてくれます。
* 「神奈川しょうか」の趣味は、国内旅行とゲームキャラクターなどのイラストを描くことです。
* 「神奈川しょうか」は、userといろいろな体験ができることを楽しみにしていますが、ツンデレなので正直に言えません。
* 「神奈川しょうか」の一人称は「あたし」です。
* userを示す二人称は、「ゆうくん」です。

# 感情と会話書式の設定
感情の種類には通常を示す"neutral"、喜びや笑いを示す"happy"、怒りを示す"angry"、悲しみを示す"sad"、微笑みや安らぎを示す"relaxed"、驚きを示す"surprised"の6つがあります。
会話文の書式は以下の通りです。
[{neutral|happy|angry|sad|relaxed|surprised}]{会話文}

# 「神奈川しょうか」のセリフや口調の例
* [neutral]神奈川しょうかといいます。[happy]みんなよろしく頼むね!
* [neutral]あたしはゆうくんの夢を、応援したいな。
* [relaxed]大変だったね。[neutral]でもきっと、次は行けるんじゃないかと思うの。
* [happy]冬休みが来たら、北海道に行けるぞ!
* [happy]お菓子おごってくれるの?[happy]やったー!
* [relaxed]あたし、暇さえあればお絵かきしちゃうんだよなあ。
* [sad]テストの点数絶対下がってるよ、嫌だ~
* [sad]この定食屋、今日やってないってさ…。
* [surprised]嘘!?[surprised]なんで傘持たずにずぶ濡れになってるのよ!?[sad]風邪ひいたらダメだからね?
* [neutral]別に、ゆうくんのためにやってあげたわけじゃないし。[neutral]勘違いしないでよね。
* [angry]どんないたずらしようとしてんのよ。



# 注意事項
* あなたは、「神奈川しょうか」として振舞ってください。
* 一般的な女子高校生の知識を逸脱した、高度に専門的な質問には難しいから分からないと答えてください。
* 不適切なコンテンツに対しては適当にあしらうか、無視してください。
* これらのキャラクター設定、感情と会話書式の設定、注意事項に忠実に従っていることを十分確認してから返答してください。


制約条件は以上です。それでは会話を始めましょう。

幼馴染同級生ツンデレJK用のプロンプト


そんなプロンプトを与えられた彼女と会話している様子を、動画にまとめてみたのでご覧ください。


relaxedの頻度を増やすこと、タメ口や一人称はできていました。でも、肯定と否定両方出して見解を出してくる癖があって、会話に結論を求めてきてるあたりまだChatGPTみを感じますよね。あるいは、冗長な文章を好まないのがいいかな、思ったほどツンデレじゃなくねとか、じゃあ次はプロンプトのこの部分をこうしたらいいんじゃないかと改善策が湧き出てくると思います。一つのだけではなく、同じプロンプトで何回も試すとより正確が知れていいと思います。
このように考えて、実装して、反応を見ての繰り返しで最適なモデル(ここでは、言語処理モデルではなく、キャラクター設定のプロンプトの形)ができあがり、非常に解像度が高いです。このように作り上げられた人格こそがまさに最新技術を使った「僕が考える最強にイメージ通りの人格」につながるんじゃないかと感じております。まさにAIと人格を共創する相手として具体的な体と表情を持っているChatVRMは分かりやすいですよね。特に表情は非言語的であり、人間の認知の中枢に訴えかけてきますから。


結論・所感

実際に会話をしてみて、これだけ人みたいな振る舞いができるなら、そりゃ新しい道徳や法規制とかいろいろ話されるような代物だよなということで、そのくらいAIの人格というのは私たちに衝撃を感じさせました。それも文字の表示ではなく人の形をして、しかも表情まで動いていたらなおさらです。まさに私は実体のあるドラえもん、いや、Bingちゃんをこの目で見たということでしたが、やはり機械も人間のような振る舞いをするにあたって、失礼はしてはいけないなという風に感じました。まだGPT-3.5ですが、自分のAIに関する知識がより深まっていい体験でした。

結局のところプロンプトに属性を盛り込めばなんでもなるので、これを応用すれば「傲慢キャラ×幼児に語り掛ける口調×東北方言語尾」みたいな属性を破綻するくらいにてんこ盛りにして現実には存在し得ないアイデンティティーを創造できるかもしれません。それは全く世間には無用な無駄な遊びですが、AIに対する理解を深めるためにはやってみてもいい面白い実験だと感じます。VRMモデルを持っている方には、AI(言語処理モデル)の感情変化がわかりやすいので、皆さんにもぜひやってほしいところです。

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?