株式会社ユーザベース スピーダ事業 の阿波連です。
私が参加しているアジャイルダッシュボードチームはスピーダ経済情報リサーチのダッシュボードを開発しています。
ダッシュボードには「AI決算サマリー」という機能があります。先日、要約データを更新し、以前よりも要約精度が良くなりました。
今回は、AI決算サマリーの裏側で使用しているLLMと関連して、PromptflowにあるPrompty機能について紹介します。なお、Prompty機能は2024年11月27日執筆時点でExperimental featureですので利用時は考慮してください。
Promtflowとprompty
PromptflowはAzure Machine Learning StudioにあるLLMに特化したAI開発ツールです。ローコードでAI開発をすることができる優れものです。
Promptflowではjinjaというテンプレートファイルにプロンプトを記載し、LLMツールからそのjinjaファイルを呼び出すことでLLMにリクエストを送ります。
一方、PromptyはMicrosoftが提供するプロンプトフォーマットです。Promptyは
"Prompty standardizes prompts and their execution into a single asset."
とGithubのREADMEにある通り、プロンプトと実行(環境)を標準化することで、プロンプトの再利用性を高めることができます。
やっていることはとてもシンプルで、LLMのコネクション情報(どのモデルを、どういうパラメータで)と、プロンプトを合体させたファイルです。
このフォーマットの優れている点は、ポータビリティです。モデルとパラメータとプロンプトは基本的に独立しておらず、どれかが変化したらアウトプットがまるっと変わってしまいます。それを一つのファイルにまとめることで、このフォーマットをサポートしているツールから使うことができます。Promptflowはもちろん、Langchainなどでも使えるようです。
また、2024年5月に開催されたMicrosoft BuildにもPromptyを紹介しているセッションがありました。動画の37:45から紹介があります。 調べてみるまで知らなかったのですが、Azure AI Studioで検証したプロンプトをワンクリックでPromptyとしてExportする機能があるようです。
PromptflowからPromptyを使ってみよう
PromptflowからPromptyファイルをロードして、関数のように呼び出すことで、プロンプトを実行することができます。 以下を参考に、試しにVSCodeでLLMにプロンプトを送ってみましょう。(ここではPromptflowのセットアップやフローの作り方については省略します。)
今回は以下のようにPromptyファイルを用意しました。(使うLLMやコネクション名は伏せています)
--- name: cowsay description: cow-say. model: api: chat configuration: type: azure_openai azure_deployment: (deployment_name) connection: (connection_name) parameters: temperature: 0 max_tokens: 2048 inputs: body: type: string sample: body: hi, i am cow. --- system: あなたはアスキーアート職人です。 以下の[#牛に言わせる言葉]の内容を使い、cowsayコマンドの出力のように牛にメッセージを言わせてください。 user: #牛に言わせる言葉 {{body}}
このPromptyを使うためのPythonスクリプト( cs.py
)も用意しました。
Promptyを扱うためには promptflow.core
からPromptyをimportする必要がある点に注意してください。
from promptflow.core import tool from promptflow.core import Prompty @tool def execute(dialogue: str) -> str: prompty_func = Prompty.load(source="cowsay.prompty") return prompty_func(body=dialogue)
flow.dag.yaml
は以下のように定義しました。
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json environment: python_requirements_txt: requirements.txt inputs: dialogue: type: string default: しまうま outputs: answer: type: string reference: ${cowsay.output} nodes: - name: cowsay type: python source: type: code path: cs.py inputs: dialogue: ${inputs.dialogue}
VSCodeでは以下のようなフローが見えています。
実行してみます。(注: 改行が含まれてしまうため、ここでは見栄えのため改行コードを実際に改行した結果を出しています。)
{ "answer": "``` ___________ < しまうま > ========= \\ \\ ^__^ (oo)\\_______ (__)\\ )\\/\\ ||----w | || || ```" }
Promptyの威力
冒頭に紹介した通り、コネクション情報とプロンプトがセットになっているため、アプリ側とのインターフェースさえ変更しなければ、プロンプトの入れ替えが簡単になっている点が魅力的です。 LLMを利用したアプリケーションにおいて、プロンプトは核となる要素だと感じているため、実験と並行してアプリケーションを作っていくためにぜひPromptyの導入を検討してみてください。