【イチから学ぶ! 初めての Azure と生成 AI】Azure App Service / Container Apps を用いた生成AIアプリケーション開発 - 監視編

# はじめに

本記事は、【イチから学ぶ! 初めての Azure と生成 AI】セミナーのセッション『AI アプリのクラウド運用入門 ～App Service と Container Apps の選び方と管理のポイント』の解説記事です。

Azure を活用した生成 AI アプリケーション開発の際に役立つポイントをご紹介します。実装時に直面しがちなハマりどころやその解決策を、全 5 回に分けてお届けします。

本記事では、Azure で稼働する生成 AI アプリケーションの監視方式をご紹介します。

本記事でご紹介するサンプルアプリケーションのソースコードは、以下のリポジトリで公開しています。

https://github.com/kohei3110/azure-101-day

# 生成 AI アプリケーションの監視

生成 AI アプリケーションでは、業務ロジックに加え、AI 特有の指標も多数監視する必要があります。

Azure では、AI Foundry を使用して監視を行うことができます。AI Foundry とは、AI モデル構築・評価・デプロイするための統合ポータルで、Azure で生成 AI を組み込んだアプリケーションを開発する際におすすめのサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/b65f0f79-8198-4d56-a646-ce1b2286731b.png)


予めこの AI Foundry と Application Insights を統合すると、Application Insights に送信されたテレメトリデータを AI Foundry で確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/ab5d2c4b-6d4c-46a8-a19e-599e142494d1.png)


https://learn.microsoft.com/ja-jp/azure/ai-studio/how-to/monitor-applications

なお、テレメトリデータの送信方法は、以下の Docs に記載されています。Azure AI Inference SDK を使用することで、OpenTelemetry を使用したトレースを構成可能です。

https://learn.microsoft.com/ja-jp/azure/ai-studio/how-to/develop/trace-local-sdk?tabs=python

上記の Docs に従ってコードを書くと、以下のように、AI Foundry において一連のトレースを表示することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/bed2fa7d-6d4f-450c-9cc3-1e3b157c6522.png)

補足として、AI Foundry を使って、Azure OpenAI のメトリック（リクエスト数・トークン数等）も確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/372c5e3e-268a-414d-bd5d-2b103f301aea.png)


## Azure 上の生成 AI アプリケーション監視 構成例

今回のサンプルアプリケーションでは、Application Insights にテレメトリデータを送信するように構成しています。

Application Insights にテレメトリデータを送信する方法ですが、

1. メインのアプリケーションから SDK を使って Application Insights に直接送信する
1. サイドカーコンテナ（OpenTelemetry Collector）を介して Application Insights に送信する

という２つの方法が存在します。この２つの構成は、要件に応じて使い分けると良いでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/b62f99dc-a69a-4725-bbdc-736a153c884d.png)

なお、今回は Application Insights にテレメトリを送信していますが、Azure 以外のその他の監視サービスにテレメトリを送信することも可能です。

補足として、Container Apps 独自の機能として、Container Apps 環境で OpenTelemetry データエージェントを常駐させ、共通の Collector 経由で監視データを送信する構成がプレビューで登場しました。OpenTelemetry の世界でいう「ゲートウェイ」型の構成が、Container Apps の機能を使って実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/d6aee926-dfee-49ae-bb6b-4ed859b2426d.png)

https://learn.microsoft.com/ja-jp/azure/container-apps/opentelemetry-agents?tabs=azure-cli%2Carm-example


## 独自の関数のトレース

さて、Docs には以下のように記載があります。

```
独自のカスタム関数をトレースするには、OpenTelemetry を利用できます。OpenTelemetry SDK を使用してコードをインストルメント化する必要があります。 これには、トレーサー プロバイダーの設定と、トレースするコードのスパンの作成が含まれます。 各スパンは作業単位を表し、入れ子にしてトレース ツリーを形成できます。 スパンに属性を追加して、追加のコンテキストでトレース データをエンリッチすることができます。
```

https://learn.microsoft.com/ja-jp/azure/ai-studio/how-to/develop/trace-local-sdk?tabs=python#tracing-your-own-functions

Azure AI Inference SDK を使った場合、内部的に OpenTelemetry 仕様に従った形でテレメトリデータが送信されます。コードを書くのも簡単なので、実開発においては Azure AI Inference SDK を使用することを優先するのが良いと考えます。

一方、Azure AI Inference SDK を使わずにアプリケーションを開発している場合でも、OpenTelemetry 仕様に従う形でコードを記述することで、AI Foundry で関数をトレースすることが可能になります。

具体的には、OpenTelemetry 仕様（Semantic Conventions for Generative AI Systems) に従ってコードを書くことで、AI Foundry で見やすい形にコードを記述できます。

AI Foundry では、OpenTelemetry 仕様の attribute で指定された値を内部的に読み取って、各トレースの可視化をしてくれます。

※2025年2月27日時点で、Semantic Conventions for Generative AI Systems は Experimental フェーズです。

https://opentelemetry.io/docs/specs/semconv/gen-ai/

以下の例は、Span 属性に幾つかを設定した例です。

```python:controller.py
        ・・・
        with tracer.start_as_current_span("post_dynamic_sessions") as parent:
            parent.set_attributes(
                {
                    "span_type": "GenAI",
                    "gen_ai.operation.name": "chat",
                    "gen_ai.system": "_OTHER",
                    "gen_ai.request.model": "phi3",
                }
            )
        ・・・
```

AI Foundry で可視化すると、以下のようになります。左側のトレースには、水色で `Gen AI` と値がセットされており、一連の内容がログとして可視化されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/77451da0-fa39-4281-bff4-ad4de45eba26.png)


https://github.com/kohei3110/azure-101-day/blob/main/app/backend/api/src/controller.py

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/306712f4-d3fb-48b3-a342-a59bf358f307.png)

## 生成 AI アプリケーションの評価

本記事では詳細は触れませんが、生成 AI アプリケーションを運用する上で欠かせない観点があります。

- **モデルドリフトの監視**  
  生成 AI モデルは、実際の運用環境におけるプロンプトや入力データの変動により、当初の学習時と出力品質が乖離する可能性があります。  
  - 例えば、ユーザーからの入力パターンや業界特有の言語表現が変化すると、生成される文章の一貫性や正確性、文体が徐々に低下する「モデルドリフト」が発生するリスクがあります。  
  - 定期的に生成結果の品質（例えば、情報の正確性、自然な言語表現、出力の一貫性）を評価し、基準値を下回った場合に再トレーニングや微調整をトリガーする仕組みが求められます。

- **ユーザーエクスペリエンスのフィードバック**  
  生成 AI は、その出力内容がユーザーの期待や業務要件に合致しているかが非常に重要です。  
  - ユーザーからの直接フィードバック（例えば、評価スコアやコメント）を定量的・定性的に収集することで、生成されたコンテンツの質をリアルタイムにモニタリングできます。  
  - フィードバックループを構築し、収集したデータをもとにプロンプトの最適化やモデルパラメータの調整を行うことで、ユーザーエクスペリエンスを継続的に改善する仕組みが実装可能です。  
  - これにより、生成 AI の出力が常に最新のユーザー要求や市場動向に沿った形で提供され、サービスの信頼性と満足度が向上します。

一方、実運用となると非常に難しいのも正直なところです。評価の仕組みについて、本記事ではスコープ外としますが、Azure では２種類の評価の仕組みを提供しています。AI Foundry の画面を開くと、微妙にメニューが異なるのがわかると思います。

- **Azure OpenAI の評価**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/5d8217b1-027f-4b17-8eb0-e6ae2b54cf6b.png)


https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/evaluations?tabs=question-eval-input

- **Azure Foundry を使った評価（SDKあり）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/fb21b5bd-e492-4ea9-916c-6e48d73dc51d.png)

 
https://learn.microsoft.com/ja-jp/azure/ai-studio/concepts/evaluation-approach-gen-ai