本文へ移動

Column

OpenAI プロンプトエンジニアリングガイド日本語訳 入門編

このガイドでは、大規模言語モデル(時にGPTモデルとも呼ばれる)からより良い結果を引き出すための戦略と戦術を共有します。ここで紹介する方法は、場合によっては組み合わせて使用することで、より大きな効果を発揮することがあります。ご自身に最適な方法を見つけるために、実験することをお勧めします。

また、モデルの可能性を示すプロンプトの例もご覧ください:

プロンプトの例

GPTモデルがどのようなことができるかを学ぶためのプロンプト例


より良い結果を得るための6つの戦略

1. 明確な指示を書く

これらのモデルは、あなたの心を読めません。出力が長すぎる場合は、短い回答を求めてください。出力が簡単すぎる場合は、専門的なレベルの文章を要求してください。フォーマットが気に入らない場合は、希望する形式を示してください。モデルが何を望んでいるかを推測する必要が少なくなるほど、望む結果が得られる可能性が高くなります。

戦術:

  • より関連性の高い回答を得るために、問い合わせに詳細を含める
  • モデルに特定の役割を採用するよう依頼する
  • 入力の異なる部分を明確に示すためにデリミタを使用する
  • タスクを完了するために必要な手順を指定する
  • 例を提供する
  • 出力の望ましい長さを指定する

2. 参考文献を提供する

言語モデルは特に、難解なトピックや引用、URLについて尋ねられた場合、架空の回答を自信を持って生成することがあります。参考文献を提供することで、学生が試験でメモを使用して良い成績を収めるように、モデルがより正確な回答を生成できるようにします。

戦術:

  • 参考文献を使用して回答するようモデルに指示する
  • 参考文献からの引用を含めて回答するようモデルに指示する

3. 複雑なタスクを単純なサブタスクに分割する

ソフトウェアエンジニアリングにおいて、複雑なシステムをモジュール化されたコンポーネントに分解するのが良い慣行であるように、言語モデルに提出するタスクについても同様です。複雑なタスクは、単純なタスクに再定義されることが多く、その結果として、前のタスクの出力が後のタスクの入力として使用されます。

戦術:

  • 意図分類を使用して、ユーザーのクエリに最も関連する指示を特定する
  • 非常に長い会話を必要とする対話型アプリケーションでは、前の会話を要約またはフィルタリングする
  • 長い文書を部分ごとに要約し、再帰的に全体の要約を構築する

4. モデルに「考える」時間を与える

17を28で掛け算するように頼まれた場合、即座に答えがわからなくても、時間をかけて解決することはできます。同様に、モデルも即座に答えを出そうとするよりも、答えを考える時間を与えた方が、推論エラーが少なくなります。回答の前に「思考の連鎖」を求めることで、モデルがより確実に正しい答えを導くことができます。

戦術:

  • 急いで結論を出す前に、自分で解決策を見つけるようにモデルに指示する
  • モデルの推論プロセスを隠すために、内部独白または一連のクエリを使用する
  • 前のパスで何か見落としていないかモデルに尋ねる

5. 外部ツールを使用する

他のツールの出力をモデルに供給することで、モデルの弱点を補うことができます。例えば、テキスト検索システム(RAGや検索強化生成とも呼ばれる)は、関連する文書についてモデルに伝えることができます。OpenAIのCode Interpreterのようなコード実行エンジンは、モデルが数学を行ったりコードを実行したりするのに役立ちます。タスクが言語モデルよりも他のツールでより確実かつ効率的に実行できる場合は、最良の結果を得るためにそれをオフロードしてください。

戦術:

  • 効率的な知識検索を実装するために、埋め込みベースの検索を使用する
  • より正確な計算を実行するため、または外部APIを呼び出すためにコード実行を使用する
  • モデルに特定の関数へのアクセスを許可する

6. 変更を体系的にテストする

パフォーマンスを向上させるためには、測定できることが重要です。あるプロンプトへの変更がいくつかの孤立した例ではパフォーマンスを向上させるものの、より代表的な例のセット全体ではパフォーマンスを低下させる可能性があります。そのため、変更がパフォーマンスに対して総合的にプラスであることを確認するために、包括的なテストスイート(「評価」とも呼ばれる)を定義する必要があるかもしれません。

戦術:

  • ゴールドスタンダードの回答を参照してモデルの出力を評価する

戦略: 明確な指示を書く

戦術: より関連性の高い回答を得るために、問い合わせに詳細を含める

高い関連性のある応答を得るためには、リクエストに重要な詳細やコンテキストを含めるようにしてください。さもないと、モデルがあなたの意図を推測することになります。

悪い例: Excelで数値を追加する方法は?
良い例: Excelでドル金額の行を合計する方法を教えてください。この操作をシート全体の行に対して自動的に行い、最終的に「合計」という列にすべての合計を表示したいです。

悪い例: 誰が大統領?
良い例: 2021年のメキシコの大統領は誰で、選挙はどのくらいの頻度で行われますか?

悪い例: フィボナッチ数列を計算するコードを書いてください。
良い例: フィボナッチ数列を効率的に計算するTypeScript関数を書いてください。各部分が何をしているのか、なぜそのように書かれているのかを説明するコメントを豊富に入れてください。

悪い例: 会議のメモを要約してください。
良い例: 会議のメモを1つの段落に要約してください。その後、スピーカーとそれぞれの重要なポイントを箇条書きで書いてください。最後に、スピーカーが提案した次のステップやアクション項目があれば、それもリストにしてください。

戦術: モデルに特定の役割を採用するよう依頼する

システムメッセージを使用して、モデルが応答に使用するペルソナを指定できます。

SYSTEM: 私が何かを書く手助けを求めたときは、各段落に少なくとも1つの冗談や遊び心のあるコメントを含む文書で応答してください。

USER: 鋼のボルトベンダーが迅速かつ短期間で配送してくれたことに感謝の手紙を書いてください。これにより、私たちは重要な注文を予定通りに納品することができました。

戦術: デリミタを使用して入力の異なる部分を明確に示す

三重引用符、XMLタグ、セクションタイトルなどのデリミタを使用して、テキストの異なる部分を明確に区切ることで、モデルがそれぞれの部分を適切に処理しやすくなります。

USER: 三重引用符で区切られたテキストを俳句に要約してください。

insert text here

SYSTEM: 同じトピックに関する2つの記事がXMLタグで区切られて提供されます。まず、それぞれの記事の主張を要約してください。その後、どちらの記事がより優れた主張をしているかを示し、その理由を説明してください。

USER:

<article>最初の記事をここに挿入</article> <article>2番目の記事をここに挿入</article>

SYSTEM: あなたには論文の要約と提案されたタイトルが提供されます。論文のタイトルは、読者に論文のトピックをうまく伝えるものでありつつ、目を引くものであるべきです。タイトルがこれらの基準を満たさない場合は、5つの代替案を提案してください。

USER:
Abstract: 論文の要約をここに挿入

Title: タイトルをここに挿入

このように、デリミタを使用することで、複雑なタスクでもタスクの詳細を明確にし、モデルがあなたの求める内容を理解するための手助けをすることができます。


戦術: タスクを完了するために必要な手順を指定する

一部のタスクは、手順を明確に指定することで、モデルがその手順に従いやすくなります。ステップを明示的に記述することで、モデルがそれに従って正確にタスクを完了できるようになります。

SYSTEM: 以下の手順に従って、ユーザーからの入力に応答してください。

Step 1 - ユーザーは三重引用符で囲まれたテキストを提供します。このテキストを一文で要約し、「Summary: 」というプレフィックスを付けてください。

Step 2 - ステップ1の要約をスペイン語に翻訳し、「Translation: 」というプレフィックスを付けてください。

USER:
insert text here


戦術: 例を提供する

一般的な指示を提供することは通常、すべての例に適用される効率的な方法ですが、場合によっては例を提供する方が簡単な場合もあります。たとえば、ユーザーのクエリに応答する特定のスタイルをコピーさせたい場合など、明示的に説明するのが難しい場合があります。このような場合、いくつかの例を示すことでモデルがそのスタイルを学び、同様の応答を生成することができます。これは「少数ショットプロンプティング(few-shot prompting)」として知られています。

SYSTEM: 一貫したスタイルで応答してください。

USER: 忍耐について教えてください。

ASSISTANT: 深い谷を彫り出す川は、ささやかな泉から流れ出し、壮大な交響曲は一つの音符から始まり、最も複雑な織物は一本の糸から始まります。

USER: 海について教えてください。


戦術: 出力の望ましい長さを指定する

モデルに、所定の長さの出力を生成するよう指示することができます。目標とする出力の長さは、単語数、文数、段落数、箇条書きポイントの数などで指定できます。ただし、単語数を指定して出力を生成するように指示しても、正確にその数になることは難しい場合があります。段落や箇条書きの数を指定する方が、モデルはより正確に出力を生成することができます。

USER: 三重引用符で囲まれたテキストを約50語で要約してください。

insert text here

USER: 三重引用符で囲まれたテキストを2段落に要約してください。

insert text here

USER: 三重引用符で囲まれたテキストを3つの箇条書きポイントで要約してください。

insert text here


戦略: 参考文献を提供する

戦術: 参考文献を使用して回答するようモデルに指示する

信頼できる情報をモデルに提供できれば、モデルに提供された情報を使用して回答を作成するよう指示することができます。

SYSTEM: 提供された三重引用符で区切られた記事を使用して質問に回答してください。回答が記事に見つからない場合は、「答えが見つかりませんでした」と書いてください。

USER:
<insert articles, each delimited by triple quotes>

Question:
<insert question here>

すべてのモデルには限られたコンテキストウィンドウがあるため、質問に関連する情報を動的に検索する方法が必要です。効率的な知識検索を実装するために埋め込みを使用することができます。詳細については、「埋め込みベースの検索を使用して効率的な知識検索を実装する」戦術を参照してください。

戦術: 参考文献からの引用を含めて回答するようモデルに指示する

入力が関連する知識で補われている場合、モデルに提供された文書から引用を加えるように依頼することができます。この際、引用は提供された文書内で文字列検索を行うことでプログラム的に確認できます。

SYSTEM: 三重引用符で区切られた文書と質問が提供されます。質問に対して文書を使用して回答し、その文書から引用を行ってください。必要な情報が文書に含まれていない場合は「情報不足」と書いてください。質問に対する回答には、必ず引用を添えてください。引用の形式は以下のようにしてください:{"citation": …}。

USER:
"""<insert document here>"""

Question:
<insert question here>


戦略: 複雑なタスクを単純なサブタスクに分割する

戦術: 意図分類を使用して、ユーザーのクエリに最も関連する指示を特定する

多数の独立した指示セットが必要なタスクでは、まずクエリの種類を分類し、その分類に基づいて必要な指示を決定することが有益です。これは、固定されたカテゴリーを定義し、特定のカテゴリーのタスクを処理するために関連する指示をハードコードすることで達成できます。このプロセスは再帰的に適用し、タスクを段階的に分解することもできます。このアプローチの利点は、各クエリがその段階のタスクを実行するために必要な指示のみを含むため、タスク全体を1つのクエリで実行する場合に比べてエラー率が低くなることです。また、大規模なプロンプトは実行コストが高くなるため、コスト削減にもつながります(価格情報を参照)。

例えば、カスタマーサービスアプリケーションにおいて、クエリを以下のように分類できると仮定します:

SYSTEM: カスタマーサービスのクエリが提供されます。各クエリを主要カテゴリと副次カテゴリに分類してください。出力は、json形式で提供してください。キーは「primary」と「secondary」です。

主要カテゴリ: Billing(請求)、Technical Support(技術サポート)、Account Management(アカウント管理)、General Inquiry(一般問い合わせ)

Billingの副次カテゴリ:

  • Unsubscribe or upgrade(購読解除またはアップグレード)
  • Add a payment method(支払い方法の追加)
  • Explanation for charge(請求の説明)
  • Dispute a charge(請求の異議申し立て)

Technical Supportの副次カテゴリ:

  • Troubleshooting(トラブルシューティング)
  • Device compatibility(デバイスの互換性)
  • Software updates(ソフトウェアのアップデート)

Account Managementの副次カテゴリ:

  • Password reset(パスワードリセット)
  • Update personal information(個人情報の更新)
  • Close account(アカウントの閉鎖)
  • Account security(アカウントのセキュリティ)

General Inquiryの副次カテゴリ:

  • Product information(製品情報)
  • Pricing(価格)
  • Feedback(フィードバック)
  • Speak to a human(人と話す)

USER: インターネットを再接続したいです。

カスタマーのクエリを分類した後、モデルに次のステップを処理するための指示を提供することができます。例えば、カスタマーが「トラブルシューティング」に関する支援を求めていると仮定します。

SYSTEM: 技術サポートの文脈でトラブルシューティングを必要とするカスタマーサービスの問い合わせが提供されます。以下の手順でユーザーをサポートしてください:

  1. ユーザーにルーターのすべてのケーブルが接続されていることを確認するよう依頼してください。ケーブルは時間と共に緩むことがよくあります。
  2. すべてのケーブルが接続されていて問題が解決しない場合、どのルーターモデルを使用しているかを尋ねてください。
  3. 次に、デバイスの再起動方法をアドバイスします:モデル番号がMTD-327Jの場合、赤いボタンを押し続けて5秒待ち、その後5分間待機してから接続をテストするように指示してください。モデル番号がMTD-327Sの場合、電源を抜いて再接続し、5分間待機してから接続をテストするように指示してください。
  4. デバイスを再起動して5分後も問題が続く場合、ITサポートに接続するように指示し、{"IT support requested"}という出力を生成してください。
  5. ユーザーがこのトピックとは関係のない質問を始めた場合、現在のトラブルシューティングのチャットを終了するかどうかを確認し、ユーザーのリクエストを再分類してください。

USER: インターネットを再接続したいです。

このように、モデルは会話の状態を示す特別な文字列を生成するよう指示されています。これにより、システムを状態機械に変え、状態がどの指示を注入するかを決定するようにできます。状態を追跡し、その状態で関連する指示を記録し、さらにオプションで状態遷移が許可される状態を追跡することで、より構造化されたアプローチでは実現が難しいユーザーエクスペリエンスのガードレールを設けることが可能です。


戦術: 非常に長い会話を必要とする対話型アプリケーションでは、前の会話を要約またはフィルタリングする

モデルには固定されたコンテキスト長があるため、ユーザーとアシスタント間の対話をコンテキストウィンドウに含め続けることはできません。

この問題に対処するためのいくつかの方法があり、その一つが、対話の前のターンを要約することです。入力サイズが事前に決められた長さに達すると、会話の一部を要約するクエリがトリガーされ、以前の会話の要約がシステムメッセージの一部として含まれるようになります。あるいは、対話全体にわたって前の会話を非同期に要約することも可能です。

別の解決策として、現在のクエリに最も関連する前の会話部分を動的に選択する方法もあります。「埋め込みベースの検索を使用して効率的な知識検索を実装する」戦術を参照してください。


戦術: 長い文書を部分ごとに要約し、再帰的に全体の要約を構築する

モデルには固定されたコンテキスト長があるため、単一のクエリでコンテキスト長を超える長さのテキストを要約することはできません。

非常に長い文書(たとえば本)を要約するには、文書の各セクションを要約するための一連のクエリを使用できます。セクションの要約を連結し、再度要約して、要約の要約を作成します。このプロセスは再帰的に進行し、文書全体が要約されます。必要に応じて、後のセクションの内容を理解するために前のセクションに関する情報が必要な場合は、本のその時点の内容を要約する際に、前のテキストの概要を含めるというトリックを使用できます。この手法の有効性は、GPT-3のバリエーションを使用したOpenAIの研究で検証されています。


戦略: モデルに「考える」時間を与える

戦術: 急いで結論を出す前に、自分で解決策を見つけるようにモデルに指示する

モデルに、最初の原則から推論するように明示的に指示することで、より良い結果を得られる場合があります。たとえば、数学の問題に対する学生の解答を評価するためにモデルを使用する場合、最も明白なアプローチは、単にモデルに学生の解答が正しいかどうかを尋ねることです。

SYSTEM: 学生の解答が正しいかどうかを判断してください。

USER:
問題文: ソーラーパワー設備を構築しており、財務計算を手伝ってほしい。

  • 土地の費用は1平方フィートあたり100ドル
  • ソーラーパネルは1平方フィートあたり250ドルで購入できる
  • メンテナンスには年間10万ドルの固定費と、追加で1平方フィートあたり10ドルがかかる契約を結んだ 1年目の運用コストの合計を平方フィート数の関数として計算してください。

学生の解答: 設置面積を平方フィート数xとする。

  1. 土地の費用: 100x
  2. ソーラーパネルの費用: 250x
  3. メンテナンス費用: 100,000 + 100x 合計コスト: 100x + 250x + 100,000 + 100x = 450x + 100,000

ASSISTANT: 学生の解答は正しいです。

しかし、この学生の解答は実際には正しくありません!モデルに最初に自分の解決策を考えさせるように促すことで、この誤りを認識させることができます。

SYSTEM: まず、問題に対する自分の解決策を考え出してください。その後、学生の解決策と比較し、学生の解決策が正しいかどうかを評価してください。自分で問題を解く前に、学生の解決策が正しいかどうかを判断しないでください。

USER:
問題文: ソーラーパワー設備を構築しており、財務計算を手伝ってほしい。

  • 土地の費用は1平方フィートあたり100ドル
  • ソーラーパネルは1平方フィートあたり250ドルで購入できる
  • メンテナンスには年間10万ドルの固定費と、追加で1平方フィートあたり10ドルがかかる契約を結んだ 1年目の運用コストの合計を平方フィート数の関数として計算してください。

学生の解答: 設置面積を平方フィート数xとする。

  1. 土地の費用: 100x
  2. ソーラーパネルの費用: 250x
  3. メンテナンス費用: 100,000 + 100x 合計コスト: 100x + 250x + 100,000 + 100x = 450x + 100,000

ASSISTANT: 設置面積を平方フィート数xとする。

  1. 土地の費用: 100x
  2. ソーラーパネルの費用: 250x
  3. メンテナンス費用: 100,000 + 10x 合計コスト: 100x + 250x + 100,000 + 10x = 360x + 100,000

ASSISTANT: 学生の解答は間違っています。彼らはメンテナンス費用の計算で誤りを犯し、10xではなく100xを使用しています。1年目の正しい運用コストの合計は360x + 100,000になります。

このように、モデルに時間を与えて自分自身で解決策を考えさせることで、より正確で信頼できる結果を得ることができます。


戦術: モデルの推論プロセスを隠すために、内部独白や一連のクエリを使用する

前述の戦術では、問題に対してモデルが詳細に推論することが重要である場合があることを示しました。しかし、あるアプリケーションでは、最終的な答えに至るまでのモデルの推論プロセスをユーザーと共有することが適切でない場合もあります。たとえば、教育アプリケーションで学生に自分で答えを考えさせたい場合、モデルの推論プロセスが学生に答えを与えてしまう可能性があります。

この問題を軽減するために、「内部独白」という戦術を使用することができます。内部独白のアイデアは、モデルに出力の一部をユーザーから隠す形式にするよう指示することです。その後、出力をユーザーに提示する前に解析し、必要な部分だけを表示します。

SYSTEM: 次の手順に従ってユーザーのクエリに答えてください。

  1. 最初に問題の解決策を考え出します。学生の解答が間違っている可能性があるため、それに頼らないでください。このステップのすべての作業を三重引用符で囲んでください(""").
  2. 自分の解決策と学生の解答を比較し、学生の解答が正しいかどうかを評価します。このステップのすべての作業も三重引用符で囲んでください(""").
  3. 学生が間違えた場合、答えを明かさずに学生にヒントを与える方法を考えます。このステップも三重引用符で囲んでください(""").
  4. 学生が間違えた場合、前のステップで作成したヒントを学生に提供してください(三重引用符の外で)。

USER:
問題文: <問題文を挿入>

学生の解答: <学生の解答を挿入>

このように、モデルに指示を与えて推論プロセスを隠すことで、ユーザーに適切な情報だけを提示することができます。

あるいは、一連のクエリを使用して最終クエリ以外の出力をエンドユーザーから隠すこともできます。

まず、モデルに問題を独自に解決させます。この最初のクエリには学生の解答が必要ないため、それを省略できます。この方法の利点は、モデルの解答が学生の解答に影響を受けることがない点です。

USER:
<問題文を挿入>

次に、モデルに利用可能なすべての情報を使用して学生の解答の正確性を評価させます。

SYSTEM: 自分の解答と学生の解答を比較し、学生の解答が正しいかどうかを評価してください。

USER:
問題文: """<問題文を挿入>"""

あなたの解答: """<モデルが生成した解答を挿入>"""

学生の解答: """<学生の解答を挿入>"""

最後に、モデルに、自身の分析を基に親切なチューターのペルソナで回答を構築させます。

SYSTEM: あなたは数学のチューターです。学生が間違いを犯した場合は、答えを明かさずに学生にヒントを提供してください。学生が間違いを犯していない場合は、単に励ましのコメントを提供してください。

USER:
問題文: """<問題文を挿入>"""

あなたの解答: """<モデルが生成した解答を挿入>"""

学生の解答: """<学生の解答を挿入>"""

分析: """<前のステップでモデルが行った分析を挿入>"""


戦術: 前のパスで何か見落としていないかモデルに尋ねる

たとえば、モデルを使用して特定の質問に関連するソースから抜粋をリストさせる場合、各抜粋をリストした後に、次の抜粋を書くべきか、それとも停止すべきかを判断する必要があります。ソースドキュメントが大きい場合、モデルが早すぎる段階で停止し、すべての関連する抜粋をリストしないことが一般的です。この場合、モデルにフォローアップクエリを提示して、前のパスで見逃した抜粋を見つけるよう促すことで、パフォーマンスを向上させることができます。

SYSTEM: 三重引用符で区切られた文書が提供されます。あなたのタスクは、以下の質問に関連する抜粋を選択することです。「人工知能の歴史において、重要なパラダイムシフトは何がありましたか。」

抜粋には、解釈に必要なすべての関連するコンテキストを含めるようにしてください。つまり、重要なコンテキストが欠けている小さなスニペットを抽出しないでください。出力は次のようにJSON形式で提供してください:

[{"excerpt": "..."}, {"excerpt": "..."}, {"excerpt": "..."}]

USER:
"""<ドキュメントをここに挿入>"""

ASSISTANT:
[{"excerpt": "ここにモデルが抜粋を書く"}, {"excerpt": "ここにモデルがもう1つの抜粋を書く"}]

USER: 他に関連する抜粋はありますか?繰り返さないように注意してください。また、解釈に必要なすべてのコンテキストが含まれていることを確認してください。つまり、重要なコンテキストが欠けている小さなスニペットを抽出しないでください。


戦略: 外部ツールを使用する

戦術: 埋め込みベースの検索を使用して効率的な知識検索を実装する

モデルは、提供された情報源を利用して、より情報に基づいた最新の回答を生成できます。たとえば、特定の映画について質問された場合、映画に関する高品質な情報(俳優、監督など)をモデルの入力に追加することが有用です。埋め込みは、効率的な知識検索を実装するために使用でき、関連する情報をランタイムで動的にモデル入力に追加できます。

テキスト埋め込みとは、テキスト文字列間の関連性を測定できるベクトルのことです。類似または関連する文字列は、無関係な文字列よりも互いに近くなります。この事実と高速なベクトル検索アルゴリズムの存在を活用して、埋め込みを用いて効率的な知識検索を実装できます。具体的には、テキストコーパスをチャンクに分割し、それぞれのチャンクを埋め込みとして保存します。その後、クエリを埋め込み、ベクトル検索を実行して、クエリに最も関連するテキストチャンクをコーパスから見つけます(すなわち、埋め込み空間内で最も近いものを見つけます)。

OpenAI Cookbookでは、これを実装するための例を見つけることができます。詳しくは、「取得された知識を使用してクエリに答えるようにモデルに指示する」戦術を参照してください。これにより、モデルが誤った事実を作り上げる可能性を最小限に抑えることができます。


戦術: より正確な計算を行うためにコード実行を使用する、または外部APIを呼び出す

言語モデルは、単独で正確な算術や長い計算を実行することに信頼できない場合があります。このような場合には、モデルに独自の計算を行わせるのではなく、コードを作成して実行するように指示できます。具体的には、モデルに実行すべきコードを三重バックティックなどの指定された形式に書かせることができます。出力が生成された後、コードを抽出して実行します。必要に応じて、コード実行エンジン(たとえばPythonインタープリター)からの出力を次のクエリの入力としてモデルに提供することもできます。

SYSTEM: Pythonコードを三重バックティック(```)で囲んで書き、実行することができます。これを使用して計算を行ってください。

USER: 次の多項式のすべての実数解を求めてください: 3x*5 - 5x4 - 3x3 - 7*x - 10。

また、コード実行のもう一つの良いユースケースは、外部APIを呼び出すことです。モデルがAPIの使用方法について適切に指示されている場合、APIを使用するコードを書かせることができます。モデルにAPIの使い方を指示するには、ドキュメントやAPIの使用方法を示すコードサンプルを提供することができます。

SYSTEM: Pythonコードを書き、実行するためには三重バックティックを使用してください。また、ユーザーが友人にメッセージを送るのを手助けするための以下のモジュールにアクセスできることに注意してください。

pythonコードをコピーするimport message message.write(to="John", message="仕事終わりに会いたい?")

注意: モデルによって生成されたコードを実行することは、必ずしも安全ではなく、これを行うアプリケーションでは注意が必要です。特に、信頼されていないコードが引き起こす可能性のある害を制限するために、サンドボックス化されたコード実行環境が必要です。


戦術: モデルに特定の関数へのアクセスを許可する

Chat Completions APIでは、リクエスト内に関数の説明のリストを渡すことができます。これにより、モデルは提供されたスキーマに従って関数の引数を生成できるようになります。生成された関数引数はAPIによってJSON形式で返され、関数呼び出しを実行するために使用できます。関数呼び出しから提供された出力は、次のリクエストでモデルにフィードバックしてループを閉じることができます。外部関数を呼び出すためにOpenAIモデルを使用する推奨方法はこれです。詳細については、導入のテキスト生成ガイドの関数呼び出しセクションとOpenAI Cookbookの関数呼び出しの例を参照してください。


戦略: 変更を体系的にテストする

システムの変更(例えば、新しい指示や新しいデザイン)がシステムを改善したのか悪化させたのかを判断するのは難しい場合があります。いくつかの例を見れば、どちらが良いかの手がかりが得られることがありますが、サンプルサイズが小さいと、本当の改善と偶然の幸運を区別するのは難しいかもしれません。変更が一部の入力ではパフォーマンスを向上させるが、他の入力ではパフォーマンスを低下させる場合もあります。

評価手順(または「評価」)は、システム設計の最適化に役立ちます。良い評価は次の特徴を持ちます:

  • 実際の使用状況を代表している(または少なくとも多様である)
  • 統計的な力を高めるために多くのテストケースを含んでいる(下表を参照)
  • 自動化や繰り返しが簡単である

検出する差異 | 95%の信頼性を持つサンプルサイズ 30% | 約10 10% | 約100 3% | 約1,000 1% | 約10,000

出力の評価は、コンピューターや人間、またはその両方によって行うことができます。コンピューターは、客観的な基準(例: 正しい回答が1つしかない質問)や、モデル出力を他のモデルクエリで評価する一部の主観的または曖昧な基準を自動化して評価できます。OpenAI Evalsは、評価を自動化するためのツールを提供するオープンソースのソフトウェアフレームワークです。

モデルベースの評価は、複数の出力が同等に高品質と見なされる場合(例: 長い回答が必要な質問)に役立ちます。モデルベースの評価で現実的に評価できる範囲と、人間の評価が必要な範囲の境界は曖昧であり、モデルがより高度になるにつれてその境界も変化しています。モデルベースの評価が特定のユースケースでどれだけうまく機能するかを理解するために、実験することをお勧めします。


戦術: ゴールドスタンダードの回答を参照してモデルの出力を評価する

質問に対する正しい回答が特定の既知の事実に基づいていることがわかっている場合、モデルクエリを使用して、回答にどれだけの必要な事実が含まれているかをカウントすることができます。

例えば、次のシステムメッセージを使用する場合を考えてみます:

SYSTEM: 三重引用符で区切られたテキストが提供されます。それは質問に対する回答であるはずです。次の情報が回答に直接含まれているかどうかを確認してください:

  • ニール・アームストロングは、月面に初めて足を踏み入れた人物である。
  • ニール・アームストロングが月面に初めて足を踏み入れた日は1969年7月21日である。

これらの各ポイントに対して、以下の手順を実行してください:

  1. ポイントを再度記述してください。
  2. ポイントに最も近い回答の引用を提供してください。
  3. この引用を読んだ人が、トピックを知らなくてもそのポイントを直接推測できるかどうかを考慮してください。その理由を説明してから決定してください。
  4. 3の回答が「はい」であれば「yes」と書いてください。そうでない場合は「no」と書いてください。

最後に、"yes" の数をカウントしてください。結果を次の形式で提供してください: {"count": <insert count here>}。


ここでは、「OpenAI プロンプトエンジニアリングガイド」の主要な戦略と戦術について、詳細に説明しました。これらの手法を適切に適用することで、GPTモデルからの出力をより精度の高いものにし、意図した結果を効果的に得ることが可能になります。これらの戦術はすべて、さまざまなシナリオで活用できる汎用的なアプローチですので、ぜひ実践してみてください。


プロンプトエンジニアリングの応用事例

プロンプトエンジニアリングの実際の応用事例をいくつか紹介します。これらの事例を通じて、さまざまな分野でどのようにGPTモデルが活用され、プロンプトエンジニアリングがその効果を最大限に引き出しているのかを理解することができます。

企業でのプロンプトエンジニアリング活用例

ある大手企業は、カスタマーサポートにGPTモデルを導入しました。プロンプトエンジニアリングを活用することで、サポートチームは迅速かつ的確な回答を提供できるようになり、顧客満足度が大幅に向上しました。たとえば、問い合わせ内容に応じた具体的なプロンプトを設計し、モデルが適切な情報を提供できるようにしました。

教育分野でのGPT活用事例

教育機関では、GPTモデルを使用して自動的に学習コンテンツを生成する取り組みが進んでいます。プロンプトエンジニアリングを駆使して、モデルが学生の学習進度や理解度に合わせたコンテンツを作成することで、個別化された教育が実現しました。具体的な指示を与えることで、モデルは学生に最適な学習内容を提供できるようになりました。

クリエイティブ業界での実際の使用ケース

クリエイティブ業界では、GPTモデルを活用して新しいアイデアの創出やコンセプト開発を行っています。プロンプトエンジニアリングによって、モデルは特定のテーマやスタイルに基づいたクリエイティブな提案を行うことができ、クリエイティブプロセスの効率化に貢献しています。

例えば、プロンプトに「未来的なデザインのコンセプトを3つ提案してください」と指定することで、モデルは具体的で斬新なアイデアを提供しました。

Download

資料ダウンロード(無料)

STYZでは、定期的に事例・実績、システム開発に纏わるナレッジなどを公開しております。ぜひご活用ください。

資料ダウンロード(無料)

Contact

お問い合わせ・ご相談

プロジェクトに関するご相談はお気軽にご相談ください。お見積もり依頼も可能です。1営業日中にご返信いたします。

お問い合わせする