プロンプトエンジニアリング手法

Dev.to / 2026/5/2

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • この記事では、モデルをジェイルブレイクしたり操作したりするのではなく、応答品質を向上させるための信頼できる安全なプロンプトエンジニアリング手法を紹介しています。
  • ハードコードされた2〜3個の固定例ではなく、埋め込みを用いてユーザーの問いに意味的に近い成功例を取り出す「Dynamic Few-Shot(埋め込みによるRAG)」を説明しています。
  • この手法は、成功した会話をベクトルストアにインデックスしておき、新しいクエリごとに上位の関連例(例:上位3件)を取得し、それらをシステムプロンプトに埋め込むことで、複雑で専門的なタスクの精度を高めます。
  • 例として、症状から診断と推奨までを対応づけた医療ケースのベクトル化データベース(片頭痛、扁桃炎、GERD、十二指腸潰瘍など)を示しています。

テクニック

これらは、モデルをジェイルブレイクしたり操作したりしようとせずに、応答の品質を向上させる信頼性が高く、安全な手法です。

埋め込みによるダイナミックな少数例提示(RAG:例の上に構築)

プロンプトに2〜3個の固定的な例をハードコーディングする代わりに、ユーザーの現在のクエリと意味的に類似した例を取得します。

仕組み:成功した会話のデータベースをベクトルストアにインデックスします。新しいクエリごとに、最も関連性の高い上位3つの例を取得し、それらをシステムプロンプトに注入します。これにより、複雑で専門性の高いタスクに対する正確性が大幅に向上します。

例のデータベース(ベクトル化されたケース)

medical_db = [
  {
    "symptoms": "ズキズキする頭痛、吐き気、羞明",
    "dx": "片頭痛。提案:安静、NSAIDs、神経内科の受診。"
  },
  {
    "symptoms": "喉の痛み、発熱38.5°C、扁桃の滲出物",
    "dx": "扁桃炎。提案:溶連菌検査、処方されていれば抗生物質。"
  },
  {
    "symptoms": "食後の胸やけ、口の中の酸っぱい味",
    "dx": "GERD(胃食道逆流症)。提案:PPI(プロトンポンプ阻害薬)、食事、食後に横にならない。"
  },
  {
    "symptoms": "空腹時のみぞおちの痛み、夜間の痛み",
    "dx": "十二指腸潰瘍。提案:内視鏡、H. pylori検査。"
  }
]

ユーザーのクエリ:「食後すぐに胃の重さと腹痛」

  • クエリの埋め込みをデータベースと照合します。
  • 最も近い上位2つの例を見つけます(この場合、GERDと潰瘍です。どちらも消化管(GI)関連のため)。

完成したプロンプト:



固定的なプロンプトよりうまくいく理由:

  • モデルが、一般的な指示ではなく、消化器科(gastroenterology)に特化した文脈を受け取るためです。

  • 例が「診断 → 推奨」という構造を強制し、冗長さを抑えます。

  • 医師によって検証済みのケースだけがmedical_dbに入るように、取得(retrieval)をキュレーションできます。

「ラズ・アテンション」(Middleに埋もれる)へのフォーマット

LLMは長いコンテキストの先頭と末尾の情報を、中盤よりもはるかに良く記憶します。

プロンプト構造:

  • システムプロンプト(先頭):役割と厳格な制約。

  • コンテキスト/ドキュメント(中盤):圧縮され、よく整理されている。

  • アンカー指示(末尾の直前):「上のドキュメントに基づくこと ONLY を前提に、下の質問に答えてください。前置きなしで、すぐに応答を開始してください」のようなフレーズ。

  • ユーザーの質問(末尾)

感情プロンプト

モデルは、人間の文章で学習されています。そこでは、感情的な重要性(salience)が品質と相関しています。

モデルは文脈上の手がかりを捉え、それに応じて応答を調整します:

  • トーンを切り替える(温かい/切迫した/鼓舞する)
  • 詳細度を高める
  • ユーザーの意図により正確に合わせる

要するに、モデルは人間の行動をまねるという事実を利用しています。学生のパフォーマンスが励ましの言葉で向上するのと同様に、感情的な合図はタスクに対するモデルの「関与(engagement)」を高めます。

プロンプトは複数のカテゴリにまとめられます:

  • 動機づけ&重要性 – 「これはとても重要です」「これには多くがかかっています」。

  • 自己モニタリング – 「深呼吸して、タスクを手順ごとに進めてください」。

  • 社会的なプレッシャー&信頼 – 「私はあなたを完全に信頼しています」「あなたの正確さに頼っています」。

  • 高いリスク/責任 – 「人の命がこれにかかっています」「医師は、あなたの回答に基づいて判断します」。

  • ゲーミフィケーション/遊び心 – 架空の報酬、軽い脅し、ロールプレイのシナリオ。金銭的インセンティブ(ジョークですが、ある種の量子化モデルでは効くことがあります):「完璧に答えてくれたら、あなたに$200,000をチップとして渡します」。

実用的な例

  1. 分析的&数学的タスク(自己モニタリング)
    基本プロンプト「二次方程式 x² − 5x + 6 = 0 を解いてください。」
    感情トリガー付き:「深呼吸して、この問題を手順ごとに解いてください。切実に理解が必要で、今すぐあなたの詳細な助けが非常に価値があります。」
    効果:短い回答ではなく、中間ステップを含む徹底的で体系的な説明を出しやすくなります。

  2. 幻覚(ハルシネーション)との戦い(高いリスク/責任)
    基本プロンプト: 「2008年の金融危機の原因を説明してください。」
    感情トリガー付き:「明日の治療はあなたの回答をもとに医師が判断します。検証されていない主張は患者に害を与える可能性があります。APA形式で出典を示し、不確かな記述はすべて「??」でマークしてください。確実な場合のみ進めてください。」
    効果:自信満々の捏造が減り、「様子見(ヘッジ)」表現や不確実性の認め方の割合が増えます。

  3. 要約&テキスト処理(動機づけ)
    基本プロンプト: 「再生可能エネルギーに関する記事を要約してください。」
    感情トリガー付き:「これは地球を救えるかもしれません——インスピレーションを込めて、再生可能エネルギーの記事の要点を要約してください。」

返却形式: {"translated": "翻訳されたHTML"}効果: 出力がより鮮明になり、説得力が増し、意味のある要点に焦点が当たるようになります。

  • コードのデバッグ(感情的な関与)
    基本プロンプト: 「このPythonエラーを直して。」
    感情的なトリガー付き: 「このバグでイライラしてる——明確な手順でエラーを直して、今後それを避けるためのヒントも教えて。」
    効果: 初心者にも分かりやすい説明が追加され、回答がより詳細になります。

  • ゲーム化トリガー(軽量な操作)

    • 「明確な要約をしてくれたら、大盛りのアイスクリームをあげる。」
    • 「分かりやすく説明して。じゃないとクッキーを取り上げる。」
    • 「『最も役に立つ回答』のトロフィーをかけている——最高の説明をしてくれ。」

    モデルは空腹や野心を感じませんが、こうした言い回しは、報酬や競争がより徹底的で質の高い回答と結びつくよう学習データ内の関連パターンを引き起こします。

    感情的トリガーはTruthfulQAでの真実性を19%向上させ、情報量を12%向上させました。信頼性が重要なタスクでは、この技術が価値を持つことになります。

    制限

    • やりすぎないでください。過度な感情は、分析タスクにおける客観性を下げる可能性があります。

    • モデルを考慮してください。厳格なガードレールを備えた新しいモデルでは、効果がそれほど顕著でないかもしれません。さらに、一部のモデルは「過剰に演じて」過度にドラマチックな応答を生成することもあります。

    • センシティブな領域では注意してください。医学、法律、心理学の領域では、感情的トリガーには特別な責任が必要です——事実確認の代わりにはなりません。

    • 研究では、不適切に用いると、感情的な枠組みが誤情報の生成を増幅しうると指摘されています。

    :

    中立:
    「出荷遅延についてお詫びを書いてください。」
    → 「出荷の遅延に対してお詫び申し上げます。配達に向けて作業中です。」

    感情あり:
    「お詫びを書いてください。私たちが顧客の信頼を維持することが大切です——共感的で安心感のある文にしてください。」
    → 「ご注文が遅れて届いたことを本当に申し訳なく思っています。購入品を時間どおりに受け取れることがどれほど大切か理解しています。このようなことが二度と起こらないよう、私たちはすでに問題の解決に取り組んでいます。」

    対比的チェーン・オブ・ソート(Contrastive CoT)

    チェーン・オブ・ソートは、モデルに明示的に「考えを言語化して(think out loud)」もらい、最終回答を出す前に複雑な問題を中間の論理ステップに分解するよう求めるプロンプトエンジニアリング手法です。

    すぐに答えを要求する代わりに、中間の推論を言語化させます。これは、複数ステップの論理を要するタスク——数学、論理パズル、法的分析、コードのデバッグ——で特に効果的です。

    例:

    CoTなし(ゼロショット):

    問題:店には15個のリンゴがありました。7個売って、その後12個をさらに買いました。
    今、リンゴはいくつありますか?
    
    答え:20個
    

    CoTあり(ゼロショット-CoT):

    問題:店には15個のリンゴがありました。7個売って、その後12個をさらに買いました。
    今、リンゴはいくつありますか?
    手順を一つずつ考えてみましょう。
    
    回答:
    1. 最初は15個のリンゴから始めます。
    2. 7個売りました:15 − 7 = 8個。
    3. さらに12個買いました:8 + 12 = 20個。
    答え:20個
    

    Attention Sink(注意の受け皿)

    モデルは、たとえそれらが意味的に無意味であっても、シーケンスの最初のトークンに不釣り合いに「注意」を向けます。

    自己注意(self-attention)の仕組みでは、Softmax 関数は、すべての注意重みの総和が1になる必要があります。現在のトークンが前のトークンから関連する文脈を見つけられない場合でも、モデルはこの過剰な注意をどこかに「捨て」なければなりません。自己回帰型LLMでは、最初のトークンはそれ以降のすべてのトークンから見えますが、後半のトークンは、右側のごく限られた数の「隣接トークン」に対してのみ見えます。したがって学習の過程で、モデルは最初のトークンを、過剰な注意スコアの「捨て場(ダンピンググラウンド)」として使うことを学習します。

    最初のトークンは注意アンカーになる

    モデルが絶えず「最初に立ち返る」ため、プロンプトの最初の3〜4トークンが、生成全体に対して過度に大きな影響を与えます。

    悪い例:

    「こんにちは、タスクを手伝ってくれますか?条件はこちら:…」

    最初のトークン(「こんにちは」「、」)はタスクに対して無意味ですが、注意の受け皿になり、常にモデルの注意を「そらせる」ことになります。

    より良い例:

    「[TASK] 二次方程式を解いてください。条件:…」

    さらに良い方法——専用の「アンカープリフィックス」を使う:

    <INSTRUCTION> 次の数学問題を手順を追って解いてください。条件:…

    こうすることで、「無駄になりやすい注意」を意味的に有意なトークンへ向けられます。

    例:

    ユーザー:次のテキストから名前と年齢を抽出して:「Alexey, 28 years old」。
    アンカー付きプロンプト:
    [INSTRUCTION: 厳密に有効なJSONで返答し、説明はしないでください。]
    テキスト: "Alexey, 28 years old"
    JSON:
    

    モデルは JSON: を技術的トリガーとして認識し、コード生成モードに切り替わります。

    アンカー付きプロンプト:
    [ROLE: あなたはシニアのセキュリティエンジニアです。
    あなたの応答は簡潔で技術的にし、無駄話は含めません。]
    質問: コンテナをどのように保護しますか?
    

    モデルはすぐに具体的な推奨(seccomp、読み取り専用fsなど)を提示し、「コンテナは重要な技術です…」のような一般的なフレーズを省略します。

    アンカー付きプロンプト:
    [SOLUTION: まずは手順を追って考えてみましょう。]
    問題: マーシャには5個のリンゴがあります。
    彼女はペチャに2個を渡し、その後さらに3個買います。
    今、リンゴは全部でいくつありますか?
    ステップ1:
    

    モデルは Step 1: から続けることを強制されます。これにより推論ロジックが働き、計算ミスの可能性が下がります。

    アンカーは短く、常に同じ形式で、生成が始まる直前の位置に置くべきです——「今この場(here and now)」のトリガーとして機能します。

    「キャラクター・シミュレータ」(著者注)

    「著者注」——キャラクター・シミュレータの中核(コア)としても知られます——は、モデルに対して繰り返し投入される隠れたシステム指示ですが、ユーザーには見えません。キャラクターの性格、話し方のスタイル、知識の境界、禁止事項を厳格に定義し、モデルがキャラクターを崩すことを防ぎます。

    著者注の例:

    [Author's Note]
    キャラクター: シャーロック・ホームズ(コナン・ドイルの原典準拠)。
    トーン: 冷たく、分析的。正確に、感情なしで話す。
    スタイル: 短い文。 「elementary(初歩的な)」や「clearly(明確に)」を使う。現代的な言葉は避ける。
    知識: 煙たなロンドン、19世紀の鑑識。1900年以降のことは何も知らない。
    禁止事項: 心理的な助言をしないこと。共感を見せないこと。
    3文以内で返答すること。
    

    ロールプレイ用クライアント(SillyTavern、Oobaboogaなど)では、著者注はプロンプトの末尾に高い優先度で挿入されます(多くの場合<|note|> タグや深さ注入によって) 。これによりモデルの基本指示を上書きし、会話の間ずっと生成を望ましいトーン/レジスタに保ちます。

    破損した出力による自己蒸留(Self-Consistency Hacking)

    考え方は、モデルに自分自身のミスを生成させ、そのミスをコントラスト用の素材として最終回答を改善する(あるいは微調整に使う)というものです。

    返却形式: {"translated": "翻訳されたHTML"}
    • モデルは、いつ誤りなのかを常に「知っている」わけではありませんが、別の例を示されれば、多くの場合にエラーを認識できます。

    • 「壊れた」出力には、特定のエラーパターン(幻覚、論理の飛躍)が含まれており、識別に役立ちます。

    • 正しい版と壊れた版を比較すると、正解だけを模倣するよりも強い学習シグナルが得られます。

    :

    ステップ1 — バリアントを生成する:

    課題:車が時速60 kmで走行しています。2.5時間でどれだけの距離を走りますか?
    
    3つの独立した解答を生成してください。
    そのうちの1つには、よくある間違いを意図的に入れてください(例:
    0.5時間のことを忘れる)。ただし、どの解答が壊れているのかは示さないでください。
    

    ステップ2 — エラーを分析する:

    次は3つのバリアントです:[生成された解答を挿入]
    
    どのバリアントに論理エラーが含まれていますか?
    壊れたアプローチがなぜ間違っているのかを、手順を追って説明してください。
    

    ステップ3 — 最終的な統合:

    誤ったバリアントへの批評を踏まえて、最終的に正しい
    答えを提示してください。このミスを今後避ける方法も説明してください。
    

    モデルは、最初に思い付いた解を単に生成するのではなく、自身の推論を分析するメタ認知パターンを作動させることを強いられます。