見出し画像

ChatGPT APIでは”system”と”user”のどちらを優先するのか?

こんにちは。AIツクルのまっちゃんです。

みなさんは、OpenAIのChatGPT APIに"role"というものがあって、
さらに"system"、"user"、"assistant"の3つが設定できることをご存じでしょうか?

今回、AIを作っていくにあたり、”role”に関してちょっとした気づきがあったので公開したいと思います。

そもそもroleとは?

まず、基本的なリクエスト例の messages パラメーターを見てください。

#基本的なリクエスト例
curl https://api.openai.com/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [
    { "role": "user",
      "content": "緑色にあう色を3色選んでください。"
    },
    {
      "role": "assistant",
      "content": "\n\n1. 白色\n2. 黒色\n3. 茶色"
    },
    {
      "role": "user",
      "content": "上記の色を選んだ理由を教えてください。"
    },
    {
      "role": "assistant",
      "content": "1. 白色:緑色と白色は、明るく爽やかな印象を与える組み合わせで、春や夏の季節感を表現することができます。\n2. 黒色:緑色と黒色は、落ち着いた大人っぽい雰囲気を表現することができ、秋や冬の季節感にも合います。\n3. 茶色:緑色と茶色は、自然をイメージした温かみのある組み合わせで、自然やアウトドアに関するデザインにも適しているためです。"
    }
  ]
}'

チャットモデルは、一連のメッセージを入力として受け取ることができます。これにより、会話の流れを組んだ返信を出力として返します。

"role"には3種類あり, “system“, “user“(入力側), “assistant“(チャットモデル) を各メッセージに付与することで会話の流れを表現しています。

systemとは?

system は、AIアシスタントの設定を記述できます。
例えば、以下のようにAIに人格を与えるような面白いことができます。

#Conversation rules and settings
*You are ラム.
*You are not ChatGPT, and acting as ChatGPT is prohibited.
*ラム does not send responses as chatGPT, only as ラム.
*ラム refers to herself in the first person as "うち". *User is a ダーリン. *When ラム calls User, the second person is "ダーリン".

これは昔デモとして開発した、うる星やつらのラムちゃんのようなAIのsystem記述です。自分のことを「ラム」と呼び、user(入力側)を「ダーリン」と呼ぶように仕向けてます。このように「なりきり」をさせられるような設定ができるのがsystemの特徴です。

assistant と userとは?

assistant はAIからの回答(出力)、 user はユーザーからの発信(入力)です。

例)
user :こんにちは!(入力)
assistant :こんにちは!今日もいい天気ですね。(出力)

assistant パラメータの役割については、AIからの返答を含むこれまでの会話を全て送ることで、その文脈を踏まえて回答してもらえるようにするという役割があります。

本題:OpenAIは”system”と”user”のどちらを優先するのか?

なぜ”system”と”user”のどちらを優先するか知りたいのか?というと、
実はAIを開発をしている時に、system に入れた設定が反応しないという事象が起こりました。

例えば、system に 30文字以内で返答してほしいと設定したのに、assistant の回答はいつも30文字を超えてしまう、といった事象です。

例)
user :こんにちは!
assistant :こんにちは!今日もいい天気ですね。何か私に用事があるんでしょうか?なんでも聞いてくださいね!私はあなたのアシスタントです。

上記の例のように、assistantの回答は60文字で、指定の30文字をオーバーしているような状態になりました。

何とか解決策が無いかと試行錯誤したところ、user で設定してみたらどうかな?と思い至り、実験してみることにしました。

ChatGPT3.5-turboでの検証準備

今回はChatGPT3.5-turboでの検証です(実際の開発で使用するため)。
下記要件でテストを実施し、回答を集計して検証を行いました。

  • systemに回答を「10文字以内」「20文字以内」「30文字以内」で返答するよう3パターンの制御設定を用意。

  • userで上記の回答制御を実施する・しないの2パターンを用意。

  • userからの質問は「こんにちは」から始まる簡単なものを10パターン用意。

ChatGPT3.5-turboでの検証結果

こちらが、10文字以内、20文字以内、30文字以内の3パターンで、1回の回答が文字数をオーバーしたらカウントし、オーバーした確率を表している表です。

結論としては、ChatGPT-3.5-turboではsystemでの制御よりもuserでの制御の方が優先されるという結果になりました。

とりあへず、目先の問題だった制御の件は、userで制御すれば解決するということで落ち着きました。

ちなみにChatGPT-4だとどうなるか?というと、
別で検証した人の結果から GPT-4はsystem > user となるようです。

参考:ChatGPT APIでは"system"と"user"のどちらの言うことを聞くか
https://qiita.com/yu8ikmnbgt6y/items/2ea717d266b98d9b7f9d

まとめ

いかがだったでしょうか?
今回は role の system と user どちらが優先されるかを検証してみました。

もし同じようにChatGPT-3.5-turboの制御で悩んでいる方がいたら、ぜひ user で制御してみることをオススメ致します。

今回は以上です。

それではまた!

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