見出し画像

プロンプトエンジニアリングガイドを読んで基礎概念をまとめた

世の中にはさまざまなプロンプトのフォーマットがたくさんあります.
また,こんなことやってみた!みたいな記事やツイートもかなり見かけますが,自分自身が使いたいように思うがままにカスタマイズするには基本を理解する必要があると思い読むことにしました.

プロンプトエンジニアリングガイド自体は,LLMに関する論文やら講義やらサンプルプログラムやらをまとめたものです.こちらのGithubです.

読んだのはこちらの日本語ページです

ベーシックフォーマット

ベーシックフォーマットはこれ

Q[ここに入力を書く]
A

指示文に含めるベーシックな情報はこれ

  • 命令:タスクの内容→書く,分類する,要約する,翻訳する,並べ替える,など

  • 文脈:外部情報,追加の文脈,回答の例や思考方法など

  • 入力:入力,質問など

  • 出力形式:タイプ,形式を支持する

ポイントは,フォーマットにこだわる必要はなく,明示されていればいいという所です.
例えば,Qの代わりに区切り文字を使って指示を入れることができます.

### 指示内容 ###
Text を HOGE しなさい
Text : あんなことやこんなこと

詳細を指定するフォーマット

出力形式を指定したり,解答例を示すこと(Few-shotという)で精度を上げることができます.

出力形式の指定

Q:TextをFormat形式で〜しなさい
Format:HOGE
Text:HOGE
A:

この出力形式とは「カンマ区切りのリストで」「140字以内で」という文章構造の形式に関わらず,「5歳児にもわかるように」や「高校生に対して説明するように」という表現方法の指定もすることができます.

分類の解答例を教示

TextをA,B,Cに分類せよ
Text:HOGE
Aです
Text:FUGA
Bです.
Text:PIYO

これもフォーマットを固定する必要はなく,明示されていればいいので,次のように置き換えることもできます.

TextをA,B,Cに分類せよ
HOGEは? // Aです
FUGAは? // Bです
PIYOは?

この分類の解答例を教示とは,同じ回答をするにしても表現はさまざまであり,正しい動作方法や望むような回答方法に近づけるようにサンプルを示す,ということだそうです.

多段で考えさせる

一発でQ→Aと答えが出ないもの,〜をすると〜となるから〜という答えになる的な3段論法が必要なもの(Chain-of-Thoughtという)は一発では答えを返してくれません.例文を本文から転載します.

このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。

奇数を抽出→合計→偶数か判断というフローが必要になります.
こんなときは次のように対応します.

  • 「ステップバイステップで考えましょう」とつける

  • 処理フローを記載する

このグループの奇数を合計すると偶数になります。: 489151221。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります。: 171019481224。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります。: 161114481324。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります。: 17910121342。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15325138271。
ステップバイステップで考えましょう。
A: 

この方法だとステップバイステップで答えが返ってくることがあります.

つまり答え方を絞れないです.
そこで,次のように処理フローを記載してしまう方が答え方を絞れそうです.(解答例を教示しているのに近い).

※次のプロンプトは本文より転載したものです.

このグループの奇数を合計すると偶数になります。: 489151221。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 171019481224。
A: 奇数を全て加えると(17, 19)36になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 161114481324。
A: 奇数を全て加えると(11, 13)24になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 17910121342。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15325138271。
A:

これ,よく見ると「〜しなさい」という直接的な指示はないんですよね.
それでも動きます.

自分たちで開発するアプリに使うためのヒント

プロンプトガイドにはこんなようなことが書いてあり,何をさせるのかを明確に指示した上で,入力と出力のペアを与えてやるとよさそう,という気持ちになりました.

ここの設計はアプリケーションの設計にもつながる気がします.
上のChain-of-Thoughtの文章を例にとって考えてみます.
作成するアプリケーションは,入力した数値のうち奇数を合計すると偶数になるかどうかを返すアプリです.
システムメッセージとしてを組み込んでおきます.

このグループの奇数を合計すると偶数になります。: 489151221。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 171019481224。
A: 奇数を全て加えると(17, 19)36になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 161114481324。
A: 奇数を全て加えると(11, 13)24になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 17910121342。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。

アプリが受け取る入力はカンマ区切りの数値です.受け取った入力を次のように当てこみます.
(ここからpythonっぽく書きますが超適当です.)

text = [15325138271]
question = f"このグループの奇数を合計すると偶数になります。: {text}。A:"

出力はこのように得られます.

answer = 奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。

(前略)答えは[True/False]です。と返ってくるので,TrueなのかFalseなのかを取得するようにすればいいわけですね.(適当に取得します)

result = "True" in answer