Skip to content

Latest commit

 

History

History
152 lines (121 loc) · 9.82 KB

README.ja.md

File metadata and controls

152 lines (121 loc) · 9.82 KB

エンタープライズ向けAzure OpenAIアプリ基盤

エンタープライズ向けAzure OpenAIアプリ基盤の参照アーキテクチャのデプロイ方法の詳細を示すリポジトリ。

ソリューションの主な利点:

  • 責任あるAI利用のためのプロンプトと応答監視。 ログ情報には、ユーザーがモデルに送信しているテキストと、モデルから受信されているテキストが含まれます。これにより、モデルが企業環境内およびサービスの承認されたユースケース内で責任を持って使用されるようになります。
  • 利用制御とスロットリング制御により、 さまざまなユーザグループに対してきめ細かなアクセス制御が可能になります。
  • 高可用性構成により、 トラフィックが 1 つの Azure OpenAI サービスの制限を超えた場合でも、ユーザー要求が満たされるようにします。
  • 高セキュリティを実現するために、最小特権の原則に従ってAzure Active DirectoryのRBACを活用します。

video

リファレンスアーキテクチャ

img

機能

このプロジェクト フレームワークは、次の機能を提供します:

  • OpenAI 使用状況メトリックのエンタープライズログ:
    • トークン利用
    • モデル利用
    • プロンプト入力
    • ユーザー統計
    • プロンプト応答
  • リージョンのフェールオーバーによるOpenAI サービスの高可用性
  • 最新のOpenAIライブラリとの統合

はじめ方

前提条件

インストール

アーティファクトのプロビジョニングは、まず、次に示すソリューションアーティファクトをプロビジョニングします:

マネージドサービス

構成

Azure OpenAI

  • まずは、Azure OpenAIのリソースをプロビジョニングします。現在のプライマリリージョンは米国東部であり新しいモデルと容量は他のリージョンよりも先にこの場所でプロビジョニングされることに注意してください。 リソースのプロビジョニング

  • リソースがプロビジョニングされたら、選択したモデルを使用してDeploymentを作成します: モデルのデプロイ

  • モデルがデプロイされたら、OpenAI スタジオに遷移して、新しく作成したモデルをスタジオのプレイグラウンドでテストします。 oai.azure.com/portal

API Management

  • Azure ポータルを使用してプロビジョニングできます :リソースのプロビジョニング

  • API Management サービスがプロビジョニングされたら、サービスの OpenAPI 仕様を使用して OpenAI API レイヤーをインポートできます。

  • すべての API 操作のために:

    • 設定 で、OpenAI ライブラリの仕様と一致するように サブスクリプション - ヘッダー名] を "api-key" に設定します。 img
    • "set-headers" のinbound ruleを構成して、"api-key" ヘッダーパラメーターを OpenAI サービスからの API シークレットキーの値で追加/上書きします。OpenAIキーを見つけるための手順はここにあります: キーを取得する img
    • デプロイされたOpenAIサービスのエンドポイントにバックエンドサービスを/openaiとして構成し、既存のエンドポイントを必ず上書きしてください。
    • 診断ログの設定を構成します:
      • Sampling rateを100%に設定します
      • 「Number of payload bytes to log」を最大値に設定します。 img
  • APIのテスト

    • "デプロイ ID"、"API バージョン"、およびサンプル プロンプトを指定して、エンドポイントをテストします: img

サブスクリプションのアクセス制御

API Management を使用すると、API プロバイダーは API を不正使用から保護し、さまざまな API 製品レベルの価値を生み出すことができます。API 管理レイヤーを使用して受信要求を調整することは、Azure API 管理の重要な役割です。要求の速度または転送された要求/データの合計を制御することによって。
APIM レイヤーの構成の詳細: https://learn.microsoft.com/en-us/azure/api-management/api-management-sample-flexible-throttling

OpenAIのログ記録

  • API 管理レイヤーを構成したら、サブスクリプション キー パラメーターをcompletion要求に追加することで、API レイヤーを使用するように既存の OpenAI Python コードを構成できます。 例:
import openai

openai.api_type = "azure"
openai.api_base = "https://xxxxxxxxx.azure-api.net/" # APIM Endpoint
openai.api_version = "2023-03-15-preview"
openai.api_key = "APIM SUBSCRIPTION KEY" #DO NOT USE ACTUAL AZURE OPENAI SERVICE KEY


response = openai.Completion.create(engine="modelname",  
                                    prompt="prompt text", temperature=1,  
                                    max_tokens=200,  top_p=0.5,  
                                    frequency_penalty=0,  
                                    presence_penalty=0,  
                                    stop=None) 

デモ

  • OpenAI 要求が Azure Monitor サービスへのログ記録を開始したら、Log Analytics クエリを使用してサービスの使用状況の分析を開始できます。
  • テーブルの名前は "ApiManagementGatewayLogs"テーブルの名前は
  • BackendResponseBody フィールドには、テキスト補完、トークンおよびモデル情報を含む OpenAI サービスからの json 応答が含まれています。
  • IP とモデルによってトークンの使用状況を識別するクエリの例:
ApiManagementGatewayLogs
| where OperationId == 'completions_create'
| extend modelkey = substring(parse_json(BackendResponseBody)['model'], 0, indexof(parse_json(BackendResponseBody)['model'], '-', 0, -1, 2))
| extend model = tostring(parse_json(BackendResponseBody)['model'])
| extend prompttokens = parse_json(parse_json(BackendResponseBody)['usage'])['prompt_tokens']
| extend completiontokens = parse_json(parse_json(BackendResponseBody)['usage'])['completion_tokens']
| extend totaltokens = parse_json(parse_json(BackendResponseBody)['usage'])['total_tokens']
| extend ip = CallerIpAddress
| where model !=  ''
| summarize
    sum(todecimal(prompttokens)),
    sum(todecimal(completiontokens)),
    sum(todecimal(totaltokens)),
    avg(todecimal(totaltokens))
    by ip, model

img

  • プロンプトの完了を監視するクエリの例:
ApiManagementGatewayLogs
| where OperationId == 'completions_create'
| extend model = tostring(parse_json(BackendResponseBody)['model'])
| extend prompttokens = parse_json(parse_json(BackendResponseBody)['usage'])['prompt_tokens']
| extend prompttext = substring(parse_json(parse_json(BackendResponseBody)['choices'])[0], 0, 100)

img