🔖

Prompt Flowを使ってプロンプトのテストフローを構築する

2024/08/01に公開

はじめに

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を使ってpromptflowpromptflow-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 flow for VS Code

プロジェクトの作成

以下のコマンドでプロジェクトを作成します。prompt-testはプロジェクトの名前です。任意の名前を指定してください。

$ pf flow init --flow prompt-test

このようなプロジェクトが作成されていればOKです。
プロジェクト構造

続いて、テストしたいプロンプトを作成します。今回は例として3つのプロンプトを一括でテストするフローを構築します。promptsディレクトリを作成し、その中にプロンプトを作成します。
prompt構成

prompts/prompt_1.py
prompt = '''
日本の首都を教えてください。
'''
prompts/prompt_2.py
prompt = '''
アメリカの首都を教えてください。
'''
prompts/prompt_3.py
prompt = '''
イギリスの首都を教えてください。
'''

次に各プロンプトをマッピングするファイルprompt_map.pyを作成します。

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を以下のように書き換えてください。

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を以下のように書き換えてください。

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を編集します。

data.jsonl
{"prompt": "prompt_1"}
{"prompt": "prompt_2"}
{"prompt": "prompt_3"}

ここで定義した値が、hello.pypromptに渡されるしくみになっています。

以下のコマンドでテストを実行します。

$ pf run create --flow prompt-test --data ./prompt-test/data.jsonl

以下のような結果が出力されれば成功です。
テストコマンド出力

以下のコマンドで結果を確認することができます。{テスト名}はテストコマンド出力のnameの値です。

$ pf run show-details --name {テスト名}

テスト結果確認(コマンドライン)

コマンドライン上で結果を確認する場合、inputの変数が多くなったりすると上のようにくずれて見にくくなることもあるので、HTML形式で結果を確認するのがおすすめです。

以下のコマンドでHTML形式で結果を確認することができます。

$ pf run visualize --name {テスト名}

テスト結果確認(html)

出力結果はもちろん、それぞれのテストケースの処理時間やトークン消費量なども確認することができます。

おわりに

今回はPrompt Flowを使ってプロンプトのテストフローを構築しました。

今回はOpenAI APIを直接使いましたが、Semantic kernelやLangChainといったSDKをPrompt Flow上のPythonコードで動かしてプロンプトを評価することもできます。

プロダクトでSDKのクラスや関数をすでに定義している場合は、それらをPrompt Flow上で使うことで、簡単にプロンプトのテストを行うことができます。

Prompt Flowの導入を検討している方は、ぜひ試してみてください!!

ヴィアゲート株式会社 Techチーム

Discussion