プロンプト フロー SDK を使用して Python でカスタム チャット アプリを構築する
重要
この記事で説明する機能の一部は、プレビューでのみ使用できる場合があります。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
このクイックスタートでは、プロンプト フロー SDK を使用してローカル開発環境を設定する方法について説明します。 プロンプトを記述し、それをアプリ コードの一部として実行し、実行されている LLM 呼び出しをトレースし、LLM の出力に対して基本的な評価を実行します。
前提条件
重要
Azure サブスクリプション内のストレージ アカウントに対してロールの割り当てを追加するために必要なアクセス許可を持っている必要があります。 アクセス許可の付与 (ロールの割り当ての追加) は、特定の Azure リソースの所有者によってのみ許可されます。 ID を使用して Azure OpenAI Service を呼び出すためのアクセス権を付与するためには、Azure サブスクリプション所有者 (これは IT 管理者である可能性があります) に手助けを求める必要があるかもしれません。
このクイックスタートに従う前に、アプリケーションに必要なリソースを作成します。
- 外部リソースに接続するための AI Studio ハブ。
- プロジェクト成果物を整理し、トレースと評価の実行を共有するためのプロジェクト。
- デプロイ済みの Azure OpenAI チャット モデル (gpt-35-turbo または gpt-4)
まだ実行していない場合は、AI Studio プレイグラウンドのクイックスタートを完了して、これらのリソースを作成します。 これらのリソースは、ハブとプロジェクトを作成するための SDK のガイドの記事に従って作成することもできます。
ID を使用して Azure OpenAI Service を呼び出すためのアクセス権を付与する
セキュリティのベスト プラクティスを使用するために、API キーの代わりに Microsoft Entra ID を使用して、ユーザー ID を使用して Azure OpenAI に対して認証します。
そのユーザー ID に、使用している Azure AI サービス リソースに対する Cognitive Services OpenAI ユーザー ロールを自分自身で、または管理者が付与する必要があります。 このロールにより、ユーザー ID を使用して Azure OpenAI Service を呼び出す機能が付与されます。
使用している Azure AI サービス リソースへのアクセス権を自分自身に付与するには:
AI Studio で、プロジェクトに移動し、左側のペインから [設定] を選択します。
[接続されたリソース] セクションで、[AIServices] という種類の接続名を選択します。
Note
[AIServices] という接続が表示されない場合は、代わりに [Azure OpenAI] という接続を使用します。
[リソースの詳細] ページで、[リソース] 見出しの下にあるリンクを選択して、Azure portal で AI サービス リソースを開きます。
Azure portal の左側のページから、[アクセス制御 (IAM)]>[+ 追加]>[ロールの割り当ての追加] の順に選択します。
Cognitive Services OpenAI ユーザー ロールを検索し、それを選択します。 [次へ] を選択します。
ユーザー、グループ、またはサービス プリンシパル を選択します。 次に、[メンバーの選択] を選択します。
開いた [メンバーの選択] ペインで、ロールの割り当てを追加するユーザーの名前を検索します。 ユーザーを選択して [選択] を選択します。
ウィザードを続行し、[確認と割り当て] を選択してロールの割り当てを追加します。
Azure CLI をインストールしてサインインする
ユーザー資格情報を使用して Azure OpenAI Service を呼び出すことができるように、Azure CLI をインストールしてローカル開発環境からサインインします。
ほとんどの場合は、次のコマンドを使用して、ターミナルから Azure CLI をインストールできます。
これらのコマンドが特定のオペレーティング システムまたはセットアップで機能しない場合は、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 以降が既にインストールされている場合は、次のコマンドを使用して仮想環境を作成できます:
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 のチャット プレイグラウンドで見つけることができます。
.env
ファイルを作成し、次のコードを貼り付けます。AZURE_OPENAI_ENDPOINT=endpoint_value AZURE_OPENAI_CHAT_DEPLOYMENT=chat_deployment_name AZURE_OPENAI_API_VERSION=api_version
AI Studio プロジェクト内のチャット プレイグラウンドに移動します。 まず、LLM にメッセージを送信して、チャットがモデルと連携していることを検証します。
チャット プレイグラウンドで Azure OpenAI のデプロイ名を見つけます。 ドロップダウンでデプロイを選択し、デプロイ名にマウス ポインターを置いてそれを表示します。 この例では、デプロイ名は gpt-35-turbo-16k です。
.env
ファイルで、chat_deployment_name
を前の手順のデプロイの名前に置き換えます。 この例では、gpt-35-turbo-16k
というデプロイ名を使用しています。<> [コードの表示] ボタンを選択し、エンドポイント値と API バージョン値をコピーします。
.env
ファイルで、endpoint_value
をエンドポイント値に置き換え、api_version
を前の手順のダイアログからコピーした API バージョン ("2024-02-15-preview" など) に置き換えます。
警告
キー ベースの認証はサポートされますが、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_CHAT_DEPLOYMENT"),
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_CHAT_DEPLOYMENT"),
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 を使用したアプリの評価に関するページを確認するようにしてください。