ChatGPTが騒がれ始めてからずいぶんと月日が流れ、問題点を多く指摘され、そろそろなんでもっと効率的に使うことができないのだろうかと悩み始めていました。そんなとき(Deaplearning.AI)[https://learn.deeplearning.ai/]のショートコースを知りました。おすすめはChatGPT Prompt Engineering for Developersです。驚くべきことにAPIのkeyがなくてもPythonでchatGPTのAPIを実試すことができます。下の画面中央の部分がそれにあたります。日本語版の開始が待たれるところです。
幾つかのショートコースを学んでみて、このChatGPT Prompt Engineering for Developersが一番大事だと悟りました。かつ、このコースを最後まで行うまでには結構な時間を要します。最終的にチャットボットつくるのですが、単に普通にChatGPTやGPT4をチャット形式で使うにはそこまでの知識は必要ないと思いました。以下、それをまとめました。おどろいたことにチャットGPTはAPIから命令が来たのか、チャット画面の入力から来たのかの認識はないようです。つまり、どちらを使おうと同じだということです。1つの違いは会話形式では各会話セッションの記録は持っている参照できるようです。APIではそれがないようです。以下の内容は英語版を日本語版に翻訳してあります。また、日本語にする際に若干の修正をしています。英語版の内容を部分選択しています。翻訳にはchatGPT4を使っています
プロンプトの原則¶
原則1: 明確かつ具体的な指示を書く
戦術1: 区切り文字を使用して、入力の異なる部分を明確に示す
戦術2: 構造化された出力を求める:JSON、HTML、EXCEL
戦術3: モデルに条件が満たされているかどうかを確認するように求める
戦術4: "フューショット" プロンプティング
原則2: モデルに「考える」時間を与える
戦術1: タスクを完了するために必要な手順を明示する
戦術2: 結論に急ぐ前に、モデルに自分自身の解決策を考えさせる
原則1: 明確かつ具体的な指示を書く
それでは、最初の原則について詳しく見ていきましょう。それは「明確で具体的な指示を書く」です。モデルに何をさせたいのかを明確に表現すべきです。可能な限り明確で具体的な指示を提供することで、それを実現します。これにより、モデルは望ましい出力に向かい、関連性のないまたは不正確な応答を得る可能性が減ります。
明確なプロンプトを書くことと短いプロンプトを書くことを混同してはなりません。多くの場合、長いプロンプトがモデルに対してより明確な文脈を提供し、それが実際にはより詳細で関連性のある出力につながります。
戦術1: 区切り文字を使用して、入力の異なる部分を明確に示す
明確で具体的な指示を書くための最初の戦術は、区切り文字を使用して明確に示すことです。区切り文字は、、
、< >、 、: など、何でも良いです。そして、テキストやデータなどの入力の異なる部分を区切るために使用します。区切り文字は、データの構造を明示し、データの解析や処理を容易にします。
例をお見せしましょう。
text="モデルに何をさせたいのかを表現するためには、できるだけ明確かつ具体的な指示を提供する必要があります。
これにより、モデルは望ましい出力に導かれ、関係ないまたは誤った回答を受け取る可能性が減少します。
明確なプロンプトを書くことと短いプロンプトを書くことを混同しないようにしましょう。
多くの場合、長いプロンプトは、モデルにとって明確な文脈を提供し、
それはより詳細かつ関連性のある出力につながります。"
prompt="バッククォートで区切られたテキストを1文で要約してください。"
この例をJupyter Notebookに貼り付けてみましょう。これはただの段落です。そして、私たちが達成したいタスクはこの段落を要約することです。なので、プロンプトでは、バッククォート1つで区切られたテキストを1つの文に要約するように指示しています。
ご覧の通り、私たちは文章の出力を受け取り、それをこれらの区切り文字を使用して、モデルに対して非常に明確に要約すべき正確なテキストを示しています。区切り文字は、特定のテキスト部分をプロンプトの残りの部分から分離するための明確な句読点となります。これらは、トリプルバッククォートや引用符、XMLタグ、セクションタイトルなど、モデルに対してこれが別のセクションであることを明確にするものです。
text="モデルに何をさせたいのかを表現するためには、できるだけ明確かつ具体的な指示を提供する必要があります。これにより、モデルは望ましい出力に導かれ、関係ないまたは誤った回答を受け取る可能性が減少します。明確なプロンプトを書くことと短いプロンプトを書くことを混同しないようにしましょう。多くの場合、長いプロンプトは、モデルにとって明確な文脈を提供し、それはより詳細かつ関連性のある出力につながります。 "
prompt="バッククォートで区切られたテキストを1文で要約してください。"
戦術2: 構造化された出力を求める:JSON、HTML、EXCEL
次の戦術は、構造化された出力を求めることです。モデルの出力を解析しやすくするために、EXCELのような構造化された出力を求めると便利です。例えば、プロンプトでリストの生成を指示し、それが3つの架空の書籍タイトルとそれらの著者、ジャンルのリストであるとします。それらを次のキーを持つEXCEL形式で提供するよう求めます: book ID、title、author、genre。この形式に従うと、得られた出力は整然とします。
prompt="""以下のキーを含むEXCEL形式で、架空の書籍タイトル3つとその著者、ジャンルをリストアップしてください:
book_id、title、author、genre。"""
戦術3: モデルに条件が満たされているかどうかを確認するように求める
次の戦術では、モデルは条件が満たされているかどうかを確認します。タスクが特定の前提を満たさない場合、モデルにこれらの前提を確認させます。前提が満たされていない場合は、タスクを中止し、それを明示します。また、予期せぬ状況が起きたときや、モデルがそれらの状況をどのように処理すべきかを検討することも重要です、これにより予期しないエラーや結果を避けることができます。
Text="""お茶を作るのは簡単です!まず、水を沸かし始めます。それが進行している間に、カップを取り出し、ティーバッグを入れます。水が十分に温かくなったら、それをティーバッグの上に注ぎます。少し放置してお茶を蒸らします。数分後、ティーバッグを取り出します。お好みで、砂糖やミルクを加えることができます。それでおしまい!美味しいお茶のカップを楽しむことができます。"""
Prompt="""トリプルクォートで区切られたテキストが提供されています。
それが一連の指示を含んでいる場合、以下の形式で指示を再記述してください:
ステップ1 - ...
ステップ2 - ...
...
ステップN - ...
テキストに指示の連続が含まれていない場合は、
単に「指示は提供されていません」と記述してください。
"""{text_1}"""
text="""今日は太陽が明るく輝いていて、鳥たちが歌っています。公園で散歩するのに最適な美しい日です。花々は咲いていて、木々はそよ風で優しく揺れています。人々は外出して、素敵な天気を楽しんでいます。ピクニックを楽しんでいる人もいれば、ゲームをしたり、単に芝生でくつろいでいる人もいます。自然の美しさを感謝し、屋外で時間を過ごすのに完璧な日です。"""
prompt="""トリプルクォートで区切られたテキストが提供されています。
それが一連の指示を含んでいる場合、以下の形式で指示を再記述してください:
ステップ1 - ...
ステップ2 - ...
...
ステップN - ...
テキストに指示の連続が含まれていない場合は、
単に「指示は提供されていません」と記述してください。
もしプロンプトが一連の指示を含んでいる場合、それらの指示を明確に書き直し、ステップを明記することが求められます。モデルはテキストから指示を抽出し、指示が見つからない場合は、「手順が提供されていません」と言うように指示します。この方法で、モデルが指示を抽出しようとし、何も見つからない場合には、ステップが提供されていないと明示することができます。
戦術4: "フューショット" プロンプティング
「フューショットプロンプト」と呼ばれる戦術は、求めるタスクの成功例を提供し、その後にモデルに実際のタスクを求めるものです。これにより、モデルは一貫したスタイルで答えることができます。例えば、子供と祖父母の間の会話の例を提供し、子供が「忍耐について教えて」と言うと、祖父母が比喩を使って応えるシナリオを提供します。これに続いて、「私に回復力について教えて」というプロンプトを提供し、モデルに同様のトーンで答えるように求めます。
Prompt="""あなたの仕事は、一貫したスタイルで答えることです。
<子供>: 私に忍耐について教えてください。\
<祖父母\>: 忍耐は、種を蒔いてから花が咲くまでの時間を待つことです。\
静かな池の水が、石を投げ入れられてもまた静まるように、\
長い冬の後に春が訪れるのを待つように、\
我々も困難な時期を耐え忍び、より良い未来を信じて待つ必要があります。
<子供>: 私に回復力について教えてください。\
以上の4つの戦術は、モデルに対して明確で具体的な指示を出す方法を示しています。
原則2: モデルに「考える」時間を与える
戦術1: タスクを完了するために必要な手順を明示する
次の原則は、モデルに考える時間を与えることです。もしモデルが推論エラーを起こして間違った結論に急いで飛びつく場合、問いを再構成し、関連する推論の連鎖を要求し、その後にモデルが最終的な答えを提供するようにすると良いでしょう。短い時間や少ない単語数で解決するのが難しいタスクをモデルに与えると、モデルは可能性の高い推測を立てるかもしれません。これは人間にも起こり得ることで、例えば、誰かに複雑な数学の問題を解答する時間を与えずに尋ねると、彼らも間違える可能性が高いです。
text=```
魅力的な村で、兄妹のジャックとジルは丘の上の井戸から水を汲む任務に出発しました。
彼らが歌いながら登っていると、不幸なことにジャックは石につまずき、
丘を転げ落ち、ジルも彼に続いて転げ落ちました。
少し怪我をしましたが、2人は家に戻り、家族から安心するような抱擁を受けました。
事件にもかかわらず、彼らの冒険心は消えず、喜びを持って探検を続けました。
# 例1
プロンプト_1=```
以下のアクションを実行してください:
1 - トリプルバッククォートで区切られた以下のテキストを1文で要約します。
2 - 要約を英語に翻訳します。
3 – 英語の要約で各名前をリストします。
4 - 以下のキーを含むjsonオブジェクトを出力します:english_summary、num_names。
回答は改行で区切ってください。
テキスト:
```{text}```
戦術2: 結論に急ぐ前に、モデルに自分自身の解決策を考えさせる
モデルの制限についても理解することが重要です。言語モデルは訓練過程で膨大な知識に触れていますが、その情報を完全に記憶しているわけではありません。特に、モデルがあまり知られていないトピックについての質問に答えようとし、それがplausibleに聞こえるようなことを作り出す可能性があります。これらの作り話は幻覚と呼ばれ、実際の歯ブラシ会社から架空の製品名の説明をでっち上げる例などがあります。
プロンプト = f””” 学生の解決策が正しいかどうかを判断してください。 質問: 私は太陽光発電設備を建設しており、財務の計算についての\ 助けが必要です。 - 土地のコストは $100 / 平方フィート - $250 / 平方フィートで太陽電池パネルを購入できます - 保守に関する契約を交渉し、毎年一律で $100k、さらに\ $10 / 平方フィートのコストがかかります 最初の1年間の運営費用は、平方フィート数の関数として何ですか。 学生の解決策: xを平方フィートでの設備のサイズとします。 コスト: 1. 土地のコスト: 100x 2. 太陽電池パネルのコスト: 250x 3. 保守コスト: 100,000 + 10x 4. 合計コスト: 100x + 250x + 100,000 = 450x + 100,000 ”””
プロンプト = f"""
あなたのタスクは、学生の解決策が正しいかどうかを判断することです。
問題を解決するには以下の手順を実行してください:
- 最初に、問題に対する自分自身の解決策を考え出します。
- それから、自分の解決策と学生の解決策を比較し、学生の解決策が正しいかどうかを評価します。
自分自身で問題を解決するまで、学生の解決策が正しいかどうかを判断しないでください。
以下の形式を使用してください:
質問:
学生の解決策:
学生の解決策はこちら
実際の解決策:
解決策を考え出す手順とあなたの解決策はこちら
学生の解決策は計算した実際の解決策と同じですか:
はい または いいえ
学生の成績:
質問:
太陽光発電設備を建設しており、財務の計算についての
助けが必要です。
- 土地のコストは $100/平方フィート
- $250/平方フィートで太陽電池パネルを購入できます
- 保守に関する契約を交渉し、毎年一律で $100k、
さらに $10/平方フィートのコストがかかります
最初の1年間の運営費用は、平方フィート数の関数として何ですか。
学生の解決策:
xを平方フィートでの設備のサイズとします。
コスト:
1.土地のコスト: 100x
2.太陽電池パネルのコスト: 250x
3.保守コスト: 100,000 + 100x
合計コスト: 100x + 250x + 100,000 + 100x = 450x + 100,000
実際の解決策:
反復プロセス
大規模な言語モデルを利用してアプリケーションを構築する際には、最初の試みで完璧なプロンプトを得ることは稀です。重要なのは良いプロセスを持ち、プロンプトを反復的に改善することです。
アイデアを持ち、データを取得し、モデルを訓練し、実験結果を得るプロセスは効果的です。その出力を分析し、何がうまくいっていて何がうまくいっていないのかを把握し、問題を解決するための新しいアプローチを考えます。
プロンプティングにおいて、もし最初の試みがうまくいかない場合は、指示が明確でなかった理由や、アルゴリズムに考える時間を与えなかった理由を理解し、アイデアとプロンプトを洗練する反復プロセスを通じて、アプリケーションにとって機能するプロンプトに到達するまで、このループを何度も繰り返します。
プロンプト開発は反復プロセスであり、何かを試し、望んでいる結果が得られない場合は、指示を明確にする方法を考えたり、モデルに考える時間を与える方法を考えたりします。効果的なプロンプトエンジニアになる鍵は、完璧なプロンプトを知っていることではなく、アプリケーションにとって効果的なプロンプトを開発するための良いプロセスを持っていることです。
ーーーーーーーーーーーーーーーーーーーーーーーー
Python3ではじめるシステムトレード【第2版】環境構築と売買戦略
「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。