2024.10.07

コーディング能力最強の ChatGPT o1 preview はAWSインフラ構成図を記述できるか ~ Mermaid の実装検証 ~ Amazon Q は未完の大器

D.M.です。
今日もLLMをシステム開発業務効率化に活用するぞ!

結論ファースト

・OpenAI o1 preview のプログラミングスキルは明らかに優れている。
・Amazon Q Developer は精度がまだ不安定だが、大いなるポテンシャルがある。

モチベーション

AIはインフラ構成図の先生になれるのか

私は研修を担当することが多く、新卒やインターン向けに簡単なシステム構成を考えてもらうタスクがあるのですが、レビューするのがやや大変です。
みなさん初心者なのでいきなりインフラ設計をやってくれというとさっぱりわからない。
ゼロから教えていくのはそれなりに負担があるので、 ChatGPT などの LLM にインフラ構成図の先生ができるのかを検証してみようと思いました。

最終目的

・AWSインフラ初学者がLLMを活用していい感じの構成図を設計できるようになる。

今回やってみること

・LLMに要件を与えインフラ構成図を書いてもらう。
・複数のLLMで比較する。可能な限り少ない指示で妥当なものができるLLMが望ましい。

既にLLMでの実装例は豊富にありますが、構成図の記述は少ないです。
検索するといろんな記事があり、しっかり具体的な指示を与えて何度かやり取りをすればMermaidで書いたりCDKのコードを出すことができるので、多くの方が業務で活用できているのではと思います。
ただこれらは人間がかなりの指示を出して初めて実現しているように見受けられます。
要件を基にしてインフラ構成図の素案を生成させる例はほぼ存在しないので、今回のお題にしてみようと思いました。

Mermaid記法で実装

インフラ構成図はPluntUMLやDraw.ioなど各種ツールを使って記述することが一般的と思います。
今回はMermaidでやってみようと思います。
https://mermaid.js.org/
Knut Sveidqvistが2014年に発表し人気を集め、Notion や GitHub がこぞって対応しています。
Markdown記法からインスパイアされたこともあり、統合して使われていたりします。
MermaidとPluntUMLは共にテキストエディタで書けるのですが、私は個人的にMermaidが好きなのでこれでやってもらおうと思います。

※Mermaid で AWS アーキテクチャ図が書けるようになったのですが、残念ながら今回この話が出てきません。
ウキウキして始めたのですが、LLMはまだ新しい記法に対応できていませんでした。
今回のアウトプットよりもっとカッコいいアーキテクチャの記述はv11.1.0以上で利用可能です。LLMの次のアップデートとかでこの辺がいけるといいなあ。
https://mermaid.js.org/syntax/architecture.html

※PluntUMLも使われています。
「長く維持されるシステム構成図のつくりかた 〜 PlantUML で継続的に AWS/GCP/Azure アーキテクチャ図をメンテする仕組み 〜」
https://qiita.com/irongineer/items/23fcd55830ae2de96ca8

今回エントリーしたLLM

・Claude 3.5 Sonnet
・Gemini 1.5 Pro
・OpenAI o1 preview
・OpenAI GPT-4o
・Github Copilot
・Amazon Q
・Perplexity

LLM選定の理由

Artificial Analysis というとんでもなく便利なサイトがあります。
https://artificialanalysis.ai/
このサイトは LLM の性能を妥当な基準に沿って比較した結果をグラフにしてくれています。

Coding(HumanEval) の箇所で上位の LLM を選定してみました。
・OpenAI o1 preview
・OpenAI GPT-4o
・Claude 3.5 Sonnet
・Gemini 1.5 Pro

(2024年10月現在。 https://artificialanalysis.ai/ から引用)

トップ3はで注目度が高いOpenAIのChatGPTの最新版です。
特に o1 preview統計やコーディングなど理系タスクに特化した性能を持っていると喧伝されているため期待が募ります。

Claude 3.5 Sonnet は特にコーディングスキルが高いことで知られています。
公式ページによると各種スコアで GPT-4o よりも優れた結果を出しています。
https://www.anthropic.com/news/claude-3-5-sonnet

Artificial Analysis のランキング以外の候補者も以下のものがあります。

Github Copilot はコーディングを支援してくれる AI です。
プログラムを半自動的に生成してくれることもあり多くの会社で導入されています。
この機能の一部である Github Copilot Chat は、プログラミングに特化した QA チャットが可能です。
プロンプトで指示したプログラム実装をアウトプットしてくれます。
プログラミングスキルが高いAIですが、AWSインフラ構成図を実装する知見はどの程度あるかは未知数のため検証してみようと思いました。

Amazon Q は2024年5月に出たばかりで、AWSの知識に特化したLLMです。
開発者向け機能はAmazon Q Developerと呼ばれ、その Chat 機能では AWS のサービスについて結構突っ込んだ内容を質問できるようです。
・適切なサービス、ベストプラクティスの説明。
・AWS SDK や AWS CLIを使用した開発。短いスクリプトまたはコードスニペットを生成できます。
・アカウント内のリソースのタイプを一覧表示、特定のリソースの詳細を一覧表示、リージョンや状態などの基準に基づいてリソースを一覧表示
詳しくは公式の説明をご一読ください。
https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/what-is.html

以下の記事では Amazon Q に AWS の資格試験の問題を解かせていますが、正確な回答ができています。
https://dev.classmethod.jp/articles/amazon-q-accuracy-test/

Amazon Q には GitHub Copilot のようなコーディング支援機能もあるということなので、 AWS の構成図を書くという目的であればもしかしたらめっちゃできるのではという期待があります。

検証方法

以下の課題を1セット2回出力で5セット10回の回答をしてもらいます。
1セットの初回に出したものを2回目で修正してもらいます。
2回目の修正には「教えて.AI byGMO」でも人気のパワハラプロンプトを使っています。
「これを60点とします。100点にするために必要な案を出し、修正してください。」

※もちろん10回では統計的に充分とは言えないのですが、ニーズに沿ったことができるかを試しにやってみたというレベルでご理解ください。

課題
以下のプロンプトを実行します。

1回目
シニアインフラエンジニアとして、最短時間で作成可能な、 AWS を使用したシンプルな本番環境の Web アプリケーションのアーキテクチャを Mermaid 形式で記述してください。
詳細な説明は不要ですので、図だけを示してください。

[機能面の条件]
・Webアプリケーションにはログイン、一覧、登録、外部API実行があります。
・1日1回、複雑な条件で集計する処理があります。

[Marmeid の条件]
・AWSのブロックは略語で表記する。
・全体図の縦横比がバランスよくなるようにブロックが配置される。
・ユーザのリクエストからレスポンスまでの流れがわかるようにする。
・AWSのブロックの種類毎に異なるスタイルを付ける。

[インフラ面の条件]
・ネットワーク構成の AZ, VPC, Public subnet, Private subnet,Internet gateway, NAT Gateway, vpc endpoint について詳細に記載してください。
・障害発生時に強い冗長な構成であることがわかる図にしてほしいです。
・使用するコンポーネントを全てを図に記載してほしいです。
・図が複雑になるので監視については考慮しないください。
・クライアントがブラウザからどこへアクセスするかエンドポイントを明示してください。
・外部APIを実行する処理について、通信フローを明示してください。
・サーバレスにするためにECSまたはLambdaを使ってください。
・RDSをつかってください。


2回目
これを60点とします。100点にするために必要な案を出し、修正してください。

 

Please describe an architecture of a simple AWS web application for production environment in mermaid format that you can create in the shortest time as a senior infrastructure engineer. 
please just show a diagram; you don't have to explain it in detail. 

[Functional Requirements] 

The web app includes login, list, registration, and an external API execution.
A complex aggregation process runs once daily.
Show a highly redundant, failure-resistant architecture.

[Infrastructure Requirements] 

Use AWS block abbreviations.
Arrange blocks to balance the diagram's aspect ratio.
Apply different styles for each AWS block type.
Use network components: 3 Availability Zones, VPC, Public Subnets, Private Subnets, Internet Gateway, NAT Gateway, VPC Endpoint , if necessary.
Exclude monitoring to reduce complexity.
Show the flow from user request to response.
Show communication flow for external API execution.
Indicate browser access endpoints.
Please Use ECS or Lambda to be serverless. 
use RDS. 


I will rate this output 60 points. Please list the elements that are lacking to make it a 100-point output, and provide an example of what a 100-point output would look like.

なぜ突然英語が出てきたか

これは実は Amazon Q がまだ英語にしか対応していないためです。
可能な限り同じ条件にするため全てのLLMへ英語で質問していきます。

そして Amazon Q には入力プロンプト文字数制限1000文字というのもあります。
なのでその限界文字数まで指示を書いている、という状況に結局なってしまいました。
本当はもっと短いプロンプトがよかったのですが、アウトプットがあまり期待したものにならなかったので、ある程度のクオリティを担保するために最低限の指示を書くことになりました。
(もちろんさらにもっと書けば精度は上げられますが、そこを凝る時間をかけなくてもAIとしていい感じにできるようになってほしいというのが本音です)

検証結果

結果このようになりました。

インフラ構成図をMermaidで書く実力ランキング

1. o1 preview : ほぼできている。
2. Claude 3.5 Sonnet : 穴はあるが悪くない。2回ぐらいの具体的な指示で直せそう。
3. GPT-4o : 穴はあるが悪くない。2回ぐらいの具体的な指示で直せそう。
4. Amazon Q : 優れたものも多いが、悪い時もある。出力のクオリティが安定しない。
5. Gemini 1.5 Pro : 優れたものも多いが、悪い時もある。出力のクオリティが安定しない。
6. Github Copilot : 抜け漏れが多い。
7. Perplexity : 図の出力が全然センスがない。(もしかしたら内容は正しいのかもしれないが図として見ずら過ぎる)

Artifical Analysis の Coding スキルランキングそのままの結果になりました。
(ある意味当然の結果)

10回出力の中でよかったものを出していこうと思います。

o1 preview の Mermaid

o1 preview は優れたアウトプットを安定して出すことができました。

o1 preview Mermaid

graph TB

subgraph VPC
subgraph Public Subnets
IGW[IGW]
ALB[ALB]
NGW[NATGW]
end

subgraph Private Subnets
ECS1[ECS – AZ1]
ECS2[ECS – AZ2]
ECS3[ECS – AZ3]
RDS[(RDS – Multi-AZ)]
ECSAgg[ECS Aggregation Task]
end
end

User((User Browser)) –> ALB
ALB –> ECS1
ALB –> ECS2
ALB –> ECS3

ECS1 –> RDS
ECS2 –> RDS
ECS3 –> RDS

ECS1 — External API Call –> NGW
ECS2 — External API Call –> NGW
ECS3 — External API Call –> NGW
ECSAgg — External API Call –> NGW
NGW –> ExternalAPI[External API]

ScheduledEvent[Scheduled Event] –> ECSAgg
ECSAgg –> RDS

classDef awsCompute fill:#f0f9ff,stroke:#0073bb,color:#000
classDef awsDatabase fill:#f3e5f5,stroke:#7e57c2,color:#000
classDef awsNetwork fill:#fff2e8,stroke:#d93f3c,color:#000
classDef userStyle fill:#ffffff,stroke:#000000,color:#000

class ECS1,ECS2,ECS3,ECSAgg awsCompute
class RDS awsDatabase
class ALB,NGW,IGW awsNetwork
class User userStyle

図を見る限り、突っ込みどころとして、 Scheduled Event は EventBridge にしてほしいとか、S3で静的ファイルを返すほうがいいとかは確かにあります。
ただ正直、他のLLMに比べると出力のクオリティ安定度が非常に高いです。高い状態が10回連続で続きます。この点で満足してしまいました。
速度は4oのおよそ5分の1、価格も4oの約6倍になり、デメリットも際立っていますが、これは使う価値が間違いなくあります。
このクオリティなら初学者の先生として充分に役に立つと私は評価したいと思います。

Claude 3.5 Sonnet

プログラミングスキルが高いと評判のClaudeはインフラ構成図の実装も比較的優れた評価になりました。

Claude 3.5 Sonnet Marmeid

graph TB
classDef EC2 fill:#F9D74C,stroke:#333,stroke-width:2px
classDef ELB fill:#F58536,stroke:#333,stroke-width:2px
classDef RDS fill:#49A37A,stroke:#333,stroke-width:2px
classDef Lambda fill:#FF9900,stroke:#333,stroke-width:2px
classDef S3 fill:#E05243,stroke:#333,stroke-width:2px
classDef VPC fill:#7AA116,stroke:#333,stroke-width:2px
classDef IG fill:#7AA116,stroke:#333,stroke-width:2px
classDef NAT fill:#A116,stroke:#333,stroke-width:2px
classDef CF fill:#F05033,stroke:#333,stroke-width:2px
classDef R53 fill:#9D25,stroke:#333,stroke-width:2px
classDef SM fill:#3B48CC,stroke:#333,stroke-width:2px
classDef ECR fill:#F58536,stroke:#333,stroke-width:2px
classDef CW fill:#FF4F8B,stroke:#333,stroke-width:2px
classDef WAF fill:#DD344C,stroke:#333,stroke-width:2px

User((User))
ExternalAPI[External API]
R53[Route 53]:::R53
WAF[WAF]:::WAF

subgraph VPC[VPC]
IG[Internet Gateway]:::IG
ALB[ALB]:::ELB

subgraph “Public Subnets”
NAT1[NAT Gateway]:::NAT
NAT2[NAT Gateway]:::NAT
NAT3[NAT Gateway]:::NAT
end

subgraph “Private Subnets”
subgraph “ECS Cluster”
ECS1[ECS Task]:::EC2
ECS2[ECS Task]:::EC2
ECS3[ECS Task]:::EC2
end
ASG[Auto Scaling Group]
end

RDS[(RDS Multi-AZ)]:::RDS
S3EP[S3 VPC Endpoint]
end

CF[CloudFront]:::CF
S3[S3]:::S3
Lambda[Lambda]:::Lambda
ECR[ECR]:::ECR
CW[CloudWatch]:::CW

User –>|HTTPS| R53
R53 –> WAF
WAF –> CF
CF –> ALB
ALB –> ECS1
ALB –> ECS2
ALB –> ECS3
ECS1 –> RDS
ECS2 –> RDS
ECS3 –> RDS
ECS1 & ECS2 & ECS3 -.-> S3EP
S3EP –> S3
ECS1 & ECS2 & ECS3 -.-> NAT1 & NAT2 & NAT3
NAT1 & NAT2 & NAT3 –> IG
IG -.-> ExternalAPI
Lambda –>|Daily Aggregation| RDS
CF –> S3
ECS1 & ECS2 & ECS3 –> CW
ASG -.->|Manages| ECS1 & ECS2 & ECS3
ECR -.->|Provides Images| ECS1 & ECS2 & ECS3

めっちゃ見ずらいですが、それなりの図になっています。
S3やECRがあるのは o1 preview より優れているといえるかも。
ただ実際このレベルのアウトプットは頻度がそれほど多くなく、他のものは public subnet がそもそもなかったり日次処理(Daily Aggregation)がなかったりしたので、総合的には o1 preview より劣りました。
一方で、 Claude は本家 Web サイトの Artifacts の機能のおかげで Mermaid がすぐにプレビュー表示できます。開発効率という点では非常にアドバンデージがあります。
アウトプットのクオリティは4oも負けていないのですが、Claudeのほうが気持ち優れている印象があります。

Gemini 1.5 Pro

速度は一番早いんですが出力のクオリティが安定しませんでした。

例えばこの図は悪い例ですが、 Web Tier の ECS が何をしてるのか。外部API実行に使っているようなのですが、App の ECS と同じでもいい気がします。それからCLBを使っている点もちょっと違わないかと思います。
Claude 3.5 Sonnetより優れた出力もありましたが、ただダメな時も多い。そんな感じです。
(そもそもGoogleが自社のCloudを差し置いてAWSについて詳しいはずがないというのがあると思いますが)

Gemini は残念ながら成果が弱かったのですが、その実力を測るには今回のユースケースが適さなかった可能性があります。
入力トークン数上限が100万という圧倒的な数値を持っています。つまり可能性として、プロンプトに大量の例を入れることで Few Shot Learning をすることで精度を上げられる可能性があります。
マルチモーダルの処理能力も高いため、正しい図と正しいMermaidの例をセットでプロンプトに送ることで今回の結果を覆せるかもしれません。

Github Copilot Chat

大間違いというのはなかったのですが図として抜け漏れが多く他のLLMに比べると充分な結果ではありませんでした。

例えばこの図は、 Public Subnet, Private Subnet の中身がそれぞれ異なっているので、意図した冗長性が保たれていないように感じます。
GitHub には Mermaid も多く上がっていると思いますが、どうもスキルを引き出すことができませんでした。
Github Copilot Chat は Workspace 内のファイルを参照して Few Shot Learning ができるので、フォルダ内に良い構成図を用意しておけば改善が見込めるかもしれません。

Perplexity

Perplexity は検索エンジンなので、案の定プログラミングには全く向いていませんでした。
(入れる必要なかったのですが、検索エンジンにプログラミングさせるなどという余興ができる時代になったというだけでも面白かったです)
この図に象徴されるように、図の書き方の根本がずれており、非常に見ずらいアウトプットになっています。
他の図と Perplexity の図を比較すると、センスがない人とある人の図を比較している状況とまったく同じ気持ちになります。
新人さんが頑張って図を書いてきてくれたけど、いや今回はそういう風に書くんじゃないよっていうやつです。
ただ唯一 Meermaid v11.1.0 のAWSアーキテクチャの記法にチャレンジした出力をしてくれた点は良かったと思いました。

Amazon Q の Mermaid

最後Amazon Qはイタい結果になりました。
成績的には Gemini といい勝負と思います。
調子がいいときは以下のようにいい結果を出力してくれます。

Amazon Q 使いずらいところ

日本語できない。
長い質問が入力できない(1000文字上限)
長いアウトプットが出力できない。
出力のクオリティが安定しない。

質問に答えられないときはリンクで逃げる。

気分が乗らないときは答えない。

会話履歴が読めないことが多々発生(履歴を読んでいると書いてあるのだが、、)

特に出力結果の不安定さは最も困ったところです。
もちろんユースケースとしてはレアなお願いをしていると思いますが、他のLLMより優れたレベルのものを出せていた瞬間もあっただけに悔しい結果です。

今後のAmazon Q Developerに期待

すでに最大で95点ぐらいのものを出せているので、今後安定すれば間違いなく実用的な構成図を出力できるようになります。
そうなるとCloudFormationやAWS CDKも生成し半自動でインフラ構築される未来がそう遠くはないのではないでしょうか。

この検証自体が良い勉強になりました

LLMが出力した大量のインフラ構成図を確認したことで、意外な効果がありました。
・LLMの出力は最低1か所はまちがっている。それを探すのがレビューの練習になる。
・あれ、ここ間違いかもしれないけど実際どうだっけ、というように細かい部分でAWSの仕様が分かっていないことがあり、その確認が勉強になります。

教えて.AI の姉妹サービス「天秤AI」で今回と同じ検証を簡単に試すことができます。ぜひ一度みなさんもブレストがてらやってみてください。
https://tenbin.ai/

採用に力を入れています

次世代システム研究室では、最新のテクノロジーを調査・検証しながらインターネットのいろんなアプリケーションの開発を行うアーキテクトを募集しています。募集職種一覧 からご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事