はじめに
昨今の生成AI情勢はすごいものがありますね。先月、AI Agent Summit 25 Springに参加してきたのですが、ソフトウェアエンジニアとしてとても危機感を感じるようなインパクトのあるものでした。あれから、MCPやA2AといったAIエージェント活用に対する進歩も目まぐるしく、ついていくのも大変ですね…。
そんな置いてけぼりにされてしまった私を含めたソフトウェアエンジニアの方向けのファーストステップとして、プロンプトエンジニアリングをサクッと学び、活用への一歩に繋がればなと思います。
本記事では、プロンプトエンジニアリングの基本構造と代表的な手法について、サクッと学べるようにまとめます。自己活用だけでなく、チームや社内展開にも使えるよう、ユースケースつきで紹介します。(AIエージェント、RAG、MCPといったものには触れません。あくまでプロンプトにのみフォーカスします)
対象読者
- これから生成AI関連キャッチアップしたい方
利用するLLM
- GPT-4o (一番敷居が低いと思ったのでChatGPTからこれを使っていますが、なんでも可)
注意
- LLM毎に特徴があるので結果が必ずしも同じにはなりません
- 同じプロンプトでも同じ結果が出力されるとは限りません
1. プロンプトエンジニアリングとは?
これはちょっと調べると色々と出てきます。
例えば、AWSのプロンプトエンジニアリングの説明ページには下記のように記載があります。
プロンプトエンジニアリングとは、生成人工知能 (生成 AI) ソリューションをガイドして、目的の出力を生成させるプロセスをいいます。生成 AI は人間を模倣しようとしますが、質および関連性の高い出力を生成するには詳細な指示が必要です。プロンプトエンジニアリングでは、AI がユーザーとより有意義にやり取りできるようガイドする、最も適切な形式、語句、記号を選択します。プロンプトエンジニアは、アプリケーションの生成 AI が想定どおりに機能するよう、創造性と試行錯誤を駆使して多数の入力テキストを作成します。
要するに「AIから望ましい出力を得るための入力設計術」といいましょうか。クラス・関数の設計、開発のようなイメージに近いと思います。更に、LLMの挙動は確率的で曖昧なため、プロンプトの設計をきちんとしないと意図しない回答の返ってくる確率が上がります。
例えば、ゼロショット(後述します)で生成AIに下記のようなプロンプトを投げると
こんにちは、私は最近すごく忙しくて、やることがいっぱいあるんですが、タスクをまとめて管理したいなと思っていて、どういうふうに整理したらいいか迷ってるんです。
ToDoリストみたいなものをMarkdownで作れたらいいなと思ってるんですが、たとえば仕事のタスクとか、プライベートなこともあって、優先順位も考えたいし、見やすくしたいです。
なんかいい感じで書いてもらえますか?
もちろん、以下はあなたの希望に基づいて作成したToDoリストの例です。
- [ ] 仕事のタスクをまとめる
- [ ] プライベートの予定も書く
- [ ] 優先順位を考える
- [ ] Markdownで見やすくする
他に追加したい項目があれば教えてくださいね。
設計せずにつらつらお願いしてみたプロンプトです。これには下記のような問題点があります。
- 依頼が漠然としており、タスク内容が曖昧
- Markdown形式も曖昧にしか指示していない
- 「いい感じ」といった主観的な表現が多く、出力の品質がブレやすい
上記のプロンプトを構造化して端的に伝えると、
[タスク]
以下の条件でToDoリストをMarkdown形式で出力してください。
- カテゴリ:仕事、プライベート
- 各カテゴリに3つずつタスクを記載
- チェックボックス形式で表示
### 仕事
- [ ] メール対応
- [ ] 会議資料の作成
- [ ] クライアントとの打ち合わせ
### プライベート
- [ ] 洗濯する
- [ ] スーパーで買い物
- [ ] 読書する
指示が簡潔でも具体的ですね。また、意図が明確なので、出力にブレがないです。
このように、出力目的をきちんと決めて設計すると望ましい出力が返ってくるようになります。
次の章以降こういった手法をサクサク紹介していきます。
2. プロンプトの基本構成
2.1. 入力構造の考え方
NRIのプロンプトエンジニアリングにいい感じの説明があったので、補足を入れて説明します。
要素 | 説明 | 補足 |
---|---|---|
Instruction(命令・指示) | 生成AIモデルが実行する指示やタスク | 何をしてほしいのかを明確に伝える(例:要約して、分類して、翻訳して、など) |
Context(背景・文脈) | 出力の質を高めるために、生成AIモデルに考慮してもらいたい背景や外部情報 | タスクの前提条件や目的、専門用語の定義など、モデルが適切に判断するための補足情報 |
Input Data(入力) | 生成AIモデルに回答して欲しい質問 | 実際にAIに渡すデータやテキスト、質問内容そのもの |
Output Indicator(出力形式) | 出力して欲しい形式、フォーマット | 回答をどのように表現してほしいか(例:箇条書き、JSON形式、Markdownなど) |
大きくはこの4要素(場合によっては役割・条件など)をきちんと記載することで、精度の高い入力構造を作ることができます。
2.2. 入力構造のフォーマット
記載の仕方にはいくつか派閥はあるみたいですが、好きなフォーマット例を活用してください。
-
Gemini for Google Cloud が推奨しているフォーマット
[タスク] ... [背景・文脈] ... [入力] ... [出力形式] ...
-
Prompt Engineering Guideのフォーマット
### タスク ### ... ### 背景・文脈 ### ... ### 入力 ### ... ### 出力形式 ### ...
-
Markdown形式のフォーマット(個人的にはこれがおすすめです)
## タスク ... ## 背景・文脈 ... ## 入力 ... ## 出力形式 ...
個人的な推察ですが、markdownではなくヘッダを何かで囲うのはLLMがヘッダとコンテンツを認識しやすいからだと思います。ただ、markdownで何かコンテキストの読み間違いをしたようなケースには遭遇したことはないため、微々たる差かと思います。(プロンプトをmdで書いた方が管理しやすいためこちらがおすすめです)
実際に記載してみましょう。
## タスク
以下の会議内容をもとに、要点をまとめてください。
## 背景・文脈
この会議は、マーケティング部の週次定例です。メンバー間の情報共有と進捗確認が目的で、議題は新キャンペーンと広告予算の見直しです。
## 入力
- 新キャンペーンは5月1日スタート予定。広告媒体はInstagramとYouTube。
- 予算については、YouTubeの単価上昇により見直しの必要がある。
- インフルエンサーとのコラボも検討中。担当:田中
- 来週中に試算を出して、次回定例で再確認
## 出力形式
Markdown形式で、以下の構成で出力してください:
- 要約
- 次のアクション
ちなみに、毎回このフォーマットを守って記載する必要はありません。用途に合わせて要素を増減させてください。私は## 条件
や## 修正案
など状況に合わせて足して活用しています。
2.3. 入力内容の記載
各要素の入力内容について、下記のようなことに気を付けて記載すると良いでしょう。
ポイント | 説明 |
---|---|
命令・依頼調で記載する | 「〜してください」「〜でまとめてください」のように、明確な依頼口調で記載する |
強調したいことを先に記載する | 「Pythonを活用してください」「3ステップで説明してください」など、要点を文頭に置く |
背景を冗長に記載しない | 要点 → 目的 → 制約 の順で簡潔にまとめる。肥大化する場合は、要素を分ける or プロンプトを分割 |
箇条書きで記載する | 読みやすさ・構造化のために、箇条書きを活用する |
肯定表現で記載する | 否定表現よりも肯定表現の方が精度が高いです |
より細かい記載方法は次の章で解説します。
3. よく使われるプロンプトエンジニアリング手法
ガンガン説明していきますね。基本的にはPrompt Engineering Guideがバイブルになりますので、下記に目を通しておくと更に見識を深めることができます。
3.1. ロールプレイ(役割設定)
AIに「あなたは〇〇です」と役割を与えます。これにより回答精度やスタイルが安定しやすくなります。特に、「エンジニア向けドキュメント生成、法務担当風のチェック」など専門的な回答をする際により効果を発揮します。
## タスク
あなたは〇〇の役割を持つ専門家です。次の〇〇について、△△という目的で対応してください。
...
3.2. Zero-shot Prompting
これは手法というより、後続のFew-shotを理解するための説明になります。
ゼロショットとは、単純にタスクだけを与える手法(手法と言えるのか…?)です。
ゼロショットはタスクだけを与えるため、構造化する必要はありません。
次の日本語文を英語に翻訳してください。
「今日はとても寒いです。」
It is very cold today.
昨今の生成AIはすごいのでゼロショットでも、十分な精度が出る場合もあります。
試しにプロンプトを投げたいときや、タスクが明快で常識的な範囲で回答できるもの、時間がない時の素早い応答生成、対話形式で進める場合など、活用機会は多くあります。
ただし、前の章で説明した通り曖昧な指示だと期待とズレたり、複雑なタスクや構造化出力には向かないです。そういう時は後述するFew-shotやChain-of-Thoughtを活用します。
3.3. Few-shot Prompting
Few-shot prompting とは、AIにタスクをお願いする際に、1〜数個の具体例を事前にプロンプトに含めてから、同じ形式のタスクを追加で解かせる手法です。1つ含めれば1ショット、5つ含めれば5ショットです。こういった入出力の例を事前にいくつか与えることで、出力のフォーマットや文体を安定させることができます。
## タスク
あなたは生成AI活用コンサルタントの専門家です。次の業務に対して、初心者でも扱いやすいプロンプトを提案することを目的として対応してください。
## 背景・文脈
この内容は社内のAI利活用促進プロジェクトの一環であり、AIに不慣れな現場スタッフでも使えるようにするという前提条件があります。利用者は、定型業務の効率化や発想支援を目的としています。
以下は、これまでに他部署向けに提案したプロンプトの例です:
### 【例①:経理部門】
- Input:定型仕訳のパターンを整理したい
- Output : 以下の仕訳例をもとに、パターン別に整理して一覧表にしてください。
### 【例②:営業部門】
- Input : 商談報告メールのテンプレートを整えたい
- Output : 商談の内容をもとに、お客様向けの報告メールのテンプレートを作成してください。ビジネスメールの形式で。
### 【例③:人事部門】
- Input: 新入社員向けのFAQを整理したい
- Output : 以下の質問リストをもとに、新入社員向けのFAQページをMarkdown形式で作成してください。
## 入力
今回の対象業務は「カスタマーサポート部門」です。
・ユーザーからのよくある問い合わせをカテゴリ別に整理したい
・シンプルでわかりやすくまとめたい
・対応履歴から作成することを想定
## 出力形式
- Markdown形式で出力
- 3カテゴリに分類
- 質問と回答を表形式で整理してください
上記のプロンプトでは、few-shot学習データを## 背景・文脈
側に入れていますが、## 入力内容
側に記載しても良いです。また、ショットが多くなる場合は## 条件
や## 具体例
などを設けると良いです。
3.4. Chain-of-Thought
chain-of-thought (CoT)プロンプティングは、結果だけではなくモデルに「思考の過程を明示的にたどらせる」プロンプト手法です。特に、推論・判断・選択肢からの選別など、ステップを踏む問題に強い効果を発揮します。前述のfew-shotと混ぜて活用することが可能です。
なぜCoTが有効かというと、通常のプロンプトでは「一発で答えを出す」ように求められますが、それではモデルが誤った仮定で答えてしまうことがあります。一方、CoTではモデルが段階的に情報を処理するよう誘導するため、特に論理的なタスクで精度が向上します。
具体的には「ステップ・バイ・ステップで考えてください」、「途中の計算や推論も含めて記載してください」など、思考を促す1文を入れることから始めることができます。
問題:あるお店でリンゴを3個とバナナを2本買いました。リンゴは1個100円、バナナは1本80円です。合計金額はいくらですか?
ステップ・バイ・ステップで考えて回答してください。
リンゴは1個100円なので、3個で 100円 × 3 = 300円。
バナナは1本80円なので、2本で 80円 × 2 = 160円。
合計は 300円 + 160円 = 460円です。
答え:460円
もっと精度を…という場合は、思考過程をfew-shot + CoTで具体的に表現することができます。
## タスク
あなたは文章問題を解く算数の家庭教師です。生徒が問題を理解しやすいように、考え方の手順を明示しながら答えてください。
## 背景・文脈
この内容は小学生向けの算数トレーニングの一環であり、思考プロセスを明示することが求められています。利用者は、計算結果だけでなく、どのように答えにたどり着いたかを学ぶことを目的としています。
## 入力
以下に3つの例題と、それぞれの思考ステップ付きの模範解答を記載しています。このフォーマットに続いて、最後の問題にも同様の流れで答えてください。
### 【例1】
- 問題:1個100円のりんごを3個、1個150円のバナナを2個買いました。合計金額はいくらですか?
- 考え方:
- りんご:100円 × 3個 = 300円
- バナナ:150円 × 2個 = 300円
- 合計:300円 + 300円 = 600円
- 答え:600円
### 【例2】
- 問題:ペンが5本で1,000円、ノートが2冊で800円です。全体の金額は?
- 考え方:
- ペン:5本で1,000円
- ノート:2冊で800円
- 合計:1,000円 + 800円 = 1,800円
- 答え:1,800円
### 【例3】
- 問題:映画のチケットが大人2人で3,000円、子ども2人で1,600円です。全体の支払いはいくらですか?
- 考え方:
- 大人:2人で3,000円
- 子ども:2人で1,600円
- 合計:3,000円 + 1,600円 = 4,600円
- 答え:4,600円
### 【問題】
- 問題 : パンが3個で240円、ジュースが2本で300円です。合計金額はいくらですか?
- 考え方 :
- 答え :
## 出力形式
- 思考ステップを明示しながら答えてください(「考え方:〜」の形式)
- 最終的な答えも明示してください(「答え:〜」の形式)
- フォーマットは箇条書き+Markdownで記載してください
ここまでがよく使われる手法ですが、少し難しい手法にも触れておきます。
3.5. Self-Consistency
下記のような概念です。
プロンプトエンジニアリングのより高度な技術の1つであるSelf-Consistency(自己整合性)は、Wang et al. (2022)によって提唱され、「連想思考プロンプティングで使用される単純な貪欲復号化を置き換えることを目的としています」と述べています。アイデアは、few-shot CoTを通じて複数の多様な推論パスをサンプリングし、生成物を使用して最も整合的な回答を選択することです。これにより、算術および常識的推論を必要とするタスクにおけるCoTプロンプティングのパフォーマンスが向上します。
小難しいですが、few-shot + CoTのプロンプトを複数回試行させた上で、一貫性のある(最も頻出する)答えを選ぶというアプローチです。これは、CoTの弱点である「たった一つの思考パスに依存してしまう」点を補うために使われます。
例えば、先ほどの3.4のプロンプトを3回実行するとします。すると結果は
- 結果1 : 540円
- 結果2 : 1320円
- 結果3 : 540円
のように返ってきました。ここでこの結果の中から最も頻出した答えを選びます。
- 結果 : 540円
と言った感じです。これは、同じプロンプトを投げても生成AIの確率的な側面により、結果が異なるためです。3.4.の例では、結果2のようなミスは少ないかもしれませんが、内容や利用するモデルによっては十分起こり得ます。
3.6. Tree-of-Thought
ToT(Tree-of-Thought)とは、下記のようなものです。
複雑な課題に対して、探索や戦略的な先読みが必要な場合、従来の単純なプロンプト技術では不十分です。Yao et el. (2023)とLong (2023)は最近、思考の木(Tree of Thoughts、ToT)というフレームワークを提案しました。これは、言語モデルを用いた一般的な問題解決のための中間ステップとして機能する思考の探求を促進するものです。
ToTは、思考が問題解決への中間ステップとなる一貫した言語の連続を表す思考の木を保持します。このアプローチにより、LMは熟考プロセスを通じて中間の思考の達成度を自己評価することが可能です。思考の生成と評価能力は、探索アルゴリズム(例:幅優先探索や深さ優先探索)と組み合わされ、先読みとバックトラッキングを伴う思考の系統的な探求を可能にします。
CoTが1本の思考パスをたどるのに対して、ToTは複数の思考パスを同時並行・分岐させながら探索していくようなイメージになります。すごく簡略化すると下記のようなイメージです。
問題
┌─────┴─────┐
思考① 思考② ← 初期のアイデア(分岐)
↓ ↓
推論①a 推論②a ← 各アイデアに対する展開(深掘り)
↓ ↓
結論① 結論② ← 各ツリーの最終的な答え候補
プロンプトに起こす場合は、下記のような仕組みを入れて実現します。
(一回の出力では、結果が途中で切れてしまうかもしれないため、段階に分けて出力推奨です。)
- 思考の枝を明示的に指示する : 「3つの解法パターンを提案してください」,「それぞれのパターンについて順に深掘りしてください」
- 評価ステップを挿入する :「各案に対して利点と欠点を記述してください」,「最終的に最も妥当な案を選んでください」
- ステップを分割して処理する : 「まず3案出し→次に評価→最後に結論」のように段階を明示する
## タスク
あなたは新規事業の企画に長けたプロダクトマネージャーです。
次の条件に基づき、Webサービスのアイデアを複数案提案し、それぞれの評価を行った上で最適な案を1つ選定してください。
## 背景・文脈
この依頼は、新規事業創出プログラムの一環です。
限られた開発リソースの中で、将来性が高く、ユーザー価値の高いサービスアイデアを選びたいと考えています。
## 入力
ターゲットユーザー:リモートワーカー
課題:集中力の低下、孤独感、自己管理の難しさ
制約条件:開発期間は3ヶ月以内, 単独利用でも価値があること
## 出力形式
- Markdown形式で出力
- 以下の形式で3つのアイデアを提案してください:
- アイデアの名称と概要
- 利点と課題(表形式)
- 想定される利用シーン
- 最後に、3つの中から最適だと思われる案を選び、その理由を述べてください。
なお、出力はキリの良いタイミングで分けて出力してください。
3.7. Generate Knowledge Prompting
GKP(Generate Knowledge Prompting)とは、「生成AIがもともと知らない、あるいは曖昧な知識」を、プロンプトを通じて段階的に生成・蓄積させていく手法です。既存の知識ベースが不十分な分野において有効です。CoTと似ていますが、知識の構築が主目的です。
具体的には「知識を生成」→「その知識に基づいて質問・推論・応用」という2段階に分けて実行すると良いです。下記のように知識用のプロンプトを与えます。
## タスク
あなたは最先端技術に詳しいリサーチャーです。指定されたキーワードに基づいて、5つの技術要素に関する知識を生成し、以下の構成でまとめてください。
## 背景・文脈
この調査は、次年度のR&D投資戦略の資料作成の一環です。まだ十分に整備された情報源がないテーマもあるため、AIの知識や関連概念を活かして、仮説ベースで体系的に整理してください。
## 入力
調査対象キーワード:
- AI × 法律(LegalTech)
- AI × 環境(GreenTech)
- AI × 音楽(Music AI)
## 出力形式
- Markdown形式で出力
- 各キーワードごとに以下の5要素で構成すること
1. **技術名称**
2. **概要(100文字以内)**
3. **想定されるユースケース(箇条書き)**
4. **期待されるメリット(箇条書き)**
5. **課題と懸念点(箇条書き)**
そして、質問をしてみましょう。
上記の中で、最も実用化が早そうな技術を選び、その理由を3つ挙げてください。
実運用の際はもっと関連性のない事柄で、推論に役立つ知識をインプットさせるようです。
4. チューニングのコツ
このような感じでプロンプトエンジニアリング手法を取り入れていくと、段階的にプロンプトを成長させることができます。
おわりに
ここまでみてもらって思ったかもしれないですが、プロンプトエンジニアリングの大部分は「特別なスキル」ではないです。なんなら日常で使えるレベルの技術です。ここで大事なことは、「なんとなく使う」から「戦略的に使う」へシフトすることだと思います。
また、こういった記載に慣れることが目的のため今回扱いませんでしたが、ReActやFunction Callingまで学ぶとAIエージェントのチューニングやRAGの構築時にも役立つと思います。
今後、生成AIの更なる能力向上でこういったプロンプトエンジニアリングが不要になると言った話もありますが、現状は必要で生成AIを学ぶ足掛かりになると思うので、問題なく取り組めば良いと思います。(後、自然言語をきちんと書く練習ができるという観点で個人的には有意義でした)