【FDO43】【会話文章生成 その3】プロンプト外の機能について
この記事は「おしゃべりクマちゃん🧸」シリーズの記事になります。インデックスはコチラ。前回の記事はコチラ。
今回はChatGPTのプロンプトの外で、通常のプログラミングによって作成した機能について紹介します😀
概要
発言生成機能は、基本的にプロンプトエンジニアリングによって実現していますが、一部それを補うために通常のプログラミングによって行っている処理があります。
行った処理のうち主要なものは、以下のものになります。
- 文章の正規化
- 変化するプロンプト
- 会話の履歴の管理
- 会話の要約
文章の正規化
前回までの記事の通り、ChatGPTのAPIにはプロンプトを通じて指示を出し、回答を生成させています。しかしながら、プロンプトの動作は確実なものではないため、回答の文章の形式には揺らぎが生じます。
例えば演じさせるキャラクタの名前を「太郎」だとすると、「こんにちは」という応答を返す場合でも
こんにちは
「こんにちは」
太郎: こんにちは
といったように、内容は同じなのですが、括弧がついたり、微妙な変化が起こることがあります。
このようなパターンを正規表現を利用して検出し、決まった形式に整形しています。
変化するプロンプト
場合によってキャラクタに異なる挙動をさせたい時は、プロンプトに「50%の確率で◯◯すること」などというように記載するよりは、事前にプロンプト自体を加工したほうが動作が安定します。
「◯◯すること」を含んでいないプロンプトを用意しておき、プログラム側で確率を計算して、50%以上の場合に動的に「◯◯すること」をプロンプトに文字列として追加する、ような形です。
発言生成機能では、プロンプト内に{additional_actions}
という文字列を埋め込んであり、これを
- 但し、文章に問いかけを含んではならない
- 但し、文章に絵文字を一つ含ませること
- 但し、感情表現の豊かな文章にすること
のうちからランダムに選んだ一つで置換しています。
発言生成機能では、前処理によってこのようにプロンプトの加工を行っています。
会話の履歴の管理
キャラクタとの連続した会話を実現するため、会話の履歴をセッションに記録しています。
これまでの会話の履歴を全てプロンプトに含めることで、キャラクタとの連続した会話を行うことが可能となります。
会話の要約
上記の通り、キャラクタとの会話の履歴を記録し、プロンプトに含めているのですが、プロンプトには4000トークン等の上限があります。そのため、一定量の会話しかプロンプトに含めることができません。そこで、限られたトークン内でなるべく多くの記憶を実現するため、トークン量が上限に近づいた場合に「これまでの会話を箇条書きに要約して圧縮する」という処理を行なっています。
要約の処理にも、ChatGPTのAPIを利用しています。要約用のプロンプトを用意し、これまでの会話を渡すことで、ChatGPTが要約を実行します。
要約は直近の会話については行わず、会話履歴の前半2/3のみを要約し、後半1/3はそのままの会話履歴として残すようにしています。これは、全体を要約してしまうと直近の会話の流れが失われてしまい、キャラクタの応答がちぐはぐしたものになってしまうためです。
また、要約の際にはキャラクタの発言のみを残して、ユーザーの発言は削除しています。相手の言っていたことは忘れてもそんなに不自然ではないのですが、自分の発言を忘れると不自然な感じがしたため、相手の発言は削除することでトークン数を稼いでいます。
ちなみに、自分の発言から相手の発言がある程度予想できるのか、相手の発言を削除して要約していても、それほど不自然な感じはしない気が個人的にはしています🤔
システム構成図
上述の機能を含むプロンプト外の機能については、全てPythonを利用して実装し、AWSにLambdaとして設置しています。
システム構成図
プロンプトはDynamoDBに保存し、プロフィールを差し替えることで複数キャラクタを実装できるようにしています。会話の履歴もDynamoDBに保存しています。
要約機能は本体とは別のLambdaとして実装し、トークン数が定められた量を超えた場合に非同期にキックするようにしています。
デモアプリはSvelteにて実装し、S3とCloudFrontにて配信しています。
開発用のUIにSlackを利用しており、Slackから発言生成機能の動作が確認できるようにもなっています。
動作デモ
前回と同じものになりますが、再度デモアプリを紹介しておきます。このデモアプリは、上述のプロンプト外の機能を全て含んだものとなっています。
デモアプリ動作画面
- (OpenAIのAPIの利用料金に上限を設定しているため、もしかしたらエラーになって動かないかもしれません。もし動かなくなっていたら、お金がなくなったんだな、と思ってください😅)
- (Lambdaのコールドスタートの関係でエラーになることがあるようです。その場合は、何度か話しかけたりリロードすると動き出すことがあります🙏🏻)
次回は、発言生成機能に関する、若干発展的な話題を紹介する予定です。
続きはコチラ。
Discussion