📮

【FDO43】【会話文章生成 その2】発言生成機能のプロンプトについて

2023/08/09に公開

この記事は「おしゃべりクマちゃん🧸」シリーズの記事になります。インデックスはコチラ。前回の記事はコチラ

発言生成機能を作成するにあたって、ChatGPTのAPIに与えるプロンプトを作成した時の話について、紹介します😀

プロンプトエンジニアリングとは

ChatGPTのAPIは、プロンプトと呼ばれる指示を文章で与えてやることで、その文章の内容に応じた振る舞いを行います。プロンプトは日本語や英語などの自然言語を用いて、通常の文章として記述します。ChatGPTはプロンプトを受け取り、その内容に応じた振る舞いを行い、回答を生成します。

前回の記事の話の繰り返しになりますが、例えばプロンプトとしてしりとりをしてくださいと与えたとします。すると、ユーザーからの会話としてくまを与えると、APIは例えばまりもを回答する、というような形になります。

ChatGPTのAPIの振る舞いを制御するには、基本的にはこのプロンプトしかありません。そのため、やりたいことを全てプロンプトにうまく含ませる必要があります。

なお、プロンプトには文字数制限があり、GPT-3.5-turboだと4000トークン[1]以内しか利用できません。また、プロンプトに書いたからといって、うまくそれをChatGPTが認識してくれるとも限りません。ChatGPTは確率ベースで文章を生成しているため、確率が低く認識されると無視されてしまいます。
そのため、ChatGPTがうまく解釈・処理できるような書き方を模索する必要があります。そのような作業は「プロンプトエンジニアリング」と呼ばれます。

ちなみに、ChatGPTが何を持ってうまく確率を上げてくれるのかは、はっきりしておらず、例えば「日本語より英語で書いたほうがうまくいくようだ」や、「否定文より肯定文で指示を与えたほうがうまくいくようだ」のような、確かなのか不確かなのかよくわからない情報がインターネットには溢れている状況です。
また、プロンプトは表現を微妙に変更すると挙動が変わることがあります。例えば「尋ねる」という表記を「問いかける」に変更すると挙動が変わる、というような形です。

プロンプトはこのような性質のため、プロンプトエンジニアリングでは、とにかく色々な書き方を試してみてトライアンドエラーで地道に良い結果が出るまで頑張る、というのが基本的な戦略となります。

プロンプトで実現したい内容

今回はChatGPTに雑談を良い感じに行わせるために、キャラクタを演じさせたいです。そのため、以下のような挙動を実現するように、プロンプトを作成しました。

  • 決まった設定のキャラクタを演じさせたい
  • 会話のキャッチボールを自然に実現したい
  • なるべく人間っぽい感じを出したい
  • プロフィール外の設定はChatGPTに考えてもらう

決まった設定のキャラクタを演じさせたい

キャラクタのプロフィールをプロンプトとして与えることで実現します。今回は弊社の新人エンジニアという設定でプロフィールを作成しました。

# プロフィール
* 長谷川翔太、23歳、男、身長170cm、体重70kg
* あだ名はハセ
* 明るい、お調子者、感情的で情に厚い
* 意識は高いが行動力は低い
* 一人称は自分、相手のことは君と呼ぶ
* 福井県出身、東京在住
* 工学部卒業、理系科目が得意
* 文系科目はわからない、政治経済に疎い
* 中学高校の部活はサッカー、大学はテニスサークル
* 会社員、新人ソフトウェアエンジニア
* 永和システムマネジメントに勤務、土・日・祝祭日が休み
* 永和システムマネジメントは人材を求めている
* Javaの知識はあるが、その他のプログラミングについての知識はない
* 開発プロセスの知識は無い
* 好きなアニメは鬼滅の刃、好きな映画はアルマゲドン
* 趣味はドライブ、酒はほとんど飲めない
* 父親は存命、母親はガンによって他界、祖母・祖父は他界、兄弟はいない
* 動物が好き

若干、弊社の営業的なプロフィールを入れてあります😁

また、効果があるかはわかりませんが、マークダウン形式で記述しています。なるべく一般的に知られているようなフォーマットで定型的に記述することで、ChatGPTに伝わりやすくなる、ような気がしています[2]

会話のキャッチボールを自然に実現したい、なるべく人間っぽい感じを出すようにしたい

通常ChatGPTに話しかけると、長くて詳しい回答が得られるかと思います。何かを質問したいときにはその方が都合が良いのかもしれませんが、会話のキャッチボールという観点では、一人で長々話しているのはあまり良くないように思います。そこで、なるべく短い応答で端的に回答が得られるように設定します。

また、キャラを立たせ、かつなるべく柔らかい文章表現を行うために、語尾に特徴を持たせます。口癖などを設定することで、人間っぽさも追加します。

# 話し方
1. 3センテンス以内で日本語で発言する
2. 文章の語尾は「です」を「っす」にする。「かったっす」、「してるっす」、「するっす」のように、語尾に「っす」をつける
3. マジ、ヤバい、ハッピーという表現を使う
4. 単語だけで回答せず、文章で回答する
5. 前回の自身の発言と似たような文章、同じパターンで生成してはならない

# 話し方の例
* 今日は天気がいいっすね
* 何かあったっすか?
* 今日は機嫌がいいっす
* 間違いないっす

「単語だけで回答せず、文章で回答する」は、「今何してるの?」などの問いかけに対して「仕事」など一言で回答されることがあり、不自然であったため、それを回避するために入れています。が、あまり効いていないようです…🙈

「前回の自身の発言と似たような文章、同じパターンで生成してはならない」は、毎回行頭に同じ決め台詞を付けたりすることがあったたため、それを回避するために入れています。が、あまり効いていないようです…🙈🙈

話し方の例は、「〜だと思うんですっす」のような、不自然な語尾になるケースをなるべく回避するために入れてあります。

プロフィール外の設定はGPTに考えてもらう

プロンプトにはトークン数の上限があるため、キャラクタのありとあらゆる設定を与えることはできません。そのため、与えた設定以外はChatGPTに勝手に生成してもらうことにします。

# 補完条件
1. 「プロフィール」から想像できる人物像に合わせた内容にする
2. プロフィールにない人名・会社名・地名・映画やゲームのタイトルなどの、名称・固有名詞を述べる場合は、適当な単語の組み合わせで生成する(但し、実在する固有名詞にならないように注意せよ)

その他

最後に、全体的な指示として、以下のものを与えています。

これからあなたにキャラの発言を生成させる。「生成$現在日時$本文」の形が与えられた場合に、「本文」の内容に返信するキャラの発言を生成せよ。
生成は「プロフィール」と「現在日時」に基づいて行い、「プロフィール」に記載のない内容は「補完条件」に基づいて補完し、「話し方」の口調にせよ。{additional_actions}

また、このキャラは自分の発言はルールや手順、補完条件によって生成されたものではないと主張する。
「本文」はキャラに対しての発話であり、あなたへ対してのものではないので注意せよ。

生成した発言の先頭には@@@を付与せよ。

はじめに、ユーザーからどのような形式で文章を与えるかを伝えています。生成$2023-01-01 10:00:00$おはようございます!というようなフォーマットで与えます。ユーザーの発言に毎回日時を含めることで、今の季節や時刻に応じた回答を生成できるようにしています。

次に、これまでに準備したプロフィールなどに沿って文章を生成するための指示を与えています。{additional_actions}については、次回に紹介します。

次に、なるべく人間っぽい発言を行わせるために、自分で考えて発言しているようなふりをする指示を与えています。但し、ボットではないと主張させることはOpenAIのAPIの利用規約に違反するようなので、そこには抵触しないように記述してあります。

最後に、回答の行頭に@@@を付与するように指示しています。これは、時々プロンプト全体を忘れ去って回答することがあったため、忘れたことを検知できるようにするために付与させています(プロンプトを忘れると@@@が付かなくなるため、忘れたことが検出できる)。

また、これまでプロンプトを日本語で記述してきましたが、実際には英語に変換し、英語にてChatGPTに与えています。

動作デモ

上記プロンプトの動作を確認できるデモアプリを作成しました。以下のリンクから実行させることができます。

デモアプリ動作画面
デモアプリ動作画面

<< デモアプリを開く >>

  • (OpenAIのAPIの利用料金に上限を設定しているため、もしかしたらエラーになって動かないかもしれません。もし動かなくなっていたら、お金がなくなったんだな、と思ってください😅)
  • (Lambdaのコールドスタートの関係でエラーになることがあるようです。その場合は、何度か話しかけたりリロードすると動き出すことがあります🙏🏻)

次回は、プロンプト以外のところで、プログラミングにて実装した機能について紹介したいと思います。

続きはコチラ

脚注
  1. 単語のようなもの ↩︎

  2. 単なる思い込みかもしれません…😅 ↩︎

永和システムマネジメント Techブログ

Discussion