フローを開発する
プロンプト フローは、大規模言語モデル (LLM) によって動作する AI アプリケーションの開発サイクル全体を合理化するために設計された開発ツールです。 LLM ベースの AI アプリケーションの勢いが世界中で拡大し続ける中、プロンプト フローは、AI アプリケーションのプロトタイプ作成、実験、反復、デプロイのプロセスを簡素化する包括的なソリューションを提供します。
プロンプト フローを使用すると、次のことが可能になります。
- 視覚化されたグラフを介して LLM、プロンプト、Python ツールを使用する実行可能フローを調整する。
- フローを簡単にテスト、デバッグ、反復処理する。
- プロンプト バリアントを作成し、そのパフォーマンスを比較する。
この記事では、Azure Machine Learning スタジオで最初のプロンプト フローを作成して開発する方法について説明します。
プロンプト フローを作成して開発する
Studio で、左側のナビゲーション バーから [プロンプト フロー] タブを選択します。 [作成] を選択して最初のプロンプト フローを作成します。 フローを作成するには、ギャラリーで使用可能なサンプルを複製するか、最初からフローを作成します。 ローカルまたはファイル共有にフロー ファイルが既にある場合は、ファイルをインポートしてフローを作成することもできます。
フローの作成
左側はフラット ビューで、フローを作成できるメインの作業領域です。たとえば、フローにツールを追加したり、プロンプトを編集したり、フロー入力データを設定したり、フローを実行したり、出力を表示したりできます。
右上にあるのは、フロー ファイル ビューです。 各フローは、flow.dag.yaml ファイル、ソース コード ファイル、システム フォルダーを含むフォルダーで表すことができます。 新しいファイルの追加、既存のファイルの編集、ファイルの削除を行うことができます。 ファイルをローカルにエクスポートしたり、ローカルからファイルをインポートしたりすることもできます。
フラット化ビューでノードをインライン編集するだけでなく、[生ファイル モード ] トグルをオンにし、ファイル名を選択して開いているファイル タブでファイルを編集することもできます。
右下にあるのは、視覚化専用のグラフ ビューです。 これは、開発中のフロー構造を示しています。 拡大、縮小、自動レイアウトなどを行うことができます。
Note
グラフ ビューを直接編集することはできませんが、ノードを選択して対応するノード カードをフラット ビューで見つけ、インライン編集を行うことができます。
コンピューティング セッション
作成を開始する前に、まずコンピューティング セッションを開始する必要があります。 コンピューティング セッションは、プロンプト フローの実行に必要なコンピューティング リソースとして機能し、必要なすべての依存関係パッケージを含む Docker イメージを含みます。 これはフロー実行に必須のものです。
フロー入力とフロー出力
フロー入力は、全体としてフローに渡されるデータです。 名前と型を指定して、入力スキーマを定義します。 各入力の入力値を設定して、フローをテストします。 ${input.[input name]}
構文を使用して、フローノードのフロー入力を後で参照できます。
フロー出力は、全体としてフローによって生成されるデータであり、フロー実行の結果が要約されています。 フロー実行またはバッチ実行の完了後に、出力テーブルを表示してエクスポートできます。 構文 ${[node name].output}
または ${[node name].output.[field name]}
を使用して、フローの単一ノード出力を参照してフロー出力値を定義します。
さまざまなツールを使用してフローを開発する
フローでは、LLM、Python、Serp API、Content Safety など、さまざまな種類のツールを使用できます。
ツールを選択すると、新しいノードがフローに追加されます。 ノード名を指定し、ノードに必要な構成を設定する必要があります。
たとえば、LLM ノードの場合は、接続、デプロイ、プロンプトの設定などを選択する必要があります。接続は、秘密鍵、または Azure OpenAI とのやり取りに必要なその他の機密性の高い資格情報を安全に保存および管理するのに役立ちます。 まだ接続していない場合は、まず接続を作成し、Azure OpenAI リソースにチャットまたは完了のデプロイがあることを確認する必要があります。 LLM およびプロンプト ツールでは、テンプレート言語として Jinja を使用してプロンプトを動的に生成できます。 たとえば、固定テキストの代わりに入力名を {{}}
で囲むと、その場で置き換えることができます。
Python ツールを使用するには、Python スクリプトの設定や、入力値の設定などを行う必要があります。入力と出力を含む Python 関数を、次のように定義する必要があります。
プロンプトまたは Python スクリプトの作成が完了したら、[入力の検証および解析] を選択して、プロンプト テンプレートと Python 関数の入力に基づいてノード入力がシステムで自動的に解析されるようにすることができます。 ノード入力値は、次の方法で設定できます。
- 入力ボックスに値を直接設定する
${input.[input name]}
構文を使用してフロー入力を参照する${[node name].output}
または${[node name].output.[field name]}
構文を使用してノード出力を参照する
ノードのリンク付け
ノード出力を参照することで、ノードを互いにリンクできます。 たとえば、Python ノード入力で LLM ノード出力を参照して、Python ノードで LLM ノード出力を消費できるようにし、グラフ ビューで 2 つのノードが互いにリンクされていることを確認できます。
フローに対する条件付き制御を有効にする
プロンプト フローでは、フローを効率的に実行する方法だけでなく、開発者向けの強力な機能である条件付き制御も提供されており、この機能により、ユーザーはフロー内の任意のノードを実行するための条件を設定できます。
条件付き制御では、その中核として、フロー内の各ノードをアクティブ化構成に関連付ける機能が提供されます。この構成は基本的に、ノードを実行するタイミングを決定する "when" ステートメントです。 この機能の能力が認識できるのは、特定のタスクの実行が前のタスクの結果に依存する複雑なフローがある場合です。 条件付き制御を利用することで、指定した条件が満たされた場合にのみ実行するように特定のノードを構成できます。
具体的には、ノード カードの [Activate config] \(構成のアクティブ化\) ボタンを選択して、ノードのアクティブ化構成を設定できます。 "when" ステートメントを追加し、条件を設定できます。
フロー入力またはノード出力を参照することで、条件を設定できます。 たとえば、条件 ${input.[input name]}
を特定の値として設定したり、${[node name].output}
を特定の値として設定したりできます。
条件が満たされていない場合、ノードはスキップされます。 ノードの状態は "バイパス" と表示されます。
フローをテストする
フローは次の 2 つの方法でテストできます。
- 単一ノードを実行します。
- 単一ノードを実行するには、フラット ビューのノードで [実行] アイコンを選択します。 実行が完了したら、ノード出力セクションで結果をすばやく確認できます。
- フロー全体を実行します。
- フロー全体を実行するには、右上にある [実行] ボタンを選択します。
テスト結果とトレースを表示する (プレビュー)
フロー全体の実行について、フローを実行した後、実行バナーで実行状態を確認できます。 その後、[トレースの表示] を選択し、結果を確認してフローの実行を監視するためのトレースを表示できます。ここでは、フロー全体と各ノードの入力と出力と、デバッグに関する詳細情報を確認できます。 これは、実行中と実行が完了した後に使用できます。
トレース ビューについて
プロンプト フローのトレースの種類は、フローとして指定されます。 トレース ビュー内では、フロー オーケストレーションに使用されるツールの明確なシーケンスを監視できます。
フロー ルートの下の各レベル 2 スパンはフロー内のノードを表し、関数呼び出しの形式で実行されるため、スパンの種類は関数として識別されます。 スパン ツリー内の各ノードの実行期間を確認できます。
スパン ツリーでは、LLM 呼び出しは LLM スパンとして簡単に識別できます。 これにより、LLM 呼び出しの期間と関連するトークン コストに関する情報が提供されます。
スパンをクリックすると、右側に詳細情報が表示されます。 これには、入力と出力、未加工の JSON、例外が含まれます。これらはすべて、監視とデバッグに役立ちます。
Note
プロンプト フロー SDK では、LLM、関数、埋め込み、取得、フローなど、いくつかのスパンの種類を定義しました。 指定された属性とイベントに実行情報を含むスパンは、システムによって自動的に作成されます。
スパンの種類の詳細については、「トレース スパンの仕様」を参照してください。
フローの実行が完了した後、結果を確認するために、[テスト結果の表示] ボタンを選択して、一覧ですべての過去の実行レコードを確認できます。 既定では、過去 7 日間に作成された実行レコードが表示されます。 [フィルター] を選択して条件を変更できます。
実行レコードの [名前] を選択して、トレース ビューに詳細情報を表示することもできます。
チャット フローを開発する
チャット フローは会話型アプリケーション開発用に設計されており、標準フローの機能に基づいて構築され、チャットの入力/出力とチャット履歴管理の高度なサポートを提供します。 チャット フローを使用すると、チャットの入力と出力を処理するチャットボットを簡単に作成できます。
チャット フローの作成ページでは、チャット フローは、標準フローや評価フローと区別するために "チャット" ラベルでタグ付けされています。 チャット フローをテストするには、[チャット] ボタンを選択して会話用のチャット ボックスをトリガーします。
チャットの入力/出力とチャット履歴
チャット フローを標準フローと区別する最も重要な要素は、チャット入力、チャット履歴、チャット出力です。
- チャット入力: チャット入力とは、ユーザーによってチャットボットに送信されたメッセージまたはクエリを指します。 チャット入力を効果的に処理することは会話を成功させるために重要で、これにはユーザーの意図の理解、関連情報の抽出、適切な応答のトリガーが含まれます。
- チャット履歴: チャット履歴は、ユーザー入力と 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 %}
チャット ボックスを使用してテストする
チャット ボックスには、チャットボットとの会話をシミュレートすることで、チャット フローをテストする対話型の方法が用意されています。 チャット ボックスを使用してチャット フローをテストするには、次の手順に従います。
- [チャット] ボタンを選択して、チャット ボックスを開きます。
- テスト入力をチャット ボックスに入力し、Enter キーを選択してチャットボットに送信します。
- チャットボットの応答を確認して、コンテキスト的に適切で正確であることを確認します。
- [トレースの表示] では、すばやく監視およびデバッグできます。