エモーションテックでSREチームに所属しているsugawaraです。SRE業務の側でLLM周りの開発を行なっているのですが、現状プロンプト周りの開発・運用に課題があります。具体的には、以下のような課題です。
- プロンプトを調整することが多々あるが、その調整によって消費Token数、処理時間がどう変化したかを正確に把握できていない
- また、どのくらい結果が良くなったかが定量的に判断できていない
Azure Machine Learning Prompt flow(以後Prompt flow)で上記課題を解決できないか、ヒントが得られないかと思い触ってみることにしました。 (と書いてはいますが、記事のネタがなくて困っていたからというのが今回触ってみた主な動機です。)
注意:本記事は、2023年9月21日現在のプレビュー版 Azure Machine Learning Prompt flowを扱っています。
Prompt flowを触るまでの準備と注意点
まず、Azure Machine LearningのWorkspaceを作成しておく必要があります。
その後、作成したWorkspaceに遷移し、コンソール画面右上の「Manage preview features」から「Build AI solutions with Prompt flow」がEnabledになっていることを確認、なっていなければEnabledに変更します。
前提条件: Azure Machine Learning ワークスペースでプロンプト フローを有効にする
その後、Prompt flowのコンソール画面に遷移し、ConnectionとRuntimeを作成します。
Runtimeを作成する際の注意点としては、以下が挙げられます。 一つ目は、Flow内ではPythonを用いたNode(Flow内のタスクのこと)を作成することができるのですが、LangChainコードを直接実行したい等、デフォルトでインストールされていないライブラリを使いたい場合には、Use customized environmentを利用する必要があります。
ランタイム用に環境をカスタマイズする (プレビュー) LangChain との統合 (プレビュー)
二つ目は、Workspaceに割り当てたCompute Instanceが必要となることです。このCompute Instanceを起動している間はその分コストがかかるので注意が必要です。
今回触ってみるフローについて
今回は自前で用意したフローではなく、Microsoftの方でサンプルとして用意されているフローを用いてみることにしました。以下がそのサンプルです。
https://github.com/microsoft/promptflow/tree/main/examples/flows/standard/web-classification
このWeb ClassificationというサンプルはLLMを使用したマルチクラス分類フローで、 URLを指定すると、そのURLを1つのWebカテゴリに分類します。フローの全体像は以下の図です。
実行と評価を試してみる
まず、上記で説明したフローをPrompt flowで動かすためにFlowを作成する必要があります。 flow.dag.ymlを含むフォルダもしくはzipファイルをコンソール画面からアップロードすることでも作成できるようなのですが、せっかくなのでREADME.mdに方法がまとめられているpfazureコマンドを利用してみました。以下が実際に利用したコマンドです。(今回利用したpromptflow, promptflow-toolsのバージョンは、0.1.0b6です。)
# サブスクリプション、リソースグループ、ワークスペースを設定 az account set --subscription <your_subscription_id> az configure --defaults group=<your_resource_group_name> workspace=<your_workspace_name> az login # Flowを作成 cd <path-to-the-sample-repo>/examples/flows/standard run_name="web_classification_"$(openssl rand -hex 12) pfazure run create --file web-classification/run.yml --name $run_name --runtime <your_runtime>
注意点としては、pfazureコマンドの一覧を確認した限りではConnectionを作成できないようなので、上記コマンドを実行する前に「open_ai_connection」という名前のConnectionをコンソール画面から作成しておく必要があります。 また、一度削除したConnectionと同じ名前のConnectionを作成しようとすると以下のようなエラーが発生するため注意してください。
コマンド実行後、コンソール画面の「Runs」から結果を確認できます。どうやらpfazureコマンドで作成した場合、「Flows」ではなく「Runs」から確認することになるようで、かつコンソール画面からFlowを編集することはできないようでした。編集したい場合、コンソール画面から「Clone flow」を行なうと指定したFolder nameで「Flows」にFlowが作成されるので、そのFlowを編集する手段を取ることになりそうです。
コンソール画面の「Runs」からpfazureコマンドで作成したFlowを選択し、「View outputs」より以下画面に遷移できます。 「Outputs」で確認できるのは、作成時に指定したweb-classification/run.yml内で指定しているweb-classification/data.jsonlに含まれているデータでの分類結果です。
「Trace」からは、各処理での処理時間を確認でき、また、LLMを使っている箇所については処理時間だけでなく消費Token数についても確認できます。
次にEvaluation flowを実行してみます。こちらもサンプルとして用意されているものを利用しました。
上記の評価フローでは各予測をgroundtruthと比較して正誤判定を行ない、結果を集計しAccuracyを算出してくれるようです。以下がFlow作成に利用したコマンドです。
# Evaluation flowを作成 prev_run_name=$run_name run_name="classification_accuracy_"$(openssl rand -hex 12) pfazure run create --file web-classification/run_evaluation.yml --run $prev_run_name --name $run_name --runtime <your_runtime> --stream
以下のweb-classification/run_evaluation.ymlで上記評価フローを指定しています。
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Run.schema.json flow: ../../evaluation/eval-classification-accuracy data: data.jsonl run: web_classification_variant_1_20230724_173442_973403 # replace with your run name column_mapping: groundtruth: ${data.answer} prediction: ${run.outputs.category}
結果をコンソール画面から確認してみます。「Outputs」からは各分類結果とgroundtruthが一致しているかどうかの結果が確認できます。
また、「Metrics」からは全体のAccuracyを確認することができます。
所感
所々で期待通り動かなかったり疑問点が発生して調べたりしていたのでEvaluationまで動かすだけでだいぶ時間を取られてしまいました。触ってみての所感としては、各処理での消費Token数、処理時間を画面から容易に確認できるのは良いと感じました。
pfazureコマンドについては、コンソール画面から作成したFlowをコードとしてexportできるようになる等、今後機能が充実するとありがたいなと思いました。(コンソール画面からはzipファイルでダウンロードすることはできるみたいでした。)
また、今回はあまり触れていなかったのですが、組み込みの評価メトリクスは何かしらの役に立ちそうと感じたので今後理解・検証したいと思います。
参考
https://github.com/microsoft/promptflow/blob/main/docs/cloud/azureai/quick-start.md
おわりに
エモーションテックでは顧客体験、従業員体験の改善をサポートし、世の中の体験を変えるプロダクトを開発しています。この記事や他の記事を見て少しでも弊社に興味をもっていただけましたら、ぜひ採用ページからご応募をお願いいたします。