今回、Azure OpenAI Service(GPT-4o)+RAGで構成図からBicepのコードを生成してみましたので、その内容を投稿します。
概要
試したこと
以下の以前の記事では、Azureの構成図を生成AIにインプットして、Bicepのコードを生成させることを試してみました。
その結果、 誤りそうな部分をユーザプロンプトやシステムプロンプトで明示的に対応方法を指示することで、構成図からデプロイ可能なBicepのコードを1回の指示のみで生成することが確認できました。
ただ、毎回ユーザプロンプトで細かく指示するのは面倒なため、今回は、RAGを使ってこれをうまく解決できないかを試してみました。
対象とする構成は、前回と同じくAzure Container Appsを作成して、ログをBlob Storageに出力する構成です。
Container Appsはフロントエンド用とバックエンド用の2つを作成します。
検証環境
- Azure OpenAI Service(GPT-4o)
- Azure AI Studio
Bicepのコード生成時の注意点でRAGを実装
RAGの実装手順
前回の検証では、Azure Container AppsのBicepのコードを作成するときの注意点を、毎回ユーザプロンプトで入力する必要がありました。
今回は、この注意点をワードファイルにして、RAGを実装しました。その際、これだけではつまらないので、Azure App Serviceの場合の注意点も同じようにワードファイルに記載して、2つのファイルでRAGを実装することにしました。
-
「ContainerApps作成時の注意点.docx」の内容
Azure Container Appsを作成するBicepのコードを作成する際には、以下の6つのルールを必ず守ること。
1.リソースグループはデプロイコマンドで指定するように作成すること。
2."AppLogsConfiguration.Destination"は、azure-monitorにすること。
3.Container Appsのcpuで10 進数の値を指定する場合、 json() 関数を使用すること。
4.APIのバージョンがサポートされているバージョンか確認すること。
5.特に指定がない場合は、Container Appsは既定のイメージを利用して作成すること。
6.診断設定(リソースログの設定)でContainer Apps環境のログをストレージに出力するように設定すること。 -
「AppService作成時の注意点.docx」の内容
こちらの内容は生成AIで作成したダミーの情報です。記載内容が技術的に正しいかどうかは確認していません。
Azure App Serviceを作成するBicepのコードを作成する際には、以下の6つのルールを必ず守ること。
1.リソースグループはデプロイコマンドで指定するように作成すること。
2."AppServicePlan"を指定すること。
3.アプリケーション設定(App Settings)を適切に設定すること。
4.APIのバージョンがサポートされているバージョンか確認すること。
5.特に指定がない場合は、App Serviceは既定のランタイムスタックを利用して作成すること。
6.診断設定(リソースログの設定)でログをAzure Monitorに出力するように設定すること。
上記の2つのワードファイルをAzure AI Studioのチャットプレイグラウンドの「データを追加する」からアップロードしてRAGを実装しました(「Azure OpenAI On Your Data」の機能)。
RAGの実装結果
RAGの実装結果を確認します。
Container Appsについて聞いたときは、「ContainerApps作成時の注意点.docx」の内容が、App Serviceについて聞いたときは、「AppService作成時の注意点.docx」の内容が正しく参照できています。
しかし、この「Azure OpenAI On Your Data」機能でRAGを実装すると、チャットプレイグラウンドで、画像等のファイルを添付してチャットができなくなることがわかりました。
2024年8月時点の動作です。正確な情報は見つけられなかったため、環境や手順によっては動作が異なるかもしれません。
- RAGを実装していないチャットプレイグラウンド
ファイル添付ができます。
- 「Azure OpenAI On Your Data」機能でRAGを実装した後のチャットプレイグラウンド
ファイル添付ができなくなっています。
本当は、前回の検証と同じく、ここで構成図を添付して、構成図から直接Azure Bicepのコードを生成させたかったのですが、ちょっと簡単にはできそうになかったため、今回はそれはあきらめて、以降の方法で動作を確認しました。
この辺は、Azureの今後の機能更新にも期待です。
Bicepのコード生成の確認
前述の通り、チャットプレイグラウンドで構成図のファイルを添付してチャットができなかったため、今回は、以下の方法で動作を確認することにしました。
- 「RAGを実装していないチャットプレイグラウンド」で生成AIに構成図を文章で説明させる
- 1.で得られた情報を「RAGを実装したチャットプレイグラウンド」にインプットし、Azure Bicepのコードを生成する
「RAGを実装していないチャットプレイグラウンド」で生成AIに構成図を文章で説明させる。
Azure AI StudioのRAGを実装していないチャットプレイグラウンドでGPT-4oのモデルを利用して、以下のように、ユーザプロンプトで、構成図を添付して指示しました。
この図のAzureの構成が、図がなくても伝わるように文章で説明してください。
以下の通り図の説明が作成できました。
このAzureの構成は以下のようになっています:
1.Azure上に「Container Apps環境」が存在します。
2.Container Apps環境内には2つのアプリケーションがあります:
・「frontendapp0603」
・「backendapp0603」
3.「frontendapp0603」はHTTPSを通じてアプリ利用者と通信します。
4.「frontendapp0603」と「backendapp0603」は内部通信を行います。
5.「backendapp0603」はリソースログを「logblob0603」に保存します。
6.この構成はクイックスタートイメージを基に作成されています。
この構成により、利用者はHTTPSを通じてフロントエンドアプリケーションにアクセスし、フロントエンドアプリケーションはバックエンドアプリケーションと連携し、バックエンドアプリケーションはリソースログを保存する仕組みになっています。
リソースログの出力については、「backendapp0603」のみでなく、Container Apps環境全体のリソースログを出力させる構成を意図していたので、少し解釈が間違っているようですが、他は正しく認識されています。
「RAGを実装したチャットプレイグラウンド」でAzure Bicepのコードを生成する。
前述の項目5を正しく修正し、以下の内容をRAGを実装したチャットプレイグラウンドで指示しました。
以下の構成をAzureにデプロイできるAzure Bicepのコードを注意点を考慮して作成してください。
-----
1.Azure上に「Container Apps環境」が存在します。
2.Container Apps環境内には2つのアプリケーションがあります:
・「frontendapp0603」
・「backendapp0603」
3.「frontendapp0603」はHTTPSを通じてアプリ利用者と通信します。
4.「frontendapp0603」と「backendapp0603」は内部通信を行います。
5.「Container Apps環境」のリソースログは「logblob0603」に出力します。
6.この構成はクイックスタートイメージを基に作成されています。
この構成により、利用者はHTTPSを通じてフロントエンドアプリケーションにアクセスし、フロントエンドアプリケーションはバックエンドアプリケーションと連携します。
なお、システムメッセージ(システムプロンプト)には念のため以下を設定しました。
あなたは、作成対象のAzureリソースの作成時の注意点に全て従ってAzure Bicepのコードを生成します。注意点はRAG化されています。
「ContainerApps作成時の注意点.docx」の内容をふまえてコードを生成してくれています。
ただし、実際には、毎回意図した動作をしてくれるとは限りません。
生成されたBicepのコード
結果として後述のBicepのコードが生成されました。
なお、このコードはデプロイはできますが、frontendapp0603が正常には動作しません。
targetPort: 443と設定されていますが、Container Appsのクイックスタートイメージでは、targetPort: 80と設定する必要があります。外部通信はHTTPS通信という設定を指示しているのでなかなか難しいのかもしれません。この点も注意点として追加すればうまくいくかもしれません。
なお、今回、何回か再生成をしてみましたが、残念ながら1回の指示のみですべて正しいコードを出力させることはできませんでした。
このコードは、生成AIが作成したものです。毎回同じコードが生成されるとは限りません。
生成されたBicepのコード
param location string = resourceGroup().location
param logStorageAccountName string = 'logblob0603'
resource containerAppEnv 'Microsoft.App/managedEnvironments@2022-03-01' = {
name: 'containerAppEnv0603'
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
resource logStorageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
name: logStorageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
resource frontendApp 'Microsoft.App/containerApps@2022-03-01' = {
name: 'frontendapp0603'
location: location
properties: {
managedEnvironmentId: containerAppEnv.id
configuration: {
ingress: {
external: true
targetPort: 443
transport: 'auto'
}
}
template: {
containers: [
{
name: 'frontendapp0603'
image: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
resources: {
cpu: json('0.5')
memory: '1.0Gi'
}
}
]
}
}
}
resource backendApp 'Microsoft.App/containerApps@2022-03-01' = {
name: 'backendapp0603'
location: location
properties: {
managedEnvironmentId: containerAppEnv.id
configuration: {
ingress: {
external: false
}
}
template: {
containers: [
{
name: 'backendapp0603'
image: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
resources: {
cpu: json('0.5')
memory: '1.0Gi'
}
}
]
}
}
}
resource diagnosticSetting 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
name: 'containerAppEnvDiagnostics'
scope: containerAppEnv
properties: {
storageAccountId: logStorageAccount.id
logs: [
{
category: 'ContainerAppConsoleLogs'
enabled: true
retentionPolicy: {
enabled: false
days: 0
}
}
]
}
}
デプロイ結果
前述のAzure Bicepのコードで、frontendapp0603のtargetPortを80に修正し、デプロイしました。
結果は、前回のデプロイ結果と同じ環境ができました。
まとめ
今回は、Azure OpenAI Service(GPT-4o)で構成図からBicepのコードを生成するという内容について、RAGを活用する方法を検証しました。
前回の検証では、ユーザプロンプトで生成時の注意点を毎回入力していました。
今回は、注意点の情報でRAGを実装することで、自動で必要な注意点を考慮してBicepのコードを生成してくれることが確認できました。
意図したコードを生成してくれるときもあれば、そうでないときも多いというのが現状ですが、生成されたコードに人が手を加える前提であれば便利ではないかと思います。