前回は、Azure OpenAI Serviceの実践的な使い方とプロンプトのコツについて解説しました。
Part3では、セキュリティ設定、コンテンツフィルタリング、監視とトラブルシューティング、運用のベストプラクティスについて詳しく解説していきます。
シリーズ構成
- Part1:基本知識と環境構築
- Part2:実際の使い方とプロンプトのコツ
- Part3:セキュリティと運用のベストプラクティス(本記事)
安全に使うために - コンテンツフィルタリング
Azure OpenAIには、有害なコンテンツを防ぐフィルター機能が標準装備されています。
デフォルトでフィルタリングされるもの
Azure OpenAIは、以下のカテゴリで自動的にコンテンツをフィルタリングします:
- 暴力:暴力的な内容や描写
- 自傷行為:自傷行為を促す内容
- 性的:性的に露骨な内容
- ヘイト:差別的・攻撃的な内容
フィルタリングのレベル
各カテゴリには、4段階の重大度があります:
- 安全:問題なし
- 低:軽微な問題
- 中:中程度の問題
- 高:深刻な問題
デフォルトでは、「中」以上がブロックされます。
カスタムフィルターを設定する
業務要件に応じて、フィルターをカスタマイズできます。
-
Azure AI Foundryポータルで「コンテンツフィルター」を選択
-
「+ コンテンツフィルターの作成」をクリック
-
各カテゴリのしきい値を設定:
- ブロックなし:フィルタリングしない
- 低以上をブロック:低・中・高をブロック
- 中以上をブロック:中・高をブロック(デフォルト)
- 高のみブロック:高のみブロック
-
フィルターに名前をつけて保存
-
デプロイメントに適用
フィルターに引っかかるとこうなる
プロンプトまたはレスポンスがフィルターに引っかかると、こんなエラーが返ります:
{
"error": {
"code": "content_filter",
"message": "コンテンツフィルターによってブロックされました",
"innererror": {
"code": "ResponsibleAIPolicyViolation",
"content_filter_result": {
"hate": {
"filtered": true,
"severity": "high"
}
}
}
}
}
フィルターのベストプラクティス
- 開発環境では緩めに:テスト時はフィルターを緩めて動作確認
- 本番環境では適切に:ビジネス要件に応じて適切なレベルに設定
- ログを確認:どのようなコンテンツがブロックされているか定期的に確認
- ユーザーへの説明:フィルターでブロックされた場合、ユーザーに適切にフィードバック
監視とトラブルシューティング
本番運用では、適切な監視とエラー対応が重要です。
Azure Monitorで監視する
- Azure Portalで対象のAzure OpenAIリソースを開く
- 「監視」→「メトリック」を選択
- 以下のメトリックを監視:
重要なメトリック
- 総呼び出し数:どれくらい使われてる?
- 生成トークン数:コスト管理の指標
- 処理時間:パフォーマンスの監視
- エラー率:問題の早期発見
- トークンレート制限エラー:TPMの不足を検出
アラートを設定する
重要なメトリックにアラートを設定しましょう。
-
メトリックビューで「新しいアラートルール」をクリック
-
条件を設定:
- エラー率が5%を超えたら
- 処理時間が10秒を超えたら
- トークンレート制限エラーが発生したら
-
アクションを設定:
- メール通知
- Teamsへの通知
- Azure Functionsの実行
よくあるエラーと対処法
429 Too Many Requests
原因:レート制限(TPM)の超過
対処法:
import time
from openai import RateLimitError
def call_openai_with_retry(client, max_retries=3):
for i in range(max_retries):
try:
response = client.chat.completions.create(
model="gpt-4o-deployment",
messages=[...]
)
return response
except RateLimitError as e:
if i < max_retries - 1:
wait_time = 2 ** i # 指数バックオフ
print(f"レート制限エラー。{wait_time}秒待機...")
time.sleep(wait_time)
else:
raise
または、TPMを増やす:
- Azure AI Foundryで「デプロイ」を開く
- デプロイメントを選択して「編集」
- TPMを増やして保存
401 Unauthorized
原因:APIキーが間違っているか期限切れ
対処法:
- Azure Portalで「キーとエンドポイント」を確認
- キーを再生成
- アプリケーションの環境変数を更新
404 Not Found
原因:デプロイメント名またはエンドポイントが間違っている
対処法:
- デプロイメント名を確認(モデル名ではなく、デプロイ時につけた名前)
- エンドポイントURLを確認
Content Filter Error
原因:コンテンツフィルターに引っかかった
対処法:
- プロンプトを見直して、問題のある表現を修正
- 必要に応じてカスタムフィルターで調整
- ユーザーに適切なフィードバックを返す
from openai import APIError
try:
response = client.chat.completions.create(...)
except APIError as e:
if "content_filter" in str(e):
print("申し訳ございません。入力内容が当社のポリシーに反するため、処理できませんでした。")
else:
raise
ログの有効化
詳細なログを取得して、問題の原因を特定しやすくします。
- Azure Portalでリソースを開く
- 「診断設定」→「+ 診断設定を追加する」
- ログカテゴリを選択:
- RequestResponse:リクエストとレスポンスの詳細
- Audit:誰がいつアクセスしたか
- 送信先を選択:
- Log Analytics:クエリで分析
- ストレージアカウント:長期保存
- Event Hub:リアルタイム処理
Log Analyticsでクエリを実行
// 過去24時間のエラーを確認
AzureDiagnostics
| where TimeGenerated > ago(24h)
| where ResultType == "Failed"
| project TimeGenerated, OperationName, ResultSignature, properties_s
| order by TimeGenerated desc
// レート制限エラーの発生頻度
AzureDiagnostics
| where TimeGenerated > ago(7d)
| where ResultType == "Failed"
| where ResultSignature contains "429"
| summarize count() by bin(TimeGenerated, 1h)
| render timechart
セキュリティのベストプラクティス
ネットワークセキュリティ
プライベートエンドポイントを使う
パブリックインターネットを経由せずにアクセスできます。
- Azure OpenAIリソースで「ネットワーク」を選択
- 「ファイアウォールと仮想ネットワーク」で「選択されたネットワークとプライベートエンドポイント」を選択
- 「+ プライベートエンドポイント」をクリック
- 以下を設定:
- サブスクリプション
- リソースグループ
- 名前
- リージョン
- VNetとサブネットを選択
- プライベートDNSゾーンの統合を有効化
- 作成
これで、VNet内からのみアクセス可能になります。
IP制限を設定する
特定のIPアドレスからのみアクセスを許可できます。
- 「ネットワーク」→「ファイアウォールと仮想ネットワーク」
- 「選択されたネットワーク」を選択
- 「+ クライアントIPアドレスを追加」または手動でIP範囲を追加
- 保存
アクセス制御(RBAC)
適切なロールを割り当てて、最小権限の原則に従います。
主なロール
- Cognitive Services OpenAI Contributor:フルアクセス(開発者向け)
- Cognitive Services OpenAI User:読み取りとAPI呼び出し(アプリケーション向け)
- Cognitive Services User:API呼び出しのみ(最小権限)
ロールの割り当て方
- Azure Portalでリソースを開く
- 「アクセス制御(IAM)」を選択
- 「+ 追加」→「ロールの割り当ての追加」
- ロールを選択
- メンバーを選択(ユーザー、グループ、サービスプリンシパル)
- 確認して割り当て
Managed Identityを使う
APIキーの代わりにManaged Identityを使うと、キー管理が不要になります。
システム割り当てマネージドIDの有効化
- アプリケーション(App Service、Azure Functions等)で「ID」を選択
- 「システム割り当て」タブで「オン」に設定
- 保存
Azure OpenAIへのアクセス許可
- Azure OpenAIリソースで「アクセス制御(IAM)」を開く
- ロールの割り当てで、アプリケーションのマネージドIDに「Cognitive Services OpenAI User」を割り当て
コードでの使用
from azure.identity import DefaultAzureCredential
from openai import AzureOpenAI
# Managed Identityで認証
credential = DefaultAzureCredential()
token = credential.get_token("https://cognitiveservices.azure.com/.default")
client = AzureOpenAI(
azure_ad_token=token.token,
api_version="2024-08-01-preview",
azure_endpoint="https://your-resource-name.openai.azure.com/"
)
# 通常通り使用
response = client.chat.completions.create(...)
データ保護
データの地理的配置
- 日本リージョンを選択:データを日本国内に保持
- データ主権:各国の法規制に準拠
データの利用ポリシー
重要:Azure OpenAIに送信されたデータは、Microsoftのモデル学習には使用されません。
これは、通常のOpenAI APIとの大きな違いです。
カスタマーマネージドキー(CMK)
より高度な暗号化制御が必要な場合は、CMKを使用できます。
- Azure Key Vaultを作成
- 暗号化キーを作成
- Azure OpenAIリソースで「暗号化」を選択
- 「カスタマーマネージドキー」を有効化
- Key Vaultとキーを選択
APIキーのローテーション
セキュリティのため、定期的にAPIキーをローテーションします。
ダウンタイムなしでローテーションする方法
Azure OpenAIには2つのキー(Key1とKey2)があります。
- 現在Key1を使用中
- Key2を再生成
- アプリケーションをKey2に切り替え
- すべてのアプリケーションが切り替わったことを確認
- Key1を再生成
これで、ダウンタイムなしでキーをローテーションできます。
本番運用のベストプラクティス
環境分離
開発・ステージング・本番環境を分離しましょう。
開発環境(Dev)
├─ リソースグループ: rg-openai-dev
└─ Azure OpenAI: openai-dev
ステージング環境(Staging)
├─ リソースグループ: rg-openai-staging
└─ Azure OpenAI: openai-staging
本番環境(Prod)
├─ リソースグループ: rg-openai-prod
└─ Azure OpenAI: openai-prod
コスト管理
予算アラートを設定
- Azure Portalで「コスト管理 + 課金」を開く
- 「予算」→「+ 追加」
- スコープを選択(サブスクリプション、リソースグループ)
- 予算額を設定
- アラート条件を設定(例:予算の80%に達したら)
- 通知先メールアドレスを設定
タグでコスト追跡
リソースにタグをつけて、コストを追跡しやすくします。
Environment: Production
Project: ChatBot
CostCenter: Engineering
デプロイメント戦略
ブルー・グリーンデプロイメント
新しいモデルバージョンをテストしてから切り替えます。
- 新しいデプロイメント(Green)を作成
- 少量のトラフィックをGreenに流してテスト
- 問題なければ、すべてのトラフィックをGreenに切り替え
- 古いデプロイメント(Blue)を削除
カナリアリリース
段階的にトラフィックを新しいバージョンに移行します。
import random
def get_deployment_name():
# 10%のトラフィックを新しいデプロイメントに
if random.random() < 0.1:
return "gpt-4o-deployment-v2"
else:
return "gpt-4o-deployment-v1"
deployment = get_deployment_name()
response = client.chat.completions.create(
model=deployment,
messages=[...]
)
障害対策
フォールバック戦略
プライマリのデプロイメントが失敗したら、セカンダリにフォールバックします。
def call_openai_with_fallback(client, primary_deployment, fallback_deployment):
try:
return client.chat.completions.create(
model=primary_deployment,
messages=[...]
)
except Exception as e:
print(f"プライマリ失敗: {e}. フォールバックを試行...")
return client.chat.completions.create(
model=fallback_deployment,
messages=[...]
)
マルチリージョン構成
高可用性が必要な場合は、複数のリージョンにデプロイします。
プライマリ: 東日本リージョン
セカンダリ: 米国東部リージョン
Azure Traffic ManagerやAzure Front Doorで負荷分散・フェイルオーバーを実現できます。
まとめ(Part3)
Part3では、Azure OpenAI Serviceのセキュリティと運用について解説しました。
押さえておきたいポイント
-
コンテンツフィルタリング
- デフォルトで有効
- カスタマイズ可能
- ログで確認
-
監視とトラブルシューティング
- Azure Monitorで監視
- アラート設定は必須
- よくあるエラーの対処法を把握
-
セキュリティ
- プライベートエンドポイントの活用
- Managed Identityでキー管理不要
- APIキーのローテーション
-
本番運用
- 環境分離
- コスト管理
- 障害対策
シリーズ全体のまとめ
全3回を通して、Azure OpenAI Serviceの基本から実践、そして運用まで解説しました。
Part1:基本知識と環境構築
Part2:実際の使い方とプロンプトのコツ
Part3:セキュリティと運用のベストプラクティス
実際に触ってみて、Azure OpenAI Serviceは企業での利用に適した、安全で強力なサービスだと感じました。
特に、セキュリティ面での配慮とAzure環境との統合のしやすさが魅力です。
この記事シリーズが、これからAzure OpenAI Serviceを使ってみようと思っている方の参考になれば嬉しいです!