見出し画像

OpenAI APIを使ったプロンプト・エンジニアリングのベスト・プラクティス解説

この記事は「Best practices for prompt engineering with OpenAI API」2023年4月を翻訳したものに一部解説を追加したものとなります。最新の情報につきましては英語版のサイトを参照してください。

GPT-3やCodexへの明確で効果的な指示の出し方について
Written by Jessica Shieh

💡 OpenAI APIを使い始めたばかりの方は、最初にIntroductionQuickstartチュートリアルを読むことをお勧めします。

初心者の方は、Youtubeやnote等で色々と初心者向けのものが公開されているので、まずはそちらを参照されるといいと思います。
個人的なおすすめとしては、以下のKEITOさんのYoutubeは結構いいと思います。

chatgpt完全解説!たった1動画で基礎〜応用まで理解出来る【チャットGPT】


プロンプト・エンジニアリングの仕組み

インストラクション・フォロー・モデルの学習方法や学習させたデータにより、特に効果的で、タスクに適したプロンプト・フォーマットが存在します。以下では、信頼性の高いプロンプト形式をいくつか紹介しますが、あなたのタスクに最も適した形式を自由に検討してみてください。

こちらを参照した上で、各自最適化していくことが必要になってくると思いますので、まずは基礎を押さえましょう。

経験則と例(Rules of Thumb and Examples)

注:「{テキスト入力はこちら}」は、実際のテキスト/コンテキストのプレースホルダーです。

「{テキスト入力はこちら}」
この部分に任意のテキストを入力します。

1. 最新のモデルを使用する

最良の結果を得るためには、一般的に最新で最も性能の高いモデルを使用することをお勧めします。2022年11月現在、テキスト生成には「text-davinci-003」モデル、コード生成には「code-davinci-002」モデルがベストです。

ここからは色々と例を交えて説明されています。効果があまりないものと、より効果的な例が紹介されていますので参考にしていきましょう。

2. プロンプトの先頭に指示を配置し、###や"""で指示と文脈を分ける

効果が低い例(Less effective) ❌:

Summarize the text below as a bullet point list of the most important points.

{text input here}
以下の文章を、最も重要な点を箇条書きにして要約する。

{ここにテキストを入力する}

より効果的な例(Better) ✅:

Summarize the text below as a bullet point list of the most important points.

Text: """
{text input here}
"""
以下の文章を、最も重要な点を箇条書きにして要約しなさい。

テキスト:  """
{テキスト入力はこちら}
"""

"""や###で指示部分と処理して欲しい文章を明確に区切りましょう。

3. 望む文脈、結果、長さ、形式、スタイルなどについて、具体的かつ、できるだけ詳細に記述する

文脈、成果、長さ、形式、スタイルなどについて具体的に記述

効果が低い例 ❌:

Write a poem about OpenAI. 
OpenAIについて詩を書いてください。

より効果的な例 ✅:

Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet}
OpenAIについて、最近のDALL-E(DALL-Eはテキストから画像へのMLモデル)の製品発表に焦点を当て、
{有名な詩人}のスタイルで、インスピレーションを与える短い詩を書いてください。

4. 例(例1、例2など)を通して、望む出力形式を明示する

効果が低い例 ❌:

Extract the entities mentioned in the text below. 
Extract the following 4 entity types: company names, people names, 
specific topics and themes.

Text: {text}
以下のテキストに記載されているエンティティを抽出する。
企業名、人名、特定の話題、テーマの4種類のエンティティを抽出する。

テキスト:  {テキスト}

見せる、そして伝える - 特定のフォーマット要件を示すと、モデルはよりよい応答をします。これにより、複数の出力を信頼性をもってプログラムで解析することがより簡単になります。

より効果的な例 ✅:

Extract the important entities mentioned in the text below. 
First extract all company names, then extract all people names, 
then extract specific topics which fit the content and finally extract general 
overarching themes

Desired format:
Company names: <comma_separated_list_of_company_names>
People names: -||-
Specific topics: -||-
General themes: -||-

Text: {text}
以下のテキストで言及している指示に従い、重要なエンティティを抽出してください。
最初に、すべての企業名を抽出し、次にすべての人名を抽出し、内容に合わせて特定のトピックを抽出し、
最後に大まかなテーマを抽出してください。

期待されるフォーマット: 
企業名: <企業名のカンマ区切りリスト> 
人名: -||- 
特定のトピック: -||- 
一般的なテーマ: -||-

テキスト: {テキスト}

実施例

以下のテキストで言及している指示に従い、重要なエンティティを抽出してください。 最初に、すべての企業名を抽出し、次にすべての人名を抽出し、内容に合わせて特定のトピックを抽出し、 最後に大まかなテーマを抽出してください。

期待されるフォーマット:
企業名: <企業名のカンマ区切りリスト>
人名: -||-
特定のトピック: -||-
一般的なテーマ: -||-

テキスト: """アメリカの有力紙「ウォール・ストリート・ジャーナル」は、アメリカの電気自動車メーカー「テスラ」のCEO、イーロン・マスク氏が、対話式AIの「ChatGPT」を開発した企業に対抗して新たにAIを手がける企業を設立したと伝えました。 「ChatGPT」など、まるで人間が書いたかのような自然な文章を作成できる対話式AIの利用は世界各地で急速に広がっていて、開発競争が激しくなっています。 ウォール・ストリート・ジャーナルは14日、イーロン・マスク氏が新たにAIを手がける企業をアメリカ西部ネバダ州に設立したと伝えました。 また、イギリスの経済紙、フィナンシャル・タイムズも14日、マスク氏がAIのスタートアップ企業の立ち上げを計画していると伝えています。 欧米のメディアはマスク氏がAIの研究者とエンジニアのチームをつくり、対話式AIの「ChatGPT」を開発したアメリカの企業、オープンAIに対抗しようとしているとしています。 対話式AIをめぐっては、開発競争がコントロールできない状況に陥っているなどとして、少なくとも半年間は開発を中断するよう求めるオンラインの署名活動が行われマスク氏も先月、署名していました。 """

ChatGPTの回答

企業名: テスラ、オープンAI
人名: イーロン・マスク
特定のトピック: 対話式AI、ChatGPT、研究者、エンジニア、開発競争
一般的なテーマ: AI技術の進歩、AI技術を巡る開発競争、対話式AIの開発と利用

5. zero-shotから始め、次にfew-shot(例)、どちらもうまくいかない場合は、fine-tuneを行う

✅ ゼロショット

「ゼロショット」とは、あるタスクに対して、そのタスクに関するトレーニングデータを与えることなく、既存の言語モデルを用いて問題に回答することを指します。つまり、モデルが既知のデータセットでトレーニングされている場合でも、そのデータセットには含まれていない新しいタスクに対しても、モデルが回答できることを意味します。ゼロショットのプロンプトを作成することは、トレーニングデータの作成や膨大な時間をかけたモデルのトレーニングを必要としないため、タスクに対するモデルの応用範囲を広げる上で有用です。

Extract keywords from the below text.

Text: {text}

Keywords:
以下のテキストからキーワードを抽出する。

テキスト:  {テキスト}

キーワード: 

上記のゼロショットでうまくいかない場合には、次のステップとして、以下のように例を提示してやってみましょう。

✅ Few-shot - 2、3個の例を提供する。

Extract keywords from the corresponding texts below.

Text 1: Stripe provides APIs that web developers can use to integrate payment processing into their websites and mobile applications.
Keywords 1: Stripe, payment processing, APIs, web developers, websites, mobile applications
##
Text 2: OpenAI has trained cutting-edge language models that are very good at understanding and generating text. Our API provides access to these models and can be used to solve virtually any task that involves processing language.
Keywords 2: OpenAI, language models, text processing, API.
##
Text 3: {text}
Keywords 3:
以下の対応するテキストからキーワードを抽出する。

テキスト1:Stripeは、Web開発者がWebサイトやモバイルアプリケーションに決済処理を組み込むために使用できるAPIを提供している。
キーワード1:Stripe、決済処理、API、Webデベロッパー、Webサイト、モバイルアプリケーション
##
テキスト2:OpenAIは、テキストの理解と生成に非常に優れた最先端の言語モデルを訓練しています。私たちのAPIはこれらのモデルへのアクセスを提供し、言語処理を伴うほぼすべてのタスクを解決するために使用することができます。
キーワード2:OpenAI, 言語モデル, テキスト処理, API.
##
テキスト3:{テキスト}
キーワード 3

テキスト3:{テキスト}部分に以下の文章を入れたら、下記のようなキーワードが抽出されました。

テキスト3: ウェブサイトは、World Wide Web 上にあり、一般に特定のドメイン名の下にある複数のウェブページの集まりのこと。サイトと呼ばれることもある。企業などの団体が自身を紹介するため自ら構築したサイトをその団体の公式サイトなどと呼ぶ。 ホームページと呼ばれることもあるが、この用法は誤用とされる場合もある。

テキスト3: ウェブサイト、ホームページ、ドメイン名、団体、公式サイト

✅ ファインチューニング:ファインチューニングのベストプラクティスはこちら

「ファインチューニング」とは、あるタスクに特化したモデルを作成するために、あらかじめトレーニングされた汎用的な言語モデルに新しいトレーニングデータを追加して、タスクに関する知識を取り入れることを指します。ファインチューニングは、ゼロショットよりもよりタスクに適したモデルを作成できるため、精度向上に有効です。具体的には、既存の言語モデルにタスクに特化した新しいトレーニングデータを追加し、モデルを再トレーニングして、よりタスクに適した特徴を学習させます。これにより、より高い予測性能を発揮することができます。

6. 曖昧で不正確な記述を減らす

効果が低い例 ❌:

The description for this product should be fairly short, a few sentences only, and not too much more.
この製品の説明文はかなり短く、数文のみで、それ以上にはしない方が良い。

より効果的な例 ✅:

Use a 3 to 5 sentence paragraph to describe this product.
この製品の説明には、3~5文の段落を使用する。

7. やってはいけないことだけではなく、代わりに何をすればいいかを記述する

効果が低い例 ❌:

The following is a conversation between an Agent and a Customer. 
DO NOT ASK USERNAME OR PASSWORD. DO NOT REPEAT.

Customer: I can’t log in to my account.
Agent:
以下は、エージェントとお客様の会話です。
ユーザー名やパスワードを尋ねないでください。繰り返さないでください。

顧客: 自分のアカウントにログインできません。
エージェント:

エージェントは、以下のように回答してくれました。
悪くはないですね。

エージェント:
おっしゃる通りですね。ログインに問題があるようですね。お手数ですが、問題の詳細を教えていただけますか?例えば、エラーメッセージが表示されるか、パスワードを忘れた場合にはパスワードリセットの手順を試みましたか?

より効果的な例 ✅:

The following is a conversation between an Agent and a Customer. 
The agent will attempt to diagnose the problem and suggest a solution, 
whilst refraining from asking any questions related to PII. 
Instead of asking for PII, such as username or password, 
refer the user to the help article www.samplewebsite.com/help/faq

Customer: I can’t log in to my account.
Agent:
以下は、エージェントとお客様との会話です。
エージェントは、問題の診断と解決策の提案を試みますが、PIIに関連する質問は控えてください。
ユーザー名やパスワードなどのPIIを尋ねる代わりに、ヘルプ記事(www.samplewebsite.com/help/faq)を
紹介する。

お客様:  自分のアカウントにログインできません
エージェント:

エージェントは、以下のように回答してくれました。こちらのように案内すれば、トラブルシューティング中にお客様のユーザー名やパスワードなどの等の PII(個人情報)を聞かなくても済みますね。

エージェント
アカウントにログインできないとのこと、大変お手数をおかけして申し訳ありません。一度、パスワードのリセットをお試しになってみてはいかがでしょうか?www.samplewebsite.com/help/faqには、パスワードのリセット方法について詳しく説明されている記事があります。アカウントのセキュリティを保つために、定期的にパスワードのリセットを行うことをおすすめします。それでもログインできない場合は、お知らせください。一緒に他のオプションを検討していきましょう。

禁止事項を書き並べるだけでなく、禁止したことの代わりに何をすればいいのかをきちんと記載しましょう。

8. コード生成には、モデルを特定のパターンに誘導する「リーディングワード」を使用する

効果が低い例 ❌:

# Write a simple python function that
# 1. Ask me for a number in mile
# 2. It converts miles to kilometers
# 以下のような簡単なpythonの関数を書いてください
# 1. マイルで数字を聞いてみる
# 2. マイルをキロメートルに変換してくれる

下のコード例では、"import "を追加することで、モデルにpythonで記述し始めることを示唆しています。(同様に "SELECT "はSQL文の開始を示す良いヒントとなります)

より効果的な例 ✅:

# Write a simple python function that
# 1. Ask me for a number in mile
# 2. It converts miles to kilometers
 
import
# 以下のような簡単なpythonの関数を書いてください
# 1. マイルで数字を聞いてみる
# 2. マイルをキロメートルに変換してくれる

import

パラメータ

一般的に、モデル出力を変更するために最もよく使われるパラメータは、modelTemperatureであることが分かっています。

model - 高性能なモデルほど高価で、レイテンシーも高くなります。

Temperature - 可能性の低いトークンを出力する頻度を示す指標です。Temperatureが高いほど、出力はよりランダムに(そして通常は創造的に)なります。しかし、これは「真実性」とは異なります。データ抽出や真実のQ&Aなど、ほとんどの事実に基づいた使用例では、Temperatureは0が最適です。

Temperatureについてもう少しわかりやすく説明を追加してみました。

Temperature
とは、生成されたテキストの多様性を調整するためのパラメーターの1つであり、値が高いほどより多様なテキストが生成されます。
具体的には、低いTemperatureの場合、モデルはより確信度の高い予測を行い、生成されるテキストはより予測可能なものになります。
一方、高いTemperatureの場合、モデルはより多様な予測を行い、生成されるテキストはより多様性のあるものになります。つまり、高いTemperatureを使用すると、より意外な結果が得られる可能性がありますが、生成されるテキストの品質は低下する可能性があります。プロンプトの設計においては、適切なTemperatureを設定することが重要であり、テキスト生成の品質と多様性のバランスを取ることが求められます。

max_tokens(最大トークン数)- 出力の長さを制御するものではありませんが、トークン生成のための厳しいカットオフ制限を設定します。理想的には、モデルが終了と判断するか、またはあなたが定義した停止シーケンスに達したときなので、この制限に達することはめったにありません。

説明を追加しました。

「max_tokens(最大トークン数)」は、生成されるテキストの最大トークン数を制御するパラメーターです。トークンは、モデルが理解できる最小の単位であり、単語、句読点、空白、数字、特殊文字などが含まれます。max_tokensを設定することで、生成されるテキストがあまりに長くなりすぎないように制御することができます。ただし、max_tokensは、生成されたテキストの長さを制御するものではなく、単に生成されるトークン数に基づいてテキストの生成を停止する制限を設定するものです。モデルが生成を終了する条件を指定することもできます。通常、max_tokensは、テキスト生成の品質と速度のバランスを取るために調整されます。

stop (stop sequences) - 生成されるとテキスト生成を停止させる文字(トークン)のセットです。

説明を追加しました。

「stop(停止シーケンス)」は、テキスト生成を停止させるために指定するトークンまたは文字列のセットです。テキスト生成の際、このセットに含まれるトークンまたは文字列が生成された場合、テキストの生成が停止します。例えば、文章の終わりを表す句読点や、指定したキーワードが出力された時に停止するように設定することができます。stopの設定は、生成されたテキストが適切であることを確認するために非常に重要であり、必要に応じて適切に調整する必要があります。

その他のパラメータの説明については、APIリファレンスを参照してください。

その他のリソース

その他、以下のようなリソースも用意しいますので、興味のある方は以下のリンク先をご参照ください。

  • ガイド

    • Text completion - モデルを使ってテキストを生成または編集する方法を学ぶ

    • Code completion - Codexのためのプロンプト・エンジニアリングを探求する

    • Fine-tuning - ユースケースに合わせたカスタム・モデルのトレーニング方法を学ぶ

    • Embeddings - テキストの検索、分類、比較の方法を学ぶ

    • Moderation

  • OpenAI cookbook repo - Embeddingsを使った質問応答など、APIを使った一般的なタスクを達成するためのサンプル・コードとプロンプトが含まれています。

  • Community Forum

終わりに

本noteをご覧いただきありがとうございます!

少しでも多くの方が、プロンプトに興味を持っていただき、よりAIと共存していけるようになるといいなと思っています。

今後ChatGPTに関する情報を受け取りたい方は公式LINEにご登録いただくと定期的に情報を受け取ることができます。
もしご興味がありましたら以下から登録をお願いします。

◉情報受け取り用公式LINE⬇︎
https://lin.ee/F3fGixV

こちらを参考に皆さんがAIと少しでも仲良くなれることを願っております。


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