概要
- MicrosoftのAzure Cosmos DB + OpenAI ChatGPTサンプルを、Azure OpenAIではなく、OpenAI社のサービスを利用するように変更しました。
- Azure OpenAIは、エンラープライズ契約がないと利用できないため、個人のAzureサブスクリプションで同サンプルを動かすために作成しました。
- ソースコードとしては、Azure OpenAIへのアクセスを責務とするサービス
OpenAiService.csのみ修正しており、他の箇所の修正はありません(プロパティ等変更はあり)。 - Javaのエンジニアが、個人のAzureサブスクリプションで、ASP.NETのAzure OpenAIのサンプルを動かしたい、という極めてニッチなアレです。
成果物
成果物は【こちら】から。
L&L
作業中に判ったこと:もともとJavaの世界しか知らなかったので、Javaでいうところの何、というのの理解をまとめました。
アーキテクチャの概要
| # | サンプルの方式 | Java系のスタックで相当するもの |
|---|---|---|
| 言語 | C# | Java |
| フレームワーク | ASP.NET Core Blazor Server | JSF |
| DI | Microsoft.Extensions.DependencyInjection | CDI |
| 実行環境 | Azure App Service | AWS Elastic Beanstalk |
| DB | Azure Cosmos DB | AWS DocumentDB(MongoDB) |
- Blazor Serverは、UIを構築するためのフレームワークで、サーバサイドで動作します。
- 同じBlazorでも、Blazor WebAssemblyを使うと、ブラウザのWebAssemblyランタイムで実行されるコードになります。
(WebAssemblyはブラウザに内蔵されているバイトコード実行環境で、JavaScriptインタプリタの横にあります)
プロジェクト自体を構成するファイル
| # | サンプルのファイル | Java系のスタックで相当するもの |
|---|---|---|
| プロジェクト定義 | cosmoschatgpt.sln | .project |
| ビルド定義 | cosmoschatgpt.csproj | pom |
| 規定のエントリポイント (FW初期化、DI実行……を実行) |
Program.cs | public static void main(String[] args) |
| プロパティファイル | appsettings.json | *.properties |
| IaC (Azure CLI用のDSL) |
azuredeploy.bicep | AWS CloudFormationテンプレート |
| IaC (Azure Resource Manager テンプレート) |
azuredeploy.json | AWS CloudFormationテンプレート |
コマンドラインで遊ぶ
- コマンドラインからビルドする場合は、以下のいずれか。mavenがpomを読むように、MSBuildは(sln経由で)csprojを読みます。dotnet buildは内部的にMSBuildを使うようです。MSBuildの詳細はこちら。
"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" cosmoschatgpt.sln
dotnet build cosmoschatgpt.sln
- コマンドラインから実行する場合は、以下のいずれか。画面に表示されるとおり、localhost:8100からアクセスできます。
dotnet run --project cosmoschatgpt.csproj
dotnet run cosmoschatgpt.sln
- azuredeploy.jsonはDeploy to Azureボタンのためだけに利用します。azuredeploy.bicepをコンパイルして作ります。コマンドは以下。Bicepの詳細はこちら。
az bicep build --file azuredeploy.bicep
- azuredeploy.bicepをAzureにデプロイするコマンドは以下。
resource_group_1はbicepに書かれたリージョンに作成しておく必要があります。
az deployment group create --resource-group resource_group_1 --template-file ./azuredeploy.bicep
ソースコードの種類
| # | サンプルのファイル | Java系のスタックで相当するもの |
|---|---|---|
| 画面定義+ロジック | Pages/*.razor | xhtml + ViewScoped bean |
| サービス(DDDでいう) | Services/*.cs | Singleton bean |
| ドメインモデル | Models/*.cs | Entity bean |
| 設定値 | Options/*.cs | Singleton bean -> ConfigProperty field |
- まあここは感覚で。
Blazorまわりのあれこれ
参考:
https://learn.microsoft.com/ja-jp/aspnet/core/blazor/project-structure
https://learn.microsoft.com/ja-jp/aspnet/core/blazor/components/layouts?view=aspnetcore-7.0
| # | サンプルのファイル | 補足 |
|---|---|---|
| ルートページ | Pages/_Host.cshtml | |
| 規定レイアウト | Pages/_Layout.cshtml | _Host.cshtmlから参照 |
| ルータ | App.razor | web.xml, faces-config.xml的なやつ |
| using自動読込 | _imports.razor |
感想
概ね、JavaEE6+AWSくらいの時代感のエコシステムが判っていれば、読み解き、修正、デプロイは可能だなと思いました。
まったく知らない技術に触れると、やっぱり楽しいですねえ。