- ゼロショット・ワンショット・フューショットのおさらい
- 検証対象
- ゼロショットで EC2 リソースを説明させてみた
- ワンショットで EC2 リソースを説明させてみた
- フューショットで EC2 リソースを説明させてみた
- 比較して見えた違い
- 実運用での使い分け
- 補足:生成AIが出力する「リソース名」の扱い
- まとめ
こんにちは。CS部の山科です。
生成 AI を業務で使い始めると、 「それっぽいけど、そのまま成果物には使いづらい」 という壁にぶつかることが多いのではないでしょうか。
本記事では、ゼロショット/ワンショット/フューショットという考え方が AWS の実運用でどのように効くのかを、 CloudFormation で定義した EC2 リソースを題材に検証します。
検証には Amazon Bedrock(Playground) を使用し、 同一リソースに対してプロンプトのみを変えて比較しました。
ゼロショット・ワンショット・フューショットのおさらい
ゼロショット : 例を与えず、指示のみで出力させる方法
ワンショット : 例を1件与えてから出力させる方法
フューショット : 複数の例を与えてから出力させる方法
どちらもモデルを再学習させるものではなく、 プロンプト内で文脈を与えるだけという点が特徴です。
検証対象
- CloudFormation で定義した EC2 インスタンス
- Security Group / IAM Instance Profile / UserData / Tags を含む構成
- 実務に近い最小構成
使用したCloudFormation(EC2)
WebInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SubnetId: !Ref PublicSubnetId SecurityGroupIds: - !Ref WebSecurityGroup IamInstanceProfile: !Ref Ec2InstanceProfile MetadataOptions: HttpTokens: required UserData: Fn::Base64: !Sub | #!/bin/bash dnf -y update dnf -y install nginx systemctl enable nginx systemctl start nginx echo "Hello from CloudFormation" > /usr/share/nginx/html/index.html Tags: - Key: Name Value: sample-web-ec2 - Key: Environment Value: dev - Key: Owner Value: platform-team - Key: CostCenter Value: 1234 - Key: ManagedBy Value: CloudFormation
ゼロショットで EC2 リソースを説明させてみた
まずは、例(お手本)を与えずにゼロショットで EC2 リソースの説明を生成しました。 EC2 インスタンスの CloudFormation 定義のみを入力しています。
使用したプロンプト
あなたはAWSインフラエンジニアです。 以下のCloudFormationリソース(EC2 Instance)を読み取り、 役割、配置、通信、権限、初期設定、運用上の注意点を 日本語で説明してください。 (ここにブログのWebInstanceのYAMLを流し込む)
出力結果(一部抜粋)
このEC2インスタンスはNginxウェブサーバーとして構成されています。 1. 基本設定 - インスタンスタイプは変数「InstanceType」から参照 - AMIは変数「LatestAmiId」から最新のAMIを使用 2. ネットワーク配置 - パブリックサブネットに配置(PublicSubnetId参照) - WebSecurityGroupセキュリティグループを適用 3. セキュリティ設定 - IMDSv2が必須(HttpTokens: required)で、より安全なメタデータアクセスを強制 - IAMロール(Ec2InstanceProfile)が割り当てられている 4. 初期設定(UserData) - システムパッケージの更新 - Nginxのインストールと自動起動設定 - 簡単なHTMLページの作成 5. 運用管理 - 体系的なタグ付け: - 環境識別(Environment: dev) - 所有者管理(Owner: platform-team) - コスト管理(CostCenter: 1234) - 管理ツール識別(ManagedBy: CloudFormation) 6. 運用上の注意点 - パブリックサブネットに配置されるため、適切なセキュリティグループ設定が重要 - インスタンスプロファイルの権限範囲の定期的な見直しが必要 - 本番環境では静的コンテンツの内容を適切に管理する必要あり - システムアップデートによる影響を考慮した運用計画が必要
ゼロショットでは、EC2の構成要素を広く拾い上げる出力となりました。
- Nginxサーバーであること
- IMDSv2必須であること
- タグ構成
- 運用上の注意点
など、テンプレートに含まれる情報を網羅的に言語化できています。
一方で、
- 出力形式は固定されていない
- 観点の優先度はモデル任せ
- 「設計レビュー視点」というよりは「構成説明」に近い
という特徴がありました。
つまりゼロショットは、
構成理解・初期把握には十分 しかし設計書のドラフトとしては粒度が安定しない
という位置づけになります。
ワンショットで EC2 リソースを説明させてみた
次に、出力の観点と形式を指定したワンショットで同じリソースを説明させました。
ここでは、出力形式だけでなく、 踏み台サーバーという具体的なEC2の説明例を1件与えています。 この「例」が、生成AIにとっての思考の型として機能します。
使用したプロンプト
あなたはAWSインフラエンジニアです。 以下の形式でCloudFormationリソース(EC2 Instance)を読み取り、日本語で説明してください。 リソース名: 役割: 配置/ネットワーク: 通信: 権限: 初期設定: セキュリティ観点: 運用/注意点: 【例】 リソース名:BastionInstance(踏み台サーバー) 役割:外部からプライベートサブネット内のリソースにアクセスするための管理用サーバー 配置/ネットワーク:パブリックサブネット、Elastic IPを付与 通信:特定の拠点IPからの22番ポート(SSH)のみを許可 権限:管理者用のIAMロールが付与され、S3へのログ出力権限を持つ 初期設定:SSMエージェントの最新化と、接続ログの転送設定 セキュリティ観点:IMDSv2の有効化、および不要なパブリックアクセスの制限を確認 運用/注意点:踏み台が必要な時だけ起動する運用を検討 では、次のCloudFormationリソースを説明してください。 (ここにブログのWebInstanceのYAMLを流し込む)
出力結果(一部抜粋)
- リソース名:WebInstance(Webサーバー) - 役割: - Nginxをインストールした基本的なWebサーバー - 静的なHTMLコンテンツを提供する - 配置/ネットワーク: - パブリックサブネットに配置(PublicSubnetIdパラメータを参照) - インスタンスタイプはパラメータで指定可能 - 権限: - Ec2InstanceProfileで定義されたIAMロールが付与 (具体的な権限は IAM ロールの定義による) - 初期設定: - システムパッケージの更新 - Nginxのインストールと自動起動設定 - 簡単なテストページの配置 - 運用/注意点: - 環境はdev(開発環境)として設定 - プラットフォームチームが管理 - コストセンター1234に紐付け - タグベースの管理が可能(Name, Environment, Owner, CostCenter, ManagedBy) - システムアップデートが自動実行されるため、初回起動時に時間がかかる可能性あり
ワンショットでは、出力形式が明確に揃い、構造化された説明になりました。
特に、
- 「役割」「配置」「権限」「初期設定」「運用/注意点」
- パラメータ参照の明示
ゼロショットとの差は、
「何を書くか」をモデルに委ねるのではなく、 「どう整理するか」の型を与えたこと
にあります。
ただし、
- 可用性設計(HA)
- 監視・バックアップ戦略
- セキュリティ設計の深掘り
といった“設計レビューの軸”はまだ弱い印象です。
ワンショットは、
整った説明文を安定して出すための方法 ドキュメント整形用途には十分有効
という位置づけと言えます。
フューショットで EC2 リソースを説明させてみた
次に、複数の例を与えたフューショットで同じリソースを説明させました。
今回のプロンプトでは、
踏み台サーバー(管理用途)
アプリケーションサーバー(ALB配下)
バッチサーバー(内部処理系)
といった役割の異なるEC2例を複数提示しています。
これにより、生成AIは
ネットワーク観点
通信設計観点
IAM権限観点
運用・監視観点
といった「設計レビューの軸」を反映しやすくなります。
使用したプロンプト
あなたはAWSインフラエンジニアです。 以下の形式でCloudFormationリソース(EC2 Instance)を読み取り、日本語で説明してください。 リソース名: 役割: 配置/ネットワーク: 通信: 権限: 初期設定: セキュリティ観点: 運用/注意点: 【例1】 リソース名:BastionInstance(踏み台サーバー) 役割:外部からプライベートサブネット内のリソースにアクセスするための管理用サーバー 配置/ネットワーク:パブリックサブネット、Elastic IPを付与 通信:特定の拠点IPからの22番ポート(SSH)のみを許可 権限:管理者用のIAMロールが付与され、S3へのログ出力権限を持つ 初期設定:SSMエージェントの最新化と、接続ログの転送設定 セキュリティ観点:IMDSv2の有効化、および不要なパブリックアクセスの制限を確認 運用/注意点:踏み台が必要な時だけ起動する運用を検討 【例2】 リソース名:AppInstance(社内Webアプリ) 役割:社内向けWebアプリケーションをホストするアプリケーションサーバー 配置/ネットワーク:プライベートサブネットに配置し、ALB(別リソース)からのアクセスを前提 通信:ALBのセキュリティグループからの80/443のみ許可、管理はSSMを利用(SSHは原則閉塞) 権限:アプリ用IAMロールが付与され、Parameter Store/Secrets Managerの参照やCloudWatch Logs出力を許可 初期設定:アプリのデプロイ準備(必要パッケージ導入)、ログのCloudWatch転送設定、定期パッチ適用の前提 セキュリティ観点:パブリックIPを付与しない、最小権限IAM、IMDSv2必須、OS更新の運用を前提 運用/注意点:Auto Scalingの導入余地、パッチ適用手順、ログ/メトリクス監視(CPU/メモリ/ディスク)を整備 【例3】 リソース名:BatchInstance(夜間バッチ処理) 役割:夜間に集計・ETL等のバッチ処理を実行するワーカーサーバー 配置/ネットワーク:プライベートサブネットに配置し、外部通信はNAT Gateway経由(またはVPCエンドポイント)を前提 通信:インバウンドは原則不要(必要時のみ社内CIDRからの限定SSH/管理はSSM)、アウトバウンドはS3や外部API向け 権限:S3の入出力、CloudWatch Logsへの出力、必要に応じてDynamoDB等へのアクセス権限を持つIAMロールを付与 初期設定:ジョブ実行ユーザー作成、実行スクリプト配置、ログ出力(/var/log等)とローテーション、時刻同期 セキュリティ観点:インバウンド最小化、権限の絞り込み、IMDSv2必須、機密情報はSecrets Manager等で管理 運用/注意点:実行スケジュール(EventBridge等)、失敗時リトライ/通知、処理時間の監視、スケール(並列実行)設計 では、次のCloudFormationリソースを説明してください。 (ここにブログのWebInstanceのYAMLを流し込む)
出力結果(一部抜粋)
- リソース名:WebInstance(Webサーバー) - 役割: - Nginxをホストする基本的なWebサーバー - 静的なHTMLコンテンツを提供(初期設定では "Hello from CloudFormation" を表示) - 配置/ネットワーク: - パブリックサブネットに配置(SubnetId: !Ref PublicSubnetId) - WebSecurityGroupによるネットワークアクセス制御 - 権限: - AMインスタンスプロファイル(Ec2InstanceProfile)が付与 - 具体的な権限はIAMロールの定義に依存 - 初期設定: - システムパッケージの更新(dnf -y update) - Nginxのインストールと自動起動設定 - 基本的なHTMLコンテンツの配置 - 運用/注意点: - 環境はdev(開発環境)として タグ付け - コスト管理(CostCenter)とオーナー情報(Owner)がタグで明確化 - 単一インスタンスのため、可用性に懸念(Auto Scalingなし) - パッチ管理戦略の検討が必要 - メトリクスやログ監視の設定が必要 - バックアップ戦略の検討が必要
フューショットでは、出力の「視点」が明確に変わりました。
今回の出力では、例えば以下のような観点が含まれました。
- Auto Scaling未導入による可用性リスク
- パッチ管理戦略の必要性
- 監視(メトリクス・ログ)の検討
- バックアップ戦略の必要性
ただし、これは「フューショットで例を増やしたから自動的に深くなる」というより、 例の中に可用性・監視・運用といった観点を埋め込んでいた影響が大きいと考えられます。
踏み台・アプリサーバー・バッチサーバーといった役割の異なる例を提示したことで、 「EC2をどういう観点で語るべきか」という枠組みが、 出力に反映されやすくなったと整理できます。
これは、例に埋め込んだ観点がそのまま出力に影響しているためです。
フューショットは単なる整形というより、 例を工夫することで、出力の観点(レビュー観点)を揃えやすくできる手法だと感じました。
比較して見えた違い
| 観点 | ゼロショット | ワンショット | フューショット |
|---|---|---|---|
| 例の有無 | なし | 1件 | 複数件 |
| 出力形式 | モデル任せ | 指定形式で安定 | 指定形式で安定 |
| 粒度 | 毎回変わる | ある程度揃う | 揃いやすい |
| 情報整理 | 説明寄り | 項目に沿って整理 | 例に含めた観点に沿って整理 |
| 観点漏れ | 起きやすい | 減る | 例の観点が反映されやすい |
| 思考の傾向 | 構成説明レベル | 整理された説明 | 例に引っ張られた説明 |
| 運用視点 | 弱い傾向 | 最低限含まれる | 例に含めれば反映される |
| 可用性・監視への言及 | ほぼ出ない | 出る場合もある | 例に含めた場合は出やすい |
| 実務利用 | 構成理解・壁打ち | ドキュメント整形 | 観点を揃えたドラフト生成 |
| 安定性 | 低い | 中 | 高い(例の設計に依存) |
| コントロール性 | 低い | 中 | 高い(例と指示の設計に依存) |
フューショットはモデルを賢くする手法ではない。 しかし、与えた例の“思考の型”を出力に反映させやすい。
実運用での使い分け
- ゼロショット
- 構成理解
- 初期把握
- 壁打ち用途
- ワンショット
- 出力形式を揃えたいとき
- 設計書のドラフト整形
- チーム共有前の文章整理
- フューショット
- 特定の観点(例:可用性・監視・セキュリティ)を含めたいとき
- 設計レビュー観点を揃えたいとき
- 論点の抜け漏れを減らしたいとき
生成 AI の出力は、人のレビューを前提に使うことで初めて実務に耐えると感じました。
また、
フューショットの本質は「例の量」ではなく、 「どの観点を例に埋め込むか」にある。
補足:生成AIが出力する「リソース名」の扱い
なお、生成AIは CloudFormation の論理ID を 「リソース名」として出力する傾向がありました。
一方で、実運用では Name タグでリソースを識別することが多いため、 設計書用途では両者を併記する方が実用的だと感じました。
<例>
リソース名: - 論理ID: - Nameタグ:
まとめ
- CloudFormation の EC2 リソース説明は Amazon Bedrock で十分に生成できる
- ゼロショットは理解補助として有効
- ワンショットは出力形式を安定させるのに有効
- フューショットは、例に含めた観点を反映させたドラフト生成に有効
AWS 運用に生成 AI を取り入れる際は、 モデル選択よりも「どの観点を与えるか」が重要だと感じました。
今回はEC2を題材にしましたが、 同じ考え方を使えば、複雑な構成図の読み解きや、 引き継ぎ資料・設計レビュー用ドキュメントの自動生成にも応用できそうです。
生成AIは「答えを出すツール」というよりも、
設計観点を整理するための補助装置
として使うのが、実運用では現実的だと感じました。
お客様の環境をより深く、素早く理解し、価値ある提案に繋げるための武器として、今後もBedrockを使い倒していきたいと思います。