著者 | シーラ・テオ 編纂者:岳陽 先月、私はシンガポール政府技術庁(GovTech)が主催し、400人を超える優秀な参加者を集めたシンガポール初のGPT-4プロンプトエンジニアリングコンテストで賞を受賞するという栄誉に浴しました。 プロンプトエンジニアリングは、芸術と科学を融合させた分野です。テクノロジーの理解だけでなく、創造性と戦略的思考も求められます。以下は、私が学習中に学んだプロンプトエンジニアリングの戦略をまとめたものです。これらの戦略は、あらゆる大規模言語モデル(LLM)を要件を正確に実行し、さらにはそれを超える成果へと導くことができます。
このシリーズの記事には以下の内容が含まれており、🔵 は初心者に適したプロンプト手法 (基本セクションを参照) を指し、🔴 は高度な戦略 (この記事の焦点) を指します。 1. [🔵] CO-STAR フレームワークを使用してプロンプトを構築します。 2. [🔵] 区切り文字を使用してプロンプトをセクションに分割します。 3. [🔴] LLMガードレールを使用してシステムプロンプトを作成します。 (翻訳者注:「ガードレール」とは、大規模言語モデルによって生成されたコンテンツが特定の標準または要件に準拠していることを保証し、不正確、不適切、または有害な情報の生成を防止するために使用される保護メカニズムまたは制限を指します。) 4. [🔴] LLM のみを使用してデータセットを分析する (プラグインやコードは不要) – このセクションでは、GPT-4 を使用して実際の Kaggle データセットを分析する実用的な例を紹介します。 01 [🔴] LLMガードレールを使ったシステムプロンプトの作成本題に入る前に、このセクションはシステムプロンプト機能を備えたLLMにのみ適用される点にご注意ください。これは、この記事の基礎セクションや他の章がすべてのLLMに適用されるのとは異なります。最も有名なLLMは当然ChatGPTなので、このセクションではChatGPTを例として使用します。 1.1 システムプロンプトに関する用語まず、用語、特にChatGPTにおける3つの用語、「システムプロンプト」、「システムメッセージ」、「カスタム指示」について明確にしておきましょう。これらの用語はChatGPTではほぼ同義語として扱われています。そのため、多くの人が(私も含めて!)混乱し、OpenAIがこれらの用語を解説する記事を公開するほどでした。以下に概要を示します。
画像はEnterprise DNAブログより 一般的に、これら3つの用語は同じものを指すので、混同しないでください。この記事の以降のセクションでは、「システムプロンプト」という用語を使用します。それでは始めましょう! 1.2 システムプロンプトとは何ですか?システムプロンプトは、LLMの動作に関する指示を与えるための追加プロンプトです。システムプロンプトは、LLMに渡す「通常の」プロンプト(つまり、ユーザープロンプト)の一部ではないため、追加プロンプトとみなされます。 チャットでは、LLMに新しいプロンプトを送信するたびに、システムプロンプトがフィルターのように機能し、LLMが応答する前に自動的にこれらのプロンプトを適用します。つまり、LLMが応答する際にシステムプロンプトが考慮されるということです。 1.3 システムプロンプトはいつ使用すればよいですか?最初に思い浮かぶ疑問は、なぜ LLM との新しい会話の最初のプロンプトではなくシステム プロンプトで指示を与え、その後 LLM とさらに会話をする必要があるのか、ということです。 答えは、LLMの会話記憶能力には限界があるということです。後者の場合、会話が続くにつれて、LLMはチャットで最初に提供した指示を「忘れて」しまい、その指示が古くなる可能性があります。 一方、システムプロンプトで指示が提供されている場合、これらのシステムプロンプトはチャットで提供される新しいプロンプトごとに送信されます。これにより、チャットの長さに関係なく、LLMはチャット全体を通してこれらの指示を受信し続けることができます。 要約: チャット全体を通して、システム プロンプトを使用して、応答時に LLM に記憶してほしい指示を提供します。 1.4 システム プロンプトには何を含めるべきですか?システム プロンプトには通常、次のカテゴリの指示が含まれます。
たとえば、システム プロンプトは次のようになります。
各セクションで扱われるカテゴリは次のとおりです。 システムプロンプトの分解 — 著者による画像 1.5 しかし、「通常の」チャット メッセージとは正確には何でしょうか?ここで、「システムプロンプトで既に多くの情報が提供されているようだ。では、通常のチャットプロンプト(つまりユーザープロンプト)には何を書けばいいのだろうか?」と疑問に思われるかもしれません。 システムプロンプトは、現在の一般的なタスクの概要を示します。上記のシステムプロンプトの例では、タスクは特定のテキストのみを使用して質問に答えるというように定義されており、LLMは{“質問”: “回答”}という形式で回答するように指示されています。
このシナリオでは、チャット中の各ユーザープロンプトは、LLMにテキストで回答してほしい質問に簡略化されます。例えば、ユーザーが「このテキストの内容は何ですか?」と質問すると、LLMは「このテキストの内容は…」と回答します。 このタスクの例をさらに要約してみましょう。この場合、上記のシステムプロンプトの最初の行は次のようになります。
編集後:
これで、各ユーザーのチャット プロンプトに、質問に回答するためのテキストと回答する質問が含まれるようになります。例:
ここでは、XMLタグを区切り文字として用いて、LLMに必要な2つの情報フラグメントを構造化された形式で提供します。XMLタグで使用されている「テキスト」と「質問」という名詞は、システムプロンプトで使用されている名詞に対応しており、LLMはタグとシステムプロンプトの指示の関係を理解できます。 要約すると、システムプロンプトはタスク全体の指示を提供し、ユーザープロンプトはタスク実行の具体的な詳細を提供する必要があります。例えば、この場合、具体的な詳細とはテキストと質問です。 1.6 動的LLMガードレール上記のコードは、システムプロンプトに数行のコードを追加することでガードレールを追加します。これらのガードレールは固定されており、チャット中は変更されません。しかし、会話のさまざまな段階で異なるガードレールを設定したい場合はどうすればよいでしょうか? ChatGPTウェブインターフェースのユーザーがこれを直接行う方法は現在ありません。しかし、ChatGPTをプログラムで操作している場合は、幸運です!効果的なLLMガードレールの構築に焦点が移るにつれ、より詳細で動的なガードレールをプログラムで設定できるオープンソースパッケージがいくつか登場しています。 特に注目すべきは、NVIDIAチームが開発したNeMo Guardrails[1]です。これは、ユーザーとLLM間の想定される会話フローを設定することで、チャットのさまざまなポイントで異なるガードレールを設定し、チャットの進行に合わせて進化する動的なガードレールを実現できます。ぜひ習得することをお勧めします。 02 [🔴] LLM のみを使用してデータセットを分析する(プラグインやコードは不要)ChatGPTのGPT-4向けのOpenAIによる高度なデータ分析プラグインについてご存知かもしれません。これはプレミアム(有料)アカウントでのみ利用可能です。このプラグインを使用すると、ChatGPTにデータセットをアップロードし、データセット上で直接コードを実行して、正確なデータ分析を行うことができます。 しかし、LLMを使用してデータセットを分析するために、必ずしもそのようなプラグインが必要ではないことをご存知でしたか?まずは、LLMを使用してデータセットを分析することの利点と限界を理解しましょう。 2.1 大規模言語モデルが解析に適さないデータセットの種類ご存知のとおり、LLM は正確な数学的計算を実行する能力が限られているため、次のようなデータセットの正確な定量分析を必要とするタスクには適していません。
OpenAI が Advanced Data Analytics プラグインをリリースした理由は、データセット上でのこれらの定量的タスクの実行を容易にし、プログラミング言語でデータセット上でコードを実行してそのようなタスクを実行できるようにするためです。 では、なぜデータセットを分析するためにそのようなプラグインを使用せずに LLM を使用することを選択するのでしょうか? 2.2 大規模言語モデルが得意とするデータセット分析の種類LLMはパターンや傾向を特定することに優れています。この能力は、多様かつ膨大な量のデータに関する広範なトレーニングによって培われ、一見すると分かりにくい複雑なパターンを認識することを可能にします。 これにより、次のようなデータセットに基づいてパターン認識タスクを実行するのに最適です。
このようなパターンベースのタスクでは、LLM のみを使用すると、コードを使用するよりも短時間でより良い結果が得られる可能性があります。この点を例で説明しましょう。 2.3 LLMのみを使用したKaggleデータセットの分析我々は、企業が顧客をより深く理解するために顧客ベースをセグメント化しようとしている顧客の性格分析のために設計された、人気のある実際のKaggleデータセット[2]を使用します。 LLM分析結果のその後の検証を容易にするため、データセットから50行をサブセットとして抽出し、最も関連性の高い列のみを保持しました。分析に使用するデータセットは以下のようになります。各行は顧客を表し、各列は顧客情報を表します。 データセットの最初の3行 — 著者による画像 ある企業のマーケティングチームで働いていると想像してみてください。あなたの仕事は、この顧客情報データセットを用いてマーケティング活動を導くことです。これは2つのステップから成ります。まず、データセットを用いて顧客を複数の意味のある顧客セグメントに細分化します。次に、各顧客セグメントに最適なクリエイティブマーケティングのターゲティング方法を決定します。これはまさに現実のビジネス課題であり、LLMのパターン検出機能(ステップ1)は、この分野で真価を発揮します。 このタスクのプロンプトを、4つのプロンプトエンジニアリング手法(後ほど詳しく説明します[3])を使用して次のように定義します。 1. 複雑なタスクを簡単なステップに分解します。 2. 各ステップの中間出力を参照します。 3. LLM ファイルのフォーマットに関する回答。 4. データセットから指示を分離します。
GPT-4 のレスポンスは次のとおりです。次に、データセットを CSV 文字列として渡します。 GPT-4の応答 — 著者による画像 GPT-4 は、必要なマークダウン形式で分析結果を返します。 GPT-4の応答 — 著者による画像 GPT-4の応答 — 著者による画像 GPT-4の応答 — 著者による画像 2.4 LLMの分析結果の検証簡潔にするために、検証のために LLM によって生成された 2 つの顧客グループ (若い家族と目の肥えた愛好家) を選択します。 2.4.1 若い家族
データセットを詳しく調べると、これらの行の完全なデータは次のようになります。 若い家族に関する完全なデータ — 著者による画像 LLMによって識別された顧客データは、識別された顧客グループに正確に一致しています。事前の前処理なしで、null値を持つデータでさえクラスタリングできます。 2.4.2 こだわりのある愛好家
データセットを詳しく調べると、これらの行の完全なデータは次のようになります。 目の肥えた愛好家のための完全なデータ — 著者による画像 これも、LLM によって特定された人口統計データと非常によく一致しています。 この例は、LLM がパターンを発見し、多次元データセットを解釈および改良し、そこから有意義な洞察を抽出しながら、その分析がデータセットに深く根ざしていることを保証する能力を示しています。 2.5 ChatGPT の高度なデータ分析プラグインを使用するとどうなるでしょうか?分析の完全性を確保するため、同じプロンプトを使用し、ChatGPTにコードを使って同じ分析を実行させようとしました。このコードでは、高度なデータ分析プラグインが起動しました。プラグインは、データセットに対してK-Meansなどのクラスタリングアルゴリズムのコードを直接実行することで各ユーザーグループの特性を取得し、各グループのデータを統合してマーケティング戦略を提供するという構想でした。 ただし、データセットには 50 行しかないにもかかわらず、複数回の試行で次のエラー メッセージが表示され、出力はありませんでした。 試行1でエラーが発生し、出力なし — 著者による画像 試行2ではエラーが発生し、出力はなし — 著者による画像 高度なデータ分析プラグインを使用すると、データセットに対してより単純なタスク (記述統計の計算やグラフの作成など) を実行するのは簡単に思えるかもしれませんが、特定の計算アルゴリズムを必要とするより高度なタスクでは、計算上の制限やその他の理由により、エラーが発生したり、出力されなかったりすることがあります。 2.6 では、データセットを分析するために LLM を使用するのはいつでしょうか?答えは分析対象のデータの種類によって異なります。 正確な数学的計算や複雑なルールベースの処理を必要とするタスクの場合、従来のプログラミング手法は依然として優位性を持っています。 パターン認識タスクにおいて、従来のプログラミングやアルゴリズムを用いたアプローチは困難であったり、時間のかかる場合があります。しかし、LLMはそのようなタスクに優れており、分析を裏付ける添付ファイルやMarkdown形式の完全な分析レポートなど、追加の出力も提供できます。
2.7 さて、プロンプトエンジニアリングに戻りましょう。このセクションを終了する前に、このデータセット分析を生成するために使用されたプロンプトを確認し、使用されたプロンプト エンジニアリングの主要な手法を分析してみましょう。
ヒント1: 複雑なタスクを簡単なステップに分解する LLMは単純なタスクには優れていますが、複雑なタスクに関してはそれほど優れたパフォーマンスを発揮しません。そのため、このような複雑なタスクの場合は、LLMが実行できるような、簡潔で段階的な指示に分解することが重要です。目標は、LLMがタスクを実行する際に取る手順をLLMに提供することです。 この例では、手順は次のとおりです。
「顧客をセグメント化し、各グループごとにマーケティング戦略を立案する」といったタスク全体を LLM に単純に委ねるよりも、LLM アプローチでは、ステップごとの指示を提供することで、適切な結果が得られる可能性が高くなります。 ヒント2: 各ステップの中間出力を使用する LLM にステップごとの指示を提供する場合は、各ステップの中間出力に、CLUSTERS、CLUSTER_INFORMATION、CLUSTER_NAME、MARKETING_IDEAS、RATIONALE などの大文字の変数名を付けることができます。 これらの変数名と指定された命令を区別するために、大文字が使用されています。これらの中間出力は、後で[VARIABLE_NAME]のように角括弧を使用して参照できます。 ヒント3:大規模な模範解答のフォーマットを標準化する ここでは、LLMレスポンスの見栄えを良くするために、Markdown形式のレポートが必要です。中間出力内の変数名もレポートの構造を決定する上で役立ちます。
実際、その後 ChatGPT にレポートをダウンロード可能なファイルとして提供するようリクエストし、その応答を使用して最終レポート ドキュメントを作成することもできます。 GPT-4の応答をファイルとして保存する — 著者による画像 ヒント 4: タスクの説明をデータセットから分離します。 最初のプロンプトでは、LLMにデータセットを提供していないことにお気づきでしょう。代わりに、プロンプトにはデータセット分析のタスクの説明のみが含まれ、次のように締めくくられています。
ChatGPT は理解したと応答し、次のプロンプトでデータセットを CSV 文字列として渡すように指示しました。 GPT-4の応答 — 著者による画像 しかし、なぜ命令をデータセットから分離するのでしょうか? 端的に言えば、LLMのコンテキストウィンドウには制限があり、具体的には1つのプロンプトに入力できるトークンの数に制限があります。命令とデータの両方を含む長いプロンプトはこの制限を超え、切り捨てや情報の損失につながる可能性があります。 より複雑な答えは、指示をデータセットから分離することで、LLM の明瞭性を維持し、情報を見落とす可能性を減らすことができるということです。例えば、100語の回答を要求したのに、LLM がそれよりも長い段落を返したなど、長めのプロンプトで与えられた特定の指示を LLM が「うっかり忘れてしまう」という状況に遭遇したことがあるかもしれません。まず指示を受け取り、次に指示が処理するデータセットを受け取ることで、LLM は実行すべきタスクを理解し、その後に提供されるデータセットで指示を実行することができます。 ただし、チャットベースの LLM のみが対話メモリを保持するため、指示とデータセットの分離を実現できますが、補完 LLM はそうではないことに注意してください。 読んでくれてありがとう! 終わり |
01 [🔴] LLMガードレールを使ったシステムプロンプトの作成1.1 システムプロンプトに関する用語1.2 システムプロンプトとは何ですか?1.3 システムプロンプトはいつ使用すればよいですか?1.4 システム プロンプトには何を含めるべきですか?1.5 しかし、「通常の」チャット メッセージとは正確には何でしょうか?1.6 動的LLMガードレール02 [🔴] LLM のみを使用してデータセットを分析する(プラグインやコードは不要)2.1 大規模言語モデルが解析に適さないデータセットの種類2.2 大規模言語モデルが得意とするデータセット分析の種類2.3 LLMのみを使用したKaggleデータセットの分析2.4 LLMの分析結果の検証2.4.1 若い家族2.4.2 こだわりのある愛好家2.5 ChatGPT の高度なデータ分析プラグインを使用するとどうなるでしょうか?2.6 では、データセットを分析するために LLM を使用するのはいつでしょうか?2.7 さて、プロンプトエンジニアリングに戻りましょう。 |