プロンプト フローを開発する
プロンプト フローは、大規模言語モデル (LLM) を利用した AI アプリケーションの開発サイクルを効率化する開発ツールです。 この記事では、Azure Machine Learning スタジオでプロンプト フローとチャット フローを作成および開発する方法について説明します。
LLM ベースの AI アプリケーションの勢いが拡大する中、プロンプト フローは、AI アプリケーションのプロトタイプ作成、実験、反復、デプロイのプロセスを簡素化する包括的なソリューションを提供します。 プロンプト フローを使用すると、次のことができます。
- 視覚化されたグラフを介して LLM、プロンプト、Python ツールを使用する実行可能フローを調整する。
- フローを簡単にテスト、デバッグ、反復処理する。
- プロンプト バリアントを作成し、そのパフォーマンスを比較する。
プロンプト フローを作成して開発する
プロンプト フローを作成するには、Azure Machine Learning スタジオの左側のナビゲーションで [プロンプト フロー] を選択し、[プロンプト フロー] ページで [作成] を選択します。
[新しいフローの作成] 画面では、次の方法でフローを作成できます。
- テンプレートから、標準、チャット、または評価フローを作成する。
- [ギャラリーを探す] から、使用できるサンプルを複製する。
- ローカル ファイルまたはファイル共有から既存のフローをインポートする。
フローを作成するには、目的のフロー カードの [作成] または [クローン] を選択します。 次の画面ペインで、必要に応じて新しいフローの名前を変更し、[作成] または [クローン] を選択できます。 新しいフローが作成 UI で開きます。
コンピューティング セッション
作成を開始する前に、フロー作成ページの上部にある [コンピューティング セッションの開始] を選択して、コンピューティング セッションを開始します。 フローの実行にはコンピューティング セッションが必要です。 コンピューティング セッションは、必要なすべての依存関係パッケージを含む Docker イメージなど、アプリケーションの実行に必要なコンピューティング リソースを管理します。
作成ページ
コンピューティング セッションの開始は数分かかる場合があります。 コンピューティング セッションの開始中に、フロー作成ページの各部分を調べます。
ページの左側にある [フロー] または "フラット" ビューは、フローを作成するメイン作業領域です。 フラット ビューでは、ノード、ツール、プロンプト、入力を編集すること、ノードまたはフロー全体を実行すること、出力を定義して表示することができます。
右上の [ファイル] には、フローのフォルダーとファイルの構造が表示されます。 各フローには、flow.dag.yaml ファイル、ソース コード ファイル、システム フォルダーを含むフォルダーがあります。 テスト、デプロイ、または共同作業用のファイルを追加、編集、削除、アップロード、またはダウンロードできます。
右下の [グラフ] ビューでは、フロー構造が視覚化されます。 拡大または縮小したり、自動レイアウトを使用したりできます。 このビューを直接編集することはできませんが、ノードを選択してフラット ビューで特定し、編集できます。
フロー入力とフロー出力
[入力] と [出力] のセクションでは、入力と出力を表示、追加、削除、編集できます。
フロー入力は、全体としてフローに渡されるデータです。 名前と種類を指定して入力スキーマを定義し、各入力の値を設定してフローをテストします。
${input.<input name>}
を使用して、フロー ノードのフロー入力を参照できます。フロー出力は、全体としてフローによって生成されるデータであり、フロー実行の結果が要約されています。 構文
${<node name>.output}
または${<node name>.output.<field name>}
を使用して単一ノード出力を参照することで、フロー出力値を定義できます。 フロー実行またはバッチ実行の完了後に、出力結果テーブルを表示してエクスポートできます。
フロー ツール
フローでは、LLM、Python、プロンプト、Serp API、Content Safety など、さまざまな種類のツールを使用できます。 ツールを選択すると、そのツールの新しいノードがフローの最後に追加されます。 ノード名を指定し、必要な構成を設定する必要があります。 ノード コントロールを使用して、フロー内のノードの位置を変更できます。
ノードの入力と出力
LLM およびプロンプト ツールでは、テンプレート言語として Jinja を使用してプロンプトを動的に生成できます。 たとえば、固定テキストを使用する代わりに入力名を {{}}
で囲むと、その場で置き換えることができます。
ノード [入力] と [出力] は、次の方法で設定できます。
- 入力の [値] を直接設定する。
${input.<input name>}
を使用してフロー入力を参照する。${<node name>.output}
または${<node name>.output.<field name>}
を使用してノード出力を参照する。
プロンプトまたは Python スクリプトの作成が完了したら、[入力の検証と解析] を選択して、プロンプト テンプレートと Python 関数の入力に基づいてノード入力がシステムで自動的に解析されるようにすることができます。
ノード出力を参照することで、ノードをリンクできます。 たとえば、Python ノードの入力で LLM ノードの出力を参照して、Python ノードで LLM ノードの出力を使用できるようにします。 [グラフ] ビューでは、2 つのノードが互いにリンクされているのを確認できます。
LLM ノード
Azure OpenAI LLM ノードの場合は、[接続]、[API]、[deployment_name] を選択し、[プロンプト] を設定する必要があります。 接続は、秘密鍵、または Azure OpenAI とのやり取りに必要なその他の機密性の高い資格情報を安全に保存および管理するために使用します。
まだ接続していない場合は、LLM ノードを追加する前に作成し、Azure OpenAI リソースにチャットまたは完了のデプロイがあることを確認します。 詳細については、「接続を設定」および「Azure OpenAI を使用してリソースを作成し、モデルをデプロイする」を参照してください。
Python ノード
Python ツールを使用するには、Python スクリプト、入力値、その他の構成を設定する必要があります。 新しい Python ノードには、入力と出力を定義する次の定型の Python 関数が用意されています。
from promptflow import tool
# 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
@tool
def my_python_tool(input1: str) -> str:
return 'hello ' + input1
条件付きコントロール
プロンプト フローには条件付き制御が用意されており、それを使用してフロー内の任意のノードの実行条件を設定できます。
条件付き制御では、フロー内の各ノードを "アクティブ化構成" に関連付ける機能が提供されます。この構成は、ノードを実行するタイミングを決定する when
ステートメントです。 この機能の利点を認識できるのは、特定のタスクの実行が前のタスクの結果に依存する複雑なフローの場合です。 条件付き制御を使用すると、指定した条件が満たされた場合にのみ実行するように特定のノードを構成できます。
ノード カードの [構成のアクティブ化] ボタンを選択して、ノードのアクティブ化構成を設定できます。 When ステートメントを追加し、条件を設定します。 フロー入力またはノード出力を参照することで、条件を設定できます。 たとえば、条件 ${input.<input name>}
または ${<node name>.output}
を特定の値として設定できます。 条件が満たされていない場合、ノードはスキップされ、ノードの状態は [バイパス] と表示されます。
フローをテストする
単一ノードを実行するか、フロー全体を実行して、フローをテストできます。
- 単一ノードを実行するには、ノード カードの [実行] アイコンを選択します。 ノードの実行が完了したら、ノードの [出力] セクションで結果をすばやく確認できます。
- フロー全体を実行するには、ページの上部にある [実行] を選択します。
フロー出力
[実行] を選択してフローを実行すると、ページの上部にあるバナーに実行状態が表示されます。 上部バナーまたは上部メニュー バーの [出力の表示] を選択して、詳細な入力、出力、フロー実行、オーケストレーション情報を表示します。
フロー実行が完了したら、[出力の表示] を選択して、[出力] 画面ですべての履歴出力を確認できます。
[出力] 画面の [トレース] タブを選択すると、フローの実行時間と関連するトークンのコストに関する情報を示すグラフが表示されます。 [ノード名] の下の [フロー] を選択すると、右側のペインに詳細なフローの概要情報が表示されます。
[フロー] を展開し、任意のステップを選択すると、そのステップの詳細情報が表示されます。 スパン ツリー内の各ノードの実行期間を確認できます。 詳細については、「トレース スパンの仕様」を参照してください。
チャット フローを開発する
"チャット フロー" は、会話型アプリケーション開発用に設計された特定の種類のプロンプト フローです。 チャット フローは標準フロー機能に基づいて構築されており、チャットの入力と出力およびチャット履歴に対する強化されたサポートを提供します。 チャット フローを使用すると、チャットの入力と出力を処理するチャットボットを簡単に作成できます。
チャット フローを作成するには、[新しいフローの作成] 画面で、[チャット フロー] カードの [作成] を選択するか、[ギャラリーを探す] で [チャット] を選択し、使用できるフローの 1 つを複製します。
チャット フローの作成ページでは、チャット フローは、標準および評価フローと区別するために [チャット] ラベルでタグ付けされています。 チャット フローをテストするには、ページの上部にある [チャット] を選択して、会話用の [チャット] ボックスを開きます。
チャット入力、チャット出力、チャット履歴
チャット フローを標準フローと区別する最も重要な要素は、"チャット入力"、"チャット履歴"、"チャット出力" です。 チャット フローではチャット履歴とチャット入力が必要です。
チャット入力とは、ユーザーによってチャットボットに送信されたメッセージまたはクエリを指します。 チャット入力を効果的に処理することは会話を成功させるために重要で、これにはユーザーの意図の理解、関連情報の抽出、適切な応答のトリガーが含まれます。
チャット履歴は、ユーザー入力と AI によって生成された出力の両方を含む、ユーザーとチャットボットの間のすべてのやり取りの記録です。 チャット履歴の保持は、会話コンテキストを追跡し、AI がコンテキストに関連する応答を生成できるようにするために不可欠です。
チャット出力とは、ユーザーの入力に応答してユーザーに送信される、AI によって生成されたメッセージを指します。 コンテキスト的に適切で人を引きつけるチャット出力を生成することは、肯定的なユーザー エクスペリエンスに不可欠です。
チャット フローには複数の入力を含めることができます。 チャット フローの [入力] セクションでは、いずれかの入力を [チャット入力] としてマークし、[チャット] ボックスに質問を入力してチャット入力値を設定します。
チャット履歴の管理
チャット履歴を管理できるように、[入力] セクションの chat_history
はチャット履歴を表すために予約されています。 chat_history
を手動で編集することはできません。
チャット履歴は入力と出力の一覧として構造化されています。 ユーザー チャット入力、生成されたチャット出力、その他のフロー入力と出力など、チャット ボックス内のすべてのやり取りは、チャット履歴に自動的に保存されます。 次のコードはチャット履歴の構造を示しています。
[
{
"inputs": {
"<flow input 1>": "xxxxxxxxxxxxxxx",
"<flow input 2>": "xxxxxxxxxxxxxxx",
"<flow input N>""xxxxxxxxxxxxxxx"
},
"outputs": {
"<flow output 1>": "xxxxxxxxxxxx",
"<flow output 2>": "xxxxxxxxxxxxx",
"<flow output M>": "xxxxxxxxxxxxx"
}
},
{
"inputs": {
"<flow input 1>": "xxxxxxxxxxxxxxx",
"<flow input 2>": "xxxxxxxxxxxxxxx",
"<flow input N>""xxxxxxxxxxxxxxx"
},
"outputs": {
"<flow output 1>": "xxxxxxxxxxxx",
"<flow output 2>": "xxxxxxxxxxxxx",
"<flow output M>": "xxxxxxxxxxxxx"
}
}
]
Note
[チャット] ボックスでテストを実行すると、チャット履歴が自動的に保存されます。 バッチ実行の場合は、バッチ実行データセット内にチャット履歴を自分で含める必要があります。 使用できるチャット履歴がない場合は、バッチ実行データセット内で chat_history
を空のリスト []
に設定します。
過去のやり取りを取得するには、プロジェクトで chat_history
を参照します。 そうすると、前の入力と出力を参照して、コンテキストに関連した応答を作成できます。 チャット履歴をプロンプトに組み込むことは、コンテキストを認識した、人を引きつけるチャットボット応答を作成するために不可欠です。
Jinja 言語の for ループ構文を使用して、chat_history
から入力と出力の一覧を表示できます。
{% for item in chat_history %}
user:
{{item.inputs.question}}
assistant:
{{item.outputs.answer}}
{% endfor %}
チャット ボックスを使用してテストする
[チャット] ボックスには、チャットボットとの会話をシミュレートすることで、チャット フローをテストする対話型の方法が用意されています。 [チャット] ボックスを使用してチャット フローをテストするには、次のようにします。
- [チャット] を選択して [チャット] サイド バーを開きます。
- 画面の下部にあるチャット ボックスにテスト質問を入力して、チャットボットに送信します。
- チャットボットの応答を確認して、コンテキスト的に適切で正確であることを確認します。
- 作成ページの上部にある [出力の表示] を選択すると、チャットの入力、出力、履歴をすばやく表示してデバッグできます。
- [出力] 画面で、[トレース] タブを選択し、[フロー] を選択すると、右側のペインにフローの詳細な概要情報が表示されます。 [フロー] を展開し、任意のステップを選択すると、そのステップの詳細情報が表示されます。