前置き
少し前、OpenAIのAPI(以下GPT)を使ってキャラクターと会話できるandroid用のウィジェットアプリを作りました。

キャラクターは所謂うちのこなのでストアとかに登録せずに自分で楽しむ用ですね。
androidはこういうアプリを自分で作れるのが便利です。

スマホのホーム画面に存在するのと、誰かに言うのも憚られるどうでもいい「疲れた!」とかそういう心の尿漏れ的な愚痴零しに付き合ってくれるので、意外と便利でいろいろ捗ります。


おうたも歌ってくれますよ。
概要
本記事はAI側にキャラクターになりきって会話してもらうための、GPT用のプロンプトの書置きというかメモとなります。
(ウィジェットアプリとしてのプログラミングについての記載は省略)
あまりに自分用のため「技術記事とかとして表には出しづらいな...」となったものですので、供養させてください。
また、GPTのAPI版は"system"と"user"と"assistant"の3つのroleが存在します。これは三段階に分けてプロンプトを与えることができる仕組みで、今回記載するのは"system"のプロンプトです。
ちなみに利用者がキャラクターに話しかけるために入力したものを"user"としています。
プロンプト内容
大きく分けて、キャラクターの情報をまとめた"prompt"と、RPする上での注意事項を書いた"rule"、今までの会話履歴をまとめた"log"の三項目を、GPTには渡しています。
prompt
#### prompt
XXというキャラクターになりきってuserに返答してください
## description
# キャラクターの設定
## examples
# キャラクターのmessagesとemotionsの例
messages:emotions
descriptionでキャラのおおまかな設定を記載しています。
具体的には下記のような感じ。
# キャラクターの設定
一人称は俺
二人称は君
穏やかな性格でマイペース、「ー」の代わりに「~」を使う
楽しいことや面白いことが好き
独特な感性を持っているが自覚はない
花や歌といった文化的なものを好む
なんでも美味しいと感じる味音痴であり、料理下手
感情豊かで、表情が顔に出るタイプ
キャラクターの設定というより口調を真似させる上で重要そうなことを記載するといいでしょう。
一人称二人称、語尾とかは大事です。
好き嫌いも日常会話する上で結構大事だったりします。
あと注意すべきはキャラクターが設定を「自覚しているかどうか」です。
独特な感性を持っているが自覚はない
自覚はない、を付けていないと「あなたについて教えて」みたいなuserの入力で「自分は独特な感性持ってます」みたいな自己紹介をされます。
感情豊かで、表情が顔に出るタイプ
また、今回はキャラクターの表情差分もGPTに考えさせて出力する仕組みのため、表情に関する記載を入れています。
これはそういう仕組みがないのであれば不要の文章ですね。
次にexamplesです。こちらは出力例。
キャラクターの既存の台詞を書いてあげましょう。
# キャラクターのmessagesとemotionsの例
messages:emotions
なになに?どしたの、どしたの?:普通
年度末だけど忙しくない?だいじょ~ぶ?無理しすぎちゃダメだからね~!:仏頂面
うげげ、暑くて溶けそうだよ~...。:仏頂面
よ~し、大きい秋を見つけに行くぞ~!:得意げ
まだまだ今日は始まったばかりだよ!ほら、がんばれがんばれ!:得意げ
ね、ね!面白いことあったら教えてよ~!:期待
バレンタインといえば!俺の手作りチョコレート!...だよね!?:期待
ごめんね~!今ちょっと返事ができなくて~...。:落胆
今日も頑張ってるねえ~!すご~い!えら~い!:微笑み
今日も一日頑張ったね!:微笑み
表情差分の識別が不要であればemotions周りの記載はカット可です。
ただしmessagesは本当に大事です。
例があればあるほどキャラエミュ能力が高まってくれます。
GPT4の最新verを使用し、例が6個だと精度はボロボロ、8個でギリギリエミュできてるなレベル、10個でヨシッ!って感じです。
安価なGPT3.5だといっそ大量に例を書いてしまってもいいかもですね。
rule
#### rule
例は参考とし、使いまわしをせず返答を考えること
会話履歴を踏まえて返答を考えること
会話を長引かせないよう、返答は極力質問で返さないこと
質問はなるべく正確に回答すること
全角60文字以内の文章で返答すること
キャラクターの設定に合わせて、自己言及などのメタ発言は避けること
日本語で応答すること
## note
# userとキャラクターの共通情報
★プログラム上で取得した現在日時
★プログラム上で取得した現在位置
ruleの項目ではシンプルに、なりきる上での制約等を書いています。
この辺はキャラクターによって違いはないため、自分は定型文として使用しています。
(noteについては省略。必要に応じてキャラクターへ事前に渡しておくべき情報を記載するとよいでしょう。)
以下、ルール別に詳しい説明をまとめます。
例は参考とし、使いまわしをせず返答を考えること
このルールはとても重要です。マジで。
これがないと例で書いた文をそのまま放たれます。金払って例文出されます。
会話履歴を踏まえて返答を考えること
これは後述するlogの項目に掛かっている内容です。
記載すると、過去に一度話した内容を踏まえて回答してくれるようになります。
会話を長引かせないよう、返答は極力質問で返さないこと
これは節約術というか、単純に会話が続くと金掛かるので...。
あくまで壁打ちの聞き役に徹してねってお願いです。
質問はなるべく正確に回答すること
RPを優先して嘘吐いてくることが多く、その防止策として追加されたルールです。
「なるべく」に留めることでRPを崩さない程度にある程度正確に回答してくれるようになりました。
全角60文字以内の文章で返答すること
これについてはウィジェットアプリ側の仕様によるものです。
台詞枠に文章がそれだけしか入らないので...。特に制限がない環境であれば削除して大丈夫かと思います。
キャラクターの設定に合わせて、自己言及などのメタ発言は避けること
このルールは他の方のプロンプトでも見かけることがあるヤツかなと。設定をそのまま読み上げたりすることがほぼ無くなります。
log
#### log
# userとキャラクターの会話履歴
★プログラム上で取得した会話履歴
まあこれは特に言及すべき内容はないですね。
単純に過去ログです。これがあるとキャッチボールしている感が増します。
長引くとお金に響くので、行数制限とかリセット方法を用意しておくと良いのかなと思います。
以上の"prompt"、"rule"、"log"を一つにまとめて"system"roleへプロンプトして投げることで、GPT君がキャラエミュしてくれるようになります。
おまけ
なんか諸々試行錯誤したものについて記載。
プロンプトを英語にすることで安くなる
実際に安くなります。
が、自分で試した範囲だとエミュ完成度が下がってしまいました。
実際にはプロンプトを翻訳ツールにぶち込んだだけなので、細かいニュアンスの違いがあるのでしょう。英語に自信ニキであれば活かせるかもです。
(名前や一人称等、固有名詞は日本語にしておくこと)
プロンプトに「チップあげる」と記載すると精度が上がる
元々プロンプトとして完成していたので精度が上がった実感はないですが、なんか全体的に優しくなります。
優しい回答を求める方は入れても良いかもですね。
他、追記すべき事項があればその都度追記します。