このページの本文へ

FIXER Tech Blog - AI/Machine Learning

FIXER cloud.config Tech Blog

ChatGPTのプロンプトを工夫して思いどおりの出力にする

2023年06月23日 10時30分更新

文● 富田大喜/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「ChatGPTに昼食を考えてもらう話」を再編集したものです。

はじめに

 こんにちは!!

 最近焼きサバにハマっている富田です。

 研修でChatGPT入門して、そろそろ1ヵ月たったかと思います。

 この記事ではその間に得られた知見を、「1週間の昼食を考えてもらうプロンプト」を作る過程を見せながら共有したいと思います。

フォーマットを指定する

 まずは素直に以下のようなプロンプトを書いてみます。

 すると、以下のようになります。

 いかにも健康そうなメニューですね(笑)

 このままでも良いような気がしますが、せっかくなのでアプリケーションにしたいとします。

 そうすると、ひとつ問題が生じます。

「プログラムとの連携、難しい」

 実際にプログラムとChatGPTを組み合わせるためには、ChatGPTからの出力をプログラムで読む必要があります。

 しかし、ChatGPTからの回答には、「以下は、一週間の昼食のサンプルメニューです。~」のような、プログラムで処理するには邪魔になる説明の文字列が入っています。

 プログラムとChatGPTを連携させるには、こういう余計な情報を避けて、必要な情報を構造体に収めるというような処理を頑張って実装する必要があります。

 正直面倒くさいですよね。JSONで欲しいです。

 そこで、先ほどのプロンプトに以下のようにフォーマットの指定を付け加えてみます。

 すると、以下のような出力になります。

 JSONになってますね!

 このように、具体的なフォーマットを渡すことで、そのフォーマットで出力させることができるようです。

より具体的に説明する

 ChatGPTにJSONを出力させることに成功しました。

 しかし、これはしばしば想定とは違う出力を返します。

 例えば、以下のような出力です。

 「自分で考えろ」とか言ってきましたよコイツ(怒

 JSONが出てはいますが、前後に余計な文字列が入っているうえに、JSONには入るべきメニューが入っていません。

 この原因は、指示が曖昧だからだと思います。

 <メニュー>の生成方法について、もう少し詳しく指示します。

 これを渡すと、以下のような出力が返ってきます。

 何度か実行しましたが、こちらは上手くいってそうです。

 このように、ChatGPTが想定外の出力を出す場合は、指示をより具体的にするといいようです。

途中計算させる

 ChatGPTに1週間の昼食を考えてもらうことは上手くいきました。

 今度は、1週間の昼食を5000円以内に収めたいとします。

 まずは、素直にプロンプトを書いてみます。

 結果は以下のようになります。

 この例でも前後に説明が入ってしまっていますが、この対策は後述します。

 ChatGPTは5000円以内になるようにメニューと値段を選択したと言ってますが、計算してみると5200円なので若干オーバーしています。

 そこで、少し丁寧にして途中計算を挟みましょう。

 以下のように手順を分割してみます。

1. 昼食の候補とその値段を生成する。
2. 合計が5000円以内になるように昼食のリストを生成する。
3. 合計が5000円を超えていたら、再度リストを生成させる。

 プロンプトは以下のようになります。

 かなり複雑になっていると思うので、説明します。

 まず、このプロンプトは、大きく分けて3つの手順からなっています。

 ひとつ目はCandidateForLunchの生成、2つ目がPreLunchListの生成、3つ目がLunchListの生成です。

 上に挙げた手順の箇条書きとちょうど対応しています。

 ひとつ目のプロンプトでCandidateForLunchと名前を付けた箇条書きを生成して、2つ目のプロンプトでそれを使用してPreLunchListを生成しています。

 PreLunchListの合計が5000円以内に収まっていなかった場合、再調整した内容を3つ目でLunchListとして出力します。

 では、やってみましょう。

 PreLunchListの段階では5550円でしたが、LunchListでは4450円になっていますね!

 このように、箇条書きを出力させて、それを利用することで途中計算をさせることができます。

マーカーを置かせる

 途中計算をさせることで、ある程度複雑な処理もできるようになりました。

 しかし、実際にプログラムで使いたいのは、一番最後に出てきたLunchListだけです。

 そこで途中計算を除いて、必要な情報だけ出力させるようにしましょう。

 具体的には、以下のようなプロンプトを最後に追加します。

 フォーマットに注目すると、JSONの出力が!!!  OUTPUT !!!という文字列で挟まれています。

 ここでは、!!! OUTPUT !!!のことをマーカーと呼ぶことにします。

 これを入力すると、最後に以下の出力が増えます。

 フォーマットで指定した通り、マーカーも出力されています。

 こうすることで、プログラム側ではマーカーの間を切り抜く処理を追加するだけで出力のJSONを得られます。

まとめ

 今回は、「1週間の昼食を考えてもらうプロンプト」を例として、

・出力のフォーマットを指定する方法
・そのフォーマットをより具体的に説明する方法
・手順を詳細に説明するために途中計算をさせる方法
・プログラムと連携するためにマーカーを出力させること

 について説明しました。

 この記事の例でも、「自分で考えろ」みたいな出力をはじめ、うまく動かないときがあるので、そういった想定外の出力にどう対応したらいいかを今後、さらに学んでいきたいと思います。

富田大喜/FIXER
(とみた たいき) 思い付きと好奇心で動く元学生エンジニア(自称)です。2023年にFIXERに入社しました。日々精進です!

カテゴリートップへ

この連載の記事