次の方法で共有


プロンプト フロー SDK を使用して Python でカスタム チャット アプリを構築する

重要

この記事で説明する機能の一部は、プレビューでのみ使用できる場合があります。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

このクイックスタートでは、プロンプト フロー SDK を使用してローカル開発環境を設定する方法について説明します。 プロンプトを記述し、それをアプリ コードの一部として実行し、実行されている LLM 呼び出しをトレースし、LLM の出力に対して基本的な評価を実行します。

前提条件

このクイックスタートに従う前に、アプリケーションに必要なリソースを作成します。

まだ実行していない場合は、AI Studio プレイグラウンドのクイックスタートを完了して、これらのリソースを作成します。 これらのリソースは、ハブとプロジェクトを作成するための SDK のガイドの記事に従って作成することもできます。

また、Azure サブスクリプションでストレージ アカウントのロールの割り当てを追加するために必要なアクセス許可も必要です。 アクセス許可の付与 (ロールの割り当ての追加) は、特定の Azure リソースの所有者によってのみ許可されます。 ID を使用して Azure OpenAI Service を呼び出すためのアクセス権を付与するには、IT 管理者への依頼が必要になることがあります。

ID を使用して Azure OpenAI Service を呼び出すためのアクセス権を付与する

セキュリティのベスト プラクティスを使用するために、API キーの代わりに Microsoft Entra ID を使用して、ユーザー ID を使用して Azure OpenAI に対して認証します。

そのユーザー ID に、使用している Azure AI サービス リソースに対する Cognitive Services OpenAI ユーザー ロールを自分自身で、または管理者が付与する必要があります。 このロールにより、ユーザー ID を使用して Azure OpenAI Service を呼び出す機能が付与されます。

使用している Azure AI サービス リソースへのアクセス権を自分自身に付与するには:

  1. AI Studio で、プロジェクトに移動し、左側のペインから [設定] を選択します。

  2. [接続されたリソース] セクションで、[AIServices] という種類の接続名を選択します。

    接続された AI サービス リソースを選択して開く方法が強調表示されている、[プロジェクト設定] ページのスクリーンショット。

    Note

    [AIServices] という接続が表示されない場合は、代わりに [Azure OpenAI] という接続を使用します。

  3. [リソースの詳細] ページで、[リソース] 見出しの下にあるリンクを選択して、Azure portal で AI サービス リソースを開きます。

    Azure portal でリソースを開く方法を示す AI サービスの接続の詳細のスクリーンショット。

  4. Azure portal の左側のページから、[アクセス制御 (IAM)]>[+ 追加]>[ロールの割り当ての追加] の順に選択します。

  5. Cognitive Services OpenAI ユーザー ロールを検索し、それを選択します。 [次へ] を選択します。

    Cognitive Services OpenAI ユーザー ロールを選択するページのスクリーンショット。

  6. ユーザー、グループ、またはサービス プリンシパル を選択します。 次に、[メンバーの選択] を選択します。

  7. 開いた [メンバーの選択] ペインで、ロールの割り当てを追加するユーザーの名前を検索します。 ユーザーを選択して [選択] を選択します。

    新しいロールが割り当てられるユーザーが含まれているページのスクリーンショット。

  8. ウィザードを続行し、[確認と割り当て] を選択してロールの割り当てを追加します。

Azure CLI をインストールしてログインする

次に、ユーザー資格情報を使用して Azure OpenAI Service を呼び出すことができるように、Azure CLI をインストールしてローカル開発環境からログインします。

ほとんどの場合は、次のコマンドを使用して、ターミナルから Azure CLI をインストールできます。

winget install -e --id Microsoft.AzureCLI

これらのコマンドが特定のオペレーティング システムまたはセットアップで機能しない場合は、Azure CLI をインストールする方法の手順に従うことができます。

Azure CLI をインストールしたら、az login コマンドを使用してログインし、ブラウザーを使用してサインインします。

az login

次に、アプリを作成し、コードから Azure OpenAI Service を呼び出します。

新しい Python 環境を作成する

最初に、プロンプト フロー SDK パッケージをインストールするために使用できる新しい Python 環境を作成する必要があります。 グローバル Python インストールにパッケージをインストールしないでください。 Python パッケージをインストールするときは、常に仮想環境または conda 環境を使用する必要があります。そうしないと、Python のグローバル インストールが中断される場合があります。

必要に応じて Python をインストールする

Python 3.10 以降を使用することをお勧めしますが、少なくとも Python 3.8 が必要です。 適切なバージョンの Python がインストールされていない場合は、オペレーティング システムへの Python のインストールの最も簡単な方法として、VS Code Python チュートリアルの手順に従うことができます。

仮想環境を作成する

Python 3.10 以降が既にインストールされている場合は、次のコマンドを使用して仮想環境を作成できます:

py -3 -m venv .venv
.venv\scripts\activate

Python 環境をアクティブ化した場合は、コマンド ラインから python または pip を実行すると、アプリケーションの .venv フォルダーに含まれている Python インタープリターが使用されます。

Note

deactivate コマンドを使用して Python 仮想環境を終了し、必要に応じて、それを後で再アクティブ化できます。

プロンプト フロー SDK をインストールする

このセクションでは、プロンプト フローを使用してアプリケーションを構築します。 [プロンプト フロー] は、LLM ベースの AI アプリケーションのエンド ツー エンドの開発サイクル (構想から、プロトタイプ作成、テスト、評価、運用環境デプロイと監視まで) を効率化するように設計された一連の開発ツールです。

作成した仮想環境にプロンプト フロー SDK をインストールするには、pip を使用します。

pip install promptflow
pip install azure-identity

プロンプト フロー SDK は、次の複数のパッケージに依存しています。すべてが必要でない場合は、これらを選択して個別にインストールできます。

  • promptflow-core: LLM コードを実行するために使用されるコアのプロンプト フロー ランタイムが含まれている
  • promptflow-tracing: OpenTelemetry トレースを標準で出力するために使用される軽量ライブラリ
  • promptflow-devkit: ローカル開発環境のためのプロンプト フロー テスト ベッドとトレース ビューアー ツールが含まれている
  • openai: Azure OpenAI Service を使用するためのクライアント ライブラリ
  • python-dotenv: 環境変数を .env ファイルから読み取って設定するために使用される

環境変数を構成する

コードから Azure OpenAI Service を呼び出すには、AI サービスのエンドポイントとデプロイ名が必要です。 このクイックスタートでは、これらの値を、アプリケーションで読み取ることができる環境変数が含まれているファイルである .env ファイルに保存します。 これらの値は、AI Studio のチャット プレイグラウンドで見つけることができます。

  1. .env ファイルを作成し、次のコードを貼り付けます。

    AZURE_OPENAI_ENDPOINT=endpoint_value
    AZURE_OPENAI_DEPLOYMENT_NAME=deployment_name
    AZURE_OPENAI_API_VERSION=2024-02-15-preview
    
  2. AI Studio プロジェクト内のチャット プレイグラウンドに移動します。 まず、LLM にメッセージを送信して、チャットがモデルと連携していることを検証します。

  3. チャット プレイグラウンドで Azure OpenAI のデプロイ名を見つけます。 ドロップダウンでデプロイを選択し、デプロイ名にマウス ポインターを置いてそれを表示します。 この例では、デプロイ名は gpt-35-turbo-16k です。

    デプロイ名と [コードの表示] ボタンが強調表示されている、開かれた AI Studio のチャット プレイグラウンドのスクリーンショット。

  4. .env ファイルで、deployment_name を前の手順のデプロイの名前に置き換えます。 この例では、gpt-35-turbo-16k というデプロイ名を使用しています。

  5. <> [コードの表示] ボタンを選択し、エンドポイント値をコピーします。

    エンドポイント値をコピーするボタンが強調表示されている、[コードの表示] ポップアップのスクリーンショット。

  6. .env ファイルで、endpoint_value を、前の手順でダイアログからコピーされたエンドポイント値に置き換えます。

警告

キー ベースの認証はサポートされますが、Microsoft では推奨していません。 キーを使用したい場合はそのキーを .env に追加できますが、誤って Git リポジトリにチェックインされないように、.env.gitignore ファイルに含まれていることを確認してください。

基本的なチャット プロンプトとアプリを作成する

最初に、プロンプト テンプレート ファイルを作成します。このために、プロンプト フローでサポートされているプロンプト テンプレート形式である Prompty を使用します。

chat.prompty ファイルを作成し、そこに次のコードをコピーします。

---
name: Chat Prompt
description: A basic prompt that uses the chat API to answer questions
model:
    api: chat
    configuration:
        type: azure_openai
    parameters:
        max_tokens: 256
        temperature: 0.2
inputs:
    chat_input:
        type: string
    chat_history:
        type: list
        is_chat_history: true
        default: []
outputs:   
  response:
    type: string
sample:
    chat_input: What is the meaning of life?
---
system:
You are an AI assistant who helps people find information.

{% for item in history %}
{{item.role}}:
{{item.content}}
{% endfor %}

user:
{{chat_input}}

では、このプロンプト テンプレートを使用する Python ファイルを作成しましょう。 chat.py ファイルを作成し、そこに次のコードを貼り付けます。

import os
from dotenv import load_dotenv
load_dotenv()

from promptflow.core import Prompty, AzureOpenAIModelConfiguration

model_config = AzureOpenAIModelConfiguration(
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)

prompty = Prompty.load("chat.prompty", model={'configuration': model_config})
result = prompty(
    chat_history=[
        {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
        {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."}
    ],
    chat_input="Do other Azure AI services support this too?")

print(result)

次に、コンソールから Python コードを実行します。

python chat.py

これで、Prompty の実行からの出力が表示されます。

Yes, other Azure AI services also support various capabilities and features. Some of the Azure AI services include Azure Cognitive Services, Azure Machine Learning, Azure Bot Service, and Azure Databricks. Each of these services offers different AI capabilities and can be used for various use cases. If you have a specific service or capability in mind, feel free to ask for more details.

チャット コードの実行をトレースする

次に、プロンプト フローのトレースにより、Python スクリプトで発生しているさまざまな LLM 呼び出しに関する分析情報をどのように提供できるかを見てみましょう。

chat.py ファイルの先頭に次のコードを追加して、プロンプト フローのトレースを有効にします。

from promptflow.tracing import start_trace
start_trace()

chat.py を再実行します。

python chat.py

今回は、出力に、実行のプロンプト フロー トレースを表示するためのリンクが表示されます。

Starting prompt flow service...
Start prompt flow service on port 23333, version: 1.10.1.
You can stop the prompt flow service with the following command:'pf service stop'.
Alternatively, if no requests are made within 1 hours, it will automatically stop.
You can view the trace detail from the following URL:
http://localhost:23333/v1.0/ui/traces/?#collection=aistudio-python-quickstart&uiTraceId=0x59e8b9a3a23e4e8893ec2e53d6e1e521

そのリンクを選択すると、プログラムの実行のステップ、LLM に渡された内容、応答の出力を示すトレースが表示されます。

プログラムの実行のステップを示すトレースのスクリーンショット。

プロンプト フローのトレースではまた、特定の関数呼び出しをトレースしたり、トレースを AI Studio に記録したりすることもできます。詳細については、プロンプト フロー SDK でトレースを使用する方法に関するページを確認してください。

プロンプトを評価する

次に、プロンプト フロー エバリュエーターを使用して、会話の品質を 0 から 5 までのスケールでスコア付けできるメトリックを生成する方法を示しましょう。 プロンプトをもう一度実行しますが、今回は結果を完全な会話が含まれている配列に格納してから、それを ChatEvaluator に渡してスコア付けします。

まず、promptflow-evals package をインストールします。

pip install promptflow-evals

次に、次のコードを evaluate.py ファイルにコピーします。

import os
from dotenv import load_dotenv
load_dotenv()

from promptflow.core import Prompty, AzureOpenAIModelConfiguration
from promptflow.evals.evaluators import ChatEvaluator

model_config = AzureOpenAIModelConfiguration(
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)

chat_history=[
    {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
    {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."}
]
chat_input="Do other Azure AI services support this too?"

prompty = Prompty.load("chat.prompty", model={'configuration': model_config})
response = prompty(chat_history=chat_history, chat_input=chat_input)

conversation = chat_history
conversation += [
    {"role": "user", "content": chat_input},
    {"role": "assistant", "content": response}
]

chat_eval = ChatEvaluator(model_config=model_config)
score = chat_eval(conversation=conversation)

print(score)

evaluate.py スクリプトを実行します。

python evaluate.py

次のような出力が表示されます。

{'gpt_coherence': 5.0, 'gpt_fluency': 5.0, 'evaluation_per_turn': {'gpt_coherence': {'score': [5.0, 5.0]}, 'gpt_fluency': {'score': [5.0, 5.0]}}}

この会話での LLM 応答の一貫性と流暢さに対して 5 がスコア付けされたようです。

プロンプト フロー エバリュエーターを使用する方法 (独自のカスタム エバリュエーターを作成したり、評価結果を AI Studio に記録したりする方法を含む) の詳細については、プロンプト フロー SDK を使用したアプリの評価に関するページを確認するようにしてください。