LLMアプリ開発を楽にするPromptyをPromptflowで使ってみよう

株式会社ユーザベース スピーダ事業 の阿波連です。

私が参加しているアジャイルダッシュボードチームはスピーダ経済情報リサーチのダッシュボードを開発しています。

ダッシュボードには「AI決算サマリー」という機能があります。先日、要約データを更新し、以前よりも要約精度が良くなりました。

今回は、AI決算サマリーの裏側で使用しているLLMと関連して、PromptflowにあるPrompty機能について紹介します。なお、Prompty機能は2024年11月27日執筆時点でExperimental featureですので利用時は考慮してください

Promtflowとprompty

PromptflowはAzure Machine Learning StudioにあるLLMに特化したAI開発ツールです。ローコードでAI開発をすることができる優れものです。

learn.microsoft.com

Promptflowではjinjaというテンプレートファイルにプロンプトを記載し、LLMツールからそのjinjaファイルを呼び出すことでLLMにリクエストを送ります。

一方、PromptyはMicrosoftが提供するプロンプトフォーマットです。Promptyは

"Prompty standardizes prompts and their execution into a single asset."

とGithubのREADMEにある通り、プロンプトと実行(環境)を標準化することで、プロンプトの再利用性を高めることができます。

prompty.ai

やっていることはとてもシンプルで、LLMのコネクション情報(どのモデルを、どういうパラメータで)と、プロンプトを合体させたファイルです。

このフォーマットの優れている点は、ポータビリティです。モデルとパラメータとプロンプトは基本的に独立しておらず、どれかが変化したらアウトプットがまるっと変わってしまいます。それを一つのファイルにまとめることで、このフォーマットをサポートしているツールから使うことができます。Promptflowはもちろん、Langchainなどでも使えるようです。

また、2024年5月に開催されたMicrosoft BuildにもPromptyを紹介しているセッションがありました。動画の37:45から紹介があります。 調べてみるまで知らなかったのですが、Azure AI Studioで検証したプロンプトをワンクリックでPromptyとしてExportする機能があるようです。

PromptflowからPromptyを使ってみよう

PromptflowからPromptyファイルをロードして、関数のように呼び出すことで、プロンプトを実行することができます。 以下を参考に、試しにVSCodeでLLMにプロンプトを送ってみましょう。(ここではPromptflowのセットアップやフローの作り方については省略します。)

microsoft.github.io

今回は以下のように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では以下のようなフローが見えています。

flow.dag.yamlのVisual

実行してみます。(注: 改行が含まれてしまうため、ここでは見栄えのため改行コードを実際に改行した結果を出しています。)

{
    "answer": "```
  ___________
< しまうま >
  =========
         \\
          \\
            ^__^
            (oo)\\_______
            (__)\\       )\\/\\
                ||----w |
                ||     ||
```"
}

Promptyの威力

冒頭に紹介した通り、コネクション情報とプロンプトがセットになっているため、アプリ側とのインターフェースさえ変更しなければ、プロンプトの入れ替えが簡単になっている点が魅力的です。 LLMを利用したアプリケーションにおいて、プロンプトは核となる要素だと感じているため、実験と並行してアプリケーションを作っていくためにぜひPromptyの導入を検討してみてください。

Page top