Prompt Flowを使ってプロンプトのテストフローを構築する
はじめに
viagate株式会社でインターンをしている羽戸(はと)です。普段はChat InsightというAIインタビューサービスの開発を担当しています。
近年、大規模言語モデル(LLM)の活用が広がる中で、プロンプトの設計とテストはますます重要になっています。プロンプトの質はアウトプットに大きな影響を与えるため、迅速かつ正確にプロンプトを評価することが求められます。そこで「Prompt Flow」を用いることでプロンプトのテストフローを驚くほど簡単に構築できます💪
Prompt Flowとは、Microsoft社が提供するAIアプリケーション開発ツールの1つです。
以下はMicrosoft社のPrompt Flowについての説明記事です。
Azure Machine Learning プロンプト フローとは
Prompt Flowはログの保存機能や、HTML形式での可視化機能があるため、テスト結果を保存しておくことができます。
プロンプトの定義やLLMとのやり取りなどの処理ごとにそれぞれのnodeを作ってフローを構築する方法を紹介している記事はたくさんありますが、今回は1つのnodeでフローを構築する方法を紹介します。
nodeを使う場合はjinja2形式のプロンプトが使われますが、テストしたいプロンプトがjinja2形式でない場合も多々あります。そのような場合に対応するために、今回はnodeを使わずにコードで構築します。
インストール
0. Pythonのバージョン確認
Prompt Flowを使うためには、Python 3.9以上が必要です。
venvなどを使って適切なPython環境を用意してください。
1. ライブラリのインストール
pip
を使ってpromptflow
とpromptflow-tools
をインストールします。
$ pip install promptflow promptflow-tools
以下のコマンドでインストールが成功しているか確認します。
$ pf -v
{
"promptflow": "1.14.0",
"promptflow-core": "1.14.0",
"promptflow-devkit": "1.14.0",
"promptflow-tracing": "1.14.0"
}
2. (Visual Studio Codeの拡張機能のインストール)
Visual Studio Codeを使っている場合、Prompt Flowの拡張機能が用意されています。
拡張機能を使うことで、フローを可視化することができます。
今回の記事では使いませんが、興味がある方はインストールしてみてください。
プロジェクトの作成
以下のコマンドでプロジェクトを作成します。prompt-test
はプロジェクトの名前です。任意の名前を指定してください。
$ pf flow init --flow prompt-test
このようなプロジェクトが作成されていればOKです。
続いて、テストしたいプロンプトを作成します。今回は例として3つのプロンプトを一括でテストするフローを構築します。prompts
ディレクトリを作成し、その中にプロンプトを作成します。
prompt = '''
日本の首都を教えてください。
'''
prompt = '''
アメリカの首都を教えてください。
'''
prompt = '''
イギリスの首都を教えてください。
'''
次に各プロンプトをマッピングするファイルprompt_map.py
を作成します。
from prompts import (
prompt_1,
prompt_2,
prompt_3
)
PROMPT_MAP = {
'prompt_1': prompt_1.prompt,
'prompt_2': prompt_2.prompt,
'prompt_3': prompt_3.prompt
}
続いて、メインとなるスクリプトhello.py
を以下のように書き換えてください。
# ---------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# ---------------------------------------------------------
from promptflow.core import tool
import os
from dotenv import load_dotenv
from openai import OpenAI
import prompt_map
load_dotenv()
# The inputs section will change based on the arguments of the tool function, after you save the code
# Adding type to arguments and return value will help the system show the types properly
# Please update the function name/signature per need
# プロンプトマップの設定
PROMPT_MAP = prompt_map.PROMPT_MAP
# openaiのAPIキーを環境変数から取得
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
@tool
def my_python_tool(prompt: str) -> str:
prompt_text = PROMPT_MAP[prompt]
# openai clientの作成
client = OpenAI(api_key=OPENAI_API_KEY)
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": prompt_text
}
]
)
result = response.choices[0].message.content
return result
このコードでは、初めに入力として受け取ったプロンプトに対応するテキストをprompt_map.py
から取得し、OpenAIのAPIを通してリクエストを送信しています。
最後にフロー構成の設定ファイルであるflow.dag.yaml
を以下のように書き換えてください。
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json
aggregation: false
inputs:
prompt:
type: string
outputs:
result:
type: string
reference: ${hello.output}
nodes:
- name: hello
type: python
source:
type: code
path: hello.py
inputs:
prompt: ${inputs.prompt}
このファイルでは、hello.py
に渡す変数の定義や、出力の定義などを行っています。
変数を追加したりする場合は、このファイルを編集する必要があります。
テストの実行
実際にプロンプトのテストを行ってみます。
まず初めに、テスト項目を管理するdata.jsonl
を編集します。
{"prompt": "prompt_1"}
{"prompt": "prompt_2"}
{"prompt": "prompt_3"}
ここで定義した値が、hello.py
のprompt
に渡されるしくみになっています。
以下のコマンドでテストを実行します。
$ pf run create --flow prompt-test --data ./prompt-test/data.jsonl
以下のような結果が出力されれば成功です。
以下のコマンドで結果を確認することができます。{テスト名}
はテストコマンド出力のname
の値です。
$ pf run show-details --name {テスト名}
コマンドライン上で結果を確認する場合、inputの変数が多くなったりすると上のようにくずれて見にくくなることもあるので、HTML形式で結果を確認するのがおすすめです。
以下のコマンドでHTML形式で結果を確認することができます。
$ pf run visualize --name {テスト名}
出力結果はもちろん、それぞれのテストケースの処理時間やトークン消費量なども確認することができます。
おわりに
今回はPrompt Flowを使ってプロンプトのテストフローを構築しました。
今回はOpenAI APIを直接使いましたが、Semantic kernelやLangChainといったSDKをPrompt Flow上のPythonコードで動かしてプロンプトを評価することもできます。
プロダクトでSDKのクラスや関数をすでに定義している場合は、それらをPrompt Flow上で使うことで、簡単にプロンプトのテストを行うことができます。
Prompt Flowの導入を検討している方は、ぜひ試してみてください!!
Discussion