こんにちは 配配メール開発課 Jazumaです。 業務やプライベートでChatGPT等のAIを使いながらもより良い回答を得るためのプロンプトの作り方が分からないという方は多いのではないでしょうか。かく言う私もその一人です。
そこで今回は Best practices for prompt engineering with OpenAI API を見てプロンプトエンジニアリングのベストプラクティスを整理します。
より良い出力を得るためのプロンプト
最新のモデルを使う
より良い回答を得るために最新のモデルを使うことが推奨されています。2023年4月時点においてはテキスト生成:GPT-4, 画像生成: DALL・E, 音声変換:Whisper が有力な選択肢になると思われます。1
プロンプトの冒頭で指示を出す・区切り文字で指示と文脈を明確に区切る
# 悪い例 Summarize the text below as a bullet point list of the most important points. {text input here}
# 良い例 Summarize the text below as a bullet point list of the most important points. Text: """ {text input here} """
OpenAIのドキュメントでは上記のように文脈部分を区切り文字で囲う例が紹介されていましたが、別の資料では指示の部分を「###」で囲っていました。 どちらがより良いプロンプトかは未確認です。
具体的に指示を出す・説明する・詳細を記載する
コンテキスト・出力結果・出力の文字数・出力形式等はなるべく具体的に詳しく指定します。
# 悪い例 経費精算システムを紹介するメールを作成してください。
# 良い例 経費精算システムを宣伝するためのメールの本文を作成してください。 詳細:""" 形式:HTML 対象:企業の経理担当者 容量:20KB程度 内容:https://www.rakurakuseisan.jp/ を本文に含める """
例を提示して出力のフォーマットを明確に示す
出力のフォーマットを具体的に示してあげるとモデルからより良い回答が得られます。 また、出力形式が定まることにより、出力結果をプログラムで解析しやすくなります。
# 悪い例 以下のテキストで言及されているエンティティを抽出します。次の 4 つのエンティティ タイプを抽出します: 会社名、人名、特定のトピックとテーマ。 テキスト: {text}
# 良い例 以下のテキストで言及されている重要なエンティティを抽出します。最初にすべての会社名を抽出し、次にすべての人名を抽出し、次にコンテンツに適合する特定のトピックを抽出し、最後に一般的な包括的なテーマを抽出します 望ましい形式: 会社名: <comma_separated_list_of_company_names> 人名: -||- 特定のトピック: -||- テーマ: -||- テキスト: {text}
zero-shotから始め、few-shot, fine-tuneの順に試す
- 前提事項
- zero-shot: プロンプトに例を示さずに指示だけを出すこと
- few-shot: プロンプトに何件か例を提示して指示を出すこと
- fine-tune: 特定のタスクをより高精度に実施するために、既存のモデルにデータセットを与えて再学習させること
まずは簡単なzero-shotプロンプトで指示を出し、上手くいかない場合はより高度なプロンプトを使います。
あいまいな指示や不正確な指示を減らす
指示を出す際は「なるべく」「少なく」等の形容詞ではなく、具体的な数値を使うことが望ましいとされます。
# 悪い例 楽楽精算についてなるべく短く、いくつかの文で一文が長くなりすぎないように説明してください。
# 良い例 楽楽精算について3 ~ 5分程度で説明してください。1文あたりの文字数は40字程度です。
「してほしくないこと」ではなく「してほしいこと」を指示する
# 悪い例 以下は、エージェントと顧客の間の会話です。ユーザー名やパスワードを聞かないでください。繰り返さないでください。 顧客: アカウントにログインできません。 エージェント:
# 良い例 以下は、エージェントと顧客の間の会話です。エージェントは問題の調査と解決策の提案を試みますが、個人情報に関する質問は控えます。ユーザー名やパスワードなどの情報を尋ねる代わりに、ユーザーにヘルプ記事 www.samplewebsite.com/help/faq を案内します。 お客様: アカウントにログインできません。 エージェント:
※ 良い例でも「控えます」のようにしてほしくないことを指示しているように見えますが... 否定文ではなく肯定文で指示をすることが重要なのでしょうか。 この点についてはOpenAIのドキュメントには記載されていませんでした。
コードを生成させる際は特定のパターンに誘導するための文言を含める
例えばSQLを生成したい時は「SELECT」、PythonやJavaScriptのコードを生成したい時は「import」をプロンプトの末尾に記載すると 期待するコードをモデルが生成しやすくなると言われています。
# 悪い例 # Write a simple python function that # 1. Ask me for a number in mile # 2. It converts miles to kilometers
# 良い例 # Write a simple python function that # 1. Ask me for a number in mile # 2. It converts miles to kilometers import
終わりに
OpenAIのドキュメントでは「なんとなくこうすると上手くいく」という漠然とした経験則が言語化されていました。
業務でAIを使う場合、やはりコードを生成するのが主な用途になると思います。 今後コード生成に特化したプロンプトのベストプラクティスも 調べてみたいと思います。