WAT Note(III).

生成AIのコンテキストとプロンプトエンジニアリングについて

Tatsuroh Wakasugi
Tatsuroh Wakasugi

はじめに

生成 AI を活用したシステム開発に取り組むエンジニアにとって、「コンテキスト」と「プロンプトエンジニアリング」の理解は必須スキルとなっています。

この記事では、初学者の方でも理解できるように、これらの概念を基礎から解説し、実際に手を動かして学べるハンズオン形式で紹介します。

コンテキストとは

コンテキスト とは、生成 AI が回答を生成する際に参照する「文脈情報」のことです。人間同士の会話でも、前後の文脈を理解することで適切な返答ができるように、生成 AI もコンテキストを基に回答を生成します。

AI が一度に処理できる情報量には制限があります。この制限内で、いかに必要な情報を適切に配置するかが、生成 AI の性能を最大限に引き出すカギとなります。

コンテキストの種類

生成 AI におけるコンテキストには、主に以下の要素が含まれます。

会話履歴:これまでのやり取りの記録です。ユーザーの質問と AI の回答が積み重なることで、AI は話の流れを理解できます。

システムプロンプト:AI の振る舞いや役割を定義する指示です。例えば「あなたは親切なプログラミング講師です」といった設定がこれに当たります。

提供された情報:ユーザーが明示的に与えた文書、データ、コードなどの情報です。

プロンプトエンジニアリングとは

基本的な定義

プロンプトエンジニアリングとは、生成 AI から望ましい回答を引き出すために、質問や指示(プロンプト)を設計・最適化する技術です。同じ質問でも、聞き方を変えることで回答の質が大きく変わることがあります。

特徴

反復的なプロセス:最初のプロンプトで完璧な結果が得られることは稀です。試行錯誤を繰り返しながら改善していきます。

明確性が重要:曖昧な指示よりも、具体的で明確な指示の方が良い結果を得られます。

構造化された指示:役割、タスク、制約、出力形式などを整理して伝えることで、AI の理解が深まります。

効果的なプロンプトの書き方

基本原則

生成 AI に指示を出す際は、以下の要素を意識すると良いでしょう。

明確さ:何をしてほしいのかを具体的に伝えます。「説明して」よりも「初心者向けに 3 つのポイントに絞って説明して」の方が明確です。

文脈の提供:必要な背景情報を含めます。「Python でファイルを読み込む方法を教えて」よりも「Python 初学者です。CSV ファイルを読み込んでデータ分析をしたいのですが、どのライブラリを使えばいいですか」の方が適切な回答が得られます。

例示:期待する出力の例を示すことで、AI の理解が深まります。

制約の明示:文字数、形式、トーンなどの制約があれば明示します。

プロンプトの構造

効果的なプロンプトは、以下のような構造を持つことが多いです。

[役割の設定]
あなたは経験豊富な Python エンジニアです。

[タスクの説明]
初心者向けに、Web API からデータを取得する方法を説明してください。

[制約条件]

- requests ライブラリを使用
- エラーハンドリングを含める
- 実行可能なコード例を提示

[出力形式]
コード例とその解説を含めてください。

プロンプトエンジニアリングの実践例

それでは、実際に手を動かしながら学んでいきましょう。

基本的な質問の改善

まず、単純な質問から始めて、徐々に改善していきます。

レベル 1(悪い例)

機械学習について教えて

この質問は曖昧すぎて、AI は何を答えればいいか迷います。

レベル 2(改善版)

機械学習の基本的な仕組みについて、初心者向けに説明してください

対象者と範囲が明確になりました。

レベル 3(さらに改善)

私はプログラミング経験が 1 年あるエンジニアです。
機械学習の基本的な仕組みについて、以下の点を含めて説明してください:

1. 機械学習とは何か
2. 教師あり学習と教師なし学習の違い
3. 実際の応用例

各項目について 2-3 文程度で簡潔にまとめてください。

背景情報、具体的な要求、出力形式まで明示されています。

まずは、あなたが興味のあるトピックで、この 3 段階の質問改善を試してみてください。

コード生成のプロンプト設計

次は、実際のシステム開発でよく使う「コード生成」のプロンプトを設計してみましょう。

シナリオ:Python でシンプルなタスク管理 CLI アプリを作りたい

ステップ 1:要件を整理する

まず、何が必要かを箇条書きにします。

  • タスクの追加、削除、一覧表示
  • データは JSON ファイルに保存
  • コマンドライン引数で操作

ステップ 2:プロンプトを作成する

Python でシンプルなタスク管理 CLI アプリケーションを作成してください。

要件:

- タスクの追加、削除、完了、一覧表示の機能
- データは tasks.json ファイルに保存
- argparse を使用してコマンドライン引数を処理
- 各タスクは ID、タイトル、ステータス(未完了/完了)を持つ

使用方法の例:
python task_manager.py add "買い物に行く"
python task_manager.py list
python task_manager.py complete 1
python task_manager.py delete 1

コードには適切なコメントとエラーハンドリングを含めてください。

ステップ 3:生成されたコードを確認・改善する

生成されたコードを実際に実行し、動作を確認します。問題があれば、追加の指示を出して修正します。

上記のコードで、タスクが存在しない場合のエラーメッセージを
もっとユーザーフレンドリーにしてください

簡単なユーティリティスクリプト(例:ファイルリネームツール、ログ解析スクリプトなど)のコード生成プロンプトを作成し、実際に試してみてください。

Few-Shot Learning(例示学習)

Few-Shot Learning とは、期待する出力の例をいくつか示すことで、AI に望ましいパターンを学習させる手法です。

シナリオ:API レスポンスのエラーメッセージを日本語に変換したい

プロンプト例

以下の例を参考に、英語のエラーメッセージを
ユーザーフレンドリーな日本語に変換してください。

例 1:
入力: "Invalid email format"
出力: "メールアドレスの形式が正しくありません。"

例 2:
入力: "Password must be at least 8 characters"
出力: "パスワードは 8 文字以上で設定してください。"

例 3:
入力: "User not found"
出力: "ユーザーが見つかりませんでした。"

では、以下のエラーメッセージを変換してください:
"Connection timeout"

この方法を使うことで、一貫性のある翻訳や変換が可能になります。

Chain of Thought(思考の連鎖)

複雑な問題を解決する際は、AI に段階的に考えさせる「Chain of Thought」が有効です。

プロンプト例

以下の問題を段階的に解決してください:

問題:
既存の Web アプリケーションに、ユーザー認証機能を追加したいです。
現在は Node.js + Express を使用しています。

以下の順序で考えてください:

1. 必要な機能をリストアップ
2. 使用するライブラリやツールの選定
3. データベーススキーマの設計
4. 実装の手順
5. セキュリティ上の注意点

各ステップについて、理由も含めて説明してください。

このように段階を踏むことで、より深く、論理的な回答が得られます。

システム開発での実践的な活用例

  • ユースケース 1:コードレビュー支援
以下の Python コードをレビューしてください:

[コードを貼り付け]

以下の観点でチェックしてください:

- バグや潜在的な問題
- パフォーマンスの改善点
- 可読性の向上
- Python のベストプラクティスへの準拠

各指摘について、理由と改善案を提示してください。
  • ユースケース 2:ドキュメント生成
以下の関数について、開発者向けのドキュメントを生成してください:

[コードを貼り付け]

以下を含めてください:

- 関数の概要
- 引数の説明(型と役割)
- 戻り値の説明
- 使用例
- 注意事項やエッジケース
  • ユースケース 3:テストケース生成
以下の関数に対するユニットテストケースを生成してください:

[コードを貼り付け]

以下のシナリオをカバーしてください:

- 正常系(代表的な入力)
- 境界値
- 異常系(不正な入力)
- エッジケース

pytest フレームワークを使用してください。

プロンプトエンジニアリングのベストプラクティス

プロンプトエンジニアリングを活用する際のポイントをまとめます。

プロンプトをバージョン管理する:効果的だったプロンプトはテンプレート化し、チームで共有しましょう。GitHub などでバージョン管理するのも良いでしょう。

繰り返し改善する:最初から完璧を目指さず、実際に使いながら改善していきます。

具体例を活用する:抽象的な説明よりも、具体例を示す方が効果的です。

制約を明確にする:文字数、形式、使用するライブラリなど、制約があれば明示します。

コンテキストを管理する:長い会話では、AI が重要な情報を忘れることがあります。必要に応じて情報を再提示しましょう。

よくある落とし穴と対処法

  • 落とし穴 1:曖昧な指示

悪い例:「いい感じにして」 良い例:「可読性を重視して、変数名を意味が分かるものに変更してください」

  • 落とし穴 2:コンテキストの過負荷

AI に一度に大量の情報を与えすぎると、重要な情報を見落とす可能性があります。必要な情報を絞り込みましょう。

  • 落とし穴 3:出力の検証不足

生成されたコードやテキストを、そのまま使わないようにしましょう。必ず内容を確認し、テストを実行してから使用します。

まとめ

プロンプトエンジニアリングのスキルを向上させるために、以下の方法がおすすめです。

実践あるのみ:日々の開発業務で積極的に生成 AI を活用し、プロンプトを改善していきましょう。

他者のプロンプトから学ぶ:GitHub やブログで公開されているプロンプト例を参考にしましょう。

フィードバックループを作る:生成された結果を評価し、プロンプトを改善するサイクルを回します。

ドキュメントを読む:各 AI サービスの公式ドキュメントには、効果的な使い方のヒントが豊富にあります。

コンテキストとプロンプトエンジニアリングは、生成 AI を効果的に活用するための基礎となるスキルです。

コンテキストは生成 AI が参照する文脈情報であり、適切に管理することが重要です。プロンプトエンジニアリングは、明確で構造化された指示を設計する技術です。実践的なハンズオンを通じて、段階的にスキルを向上させることができます。システム開発の様々な場面で、生成 AI を活用できます。

最初は試行錯誤の連続かもしれませんが、実践を重ねることで必ず上達します。ぜひ今日から、あなたの開発業務に生成 AI とプロンプトエンジニアリングを取り入れてみてください。