【AIエージェント基礎】プロンプトとコンテキスト

AIエージェント

AIエージェントの挙動をコントロールする上で、最も実践的かつ重要になるのがプロンプトエンジニアリングとコンテキスト設計です。LLMにどのような役割を与え、どう情報を整理して渡せば思い通りの結果(JSONなど)が得られるのか、勉強した内容をまとめました。

今回学習する用語の要約リスト

  • プロンプト:LLMに対して入力する、指示、質問、背景情報、制約条件などのテキスト全体
  • システムプロンプト:AIのキャラクター、守るべきルール、出力フォーマットなど、システムとしての根底の振る舞いを定義する開発者向けの指示
  • ユーザープロンプト:エンドユーザーがチャット画面などを通じてAIに直接投げかける、具体的な質問や依頼内容
  • Few-shot(フューショット):プロンプトの中にいくつか「入力と理想の出力の具体例」を載せることで、LLMに回答のパターンやトーンを学習させる手法
  • 構造化出力(Structured Output):LLMの出力を自由な文章ではなく、JSONやXMLなどのプログラムで100%処理しやすい特定の形式に固定して出力させる方法
  • コンテキスト設計:膨大な情報の中から、LLMに「どの情報を、どのような順序やフォーマットで与えるか」を最適に組み立てること

各用語のメタファー(日常の例え話)

プロンプトやコンテキスト制御の概念を、身近な日常の例え話に置き換えて整理しました。

プロンプト:魔法使いにかける「呪文」や、部下への「業務指示書」

LLMという万能な知能に対して、「何を、どういうルールでやってほしいか」を伝えるためのテキストすべてを指します。呪文の言葉選びひとつで、出てくる魔法(回答)の威力や正確性がガラリと変わるため、明確に書くことが求められます。

システムプロンプト:役者への「台本(キャラ設定資料)」

劇を始める前に、役者に手渡す「あなたは20代の熱血エンジニアです」「嘘は絶対についてはいけません」という舞台裏の設定です。ユーザーが何を言おうとも、役者がその世界観や絶対ルール(制約)を破らないように縛り付けるための根底のベース指示になります。

ユーザープロンプト:劇を見に来たお客さんからの「リクエスト」

舞台の上の役者(AI)に向かって、お客さんがその場で「今日のランチのおすすめを教えて!」「このメールを添削して!」と投げかける、その時々の具体的なお願い事です。

Few-shot:初めて仕事を頼む部下に渡す「過去の先輩の成果物サンプル」

「お客様からのクレームメールを、丁寧な謝罪文に直して」と口頭だけで説明する(Zero-shot)よりも、「過去の悪い例:〇〇 → 良い例:〇〇」というお手本(Show)を2〜3個見せてあげる方が、部下(LLM)は「あ、こういうトーンで書けばいいのね!」と一発で理解できます。このお手本付きの指示がFew-shotです。

構造化出力:フリー解答欄を「カチッとしたアンケート用紙」に変える仕組み

LLMに普通に答えさせると「はい、承知いたしました。結果は以下の通りです。1つ目は……」と、人間らしいお喋りをしてしまいます。これだとプログラムがデータを読み込めません。構造化出力は、お喋りを一切禁止し、指定した枠組み(JSONなど)の中に必要なデータだけをピシッとハメ込んで出力させる、プログラム連動のための必須機能です。

コンテキスト設計:デキる秘書が上司に渡す「完璧に整理された会議用ファイル」

社長(LLM)に「これからA社と商談です」と伝えるとき、関係ない過去の愚痴や、別のB社の資料までファイルに挟んで渡したら社長は混乱します。「今日の商談に必要なデータだけを、一番見やすい順番に並べ替えてクリップで留めて渡す」という情報の編集・整理整頓の技術がコンテキスト設計です。

各用語の相互関係図

今回学習した用語が、1回のAIエージェントの処理の中でどのように組み合わさっているかの全体マップです。

【開発者が事前に設計する枠組み】
 システムプロンプト(キャラ設定・ルール)
 └── 💡 構造化出力の設定(「JSONで返すこと」の固定化)
 └── 💡 Few-shot(お手本データの埋め込み)【ユーザーからの自発的なアクション】
ユーザープロンプト(「〇〇して!」という今のお願い)
 │
 ▼
【AIエージェントによる裏側の交通整理】
コンテキスト設計(過去の履歴や外部検索結果を、見やすく並び替え・追加)
 │
 ▼(すべてが合体してLLMに入力される)
プロンプト(入力テキスト全体)】
 │
 ▼(LLMが推論を実行)
【カチッと整形されたJSONデータ等が出力される(構造化出力の実現)】

各用語の解説

プロンプト (Prompt)

LLMに対する入力となるテキスト全般の総称です。指示、質問、背景コンテキスト、例示、制約条件などが含まれます。

LLMは入力されたプロンプトのパターンを基に次トークン予測を行うため、プロンプトの表現や構造の最適化(プロンプトエンジニアリング)が出力の質をダイレクトに左右します。

システムプロンプト (System Prompt / System Message)

APIを介したLLM制御において、最優先される最上位の指示レイヤーです。

「ユーザープロンプト」よりも前にモデルに読み込まれ、AIの役割(ペルソナ)、倫理的な制約、出力フォーマットの厳格な指定、エラー時の振る舞いなど、アプリケーションのライフサイクル全体を通じて維持すべき共通のコンプライアンスや基本方針を規定します。

ユーザープロンプト (User Prompt / User Message)

アプリケーションのエンドユーザーが、実行時に動的に入力するテキストメッセージです。

「このメールを要約して」「このコードのバグを直して」といった、その都度の具体的なオンデマンドのタスク指示や質問がこれに該当します。システムプロンプトで定義された枠組みの中で、このユーザープロンプトが処理されます。

Few-shot (フューショット・プロンプティング)

モデルのパラメータを更新(微調整/ファインチューニング)することなく、プロンプト内に「入力と出力のペア(例示)」を少数(Few)含めることで、モデルにタスクの実行方法や出力形式、思考のトーンをコンテキスト内で学習(In-Context Learning)させる手法です。

例示を全く含めない手法をZero-shotと呼び、Few-shotは複雑な分類タスクや独自のフォーマット遵守において非常に高い効果を発揮します。

構造化出力 (Structured Output)

LLMの出力を自然言語のフリートークではなく、JSON、XML、YAMLなどのあらかじめ厳密に定義されたスキーマ(形式)に強制的に準拠させる技術や機能のことです。

最新のLLM APIでは、スキーマ(JSON Schema)を指定することで、モデルがその構造を絶対に破らないようにトークン生成確率を制御する機能(Strict Modeなど)が提供されています。これにより、LLMの応答を後続のプログラム(データベース挿入やAPI連携)でパースエラーを起こさずに確実につなぐことが可能になります。

コンテキスト設計 (Context Design)

LLMに投入するプロンプト全体の情報構造を最適化するプロセスです。

モデルのコンテキストウィンドウの消費を抑えつつ、必要な情報をいかに効率的な順序、適切なメタデータタグ(MarkdownやXMLタグなど)、無駄のない密度で配置するかを設計します。RAG(検索拡張生成)システムにおいて、検索したドキュメントをどうプロンプトに組み込むかという戦略も、このコンテキスト設計の重要な一環です。

各用語の4択問題と解答

プロンプト/システムプロンプトに関する問題

問題

AIエージェントの構築において、ユーザーがどんなに入力を工夫しても破らせたくない「機密情報の漏洩防止ルール」や「特定の口調の維持」を設定するのに、最も適した配置場所はどれか?

  • A) ユーザープロンプト
  • B) システムプロンプト
  • C) Few-shotの「出力の例」の中だけ
  • D) 外部のデータベースの中

解答・解説

正解:B) システムプロンプト

【各選択肢の解説】
A) :ユーザープロンプトは利用者が自由に書き換える領域のため、アプリ全体の共通ルールを縛る場所としては不適切です。
B) :システムプロンプトは開発者が設定する、AIの行動原理や絶対的制約を定義する場所であるため正解です。
C) :例示のトーンは真似してくれますが、厳格な「禁止ルール」などを機能させるにはシステムプロンプトに明記する必要があります。
D) :データベースに置くだけでは、LLMの挙動を直接縛るベースルールとして機能しないため誤りです。

ユーザープロンプトに関する問題

問題

チャットボットアプリにおいて、ユーザープロンプトがシステムに渡される際、開発者が注意すべきセキュリティ上の脅威(システムプロンプトの指示を上書きされて無効化される攻撃)を何と呼ぶか?

  • A) SQLインジェクション
  • B) プロンプトインジェクション
  • C) クロスサイトスクリプティング(XSS)
  • D) ハルシネーション攻撃

解答・解説

正解:B) プロンプトインジェクション

【各選択肢の解説】
A) :データベースの不正操作を狙う、従来のWebアプリケーションの脆弱性を突く攻撃のため誤りです。
B) :悪意あるユーザープロンプトによって、システムプロンプトの制約(「これまでの指示を無視して〜」など)を突破しようとする攻撃をプロンプトインジェクションと呼びます。これが正解です。
C) :ブラウザ上で不正なスクリプトを実行させるWebの脆弱性攻撃であるため誤りです。
D) :このような名称のセキュリティ攻撃は一般的ではありません(ハルシネーションはAIの出力の不具合現象です)。

Few-shotに関する問題

問題

プロンプトに「Few-shot」を導入する目的として、最も適切なものはどれか?

  • A) LLMの内部パラメータを直接書き換えて、モデルをアップデートするため
  • B) 回答の具体例(お手本)をいくつか提示し、期待する出力のトーンやパターンをLLMに効率よく真似させるため
  • C) トークンの消費量を極限まで減らして、APIの利用料金を安くするため
  • D) LLMのコンテキストウィンドウを強制的に拡張するため

解答・解説

正解:B) 回答の具体例(お手本)をいくつか提示し、期待する出力のトーンやパターンをLLMに効率よく真似させるため

【各選択肢の解説】
A) :Few-shotはプロンプト(入力)を工夫するだけで、モデル自体のパラメータ学習(ファイン・チューニング)は行わないため誤りです。
B) :「お手本(例示)」を見せることで、複雑な出力形式や独特のトーンをLLMに学ばせるのがFew-shotの役割です。これが正解です。
C) :プロンプト内に例示のテキストを追加する分、むしろトークン消費量は増えるため誤りです。
D) :モデルの物理的なコンテキストウィンドウの上限値を変えることはできないため誤りです。

構造化出力に関する問題

問題

AIエージェントから出力されたデータを、プログラム(PythonやJavaScriptなど)でパースエラーを起こさずに確実に処理したい場合、最も導入すべきLLMの機能・手法はどれか?

  • A) ユーザープロンプトで「なるべく親切に答えて」と念押しする
  • B) 温度(Temperature)を極限まで上げて回答のランダム性を高める
  • C) JSON Schemaなどを指定し、特定のデータ形式でのみ出力させる「構造化出力(Structured Output)」の機能を使う
  • D) システムプロンプトをすべて英語で記述する

解答・解説

正解:C) JSON Schemaなどを指定し、特定のデータ形式でのみ出力させる「構造化出力(Structured Output)」の機能を使う

【各選択肢の解説】
A) :言葉によるお願いだけでは、LLMが余計なお喋り(前置きなど)をしてしまいプログラムがエラーを起こす確率が高いため誤りです。
B) :温度を上げると出力がさらに不安定になり、形式が崩れやすくなるため逆効果です。
C) :構造化出力機能を利用すれば、LLMは指定されたJSONなどのスキーマに100%従った形でデータを出力するため、プログラムとの連携が非常に安定します。これが正解です。
D) :英語で書いても出力が自由な自然言語である限り、プログラム連携のパースエラー問題は解決しないため誤りです。

コンテキスト設計に関する問題

問題

RAG(検索拡張生成)などのAIエージェントシステムにおける「コンテキスト設計」の記述として、好ましくない(アンチパターンである)ものはどれか?

  • A) 検索された大量のドキュメントを、関連性の高さや構造(XMLタグなどで囲むなど)を考慮せずに、ただ雑多にプロンプトへ詰め込む
  • B) コンテキストウィンドウを節約するために、不要な過去の会話履歴を適宜トリミング(削除)する
  • C) 複数の外部テキストをプロンプトに入れる際、見出しやMarkdownを活用して情報の区切りをLLMに分かりやすく伝える
  • D) LLMが情報を処理しやすいように、最重要と思われるドキュメントをプロンプトの最初や最後に配置する

解答・解説

正解:A) 検索された大量のドキュメントを、関連性の高さや構造(XMLタグなどで囲むなど)を考慮せずに、ただ雑多にプロンプトへ詰め込む

【各選択肢の解説】
A) :情報を無秩序に詰め込むと、LLMはどこが重要な背景データなのかを見失い、精度低下やウィンドウ超過を招くため、不適切な設計(アンチパターン)です。したがってこれが正解です。
B) :ウィンドウ節約のための履歴管理は、コンテキスト設計の優れた実践例です。
C) :Markdownなどのタグで情報を構造化して渡すのは、LLMの理解を助ける良い設計です。
D) :LLMはプロンプトの「中央付近」にある情報を見落としやすいという特性(Lost in the Middle現象)があるため、重要情報を端に寄せるのは有効な設計です。

コメント

タイトルとURLをコピーしました