Azure AI Foundry プロンプトフロー(Prompt Flow) ことはじめ

Azure AI Foundryのプロンプトフロー(Prompt Flow)を利用した処理実行やフローの作成方法について、とりまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d82b468c-5e71-4d18-bd5f-24122e218f66.png)

:::note info
前提として、以下投稿内のAzure OpenAI Serviceの作成と生成AIモデルのデプロイについて完了していることが必要となります。
https://qiita.com/Higemal/items/704a245125b71994b563
:::


# 流れ
1. プロンプトフローの機能有効化
2. デフォルトのプロンプトフローを使用した動作確認
 2.1 プロンプトフローの作成
 2.2 プロンプトフローの画面とデフォルト処理の説明
 2.3 処理準備(inputおよびLLM)
 2.4 処理準備(コンピューティングセッション)
 2.5 処理実行と実行結果確認
3. 処理の分割/分岐/結合について
4. その他注意事項
 4.1 課金要素について
 4.2 処理連結について



# 1. プロンプトフローの機能有効化
デフォルト状態ではプロンプトフローが利用できません。まずはAzure OpenAIプロジェクトを作成し、プロンプトフローを利用できる状態にします。

まず、Azure OpenAI ServiceからAI Foundryポータル画面に移動し、`ホーム` - `プロジェクトで最適化する`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/667d52aa-f89d-4767-8c26-6c833d8488c7.png)

<br>

プロジェクトの作成画面で、プロジェクト名を入力し、`カスタマイズ`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/68d220d2-c115-40f0-a899-c299f957298a.png)

<br>

プロジェクトの詳細画面で各種情報を入力します。`ハブ名`については任意の名称を付与し、それ以外は先に作成してあるAzure OpenAI Serviceの作成情報と同じ内容を入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d6b92f81-173d-4325-a0a2-e9eda6951e12.png)

<br>

確認画面にて`作成`を押下します。しばらく作成に時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/75f76863-ff5c-4092-aecb-2a6e6ffe9fe8.png)

<br>

その後、プロジェクト画面に遷移し、プロンプトフローが表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7a4ec476-44a4-4367-8cc3-08b0aeb7ce4e.png)



# 2. デフォルトのプロンプトフローを使用した動作確認
利用可能になったプロンプトフローについて、デフォルトテンプレートを利用して動作確認を行います。

## 2.1 プロンプトフローの作成
まず、プロンプトフローの画面から`作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/81d1ff75-bca2-4cc0-bd9b-c1f884987acc.png)

<br>

`標準フロー`について`作成`を押下します。
右ペインが表示されるので、フォルダー名について任意で命名付与し、作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/105e7130-fa1a-446c-b8d1-b46db1f0f118.png)

:::note warn
以下エラーが表示される場合、Azure側で内部的にプロンプトフローの利用準備が完了していないため、時間をあけてリトライすれば問題なく利用開始できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ab38ae6d-aff9-4d19-95f5-fe160091885c.png)
:::

<br>

プロンプトフローのデフォルト画面が開設しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e104ff3d-1885-42b2-ac81-a50940a459f5.png)


<br>

## 2.2 プロンプトフローの画面とデフォルト処理の説明
画面内の情報量が多いので、以下で各要素について分解します。


項番 | 画面名 | 内容
--- | --- | ---
① | 入力 | 処理のインプット情報を入力する部分で、テキストや数値等を`名前`,`種類(型)`,`値`として入力します。
② | 出力 | 処理の出力結果を受け取る部分になります。処理により、複数の出力結果(変数)を設けることができます。
③ | 処理部 | LLM/Prompt/Pythonなどの処理を記述するところになります。
④ | クローン/保存 | 状況の保存およびクローンして新規プロンプトフローを作成することができます。
⑤ | コンピューティングセッション管理 | 処理に利用するコンピュートリソースとセッションを管理します。
⑥ | 実行 | プロンプトフローの処理実行ボタンになります。
⑦ | グラフ | 処理の連環が表現されています。**この画面で処理間の連携/解除は操作できません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7bd4a2f3-a584-4cfe-8314-67787d12d6c6.png)

<br>

続いて、処理内容について概説します。

処理 | 内容
--- | ---
input | string型の変数topicに ユーザ入力のテキスト内容を格納
joke | OpenAI Serviceを利用し、 Inputとなる変数topicのテキストから ジョーク文をテキストとして生成
echo | Python処理を実行し、 Inputとなる処理Jokeのアウトプットテキストを 無加工でアウトプット
outputs | 処理echoのアウトプットを受け取り、 変数jokeに格納

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f0fb3f3d-14ff-4862-bbd9-5b41c22e9eec.png)

<br>

## 2.3 処理準備(inputおよびLLM)
処理実行準備として、まずはinput部にテキスト入力を行います。
こちらの入力内容をトリガーとしてLLMが実行されるため、適当な単語等を入力しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/24fa6d3c-3280-47c4-ad2b-bd08fd2c60f5.png)

<br>

また、LLM処理部は使用するAOAIサービスや生成AIモデルを事前選択しておく必要があるため選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0ccb1748-3602-450d-9a76-db551af90d46.png)

<br>

## 2.4 処理準備(コンピューティングセッション)
最後の準備事項として、python処理や処理間連携に使用するコンピュートリソースのセッション接続を行います。

特に設定しない場合、`コンピューティングセッションの開始`を押下するだけでサーバレス型のコンピュートリソースが起動しますが、理解と制御のために`詳細設定から始める`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b96ac8e0-6757-487f-a8c4-105d960eebd2.png)

<br>

コンピューティング設定画面が起動します。

`コンピューティングの種類`にて、サーバーレスとコンピューティングインスタンスが利用可能です。コンピューティングリソースを利用する場合、プロンプトフロー用のインスタンス作成と管理が必要になるため、**単純な動作確認レベルであればサーバレスで問題ありません。** サーバレスのなかで、費用がかからないもの／なるべく低いものを選択すればよいでしょう。
`アイドリングからのシャットダウンを有効にする`場合、コンピュートリソースについて所定時間経過後に自動で停止してくれます（**逆に、この設定を無効化すると手動停止するまで課金継続となります**)。最低で20分経過したらリソース停止するよう設定できますため、20分を設定しておくとよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2d69ca9a-7ba1-45a9-bd58-17257027361c.png)

<br>

ベースイメージの設定画面では、起動するコンテナイメージの選択が可能ですが、`最新のイメージを使用する`で問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/98aa2e63-86c8-4215-a5ae-fd4399d2edd9.png)


<br>

`コンピューティングセッションを適用して開始`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/11894119-2786-48fc-9a7d-135194c91de4.png)

<br>

おおよそ1～5分程度で`コンピューティングセッション実行中`になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/40908fb8-f084-490a-8b29-646b622fb9ea.png)





## 2.5 処理実行と実行結果確認
それでは処理を実行します。
青い実行ボタンを押下すると処理が実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0799148a-f64b-4a26-a744-4407134e0946.png)


<br>

少し待つと処理完了と表示されます。
処理の結果については`出力の表示`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/eb1b69fc-87b2-4118-9483-1ad9efb0877b.png)

<br>

出力結果について、出力変数ごとに内容が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/5bd21146-78b1-4e83-add5-3aaf85d09729.png)

<br>

また、**処理実行後には処理単位の入出力結果を確認することが可能です。**
LLM処理のような冪等性が高くない処理の内容確認や、処理フロー内の想定外混入などに利用できるものと思われます。

`joke`処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6f0f38b6-9b96-45b4-ba0c-f578ef9306dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a8e4a2de-5b3e-4776-add1-565a43426e2d.png)

`echo`処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/fbeb9234-235b-4b4d-a430-c9a9086cc7af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/544a0916-060d-4dcd-8111-21a826146903.png)




# 3. 処理の分割/分岐/結合について
内容が長くなるため、以下記事に別掲します。

https://qiita.com/Higemal/items/5b1447fd4af40c3e148b


# 4. その他注意事項

## 4.1 課金要素について
課金要素は主に以下の２つです。
・コンピューティングセッションにおけるインスタンス使用料金
・LLM利用におけるAzure OpenAI Service使用料金

特に前者のインスタンス使用料金については、デフォルトの場合で作業時間課金／設定次第では手動停止しない限り継続課金となるため、セッション接続時間を最低限度にすることで費用を抑えることが可能です。

OpenAI Service使用料はトークン課金形態のため、大量のトークン消費や複数LLM処理配置などを意識して避けることで費用低減につなげられます。

## 4.2 処理連結について
処理と処理の連結については、各処理の**入力**項目を設定することで定義します。
（出力部については、最終処理のアウトプットを記載することで矢印が描画）

プルダウンで候補が表示されるため手打ち入力することは必要ありませんが、グラフペインで矢印のつなぎかえなどの操作はできないため、処理分岐や複数入出力の際は注意して設定するようにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/1d80d0f0-ea83-4993-9f23-f35b045119ca.png)




# 参考
https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2