OpenAI 公式プロンプト エンジニアリング ガイド: 優れたプロンプトを作成するための 6 つの戦略

実際、多くの人から、良い結果を達成するための Prompt の書き方や、テンプレートはあるのかという質問を受けてきました。

毎回言いますが、自分の考えを明確に表現できることが最も重要であり、あらゆるスキルは二の次です。ただし、それでも信頼できる文書を送りたいと考えています。

ただし、インターネット上のさまざまないわゆる Prompt フレームワークやチュートリアルは非常にわかりにくく、わかりにくいです。

2 日前の 12 月 15 日まで、OpenAI はプロンプト ワード エンジニアリング ガイドであるプロンプト エンジニアリングをドキュメントで発表していましたが、この時点で、ついに権威ある有効なプロンプト エンジニアリング標準ドキュメントが完成しました。

写真

20 分かけて読んだ後、私は実際に故意に微笑みました。ガイド全体は簡潔で、明確で、効率的で、非常によく書かれていました。

OpenAI は、次の 6 つの主要原則について言及しました。

  1. 明確な指示を書く

  2. 参考テキストを提供する

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

  4. モデルに「考える」時間を与えます (モデルに「考える」時間を与えます)

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

  6. テストは体系的に変更されます

この記事は、具体的な原則や事例を分かりやすく説明するために使用するものであり、第6条は一般ユーザーにはあまり役に立たないので無視していただいて構いません。最後に別のマインドマップを載せておきますが、読む時間がない場合は、記事を保存して最後までスライドしてマインドマップを保存してください。

信じてもらえると思いますが、市場に出回っているプロンプト フレームワークやテクニックの 99% は、この記事ほど役に立ちません。

01

明確な指示を書く

これは私が毎日言っていることであり、どんな即効性のあるテクニックも、自分のニーズを明確に表現することには劣ります。それは他人とのコミュニケーションのようなものです。自分の言葉が理解できないのに、どうすれば相手に理解してもらえるでしょうか?プロンプト テンプレートのコピーだけに依存することは、実際には長期的な解決策ではありません。

したがって、明確な指示を書くことが核中の核となります。

明確な指示を書く方法、OpenAI が 6 つのヒントを提供します。

1. 詳細に説明する

重要な詳細とコンテキストをできるだけ多く提供します。率直に言うと、ステートメントはできるだけ明確にし、一般的になりすぎないようにしてください。

例えば:

「概要会議の議事録」とは言わないでください

代わりにこう言います。

「会議のメモを 1 つの段落に要約します。次に、講演者と各要点のマークダウン リストを作成します。

最後に、講演者が推奨する次のステップやアクション アイテムがある場合は、それをリストします。

2. モデルに役割を果たしてもらいましょう

俳優としての大物モデルを思い浮かべてください。彼にどのような役を演じてもらいたいかを伝える必要があります。そうすれば、彼はよりプロフェッショナルで明確になるでしょう。これが真実です。」

例えば:

ジョークを言うのが大好きなコメディアンのような役割を果たし、私が何かを書くのを手伝ってほしいと頼むたびに、各段落に少なくとも 1 つのジョークや面白いコメントが含まれた文書を返してくれるでしょう。

3. 区切り文字を使用して、入力の異なる部分を明確に示します

三重引用符、XML タグ、セクション ヘッダーなどの区切り文字は、別の方法で処理する必要があるテキストのセクションを区切るのに役立ちます。これは、大規模なモデルがテキストの内容をよりよく理解するのに役立ちます。私のお気に入りは、コンテンツのフレームに「"」を使用することです。

例えば:

三重引用符で区切られたテキストを 50 文字に要約します。"""ここにテキストを挿入"""

4. タスクを完了するために必要な手順を指定します

一部のタスクは気まぐれに分割でき、一連のステップとして指定するのが最適です。これらのステップを明示的に書き出すと、モデルでの実装が容易になります。

例えば:

ユーザー入力に応答するには、次の段階的な手順を使用してください。ステップ1 *-ユーザーは三重引用符で囲んだテキストを提供します。「概要:」という接頭辞を付けて、一文で文章を要約します。ステップ 2 - ステップ 1 の要約をスペイン語に翻訳し、接頭辞「翻訳:」を追加します。

5. 例を提供する

つまり、古典的な数回のプロンプトを最初に大規模なモデルのサンプルにスローし、大規模なモデルがサンプルに従って出力するようにします。

例えば:

この文章のスタイルで XX の記事を書きます。「」「沈む雲と孤独な白鳥が一緒に飛び、秋の水は空と同じ色です。漁船は遅く歌い、その音は貧しい蓬里にあります」海岸"""

6. 出力長を指定する

モデルは、指定されたターゲットの長さの出力を生成するように要求できます。目標出力長は、単語、文、段落、箇条書きなどの数で指定できます。中国語ではその効果は明ら​​かではありませんが、同時に、指定した長さはおおよその推定値にすぎず、数語であれば間違いなく不正確ですが、複数の段落であれば効果は高くなります。

例えば:

三重引用符で区切られたテキストを 2 段落、100 文字に要約します。"""ここにテキストを挿入"""

02

参考テキストを提供する

大規模なモデルにテキストまたはドキュメントを提供すると、大規模なモデルが無意味なことを話す可能性を大幅に減らすことができます。実際には、大きなモデルを知識ベースとして使用することです。

1.参考テキストを使用してモデルに解答させます

ナレッジ ベースの古典的な使用法は、提供された情報を使用して大規模なモデルに答えを作成させることです。

例えば:

質問に答えるには、提供されている三重引用符の一節を使用してください。記事内で答えが見つからない場合は「答えが見つかりません」と書いてください。"""<ここにドキュメントを挿入します""""""<ここにドキュメントを挿入します""

質問: <ここに質問を挿入>

2. 参考文献を引用して模範解答をさせる

テキストが指定されている場合は、提供されたドキュメントの一節を引用することで、回答に引用を追加するようモデルに直接依頼できます。正確性が向上し、検証可能性が高まります。

例えば:

三重引用符で区切られた文書と質問が表示されます。あなたの仕事は、提供された文書のみを使用して質問に答え、質問に答えるために使用された文書の一節を引用することです。この質問に答えるために必要な情報が文書に含まれていない場合は、「情報が不十分です」とだけ記入してください。質問に対する回答が提供される場合は、引用注記を添付する必要があります。関連する文章を引用するには、次の形式を使用します ({"引用": ...})。

"""<ここに文書を挿入>"""

質問: <ここに質問を挿入>

03

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

実際、人間と同じように、リーダーとして部下に非常に大きなことを一度に依頼すると、間違いを犯す可能性が非常に高くなります。同様のことが多くの大規模プロジェクトにも当てはまります。始める。仕事をするとき、私たちはさまざまな詳細、サブタスク、サブ目標などを細分化することについてよく話します。大型モデルも同様です。

複雑なタスクをより単純なサブタスクに分割することで、大規模なモデルのパフォーマンスが向上します。

1. インテント分類を使用して、ユーザーのクエリに最も関連する指示を特定します。

意図認識はその典型的な例です。たとえば、カスタマー サービスのシナリオで、ユーザーが「インターネットに接続できなくなったらどうすればよいですか?」という質問をした場合、大手モデルに直接返答を求めるのは実際には非常に困難ですが、現時点では、まず、大きなカテゴリの下で意図認識を分解し、次に具体的な質問に答えます。

たとえば、「インターネットに接続できなくなったらどうすればよいですか?」という質問があります。

ステップ 1、まず問題のカテゴリを特定します。

写真

ここで、ステップ 1 に従って、大きなモデルは「インターネットから切断された場合はどうすればよいか」がテクニカル サポートのトラブルシューティングの問題であることを認識し、ステップ 2 に進むことができます。

写真

この時点で、ユーザーは「インターネットに接続できなくなったらどうすればよいですか?」に対する非常に効果的な答えを得ることができます。

2. 長い会話が必要な会話アプリケーションの場合、以前の会話を要約またはフィルタリングします。

このヒントは開発者向けに偏っています。一般のユーザーはスキップできます。

モデルのコンテキストの長さは固定されているため、ユーザーとアシスタントの間の会話を無限に続けることはできません。

この問題を解決するにはいくつかの方法があります。最初の方法は、会話の履歴を要約することです。入力のサイズが所定のしきい値長に達すると、会話の一部を要約するクエリがトリガーされ、以前の会話の要約がシステム メッセージの一部として含まれる場合があります。あるいは、会話全体を通じて、以前の会話をバックグラウンドで非同期的に要約することもできます。

これらの方法は両方とも使用できます。また、過去のすべてのチャット記録をベクトル ライブラリとして保存し、その後のユーザーとの会話中にそれらを動的にクエリして埋め込むこともできます。

3. 長い文書を部分的に要約し、再帰的に完全な要約を構築する

また開発者に偏っています。一般のユーザーはスキップできます。

実際、これは数百ページの PDF ドキュメントを要約するための原則です。たとえば、大規模なモデルが本を要約する場合、トークンの制限を確実に超えるため、一連のクエリを使用してドキュメントの各部分を要約することができます。 。章の要約を接続して要約し、要約の要約を生成できます。このプロセスは、文書全体が要約されるまで再帰的に実行できます。OpenAI は、GPT-3 の亜種を使用した以前の研究で、書籍を要約するこのプロセスの有効性を研究しました。

詳細については、次のドキュメントを参照してください: https://openai.com/research/summarizing-books

写真

04

モデルに「考える」時間を与えます

この神レベルのリマインダーの言葉の源を、ステップバイステップで考えてください(ステップバイステップで考えてください)。実際、これは思考連鎖プロンプティング (CoT) であり、非常に便利な戦略です。

人と同じように、「12314992*177881はいくらに等しいか」と直接尋ねると、間違いなく混乱するでしょうが、時間をかけて少しずつ計算してみましょう。小学校の算数を勉強していれば計算できると思います。 、 右?

CoT に基づいて、OpenAI はさらに 3 つのヒントを詳しく提供します。

1. 結論を急ぐ前に、モデルに独自の解決策を見つけてもらいます。

たとえば、大きなモデルに数学の問題を投げて、それが正しいか間違っているかを判断してもらうと、結果は非常にランダムであることがわかります。しばらくの間は正しいか間違っているかも知れません。最初にそれ自体を実行してから、それが正しいか間違っているかを判断すると、結果は非常に正確になります。

たとえば、次のように言うことができます。

まずは問題に対する独自の解決策を開発することから始めます。次に、自分の解答と生徒の解答を比較し、生徒の解答が正しいかどうかを評価します。あなた自身が問題を解くまでは、生徒の解答が正しいかどうかを判断しないでください。

2. 内なる独白を使用してモデルの推論プロセスを隠す

これは非常に興味深い手法ですが、ステップごとに考えて推論のプロセスを示したほうが効果的ではないかと疑問に思われるかもしれません。

あなたは正しいですが、このヒントは開発者向けです。一部のアプリケーションでは、最終的な答えに到達するために大規模なモデルで使用される推論プロセスは、ユーザーと共有するのには適していません。たとえば、個別指導アプリケーションでは、生徒が自分で答えを考え出すように奨励したい場合がありますが、生徒の解決策に関するモデルの推論により、生徒に答えが明らかになる可能性があります。

そこで、この内なるモノローグのテクニックがあります。inner monologue のアイデアは、ユーザーから隠される出力の部分を、解析しやすくする構造化された形式にモデルに配置させることです。その後、出力が解析され、ユーザーに表示される前にその一部のみが表示されます。

例えば:

写真

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

写真

最後に、大規模なモデルに独自の分析を使用させて、役立つメンターの役割で応答を構築させることができます。

写真

モデルの推論プロセスを非表示にしながら、API と複数回通信して、生徒の個別指導計画の会話を完了します。

3. 前のプロセスで何か見逃していないかモデルに尋ねます

この手法は、長いテキストの Q&A でよく使用されます。たとえば、ドキュメントが与えられ、特定の質問に関連する情報を大規模なモデルにリストしたいとします。ソースドキュメントが大きい場合、モデルが途中で停止し、すべての関連情報をリストできなくなることがよくあります。この場合、通常は後続のプロンプトを使用して、前のパスで見逃した関連情報をモデルに検索させることで、パフォーマンスを向上させることができます。

たとえば、「北京ローストダックの何がそんなにおいしいのですか?」という私の文書に基づいた質問のうち、該当する部分をリストアップしてもらい、それを JSON 形式で出力してもらいました。

[{"関連フラグメント": "..."},

出力が停止したら、もう一度尋ねることができます。

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

05

外部ツールを使用する

大規模モデルは全能ではありません。数学や一部のリアルタイム問題など、多くのことについて大規模モデルの効果はそれほど良くないため、それに対処するためにいくつかの外部ツールが必要です。

つまり、サードパーティ ツールが安定した結果を取得できる場合、大規模モデルは実際には何もする必要がないか、大規模モデルに応答アセンブリ クラスの作業を実行させるだけで十分です。

1. 埋め込みベースの検索を使用した効率的な知識検索

ほとんどの知識ベースの原則は、検索拡張生成 (RAG) と検索拡張生成です。たとえば、近日公開予定の映画「アクアマン 2」をどう評価するか尋ねた場合、大きなモデルにそれ自体で答えさせれば、間違いなく評価されます。役に立ちません。静的です。「アクアマン 2」がリリースされることを知らなかったので、最初にオンラインで確認する必要がありました。確認した後、大量の情報をフィードバックして、大きなモデルに基づいて回答してもらいました彼が見つけた情報について。これは動的な情報です。

ただし、ベクトル マッチングを使用する静的なナレッジ ベースもあります。一般的な手順: ファイルの読み込み -> テキストの読み取り -> テキストのセグメント化 -> テキストのベクトル化 -> 質問のベクトル化 -> テキスト ベクトル内の質問の照合 最も類似した文ベクトルの上位 k 個-> 一致したテキストがコンテキストおよび質問としてプロンプトに追加されます -> 回答を生成するために大規模モデルに送信されます。

それが仕組みです。

2. コード実行を使用して、より正確な計算を実行するか、外部 API を呼び出します

大規模モデルの計算能力がゴミであることは誰もが知っているため、OpenAI では、計算が必要なものに遭遇した場合は、大規模モデルに計算用の Python コードを作成させるのが最善であると推奨しています。計算問題で。

例えば:

次の多項式の実数値の根をすべて求めます: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10。Python コードを 3 つのバッククォートで囲んで、Python コードを作成して実行する必要があります (例: 「""code fits here""")。計算を実行するために使用します。

もちろん、Python が使用されており、独自の API ドキュメントをそれにコピーして、API を呼び出すコードの書き方を大きなモデルに知らせることもできます。

3. モデルに特定の機能を提供する

これは非常に開発者向けのトリックであり、一般のユーザーは直接スキップできます。

つまり、API リクエストを通じて一連の特定の関数の説明を渡すことができます。使用可能な関数と、これらの関数のパラメーターがどのようになるかをモデルに指示します。その後、モデル モジュールは対応する関数パラメーターを生成し、API を介して JSON 形式で返されます。

JSON 配列はすでに取得しています。データベースとのやり取りの数を説明する必要はありません。データ クエリ、データ処理など、何でもできます。

処理後、JSON 配列を大規模モデルに返し、大規模モデルを人間の言語でユーザーに出力できるようにすれば完了です。

06

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

これは主に、プロンプトの変更 (新しい指示や新しいデザインなど) がシステムを良くするか悪くするかを開発者が判断するのに役立ちます。結局のところ、ほとんどの場合、サンプルサイズは比較的小さいため、真の改善と純粋な幸運を区別するのは困難です。

したがって、OpenAI では、最適化システムの設計が効果的であるかどうかを判断するための評価プログラムを開発することを推奨しています。

これについては詳しく説明しませんが、興味がある場合、または独自の AI アプリケーションを開発している場合は、自分で確認してください。

https://platform.openai.com/docs/guides/prompt-engineering/strategy-test-changes-systematally

OpenAI Prompt エンジニアリングは非常に詳細に書かれており、市販の多くのフレームワークやコースよりも優れていると思います。

時々復習しやすくするために、記事と合わせて読めるマインドマップも作成しました。

写真

07

Notion、Google、Claude によって追加されました

Google、Microsoft、Notion などにもプロンプト ガイドラインについて説明した専用の記事があり、その中心的な見解は実際には OpenAI の見解と少し似ています。

たとえば、Google のチュートリアルでは次のように言及されています。

  1. 最も重要なコンテンツや情報を明確に伝えます。(目的を明確に述べてください)

  2. プロンプト単語を作成します。最初にその役割を定義し、コンテキスト/入力データを提供し、次に指示を与えます。(役割を定義し、詳細な背景を提供し、要件を提供します)

  3. 具体的で多様な例を提供すると、モデルはその例に基づいてより正確な結果を生成できます。(参考例を提供します)

  4. 制約を使用してモデル出力の範囲を制限し、無関係または不正確な情報が生成されないようにします。(出力内容の「トピック範囲」を制限します)

  5. 複雑なタスクを一連の単純なプロンプト単語に分割します。(複雑なタスクの場合は、単純なステップに分割します)

  6. 応答を生成する前に、モデル自体の応答を評価または検査するようにモデルに指示します。たとえば、「回答は 3 つの文に制限してください」、「回答の簡潔さを 1 から 10 のスケールで評価してください」、「これは正しいことだと思いますか?」などです。(「出力品質」を制限する)

  7. 思考連鎖推論: 複雑な問題の場合、指示の最後に「ステップバイステップで考えてみましょう」を追加すると、モデルは厳密な論理推論プロセスに従って結果を出力します。(「段階的に考えてみましょう」)

Notion のチュートリアルで述べたように:

  1. 否定的な説明は使用しないでください

プロンプトにタスクの要件を記述する場合は、「マークダウン以外のコンテンツは出力しない」ではなく、「マークダウンのみを出力する」など、前向きな記述を使用します。

2. AIの性格を設定する

AIは良いことと悪いことを区別するのはそれほど得意ではありませんが、模倣することは非常に得意なので、特定のペルソナが得意なことをAIにやらせたい場合は、そのペルソナをAIに引き継がせることができます。

詳細なガイダンス文書:

概念: 優れたプロンプトを作成する方法

https://www.notion.so/blog/how-to-write-ai-prompts

Claude AIプロンプトワード公式チュートリアル

https://mp.weixin.qq.com/s/tfkpHOs2jhz3UORh0CvU4Q

OpenAI プロンプト ガイド

https://platform.openai.com/docs/guides/prompt-engineering

Google ジェネレーティブ AI プロンプト プロジェクト

https://developers.google.com/machine-learning/resources/prompt-eng?hl=zh-cn

Microsoft ヒント エンジニアリング ガイド

https://learn.microsoft.com/zh-cn/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming- language-chat-c​​ompletions

おすすめ

転載: blog.csdn.net/richerg85/article/details/135122984