見出し画像

GPTベストプラクティス完全版:より良い結果を得るための戦略と戦術

GPTを使って思ったような結果を得たい場合は、GPTの使い方を正しく学ぶ必要があります。誰かが作ったガイドや有料プロンプトも良いですが、まずはOpenAIの公式ドキュメントで最高の戦略と戦術を学びましょう。

OpenAI公式ドキュメントの「GPT best practices」を日本語訳しました。少々長いですが、非常に価値のあるガイドですので最後まで読んでみてください。

サッと読みたい方は、Twitterの簡易版をご覧ください。

この記事は一部有料となっています。翻訳しただけで有料かよ!という声が聞こえてきそうですが、ただ翻訳ツールを使ってコピペしただけのものではなく、日本語で意味が通るように細部まで修正を入れてます。オリジナルとかけ離れすぎない範囲で、見やすくわかりやすく書いたつもりです。作成に丸2日かけました。コーヒー代をおごるつもりでご購入いただけたら幸いです🙇

以下、GPTベストプラクティス完全版↓


このガイドでは、GPTからより良い結果を得るための戦略と戦術を紹介します。ここで説明する方法は、時には組み合わせて使うことでより大きな効果を発揮します。色々試して、自分にとって最も効果的な方法を見つけてみてください。

ここで紹介するいくつかの例は、現在、最も高性能なモデルであるgpt-4でのみ動作します。まだgpt-4にアクセスできない場合は、ウェイティングリストに参加することを検討してください。一般的に、あるタスクでGPTモデルが失敗した場合、より高性能なモデルが利用できるなら、より高性能なモデルで再挑戦する価値があることが多いようです。

【戦略】明確な指示を書く

GPTはあなたの心を読むことはできません。出力が長すぎる場合は、簡潔な返信を求めてください。出力が単純すぎる場合は、専門家レベルの文章をお願いしてください。フォーマットが気に入らない場合は、自分が希望するフォーマットを示してください。GPTがあなたの望みを推測する必要が少ないほど、あなたはより多くのものを手に入れることができます。

【戦術】より適切な回答を得るためにクエリに詳細を含める

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

❌ Excelで数値を足すには?

✅ Excelで金額の行を合計するには?これを行のシート全体に対して自動的に実行し、すべての合計が右側の「合計」という列に表示されるようにしたい。

❌ 大統領は誰?

✅ 2021年のメキシコ大統領は誰でしたか?また選挙はどのくらいの頻度で行われていますか?

❌ フィボナッチ数列を計算するコードを書いて。

✅ フィボナッチ数列を効率的に計算するTypeScript関数を書いて。それぞれの部分が何をしているのか、なぜそのように書かれているのかを説明するために、コードに自由にコメントを付けて。

❌ 会議のメモをまとめて。

✅ 会議のメモを1段落にまとめて。次に、発言者とその要点をマークダウンでリストアップして。最後に、発言者が提案した次のステップやアクション項目があれば、それをリストアップして。

【戦術】モデルにペルソナを採用してもらう

システムのメッセージは、モデルが返信で使用するペルソナを指定するために使用できます。

SYSTEM:
私が何か書くのを手伝ってほしいと頼むと、あなたは各段落に少なくとも1つのジョークや遊び心のあるコメントが含まれた文書を返します。

USER:
急な依頼にもかかわらず、時間通りに納品してくれたスチールボルト業者に感謝の手紙を書きます。おかげで重要な注文を届けることができました。

【戦術】区切り文字を使用して入力の異なる部分を明確に示す

トリプルクォーテーション(三重引用符)、XMLタグ、セクションタイトルなどの区切り記号は、テキストのセクションを区別するのに役立ちます。

USER:
三重引用符で区切られた文章を俳句で要約して。

"""ここにテキストを挿入"""

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

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

SYSTEM:
論文の概要とそのタイトル案が提供されます。論文のタイトルは、読者に論文のテーマがよくわかるものであると同時に、目を引くものでなければなりません。タイトルがこれらの基準を満たさない場合は、代替案を5つ提案してください。

USER:
概要:ここに概要を挿入
タイトル:ここにタイトルを挿入

このような単純なタスクの場合、区切り文字を使っても出力の品質に差は出ないかもしれません。しかし、タスクが複雑であればあるほど、タスクの詳細を明確にすることは重要になります。

【戦術】タスクを完了するために必要なステップを指定する

タスクの中には、一連のステップとして指定するのが最適なものがあります。ステップを明示的に書き出すことで、モデルがそれに従うことが容易になります。

SYSTEM:
ユーザーの入力に応答するには、以下の段階的な指示を使用してください。

ステップ1 - ユーザーはあなたに三重引用符で囲まれたテキストを提供します。このテキストを「概要: 」という接頭辞をつけて一文に要約してください。

ステップ2 - ステップ1の概要を「翻訳: 」という接頭辞を付けてスペイン語に翻訳してください。

USER:
"""ここにテキストを挿入"""

【戦術】例を挙げる

すべての例に適用される一般的な指示を提供することは、通常、タスクのすべての順列を例で示すよりも効率的ですが、場合によっては例を提供する方が簡単な場合もあります。例えば、明示的に記述することが難しい、ユーザーのクエリに応答する特定のスタイルをモデルにコピーさせる場合です。これは「few-shot」プロンプティングとして知られています。

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

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

ASSISTANT:
最も深い谷を刻む川はささやかな泉から流れ、最も壮大な交響曲は単一の音から生まれ、最も複雑なタペストリーは一本の糸から始まります。

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

【戦術】出力したい長さを指定する

指定された長さの出力を生成するようにモデルに要求することができます。目標とする出力の長さは、単語、文、段落、箇条書きなどの数で指定できます。ただし、特定の単語数を生成するようにモデルに指示しても、高い精度では機能しないことに注意してください。モデルは、特定の段落数や箇条書きの数を持つ出力をより確実に生成することができます。

USER:
三重引用符で囲まれた文章を50字程度で要約して。

"""ここにテキストを挿入"""

USER:
三重引用符で囲まれた文章を2段落にまとめて。

"""ここにテキストを挿入"""

USER:
三重引用符で囲まれた文章を3つの箇条書きにまとめて。

"""ここにテキストを挿入"""

【戦略】参考テキストを提供する

GPTは、特に難解なトピックや、引用やURLについて尋ねられると、自信を持って偽の答えを作り出すことができます。ノート一枚でテストがうまくいくのと同じように、GPTに参考文献を提供することで、捏造の少ない回答ができるようになります。

【戦術】参考テキストを使用して回答するようモデルに指示する

現在のクエリに関連する信頼できる情報をモデルに提供することができれば、提供された情報を使って答えを構成するようモデルに指示することができます。

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

USER:
"""記事1"""
"""記事2"""

質問:(ここに質問を入れる)

GPTのコンテキストウィンドウが限られていることを考えると、この戦術を適用するためには、質問されていることに関連する情報を動的に検索する方法が必要です。埋め込み(Embeddings)は効率的なナレッジ検索を実装するために使用できます。これを実装する方法の詳細については、後に紹介する戦術「埋め込みベースの検索を使用して効率的なナレッジ検索を実装する」を参照してください。

【戦術】参考テキストから引用して回答するようモデルに指示する

入力が関連する知識で補足されている場合は、提供されたドキュメントからの一節を参照することで、モデルの回答に引用を追加するよう要求するのは簡単です。出力内の引用は、提供されたドキュメント内の文字列マッチングによってプログラムで検証できることに注意してください。

SYSTEM:
三重引用符で囲まれたドキュメントと問題があなたに提供されます。あなたの課題は、提供されたドキュメントのみを使って質問に答え、質問に答えるために使用されたドキュメントの一節を引用することです。もしそのドキュメントに質問に答えるのに必要な情報が含まれていない場合は、単に「情報が不十分です」と書いてください。質問に対する回答が記載されている場合は、引用の注釈が必要です。関連する文章を引用する場合は、次の形式を使用してください:({"引用": ...})

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

質問:(ここに質問を入れる)

【戦略】複雑なタスクをよりシンプルなサブタスクに分割する

ソフトウェア工学において、複雑なシステムをモジュール化されたコンポーネントの集合に分解することが良い習慣であるように、GPTに提出されるタスクにも同じことが言えます。複雑なタスクは、単純なタスクよりもエラー率が高くなる傾向があります。さらに、複雑なタスクは、単純なタスクのワークフローとして再定義できることが多く、その場合、前のタスクのアウトプットが後のタスクのインプットを構築するために使用されます。

【戦術】インテント分類を使用して、ユーザーのクエリに最も関連性の高い指示を特定する

さまざまなケースを処理するために多数の独立した命令セットが必要なタスクの場合、最初にクエリのタイプを分類し、その分類を使用してどの命令が必要かを判断することが有益な場合があります。これは、固定のカテゴリを定義し、特定のカテゴリのタスクの処理に関連する命令をハードコーディングすることで実現できます。このプロセスは、タスクを一連のステージに分解するために再帰的に適用することもできます。このアプローチの利点は、各クエリにはタスクの次の段階を実行するために必要な命令のみが含まれるため、単一のクエリを使用してタスク全体を実行する場合に比べてエラー率が低くなる可能性があることです。また、プロンプトのサイズが大きくなるほど実行コストが高くなるため、コストを削減できる可能性もあります(価格情報を参照)。

例えば、顧客サービスのアプリケーションの場合、クエリは次のように分類できます:

SYSTEM:
顧客サービスに関する問い合わせがあなたに提供されます。各クエリを1次カテゴリと2次カテゴリに分類してください。「1次カテゴリ」と「2次カテゴリ」をキーとして、json形式で出力してください。

主なカテゴリ:請求、テクニカルサポート、アカウント管理、一般的な問い合わせ

請求の2次カテゴリ:
- 退会またはアップグレード
- 支払い方法の追加
- 請求の説明
- 請求に対する異議申し立て

テクニカルサポートの2次カテゴリ:
- トラブルシューティング
- デバイスの互換性
- ソフトウェアの更新

アカウント管理の2次カテゴリ:
- パスワードリセット
- 個人情報の更新
- アカウント閉鎖
- アカウントのセキュリティ

一般的な問い合わせの2次カテゴリ:
- 製品情報
- 価格について
- フィードバック
- 人間と話す

USER:
インターネットを再び使えるようにしたい。

顧客のクエリの分類に基づいて、次のステップを処理するためのより具体的な一連の指示をGPTモデルに提供することができます。例えば、顧客が「トラブルシューティング」のサポートを必要としているとします。

SYSTEM:
テクニカルサポートにおけるトラブルシューティングを必要とするカスタマーサービスの問い合わせがあなたに提供されます。以下の方法でユーザーをサポートしてください:

- ルーターとの間のケーブルがすべて接続されていることを確認してもらう。時間の経過とともにケーブルが緩むことはよくあります。
- すべてのケーブルが接続されているにもかかわらず問題が解決しない場合は、使用しているルーターのモデルを尋ねてください。
- デバイスの再起動方法をアドバイスする:
-- 型番がMTD-327Jの場合は、赤いボタンを5秒間押し続け、5分待ってから接続をテストするようアドバイスしてください。
-- 型番がMTD-327Sの場合は、プラグを一度抜いて差し直し、5分待ってから接続をテストするようアドバイスしてください。
- デバイスを再起動して5分待っても顧客の問題が解決しない場合は、{"ITサポート要請"}を出力してITサポートに接続します。
- ユーザーがこのトピックに関係のない質問を始めた場合、トラブルシューティングに関する現在のチャットを終了するかどうかを確認し、以下のスキームに従ってリクエストを分類します:

(上記の1次/2次分類スキームをここに挿入)

USER:
インターネットを再び使えるようにしたい。

モデルは、会話の状態が変化したときに特別な文字列を出力するように指示されていることに注目してください。これにより、システムをステートマシンにすることができ、どの命令が注入されるかは状態によって決定されます。状態、またその状態においてどの命令が関連するのか、およびオプションとしてその状態からどのような状態遷移が許可されるのかを追跡することで、構造化されていないアプローチでは実現が難しいガードレールをユーザーエクスペリエンスに張り巡らせることができます。

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

GPTはコンテキストの長さが決まっているため、会話全体がコンテキストウィンドウに含まれるようなユーザーとアシスタントの対話を無限に続けることはできません。

この問題には様々な回避策があり、その1つは、会話の前のターンを要約することです。入力のサイズが所定のしきい値の長さに達すると、会話の一部を要約するクエリがトリガーされ、前の会話の要約がシステムメッセージの一部として含まれる可能性があります。あるいは、会話全体を通してバックグラウンドで非同期的に以前の会話を要約することもできます。

別の解決策は、現在のクエリに最も関連性のある以前の会話部分を動的に選択することです。後に紹介する戦術「埋め込みベースの検索を使用して効率的なナレッジ検索を実装する」を参照してください。

【戦術】長い文書を断片的に要約し、完全な要約を再帰的に構築する

GPTは固定されたコンテキストの長さを持っているため、単一のクエリで、コンテキストの長さから生成される要約の長さを引いた範囲よりも長いテキストの要約を作成することはできません。

本などの非常に長い文書を要約するには、一連のクエリを使用して文書の各セクションを要約できます。セクションの要約は連結され、要約の要約が生成されます。このプロセスは、文書全体が要約されるまで再帰的に続行できます。後のセクションの意味を理解するために、前のセクションの情報を使う必要がある場合、さらに有効なテクニックは、本の特定の時点の内容を要約する際に、その時点より前のテキストの進行要約を含めることです。本を要約するためのこの手順の有効性は、GPT-3の変種を使ったOpenAIの以前の研究で研究されています。

ここから先は

8,147字

¥ 300

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