最新のプロンプト技術を試すにはPrompt Flowが便利

# はじめに
ChatGPTが公開されて1年余りが経過しました。その中で、プロンプトエンジニアリングの手法も様々な物が考案されてきました。
arXivにて "Prompt Engineering" で検索した際の論文数は、2023年の1月から6月までの範囲では 71 件までなのに対し、7月から11月までだと 195 件と半年前の倍以上であり、1日あたり1件以上のペースとなっています。
しかし、プロンプトの性能は性質上新しい技術を一回試してみて定量的な効果が見えるわけでもなく、何度も試行したり既存のプロンプトと比較しながら実験しないと分からないです。プロンプティングの技術のアップデートが加速している現状では、その効果を確かめるのも難しくなっているのではないかと思われます。

今回は、新たなプロンプトエンジニアリングの手法を試す手段として、Microsoft Azure Machine Learning や、最近発表された Azure AI Studio から利用できるプロンプトフローを利用するという提案をいたします。
# プロンプトフローの機能
プロンプトフローは、生成AIを利用したアプリケーションの開発を支援するためのツールです。
テンプレートを用いたプロンプトの生成やPythonコードによる処理、AI Searchなどの外部アプリとの接続をノードとして、それらを繋げることによってアプリの処理を可視化しながら開発を行うことができます。
また、テストや性能評価に役立つ機能も存在します。今回はこのテスト部分に着目して活用していきたいと思います。

はじめに、フローのバリアント機能です。こちらはフロー内のノード一つに対して、プロンプトのテンプレートを複数作成し、それらの出力を比較することができるというものです。ツール内でフロー実行した際、各バリアントに同じ入力を行い、それぞれの実行結果を同時に出力して比較することができます。
次にバッチ評価機能です。こちらは単一のフローに複数の入力からなるデータセットを投入することができるというもので、大量の入力を同時に処理して効率的に挙動を確認することができるだけではなく、入力文とラベルが組になったデータを利用して分類タスクの精度など、プロンプトに対する定量的評価を行うために利用できます。

この2つを活用して、複数のプロンプトに対していくつもの入力を試しそれぞれの性能を比較評価する、というプロセスを効率よく行うことができます。

# 検証するプロンプト
今回検証するのは、心理療法に基づいた Chain of Empathy というプロンプトの手法です。

https://arxiv.org/abs/2311.04915

この論文内では、認知行動療法（CBT）など複数の心理療法に基づき回答させる、その際に共通のプロセスとしてまずユーザーが示している感情を特定し、次にそれに至った個人的/情況的な要因を特定するという手順を踏みます。

この理論を基にして、以下のようなプロンプトを作成しました。

> system:
> 私の上司としてサポートをしてください。
> 以下の認知行動療法的アプローチをもってユーザーを支援してください。
>
> user:
> このあとユーザー（私）が話すことに対して、以下の枠組みで対応してください。
> 1. ユーザーが示している感情はなんですか？
> 2. その感情はどのような状況や考えから生じていますか？
> 3. ユーザーが感じている感情に共感し、理解を示してください。
> 4. ユーザーが抱えている問題や状況をより深く理解するために、質問をしてください。
> 5. ユーザーが抱える問題に対して、具体的なアドバイスや解決策を提案してください。
> ※ただし状況によって応用する理論およびテンプレートは変化します。

この後にユーザーの質問を続けるようにしてプロンプトとします。

性能を評価するために、単純に「コーチングしてください」とのみ入力したプロンプトと比較しながら実行することを考えます。

# バリアントを利用した実験
以下のケースについて、CoEによるプロンプトがより的確なアドバイスをしてくれるかを実験してみましょう。
> クラウド上のデータベースと連携したシステム開発の請負を行っています。
> クラウド環境の差異により発生した不具合の修正作業に追われる中、データベース管理者様との認識齟齬があったことが判明し、テーブル構造に関わる仕様変更の必要が発生しました。そのために納期に間に合うかが分からない状態です。
> 納期は5営業日後となっています。本来の工数では3日で完了する見込みでしたが、想定以上に不具合の特定に時間がかかったためスケジュールが押しており、さらに未知数の工数が加わっている状態です。
> 今からどのように行動すればいいのでしょうか？

まずはプロンプトフローを開き、プロンプトノードにプロンプトを入力します。
また、言語モデルのエンドポイントなどを選択して接続する設定も行います。今回はGPT3.5を使用します。
![prompt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/d84da643-cf93-29e8-950b-80b908262688.png)

ノード上部にある「バリエーションを表示」をクリックすると、バリアントを編集する画面が開くので、「複製」をクリックするとバリアントを新規作成することが出来ます。
![variant](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/20cf0546-2dee-356c-58a5-4b720baf37e8.png)

「実行」をクリックすると、バリアントを利用するかといった表示が出るので、そちらを選択して実行します。
![run1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/d13c9a10-1fd2-ba6e-e8e1-adb1ec8840bf.png)
![run2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/bbf9f413-3bc1-3a5c-9c5b-87fb7211acd2.png)

実行結果は一覧で表示される他、CSVファイルにエクスポートすることも可能です。
![result1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/dd224c68-565d-a329-e948-5b71dc4b6f01.png)


CoEを使わなかった場合の結果はこちら
> まずは冷静になって、計画的な行動をとりましょう。
> 1. データベース管理者との認識齟齬について明確化するために、直接話し合いの場を設けましょう。問題があった点や必要な仕様変更について詳しく話し合い、共通の理解を確立しましょう。
> 2. テーブル構造の変更に必要な作業について、正確な見積もりを行いましょう。これには、既存の不具合の特定に要した時間や変更に関連する作業内容を考慮してください。
> 3. 納期に間に合うためには、追加のリソースや労力が必要かもしれません。他のチームメンバーやリソースの利用可能性を確認し、必要な補完措置を検討しましょう。
> 4. 納期の変更が必要であれば、早急に上司やクライアントと連絡を取り、説明と合意を得ましょう。逆に、納期を守るための妥協点や優先順位の見直しを検討してもいいかもしれません。
> 最も重要な点は、透明性とコミュニケーションです。上司や関係者との円滑なコミュニケーションを行いながら、問題を解決するために適切な対策を講じてください。また、将来的に同様の問題が再発しないように、予防策や改善点についても考慮しましょう。

それに対して、CoEをプロンプトに取り入れるとこのような結果になりました。
> 1. ユーザーが示している感情は、不安や焦り、ストレスなどでしょう。
> 2. その感情は、プロジェクトの納期に対する不確実性や困難さ、想定外の問題や遅延によるものだと思われます。
> 3. ユーザーの感情に共感し、理解しています。プロジェクトの進行に関わる予期しない問題や納期へのプレッシャーがどれほどプロジェクトチームや個人に影響を与えるか理解しています。
> 4. ユーザーの抱える問題や状況をより深く理解するために、以下の質問をしてみます。
>   - 納期に対する不確実性や遅延の原因について、具体的に何がありますか？
>   - プロジェクトチーム内でのコミュニケーションや認識齟齬がどのように影響を与えましたか？
>   - どのようなリソースやサポートがあれば、納期へのリスクを軽減できると思いますか？
> 5. 以下のアドバイスや解決策を提案します。
>   - プロジェクトチームとデータベース管理者との間のコミュニケーションを改善し、共通の認識を確立することが重要です。プロジェクトのスコープや仕様変更について明確な合意を得るよう努めましょう。
>   - 納期へのリスクを把握するために、可能な限り早く問題の特定や工数の見積もりを行いましょう。
>   - プロジェクトスケジュールの再調整やリソースの再配置を検討し、納期への影響を最小限に抑えるための計画を立てましょう。
>   - ストレスや不安を感じたときは、自己管理やストレスマネジメントの方法を活用することも大切です。時間管理や優先順位の設定、適度な休憩やリラックス方法を取り入れることで、心のバランスを保ちましょう。

なんとなく的確になったような気がしますが、まだ1つしか例がなく、明確に性能差が分かる状態ではないです。そこで、もっと多くの例を使って検証してみましょう。

# バッチ実行による実験
次に、バッチ実行の機能を利用して複数のテストケースを同時に実行してみましょう。
「評価」をクリックするとバッチ実行の画面が開きます。

投入したいデータセットを選択します。なお、基本的にはCSVファイルを利用します。

![batch](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/94aa53ca-62f1-f842-e7a6-66f13ed4e68d.png)

その後、データと入力のマッピングの設定を行い実行します。
![2023-12-08_20h54_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/36f55573-2245-7c82-8102-5320c316b514.png)

バッチ実行が開始すると、各バリアント毎にジョブが生成され、それぞれの実行結果が一覧表示されます。
![batch1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/ad81df1e-111d-57cb-7bd2-413d817e2139.png)
![batch2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/e0777c6f-5808-7a99-3908-79599bd7aa24.png)

# おわりに
今回は生成 AI のプロンプト開発に役立つプロンプトフローの紹介をしました。ナレッジコミュニケーションでは「[Musubite](https://musubite-job.com/)」というエンジニア同士のカジュアルトークサービスを利用しています。生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication