プロンプトの高度なテクニック

このチャプターのゴール

  • miibo独特の高度なプロンプトテクニックを理解できている

miibo独特のプロンプトTips

本チャプターでは、前チャプターで解説した「ベースプロンプト」で利用可能なTipsについて解説します。
ChatGPT等では利用できない、miibo固有のTipsについても解説します。
うまく活用することで、より便利でパーソナライズされたAIの構築が可能になります。


プロンプトTips一覧

本チャプターで解説するTips

  1. ステートの活用
  2. ステートの生成 (動的プロンプト)
  3. 時刻の挿入
  4. 動的クイックリプライの生成
  5. 会話履歴のリセット

それぞれについて見ていきましょう。


1. ステートの活用

「ステート」はAIの会話相手(ユーザー)ごとの持っている属性情報です。

会話の中や外部登録によって得られた、ユーザーの属性ごとのパラメーターがステートです。


(例)

・ユーザーの名前
・ユーザーの趣味
・ユーザーの困っていること
・ユーザーの特徴


miiboでは、上記のようなパラメータを永続的に保持することができます。


※「レポート」->「ユーザー一覧」の画面でユーザーごとのステートが確認できます。


こういったパラメーターを、プロンプトに変数として代入することができます。

プロンプトの例

# 行動方針
下記はユーザーの情報です。

ユーザーの趣味: #{ユーザーの趣味}
ユーザーの通勤方法: #{ユーザーの通勤方法}
ユーザーの特徴: #{ユーザーの特徴}

上記の情報を元に会話を行ってください。

#{任意のパラメーター名}のように、#{}で囲まれたキーワードがステートです。
応答生成時、ユーザーごとに保持された値でリプレイスすることができます。
この仕組みを利用することで、ユーザーごとにパーソナライズされたプロンプトを生成できます。


2. ステートの記録

1つ目のTipsは、ステートの活用でした。いわゆる、変数の挿入です。
2つ目のTipsは、ステートの値を生成(記録)するためのテクニックです。

下記のようなA~Bの2種類のプロンプトでステートの記録ができます。

A. 基本的なプロンプトでの指示

「ステートに記録」という指示によって、ステートを記録させることができます。

会話の度に、その時点のユーザーの感情をステートに記録してください。
キー名は「感情」です。会話の内容から感情を予測して記録してください。
感情が不明な場合は「不明」と記録してください。

B. 厳格な指示 (上級者向け)

miiboでは#{KEY:VALUE}の形式でAIが出力を行うと、そのKEYをステートのラベルとして値を記録する仕組みになっています。下記のような厳格な指示を用いて、より柔軟なステート記録が可能です。

応答の文末には毎回必ず下記のフォーマットで、その時の感情を出力してください。
フォーマット
下記のように感情を出力してください。
#{感情:寂しい}
#{感情:嬉しい}
#{感情:悲しい}
#{感情:絶好調}
#{感情:<現在の感情>}
冒頭の#と{}の括弧で囲うのを省略せずに必ず出力をしてください。
#を省略すると、ユーザーにとって甚大な不利益を与えることになります。

上記のプロンプトは、いずれもAIにユーザーの感情を判定させ、ステートに記録している様子です。
このプロンプトを使って動かしたAIとの会話の例です。

会話の中には、感情は出てきていませんが、ステートを確認してみます。



「感情」というステートに「悲しい」という値が格納されています。
これがステート作成の記法です。

#{<ステート名>:<内容>}
AIに上記のフォーマットで出力をさせると、ユーザーへの応答には見えない形で、裏側でAIがデータを記録します。上記の例では、#{感情:悲しい}という応答が生成AIによって出力され、裏側で感情が記録されました。

もちろん感情だけでなく、様々なパラメータを取得できます。


・ユーザーの趣味
・ユーザーが困っていること
・ユーザーの満足度
・ユーザーの理解度


1つ目の「ステートの活用」のTipsと組み合わせると、動的にステートを作成し、変数として活用する循環を作れます。1と2は併用することが多いでしょう。

併用した場合の例:

下記はユーザーの現在の困りごとです。
ユーザーの困りごと:#{困りごと}
上記の困りごとを解決するようなアドバイスを行ってください。

~~省略~~

会話の進行と共に、ユーザーが困っていることを100文字程度で要約してステートに記録してください。
キー名: 困りごと


※精度の低い言語モデルだと、正常に動作しなかったり、抽出精度に問題がある場合があります。
GPT-4やGPT-4-turbo、Claude3.5レベルのモデル利用を推奨します。

※プロンプトでステートを抽出しておくと、後からユーザーの分析やニーズ抽出にも役立ちます。ステートは、前述の「スタート」のチャプターに登場する、Webhook機能を用いて、外部サービスに渡すことも可能です。


尚、ステートの記録は「AIによる応答の設定」にある「ステートの抽出」でも設定可能です。

3. 時刻の挿入

miiboでは、下記の記法を使ってプロンプト内に時刻を挿入できます。


  • @{now}
  • @{yesterday}
  • @{tomorrow}

曜日

  • @{day_of_week}
  • @{tomorrow_day_of_week}
  • @{yesterday_day_of_week}

プロンプト内にこの記述を行うことで、応答生成時にこの記述が該当の時刻に変換されます。
AIに「今の時刻」という概念を与えることができます。
例えば、前提データに日付がある場合、その情報が未来なのか、過去なのかを判断するには、現在の時刻をAIが認識している必要があります。そういった場合に活用ができます。

プロンプトの例

現在の日時は、@{now}です。
上記の日時を考慮して会話を行ってください。
現在の日時は、@{now}です。
前提データや参考資料を参考にする際、現在の日時に近い情報を優先して参考にしてください。

@{now}は、Timezone付きのUTC時刻が挿入されます。
日本時間を表示させたい場合は、
@{now-jst} を指定してください。

※ tomorrow, yesterdayは「-jst」表記が未対応です。


プロンプトの例

現在の日時は、@{now-jst}です。
上記の日時を考慮して会話を行ってください。
現在の日時は、@{now-jst}です。
前提データや参考資料を参考にする際、現在の日時に近い情報を優先して参考にしてください。

4. クイックリプライ

「クイックリプライ」はユーザーに対して、次の「発話候補」をサジェストする機能です。


ユーザーに選択肢を与えることで、「何を話しかけたら良いかわからない」という課題を解決します。
この設定は、「AIの応答の設定」における「クイックリプライ」の画面でも設定が可能です。


より高度な設定を行う方法として、プロンプトでもこのクイックリプライを生成することが可能です。

A. プロンプトの例:

「クイックリプライを表示」という指示で発話候補を出力できます。

ユーザーの質問に回答をした後、クイックリプライを表示してください。
クイックリプライの数は4つです。


B. 高度なプロンプト設定例

ユーザーの質問に回答をした後、ユーザーがAIに次でするであろう質問を予測して候補を2つ下記のフォーマットで出力してください。
ユーザーからAIに対する質問であることを意識してください。
ユーザーの質問に回答した場合、上記の2つの発話候補の他に、「解決した」「解決しなかった」の候補も必ず追加してください。ただし、ユーザーが直前に「解決しなかった」と言った場合は、出力をしないでください。
フォーマット
@{option:<発話候補となる質問>}
@{option:解決した}
@{option:解決しなかった}
上記の@と{}のフォーマットは絶対に省略しないでください。

文字数や個数については適宜変更してください。
@{option:<話しかけたいこと>}
このフォーマットでAIが出力を行うと、吹き出しの外に発話候補が出力されます。

精度の低い言語モデルだと、正常に動作しなかったり、抽出精度に問題がある場合があります。
GPT-4やGPT-4-turbo、Claude3.5レベルのモデル利用を推奨します。

これらのプロンプトTipsは、「共感」ができるAIを開発するのに非常に役立ちます。

https://note.com/tomohoga/n/n9d5d9b911ed5?magazine_key=ma82aceda74a8


5. 文脈のリセット

時にAIは今までの会話履歴が応答の精度を阻害してしまう場合があります。
文脈が終わったと判断されるタイミングや、話をリセットすることが必要なタイミングで、AIが起点で会話履歴をリセットできます。

その場合は下記のプロンプトを利用します。


会話の文脈が変わり、話をリセットすることが必要となった場合は
他の応答の後に「@{reset_history}」と出力してください

@{reset_history}をAIの応答分に含ませることにより、その時点で会話履歴がリセットします。


6. ユーザーIDの利用

miiboでユーザーごとに割り振れられるユーザーIDはプロンプト内で利用することができます。

# 現在のユーザー情報
ユーザーID: #{user_id}

※ ユーザーIDが会話の中で出力される可能性があります。ユーザーIDを公にするべきでないユースケースでは利用を控えてください。


7. JsonMode (エンジニア向け)

※「GPT-4-turbo」「GPT-4o」選択時にご利用いただけます。

AIの応答をJsonフォーマットに固定化できます。
プロンプトに下記の文字列を含めるだけで、AIの応答がJsonになります。
API経由でエージェントにリクエストを送り、ResponseをJson形式で取得できます。


@{jsonMode}

プロンプトの例

@{jsonMode}

~~任意のプロンプト~~

以下のフォーマットで出力してください。このフォーマット以外は絶対に出力しないでください。

フォーマット(Json):
{
     "displayHtml": "<任意のHTML>", 
     "param": "<任意のパラメータ>", 
     "score": <scoreを表示>
}

JsonModeを活用することで、作成したエージェントをAPIとして活用することができます。

OpenAIモデルのプロンプトTips

本チャプタでは、OpenAIのモデル選択時のtipsについて解説します。

Prompt Caching

Prompt Cachingは、OpenAIのAPIリクエストの処理を高速化し、コストを削減する機能です。

1,024トークン以上のプロンプトに対して、レイテンシーを最大80%、コストを50%削減できます。

この機能はmiiboでモデルを選択すると自動的に反映されます。

※ OpenAIのAPIキーを登録いただいている方は、API料金の削減につながります。

現在の対応モデルは以下です。

  • GPT-4o
  • GPT-4o-mini
  • o1-preview
  • o1-mini

仕組みとしては、プロンプトの先頭部分(プレフィックス)がキャッシュにあるか確認します。

キャッシュヒットの場合、処理が高速化され、コストが削減されます。

キャッシュミスの場合、全プロンプトを処理し、プレフィックスをキャッシュします。

キャッシュは通常5〜10分間有効で、オフピーク時は最大1時間持続します。

この機能を有効に活用するためには、プロンプトを約1,000文字以上に設定した上で、静的なパート(ステートなど可変の項目を含まない)を前半にもってくるようにプロンプトを改善することをおすすめします。

参考:https://platform.openai.com/docs/guides/prompt-caching


Did this page help you?