プロンプト フローと Azure DevOps を使用した GenAIOps

LLM を取り入れたアプリケーションの需要が高まる中、組織はこれらのアプリのエンド ツー エンドのライフサイクルを管理するためのまとまりのある合理化されたプロセスを必要としています。 生成人工知能運用 (GenAIOps) ("LLMOps" とも呼ばれる) は、効率的なプロンプト エンジニアリングと LLM を取り入れたアプリケーションの開発とデプロイの基礎となるものです。

この記事では、Azure Machine Learning を使用して Azure DevOps と統合し、LLM を取り入れたアプリケーションの開発ライフサイクルを "プロンプト フロー" で自動化する方法を説明します。 プロンプト フローは、LLM を組み込んだアプリケーションを開発するための合理化され、構造化されたアプローチを提供します。 その明確に定義されたプロセスとライフサイクルは、フローの構築、テスト、最適化、デプロイのプロセスを案内し、完全に機能する LLM を融合したソリューションの作成に結び付けます。

GenAIOps プロンプト フローの機能

プロンプト フローを備えた GenAIOps では、プロンプト フローを使用して LLM を取り入れたアプリを構築するのに役立つ GenAIOps テンプレートとガイダンスを使用します。 プロンプト フローを備えた GenAIOps には、単純または複雑な LLM を取り入れたアプリ用の機能があり、アプリケーションのニーズに合わせてカスタマイズできます。

プロンプト フローを備えた GenAIOps プラットフォームには、次の機能があります。

  • 一元化されたコード ホスティング。 このリポジトリでは、複数のプロンプト フローのためのコードのホスティングがサポートされ、すべてのフローに 1 つのリポジトリを提供します。 このリポジトリは、フローのライブラリのようなもので、さまざまなプロジェクトで簡単に検索、アクセス、コラボレーションを行うことができます。

  • ライフサイクル管理。 各フローには独自のライフサイクルがあり、ローカルの実験から運用環境のデプロイへのスムーズな移行を提供します。

  • バリアントとハイパーパラメーターの実験。 バリアントとハイパーパラメーターは、レシピの成分のようなものです。 このプラットフォームを使用すると、フロー内の複数のノード間で異なるバリアントの組み合わせを実権することができます。 複数のバリアントとハイパーパラメーターを試して、フロー バリアントを簡単に評価できます。

  • 複数のデプロイ ターゲット。 このプラットフォームでは、Docker をサポートする任意のターゲット プラットフォームとオペレーティング システムにデプロイするために、フローとコンピューティング セッションを取り入れた Docker イメージが生成されます。 Azure App Services、Kubernetes、Azure マネージド コンピューティングにフローをデプロイし、必要に応じてスケーリングするように構成できます。

  • A/B デプロイ。 プロンプト フローを備えた GenAIOps では、A/B デプロイがシームレスに実装され、さまざまなフロー バージョンを簡単に比較できます。 このプラットフォームは、従来の Web サイト A/B テストと同様の方法で、プロンプト フローの A/B デプロイを容易にします。 実際の設定でフローのさまざまなバージョンを簡単に比較して、パフォーマンスが最も高いバージョンを判断できます。

  • 多対多データセット/フロー リレーションシップ。 プロンプト フローを備えた GenAIOps は、標準フローと評価フローごとに複数のデータセットに対応し、フロー テストと評価の多様性を確保します。

  • 条件付きデータとモデルの登録。 このプラットフォームは、Azure Machine Learning データ資産の新しいデータセット バージョンを登録し、データセットに変更がある場合にのみモデル レジストリにフローします。

  • 包括的なレポート。 プロンプト フローを備えた GenAIOps では、バリアント構成ごとに詳細なレポートが生成されるため、情報に基づいた意思決定を行うことができます。 このプラットフォームでは、すべての実行と実験に関する詳細なメトリックの収集、実験、バリアント一括実行が提供され、CSV ファイルと HTML ファイルの両方でデータドリブンの意思決定を行えるようにします。

プロンプト フローを備えた GenAIOps には、カスタマイズのための次のその他の機能が用意されています。

  • Bring-your-own-flows (BYOF) は、LLM を取り入れたアプリケーションに関連する複数のユース ケースを開発するための包括的なプラットフォームを提供します。
  • 構成ベースの開発は、広範な定型コードを記述する必要がないことを意味します。
  • プロンプト実験と評価は、ローカルとクラウドの両方で実行されます。
  • ローカル プロンプト評価用のノートブックは、ローカル実験用の関数のライブラリを提供します。
  • デプロイ後のパイプライン内のエンドポイント テストでは、エンドポイントの可用性と準備状況が確認されます。
  • オプションの Human-in-loop (人間の関与) は、デプロイ前にプロンプト メトリックを検証します。

GenAIOps のステージ

GenAIOps ライフサイクルは、次の 4 つの異なるステージで構成されます。

  • 初期化。 ビジネスの目標を明確に定義し、関連するデータ サンプルを収集し、基本的なプロンプト構造を確立し、その機能を強化するフローを作成します。

  • 実験。 フローをサンプル データに適用し、プロンプトのパフォーマンスを評価し、必要に応じてフローを調整します。 結果に満足するまで、継続的に反復処理します。

  • 評価と調整。 より大きなデータセットを使用するフローのパフォーマンスのベンチマークを測定し、プロンプトの有効性を評価し、それに応じた改善を行います。 結果が目的の基準を満たしている場合は、次のステージに進みます。

  • 展開。 効率と有効性のためにフローを最適化し、A/B デプロイを含む運用環境にデプロイし、パフォーマンスを監視し、ユーザー フィードバックを収集し、この情報を使用してフローをさらに強化します。

この構造化された手法に従うことで、プロンプト フローを使用すると、フローを自信を持って開発、厳密なテスト、微調整、デプロイを行い、堅牢で洗練された AI アプリケーションを作成できます。

GenAIOps プロンプト フロー テンプレートは、コード優先アプローチを使用してこの構造化手法を形式化し、プロンプト フロー ツール、プロセス、GenAIOps プロンプト フロー機能を使用して LLM を取り入れたアプリを構築するのに役立ちます。 このテンプレートは、プロンプト フローを備えた GenAIOps テンプレートで入手できます。

GenAIOps プロセス フロー

GenAIOps プロンプト フロー プロセスのスクリーンショット。

  1. 初期化ステージでは、フローの開発、データの準備とキュレーション、GenAIOps 関連の構成ファイルの更新を行います。
  2. Visual Studio Code とプロンプト フロー拡張機能を使用したローカル開発の後、機能ブランチから開発ブランチに pull request (PR) を発生させ、ビルド検証パイプラインと実験フローを実行します。
  3. PR は手動で承認され、コードは開発ブランチにマージされます。
  4. PR が開発ブランチにマージされると、開発環境の継続的インテグレーション (CI) パイプラインが実行されます。 CI パイプラインは、実験フローと評価フローの両方を順番に実行し、パイプラインの他のステップとは別に、Azure Machine Learning レジストリにフローを登録します。
  5. CI パイプラインの実行が完了すると、継続的デプロイ (CD) トリガーによって CD パイプラインが実行され、Azure Machine Learning レジストリからの標準フローが Azure Machine Learning オンライン エンドポイントとしてデプロイされます。 その後、パイプラインは、デプロイされたフローに対して統合テストとスモーク テストを実行します。
  6. リリース ブランチが開発ブランチから作成されるか、開発ブランチからリリース ブランチに PR が発生します。
  7. PR は手動で承認され、コードはリリース ブランチにマージされます。 PR がリリース ブランチにマージされると、運用環境のための CI パイプラインが実行されます。 このパイプラインは、実験フローと評価フローの両方を順番に実行し、パイプラインの他のステップとは別に、Azure Machine Learning レジストリにフローを登録します。
  8. CI パイプラインの実行が完了すると、CD トリガーによって CD パイプラインが実行され、Azure Machine Learning レジストリからの標準フローが Azure Machine Learning オンライン エンドポイントとしてデプロイされます。 その後、パイプラインは、デプロイされたフローに対して統合テストとスモーク テストを実行します。

GenAIOps プロンプト フローを作成する

この記事の残りの部分では、プロンプト フローと Azure DevOps を使用して LLM を取り入れたアプリケーションを構築するのに役立つ、プロンプト フローを備えた GenAIOps テンプレート リポジトリ内のエンド ツー エンドのサンプルに従って、プロンプト フローを備えた GenAIOps を使用する方法について説明します。 その主な目的は、プロンプト フローと GenAIOps の機能を使用して、これらのアプリケーションの開発を支援することです。

前提条件

Note

Azure DevOps と Terraform を使用してインフラストラクチャを構築する場合は、Azure DevOps 用の Terraform 拡張機能がインストールされている必要があります。

プロンプト フロー接続を設定する

プロンプト フローでは、接続リソースを使用して、Azure OpenAI、OpenAI、または Azure AI 検索エンドポイントに接続します。 接続は、プロンプト フロー ポータル UI または REST API を使用して作成できます。 詳細については、「プロンプト フローの接続」を参照してください。

接続を作成するには、「プロンプト フローの接続を設定する」の手順に従います。 このサンプル フローでは、aoai という名前の接続を使用するため、接続にこの名前を付けます。

コンピューティング セッションを設定する

プロンプト フローでは、コンピューティング セッションを使用してフローが実行されます。 プロンプト フローを実行する前に、コンピューティング セッションを作成して開始します。

Azure Repos リポジトリを設定する

Azure DevOps 組織でフォークされたリポジトリを作成するには、GitHub リポジトリを設定するための手順に従います。 このリポジトリでは、コードの昇格とパイプラインの実行のために、maindevelopment の 2 つのブランチを使用します。

新しいローカル リポジトリを作成するには、「リポジトリを複製する」の手順に従います。 この複製は、開発ブランチから新しい機能ブランチを作成し、変更を組み込むのに役立ちます。

Azure サービス プリンシパルを設定する

Azure サービス プリンシパルは、アプリ、サービス、オートメーション ツールが Azure リソースにアクセスするために使用されるセキュリティ ID です。 アプリケーションまたはサービスは、ユーザーに代わってリソースにアクセスするために、Azure に対して認証を行います。

Azure サービス プリンシパルを作成する」の手順に従って、サービス プリンシパルを作成します。 このサービス プリンシパルを使用して、Azure DevOps Services 接続を構成し、Azure DevOps Services に Azure サービスへの認証と接続を許可します。 プロンプト フローの実験ジョブと評価ジョブは、どちらもサービス プリンシパルの ID で実行されます。

このセットアップでは、サービス プリンシパルに所有者のアクセス許可が提供されるため、CD パイプラインは、新しくプロビジョニングされた Azure Machine Learning エンドポイントに、接続情報を読み取るための Azure Machine Learning ワークスペースへのアクセスを自動的に提供できます。 また、パイプラインは、getlist の各シークレットのアクセス許可を持つ Azure Machine Learning ワークスペースに関連付けられているキー コンテナー ポリシーにエンドポイントを追加します。 所有者のアクセス許可を共同作成者レベルのアクセス許可に変更するには、パイプラインの YAML コードを、アクセス許可に関連するステップを削除するように変更します。

新しい Azure DevOps プロジェクトの作成

Azure DevOps UI で新しいプロジェクトを作成するには、「新しい Azure DevOps プロジェクトを作成する」の手順に従います。

Azure DevOps と Azure の間で認証を設定する

この手順では、サービス プリンシパル情報を格納する新しい Azure DevOps サービス接続を構成します。 プロジェクト パイプラインは、接続名を使用して Azure に自動的に接続し、接続情報を読み取ることができます。 作成したサービス プリンシパルを使用して Azure DevOps と Azure サービス間の認証を設定するには、「Azure と Azure DevOps で認証を設定する」の手順に従います。

Azure DevOps 変数グループを作成する

新しい変数グループを作成し、Azure DevOps サービス接続に関連する変数を追加するには、「Azure DevOps 変数グループを作成する」の手順に従います。 その後、サービス プリンシパル名は、環境変数としてパイプラインで自動的に使用できます。

Azure Repos と Azure Pipelines を構成する

このサンプル リポジトリでは、コードの昇格とパイプラインの実行のために、maindevelopment の 2 つのブランチを使用します。 サンプル リポジトリのコードを使用するように独自のローカル リポジトリとリモート リポジトリを設定するには、Azure DevOps のローカル リポジトリとリモート リポジトリを構成するための手順に従います。

サンプル リポジトリから main ブランチと development ブランチの両方を複製し、新しい Azure Repos リポジトリを参照するようにコードを関連付けます。 PR パイプラインと開発パイプラインの両方が、PR の作成トリガーとマージ トリガーに基づいて自動的に実行されるように構成されます。

development ブランチのブランチ ポリシーは、機能ブランチから開発ブランチで発生したすべての PR の PR パイプラインを実行するように構成されます。 dev パイプラインは、PR が開発ブランチにマージされるときに実行され、CI フェーズと CD フェーズの両方で構成されます。

Human-in-loop (人間の関与) もパイプライン内に実装されます。 dev パイプラインの CI フェーズが実行された後、CD フェーズは、Azure Pipelines ビルド実行 UI で手動承認が提供された後に続きます。

承認を待機する既定の時間は 60 分です。この時間が経過すると、パイプラインは拒否され、CD フェーズは実行されません。 実行を手動で承認すると、パイプラインの CD ステップが実行されます。

サンプル パイプラインの手動承認は、通知を replace@youremail.com に送信するように構成されています。 プレースホルダーを適切なメール アドレスに置き換えます。

パイプラインをテストする

パイプラインをテストするには、「パイプラインをテストする」の手順に従います。 プロセス全体には、次の手順が含まれます。

  1. 機能ブランチから開発ブランチに PR を発生させます。
  2. ブランチ ポリシーの構成により、PR パイプラインが自動的に実行されます。
  3. PR が開発ブランチにマージされます。
  4. 関連付けられた dev パイプラインが実行され、その結果、CI と CD 全体が実行され、Azure Machine Learning エンドポイントがプロビジョニングまたは更新されます。

この出力は、プロンプトの実行、評価、デプロイのシナリオの例にある例のようになります。

ローカル実行を使用する

ローカル実行機能を使用するには、次の手順に従います。

  1. 次のようにリポジトリを複製します。

    git clone https://github.com/microsoft/genaiops-promptflow-template.git
    
  2. 最上位のフォルダー レベルで .env ファイルを作成します。 各接続の行を追加し、プレースホルダーの値を更新します。 サンプル リポジトリの例では、aoai という名前の AzureOpenAI 接続と API バージョン 2024-02-01 を使用しています。

    aoai={ "api_key": "<api key>","api_base": "<api base or endpoint>","api_type": "azure","api_version": "2024-02-01"}
    <connection2>={ "api_key": "<api key>","api_base": "<api base or endpoint>","api_type": "<api type>","api_version": "<api_version>"}
    
  3. 依存関係をインストールするために、ローカルの conda または仮想環境を準備します。

    python -m pip install promptflow promptflow-tools promptflow-sdk jinja2 promptflow[azure] openai promptflow-sdk[builtins] python-dotenv
    
  4. 新しいフローをオンボードする方法の手順に基づいて、フローをテンプレートに取り込むか書き込みます。

  5. 提供されている例のような Python スクリプトを "local_execution" フォルダーに記述します。