$30 off During Our Annual Pro Sale. View Details »

0518LLMmeetup_LLMシステムの非機能要件対応_現場レポート.pdf

 0518LLMmeetup_LLMシステムの非機能要件対応_現場レポート.pdf

運用保守
 ログの保存と活用
 API監視
 ライブラリ管理
速度性能
 GPT-3.5, GPT-4の速度性能の例(Azure)
 イベントストリームでの対処
可用性
 APIの稼働率
 クォータ制限
 APIの負荷分散による対処
セキュリティ
 Azure OpenAIのネットワーク構成
 コンテンツフィルタリングのアイディア
 Azure AD認証の実装方法
 個人情報関係
 個人情報を意識したプロンプト管理
 Azure OpenAI Service のデータ保存ポリシー

Hirosato Gamo

May 19, 2023
Tweet

More Decks by Hirosato Gamo

Other Decks in Technology

Transcript

  1. 1
    LLMシステムの非機能対応 現場レポート
    ※解釈しやすいよう抽象度の高い表現をしている箇所や個人的な見解を含みます。Microsoftサービスについての正確な情報は公式ドキュメントをご参照ください。
    Hirosato Gamo (Microsoft Cloud Solution Architect)

    View Slide

  2. 2
    WHO AM I ?
    @hiro_gamo /Hirosato-Gamo
    Azure OpenAI Champ
    元データサイエンティスト。データ基盤、エンタープライズブロックチェーンサービス
    構築など経験し、現在はAI/MLシステム開発の技術支援に従事。
    HIROSATO GAMO
    Microsoft Japan Co., Ltd.
    Cloud Solution Architect (Data & AI)
    最近の悩み
    About me
    Hatena Blog

    View Slide

  3. 3
    来週、大きな発表が目白押し
    Your home for Microsoft Build

    View Slide

  4. 4
    アジェンダ
    1. 運用保守
    • ログの保存と活用
    • API監視
    • ライブラリ管理
    2. 速度性能
    • GPT-3.5, GPT-4の速度性能の例(Azure)
    • イベントストリームでの対処
    3. 可用性
    • APIの稼働率
    • クォータ制限
    • APIの負荷分散による対処
    4. セキュリティ
    • Azure OpenAIのネットワーク構成
    • コンテンツフィルタリングのアイディア
    • Azure AD認証の実装方法
    • 個人情報を意識したプロンプト管理
    • Azure OpenAI Service のデータ保存ポリシー

    View Slide

  5. 5
    LLMシステムにおけるログ
    プロンプトログ
    CosmosDB
    RDBMSなど
    アプリケーション
    ログ
    ChatGPT API
    バックエンドの
    プログラム
    画面のUI
    APIログ
    アプリケーションの動作記録やユーザ情報など
    一般的なアプリケーションで記録するログ
    プロンプトの内容や生成結果のログ。
    会話履歴の保持やシステム改善にも有効。
    (詳細は次ページ)
    APIへのアクセス記録。Azure OpenAI
    ServiceではメトリックやAPIへのアクセス情報
    について記録する機能がある。(後述)
    LLMにおいてはプロンプトログの管理が特徴的。一般的にはNoSQLデータベースに格納する。
    Azure OpenAI ServiceなどはAPI利用時にもログ収集が可能。

    View Slide

  6. 6
    プロンプトログに基づいたLLMシステム改善やユーザ分析
    プロンプト改善への活用
    Fine tuning
    業務課題の抽出
    プロンプトの内容や評価に基づき、システムプロンプトや
    Few-shotを改善する。UI上に評価を取得できる仕組みは有効。
    ChatGPTでは現在Fine tuningは利用できないが、
    LLMの改善にプロンプトログを活用する。
    社内で利用しているLLMシステムのプロンプトログを
    Embedding→クラスタリングなどすることで、ユーザがどのような質
    の問いをしているか集計し、業務やシステム改善のインサイトとする
    FAQとしての再利用
    よくある質問回答をFAQデータベース化しておく。
    検索システムやベクトルサーチと組み合わせ、質問が来た場合に
    まずFAQデータを検索させることで安定した回答が可能に。
    収集したログは単に記録だけでなく、システム改善の重要な示唆となる。
    社内で広くChatGPTを利用するようなケースでは業務課題の解決にも役立てられる。

    View Slide

  7. 7
    AzureにおけるAPI監視ログ・メトリックの取得方法
    Azure OpenAI ServiceはCognitive Serviceと同じ要領でログやメトリックを収集可能。
    Azure Monitorと連携してアラートを出すことも可能。
    Azure OpenAI Service の監視 - Azure Cognitive Services | Microsoft Learn
    診断ログ - Azure Cognitive Services | Microsoft Learn
    Cognitive Services を監視する - Training | Microsoft Learn
    ここで設定

    View Slide

  8. 8
    APIのログの実例(ChatGPT実行ログ)
    TenantId
    このイベントが関連付けられている
    Active Directory テナントのテナント ID
    XXXXXXXXXXXXXXXXXX
    TimeGenerated [UTC] イベントのタイムスタンプ (UTC) 42:24.2
    ResourceId イベントを出力したリソースのリソース ID /tenants/tenant-id/providers/provider-name
    Category イベントのログ カテゴリ RequestResponse
    ResourceGroup リソースが属するリソース グループの名前 XXXXXXXX
    SubscriptionId リソースが属するサブスクリプションの ID XXXXXXXXXXXXXXXXXX
    ResourceProvider リソースを提供するサービスの名前 MICROSOFT.COGNITIVESERVICES
    Resource リソースの名前 XXXXXXXX
    ResourceType リソースの種類 ACCOUNTS
    OperationName このイベントが表す操作の名前 Creates a completion for the chat message
    CorrelationId 関連するイベントのセットをグループ化するために使用される GUID XXXXXXXX-5b44-4e95-9069-XXXXXXXXX
    DurationMs 操作時間 (ミリ秒) 7234
    CallerIPAddress 呼び出し元 IP アドレス(下3桁はマスクされる) XX.XXX.XX.***
    location_s イベントを出力するリソースの領域 Southcentralus
    properties_s apiName API名とバージョン Azure OpenAI API version 2023-03-15-preview
    requestTime リクエスト時間 6.38198E+17
    requestLength リクエストの長さ 383
    responseTime レスポンス時間 6.38198E+17
    responseLength レスポンスの長さ 758
    Tenant_s リージョン Southcentralus
    resultSignature_d イベントのステータス 200
    Type イベントのタイプ AzureDiagnostics
    個人は特定できないようにしてある
    チャットの中身までは記録しない
    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
    収集したログはLog Analytics ワークスペースで右のクエリで確認可能。

    View Slide

  9. 9
    GPTを活用するシステムの参考アーキテクチャ
    Frontend
    OpenAI用
    Container App
    GPTの呼び出し
    会話履歴の保持
    プロンプト管理
    Azure API
    Management
    ナレッジ検索
    Form
    Recognizer
    CosmosDB
    Cognitive Search
    Azure OpenAI Service
    Azure AD
    RDBMSなど
    アプリ用
    Container App
    運用ログ・アプリケーションデータ
    API管理・制御
    Storage
    SharePoint
    インデックス化
    (AIエンリッチメントも可)
    独自データ
    Cognitive
    Service
    他システムDB
    LLMライブラリ群
    • OpenAI Python Library
    • langchain
    • Semantic Kernel
    • Llama index
    • JARVIS その他API
    呼び出し
    関数実行
    ML実行
    Web検索ほか外部API
    Functions
    Container Appsなど
    Azure Machine Learning
    Cognitive Service、Hugging GPT
    bing APIなど
    Azure Container Apps
    (サーバレスなコンテナ実行)

    View Slide

  10. 10
    LLMの開発補助に用いられるライブラリ
    langchain
    LLMの開発全般をサポートするライブラリ。
    APIコールのラッパーやプロンプトのテンプレートやメモリ機能、
    ReActを自動化するAgentなど様々な先端機能が実装されている。
    Semantic Kernel
    Microsoft が OSS として発表。(C#とPython)
    従来のプログラミング言語と最新のAIプロンプトを簡単に組み合わせることができ、
    ReActのような動的なタスクパイプラインを生成可能。APIとの連携の他、独自のプ
    ログラム関数も含めパイプラインに統合可能。
    テンプレート、埋め込みベースのメモリーなど基本的な機能も備える。
    LlmaIndex クエリに類似した文書の参照と、それを付与した回答を出すための補助ツール。
    LangchainやSemantic Kernelでいうところのメモリ機能に該当する。
    Microsoft が LLM をアプリ開発に統合するための OSS「Semantic Kernel」を発表 - Qiita
    LLM連携アプリの開発を支援するライブラリ LangChain の使い方 (1) - LLMとプロンプト・チェーン|npaka|note
    ChatGPTで独自データを利用できるLlamaIndexはどんな仕組みで動いているのか?調べてみました | DevelopersIO (classmethod.jp)
    Azure OpenAI Developers セミナー - YouTube
    【GPT】今日から使えるOSSライブラリまとめ - Qiita
    高機能だが、若いツール群という特徴。開発速度が速いため、適切なバージョン管理は必須。本番利用は注意。

    View Slide

  11. 11
    ライブラリ管理 (Python)
    ツール 概要と特徴
    Python仮想環境
    使用上の注意
    構築 異なるバージョン
    pip
    Pythonの最も標準的なパッケージ管理ツール。
    requirements.txtで依存関係を管理する。2020年
    にresolverが改善され依存関係管理が強化された。
    FreezeでLockのような管理もある程度可能。
    × × 仮想環境構築はサポートされていないのでcondaや
    Dockerと組み合わせて使われることが多い。
    conda
    AnacondaやMinicondaに付属するパッケージ管理
    ツール。Python以外のライブラリやツールも管理でき
    る。environment.ymlで依存関係を管理する。
    〇 〇
    パッケージの数や種類がpipより少ない。condaとpipの
    併用は推奨されない。(実際は組み合わせて使われる
    ことが多いが注意が必要。)
    pipenv
    pipとvenvの機能を統合したパッケージ管理ツール。
    PipfileとPipfile.lockで依存関係を管理する。
    Pyenvとの統合でバージョン違いの仮想環境構築も
    可能。
    〇 〇
    (Pyenvと連携)
    poetry
    pipenvと同様にpipとvenvの機能を統合したパッ
    ケージ管理ツール。pyproject.tomlとpoetry.lockで
    依存関係を管理する。
    〇 〇
    (Pyenvと連携)
    pipとpipenvとpoetryの技術的・歴史的背景とその展望 - Stimulator (hatenablog.com)
    pipでもlockで依存パッケージバージョンを管理しよう (zenn.dev)
    「pyenv+venv+pipは実質pipenvなのでpipenvで良さそ。私は最近pipenvしか使ってない。」 / Twitter

    View Slide

  12. 12
    Azure OpenAI Service ChatGPTの速度性能
    引用: CTOの視点から見たAzure OpenAI ServiceとOpenAIのChatGPT APIの深堀り比較 - Qiita
    個別にエンドポイントを準備するという構造上、Azure OpenAIのほうがレイテンシや可用性は安定している。

    View Slide

  13. 13
    イベントストリーム表示によるユーザへの待機ストレス軽減
    {
    "id": "chatcmpl-XXXXXXXXXXXXXXXXXXX",
    "object": "chat.completion.chunk",
    "created": 1684253491,
    "model": "gpt-4",
    "choices": [
    {
    "index": 0,
    "finish_reason": null,
    "delta": {
    "content": "。"
    }
    }
    ],
    "usage": null
    }
    {
    "id": "chatcmpl-XXXXXXXXXXXXXXXXXXX",
    "object": "chat.completion.chunk",
    "created": 1684253491,
    "model": "gpt-4",
    "choices": [
    {
    "index": 0,
    "finish_reason": "stop",
    "delta": {}
    }
    ],
    "usage": null
    }
    Bing Chat や本家ChatGPTと同じく、全てのレスポンスを待つのではなく、リクエスト時にstreamパラメータを=trueとすることで
    生成されたトークンから順に取得が可能。
    トークンごとに生成されるJSON 最後のトークン
    Azure OpenAI Service の REST API リファレンス - Azure OpenAI | Microsoft Learn
    How to handle streaming responses in OpenAI GPT chat completions API (georgeck.me)

    View Slide

  14. 14
    APIの稼働率
    OpenAI Status
    Licensing Documents (microsoft.com)
    Azure OpenAIのChatGPTは5/17にGAが発表。SLAが適用される。
    SLAドキュメントは下記からダウンロード可能。気を付けたいのはAzure OpenAI ServiceはCognitive Serviceファミリーなので、SLAも同一。
    OpenAI社のAPI稼働率はこちら参照
    ※必ず最新版ダウンロードして確認を!

    View Slide

  15. 15
    Azure OpenAI Service のクォータ制限 (5/17時点)
    制限名 制限値
    各 Azure サブスクリプションのリージョンあたりの OpenAI リソース数 3
    モデルごとの 1 分あたりの要求数* Davinci-models (002 以降): 120
    ChatGPT(GPT-3.5) モデル : 300
    ChatGPT(GPT-4) モデル : 18
    その他すべてのモデル: 300
    モデルごとの 1 分あたりのトークン数* Davinci-models (002 以降): 40,000
    ChatGPT(GPT-3.5) モデル: 120,000
    ChatGPT(GPT-4 8k) モデル: 10,000
    ChatGPT(GPT-4 32k) モデル: 32,000
    その他すべてのモデル: 120,000
    微調整されたモデル デプロイの最大数* 2
    同じモデルを複数のデプロイにデプロイする機能 禁止
    リソースあたりのトレーニング ジョブの合計数 100
    リソースあたりの同時実行トレーニング ジョブの最大数 1
    キューに入ったトレーニング ジョブの最大数 20
    リソースあたりの最大ファイル数 50
    リソースあたりのすべてのファイルの合計サイズ 1 GB
    トレーニングジョブの最大時間 (超過した場合、ジョブは失敗します) 720 時間
    トレーニング ジョブの最大サイズ (トレーニング ファイル内のトークン) x (エポックの数) 20 億
    デフォルトでは小さい
    5/17時点で緩和申請も停止中
    Azure OpenAI Service quotas and limits
    最新情報はこちら
    *制限は変更されることがあります。 運用環境に移行し、ソリューションをスケーリングする際に、より高い制限が必要になるとことが予想されます。

    View Slide

  16. 16
    リージョン負荷分散による可用性の確保
    Central South US East US West Europe France Central
    Endpoint
    GPT
    Container
    App A
    各リージョンで最大3つまでリソース作成が可能。
    クォータ上限に達した場合の回避策として現状12リソース分まで分散可能。
    特に大規模なサービスやGPT-4利用の場合、1分当たりのリクエストや処理トークンに制限が大きいので分散化も検討が必要。
    負荷分散
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Endpoint
    GPT
    Container
    App B
    Container
    App C
    Container
    App D
    Container
    App E
    Container
    App F
    Container
    App G
    Container
    App H
    Container
    App I
    Container
    App J
    Container
    App K
    Container
    App L
    2023/5/18時点でGPT-4なし
    Application
    Gateway など

    View Slide

  17. 17
    Azure OpenAI Service での閉域化
    閉域化することでネットワークセキュリティグループ(NSG)での通信保護キーの漏洩など、
    認証が意図せず突破された場合でもネットワークレベルでアクセス制御が可能。
    Vnetが介在することでファイアウォールなどのセキュリティ保護機能を付加できるためセキュリティ強化に有効。
    subnet: private endpoint
    Azure
    OpenAI Service
    Appservice/Functions/ContainerApps
    subnet: WebApp
    Azure (Japan)
    Azure (US)
    Blob Storage
    Cognitive
    Search
    インデックス化

    社内ナレッジ検索+ChatGPTをprivateエンドポイントで構成したアーキテクチャの一例
    Frontend
    Azure AD

    View Slide

  18. 18
    閉域化した場合のStudioの挙動
    Azure OpenAI Studioは、Azure OpenAI Studio - Microsoft Azureにアクセスしたマシンのローカル上で動作する
    そのためVnet上に建てられたVMなどからアクセスすれば閉域化された環境でもStudio利用が可能。
    Azure OpenAIにプライベートエンドポイント(Private Endpoint)を設定して東日本リージョンの仮想ネットワークのみから使う - JBS Tech Blog
    Azure
    OpenAI Service
    Azure (US)
    https://oai.azure.com/portal
    Azure
    OpenAI Studio
    アクセス
    ローカルから
    リクエスト実行

    View Slide

  19. 19
    コンテンツフィルタリングのアイディア
    Azure OpenAIにおいてはデフォルトでコンテンツフィルターが実装されているが、
    特定の事象に対するコンテンツフィルターを自前で構築することが必要になるケースがある。
    話題の検知
    NGワードの処理
    サービスで想定している用途と違う場合には会話を強制終了する。
    Few shotで指示することも可能だが、プロンプトを文書分類モデルで判別し
    不正利用を検知して遮断する方法も考えられる。
    話題でなくワードで遮断する。文書からブラックリストのワードを検知して止める方法もあ
    るが、NGワードをEmbeddingしておきセマンティックに検知するアイディアも。
    プロンプトインジェクション
    対策
    ここはデフォルトのコンテンツフィルタでも一定対処されているが
    攻撃を検知してSystem promptの作りなどを工夫する上で
    自前実装も価値が高いと考えられる。
    攻撃的な発言など
    禁止事項チェック
    こちらも文書分類モデルやFew Shotでも対応可能だが
    出力側でも気を付ける必要がある。個人情報の入力なども検知できると
    後述の法対応が楽になる
    溝口 浩二 coji💿さん「プロンプトインジェクション対策。 ブラックリスト的なやつを文字列や正規表現でやるんじゃなくて、embedding にしてセマンティックにやればいいのでは?」 /
    Twitter

    View Slide

  20. 20
    Azure ADによるAPIの認証の流れ
    from azure.identity import DefaultAzureCredential
    dac = DefaultAzureCredential()
    token = dac.get_token("https://cognitiveservices.azure.com/.default")
    AzureAD認証を使うことでユーザ認証やリソース間認証が可能。
    FunctionsやContainer Appsといったサーバレスアプリ実行ツールなどからの実行を認証できる。
    DefaultAzureCredential では環境変数を使うと便利です(Java on Azure) - Qiita
    Azure OpenAI ServiceでAzure AD認証を使ってみる (Python) (zenn.dev)
    response = openai.ChatCompletion.create(
    engine="chatgpt-35-turbo-v0301",
    messages = [{"role":"system","content":“XXXX”},…]
    temperature=0,
    max_tokens=800,
    top_p=0.95,
    frequency_penalty=0,
    presence_penalty=0,
    stop=None)
    openai.api_type = "azure_ad"
    openai.api_key = token.token
    openai.api_base = https://.openai.azure.com/
    openai.api_version = "2023-05-15"
    認証しトークンを取得
    キーに取得したトークンを指定
    langchain経由でも基本同じ
    LangChainとAzure OpenAI版GPTモデルの連携部分を実装してみる - Qiita

    View Slide

  21. 21
    個人情報を意識したプロンプト管理(最も規制が厳しいGDPRを例に)
    アクセス権
    削除権
    処理中止権
    個人情報へのアクセスを要求できる権利
    プロンプトなどのデータを保存する場合、請求があったら開示できるようにしておく
    必要がある。つまり自分たちでのプロンプトの保存・管理をしたほうが良い。
    個人情報を削除要求できる権利
    個人情報が含まれるデータはプロンプトも含め請求があったら削除する必要がある。
    個人情報の処理を中止要求できる権利
    特にファインチューニングのように不可逆な処理にプロンプトを用いる場合は匿名化して
    おいたほうが無難。(匿名化は単なる氏名の削除や暗号化ではない点は要注意)
    修正権
    個人情報を修正要求できる権利
    修正要求に答える必要がある。
    プロンプトの保存の方法や修正・削除には対応可能か考慮が必要。
    プロンプトに個人データが意図せず混入する恐れがあるため、個人データを保存する前提でプロンプトなどを管理する必要がある。個人データとは直接的な住所や
    名前以外にも、間接的に個人を識別できる情報も該当するので注意。Azureのデータ保存ポリシーも含め、どこにデータが保存される可能性があるのか把握が必要。
    GDPRでは請求があった場合に1カ月以内に回答など対処が必要とされる。(右記リンク参照)
    GDPR に関してよく寄せられる質問 - Microsoft セキュリティ センター
    GDPR(EU一般データ保護規則)対応プロジェクト簡易診断 - KPMGジャパン

    View Slide

  22. 22
    Azure OpenAI Service のデータ保存ポリシー
    項目 Azure OpenAI Service
    データ
    • 提供されたトレーニングデータは、お客様のモデルのfine-tuning (微調整)にのみ使用され、
    マイクロソフトのモデルをトレーニング/改善するために使用しない(参考)。
    • fine-tuning (微調整)のためにはデータをAzureストレージに置く必要があるが、配置時には暗号化され学習後はユーザ判断で削除可能
    • fine-tuning (微調整)後のモデルもユーザ判断で削除可能
    • 入力と出力データは悪用/誤用の監視目的で最大30日間保持され、承認されたマイクロソフト社員がレビューする可能性がある。
    これらのプロセスはオプトアウト申請が可能で、承認されればログは保持されない。
    Data, privacy, and security for Azure OpenAI Service - Azure Cognitive Services | Microsoft Learn
    価格 Azure の価格体系に基づく(発表時点でモデル利用価格はOpenAI社が公開しているAPIと同価格)
    API 共通性 OpenAI と共同開発した API で互換性がある。(OpenAI Python Libraryが使用可能)
    SLA ・99.9%以上の稼働率を保証 詳細(他の Azure Cognitive Services と同じ)
    サポート Azure サポートプランでサポートされる
    セキュリティ
    ・Azureのセキュリティ基準に準拠
    ・APIキーによる認証とAzure AD認証に対応
    ・Azureのプライベートネットワークによる保護
    ・不正利用防止のためのコンテンツフィルタリング
    監視 ログ・メトリック監視およびAzure Monitorと連携したアラート発行などが可能
    リージョン 米国東部、米国中南部、西ヨーロッパ、フランス中部の4つのリージョンが利用可能
    開発ツール ChatGPT用のPlaygroundなどGUIでの挙動検証やパラメータ調整が可能(Azure OpenAI Studio - Microsoft Azure)
    ※ 発表時点(2023/5時点)のサマリ情報です。ご利用時は必ず公式ドキュメントをご参照ください。
    ※ 黄色は発表時点(2023/5時点)でAzureでしか提供されない項目 ご利用申請フォーム(サブスクリプションを指定して申請)
    https://aka.ms/oai/access
    プロンプトは30日間保持されるがその後削除。
    オプトアウトすれば保持すらされず、
    誰がどんなプロンプトを打ったかAzureには残らない。

    View Slide

  23. 23
    ◼ 本書に記載した情報は、本書各項目に関する発行日現在の Microsoft の見解を表明するものです。Microsoftは絶えず変化する市場に対応しなければならないため、ここに記載した情報に対していかなる責務を負うものではなく、提示された情報の信憑性
    については保証できません。
    ◼ 本書は情報提供のみを目的としています。 Microsoft は、明示的または暗示的を問わず、本書にいかなる保証も与えるものではありません。
    ◼ すべての当該著作権法を遵守することはお客様の責務です。Microsoftの書面による明確な許可なく、本書の如何なる部分についても、転載や検索システムへの格納または挿入を行うことは、どのような形式または手段(電子的、機械的、複写、レコー
    ディング、その他)、および目的であっても禁じられています。
    これらは著作権保護された権利を制限するものではありません。
    ◼ Microsoftは、本書の内容を保護する特許、特許出願書、商標、著作権、またはその他の知的財産権を保有する場合があります。Microsoftから書面によるライセンス契約が明確に供給される場合を除いて、本書の提供はこれらの特許、商標、著作権、ま
    たはその他の知的財産へのライセンスを与えるものではありません。
    © 2023 Microsoft Corporation. All rights reserved.
    Microsoft, Windows, その他本文中に登場した各製品名は、Microsoft Corporation の米国およびその他の国における登録商標または商標です。
    その他、記載されている会社名および製品名は、一般に各社の商標です。

    View Slide