Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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 ここで設定

Slide 8

Slide 8 text

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 ワークスペースで右のクエリで確認可能。

Slide 9

Slide 9 text

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 (サーバレスなコンテナ実行)

Slide 10

Slide 10 text

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 高機能だが、若いツール群という特徴。開発速度が速いため、適切なバージョン管理は必須。本番利用は注意。

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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)

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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 最新情報はこちら *制限は変更されることがあります。 運用環境に移行し、ソリューションをスケーリングする際に、より高い制限が必要になるとことが予想されます。

Slide 16

Slide 16 text

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 など

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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 アクセス ローカルから リクエスト実行

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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には残らない。

Slide 23

Slide 23 text

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