Dify の ワークフロー の概要
以下の記事が面白かったので、簡単にまとめました。
1. ワークフロー
1-1. ワークフロー
「ワークフロー」は、複雑なタスクを小さな「ノード」に分割することで、LLMアプリケーションのモデル推論への依存を減らし、システムの説明可能性、安定性、耐障害性を向上させます。
「ワークフロー」の種類は、次のとおりです。
1-2. Chatflow
自然言語入力におけるユーザー意図認識の複雑さに対処するため、「質問分類」「質問書き換え」「サブ質問分割」などの問題理解ノードを提供します。さらに、LLMに外部環境との対話機能、すなわち「オンライン検索」「数学計算」「天気問い合わせ」「画像生成」などのツール呼び出し機能を提供します。
1-3. Workflow
自動化・バッチ処理シナリオで複雑なビジネスロジックを解決するため、「コード」「IF/ELSE」「マージ」「テンプレート」などの豊富なロジックノードを提供します。さらに、「トリガー」機能も提供します。 時間とイベントに応じて自動化されたプロセスの構築を容易にします。
2. ユースケース
2-1. カスタマーサービス
LLMをカスタマーサービスシステムに統合することで、FAQを自動化し、サポートチームの作業負荷を軽減できます。LLMは、顧客のクエリのコンテキストと意図を理解し、役立つ正確な応答をリアルタイムで生成できます。
2-2. コンテンツ生成
ブログ投稿、製品説明、マーケティング資料の作成が必要な場合でも、LLMは高品質のコンテンツの生成を支援します。「概要」や「トピック」を提供するだけで、LLMは広範な知識ベースを使用して、魅力的で有益な、構造化されたコンテンツを作成します。
2-3. タスクの自動化
「Trello」「Slack」「Lark」など、さまざまなタスク管理システムと統合して、プロジェクトとタスクの管理を自動化できます。自然言語処理を使用することにより、LLMは手動介入なしでユーザー入力の理解と解釈、タスクの作成、ステータスの更新、優先順位の割り当てを行うことができます。
2-4. データ分析とレポート作成
大規模なデータセットを分析し、レポートや概要を生成するために使用できます。 関連情報をLLMに提供することで、トレンド、パターン、洞察を特定し、生データを実用的なインテリジェンスに変換できます。これは、データに基づいた意思決定を行いたい企業にとって特に価値があります。
2-4. 電子メールの自動化
LLMは、電子メール、ソーシャル メディアの更新、その他の形式のコミュニケーションの下書きに使用できます。 簡単な概要や重要なポイントを提供することで、LLM は、適切に構造化され、一貫性があり、文脈に関連したメッセージを生成できます。 これにより、時間を大幅に節約し、明確かつ専門的な回答を得ることができます。
3. キーコンセプト
3-1. ノード
「ノード」はワークフローの主要コンポーネントです。 異なる機能を持つ「ノード」を接続することで、ワークフロー内の一連の操作が実行されます。
「 ノード」のカテゴリは、次のとおりです。
3-2. 変数
「変数」は、ワークフロー内のノードの入力と出力をリンクするために重要であり、プロセス全体にわたる複雑な処理ロジックの実装を容易にします。
3-3. ChatflowとWorkflowのノードの違い
・開始ノード
・終了ノード
・回答ノード
・LLMノード
・質問分類器ノード
4. ノード
4-1. 開始ノード
「開始ノード」は、ワークフローを開始するための変数を入力するノードです。すべてのワークフローには、ワークフローのエントリポイントとして機能する「開始ノード」が必要です。
「開始ノード」の入力のフィールドタイプは、次のとおりです。
ワークフローの実行により、「開始ノード」で定義された変数の値の入力が求められます。このステップにより、指定されたプロセスを進めるために必要な情報がすべてワークフローに確実に含まれるようになります。
4-2. 終了ノード
Workflowの最終出力コンテンツを定義します。すべてのWorkflowには、実行後に最終結果を出力するために少なくとも1つの「終了ノード」が必要です。「終了」ノードはプロセスの終了点として機能し、それを超えるとノードを追加できなくなります。Workflowでは、プロセスが「終了ノード」に到達した場合にのみ実行結果が出力されます。プロセスに条件分岐が含まれる場合は、複数の「終了ノード」を定義する必要があります。
4-3. 回答ノード
Chatflowでの応答コンテンツの定義を行います。テキストエディタでは、応答形式を柔軟に決定できます。これには、テキストの固定ブロックの作成、前のステップからの出力変数を応答コンテンツとして利用すること、またはカスタムテキストと応答用の変数のマージが含まれます。
「回答ノード」は、いつでもシームレスに統合して、コンテンツを対話応答に動的に配信できます。このセットアップはライブ編集構成モードをサポートしており、テキストと画像の両方のコンテンツを一緒に配置できます。
4-4. LLMノード
質問応答または自然言語処理のための大規模言語モデルの呼び出しを行います。「LLMノード」内では、適切なモデルの選択、プロンプト作成、プロンプトで参照されるコンテキストの設定、メモリの設定、メモリウィンドウサイズの調整を行うことができます。
タスクに適したモデルを選択するには、「設定 - モデルプロバイダー」でモデルの設定を完了しておく必要があります。
4-5. 知識取得ノード
「知識取得ノード」は、Dify知識ベースからユーザーの質問に関連するテキストコンテンツをクエリするように設計されており、LLMによる後続の回答のコンテキストとして使用できます。
「知識取得ノード」の設定手順は、次のとおりです。
(1) クエリ変数の選択
知識ベース検索シナリオでは、通常、クエリ変数はユーザーの入力質問を表します。会話型アプリケーションの「開始ノード」では、システムはユーザー入力変数として「sys.query」を事前に設定します。この変数は、ユーザーの質問に最も密接に関連するテキストセグメントの知識ベースをクエリするために使用できます。
(2) クエリの知識ベースの選択
「知識取得ノード」内で、Difyから既存の知識ベースを追加できます。Dify内で知識ベースを作成する手順については、知識ベースのドキュメントを参照してください。
(3) 取得戦略の設定
ノード内の個々の知識ベースのインデックス付け戦略と取得モードを変更することができます。これらの設定の詳細な説明については、知識ベースのドキュメントを参照してください。
「Dify」は、さまざまな知識ベース検索シナリオに対して、「N-choose-1 Recall」と「Multi-way Recall」という2つの呼び出し戦略を提供します。「N-choose-1 Recall」モードでは、知識ベースのクエリは関数呼び出しを通じて実行され、システム推論モデルの選択が必要になります。「Multi-way Recall」モードでは、結果を再ランク付けするために再ランクモデルを設定する必要があります。 これら2つのリコール戦略の詳細については、ドキュメントの取得モードの説明を参照してください。
4-5. 質問分類器ノード
「質問分類器ノード」はユーザークエリの分類条件を定義し、LLMがこれらの分類に基づいて対話の進行を指示できるようにします。典型的な顧客サービスロボットのシナリオで示されているように、「質問分類器」は知識ベース検索の予備ステップとして機能し、ユーザーの意図を特定します。検索前にユーザーの意図を分類すると、知識ベースの想起効率が大幅に向上します。
「質問分類器ノード」の設定手順は、次のとおりです。
(1) 入力変数の選択
会話型の顧客シナリオでは、「開始ノード」(sys.query) のユーザー入力変数を「質問分類器ノード」の入力として使用できます。自動化・バッチ処理シナリオでは、顧客のフィードバックや電子メールの内容を入力変数として利用できます。
(2) 推論モデルの設定
「質問分類器ノード」は、LLMの自然言語処理機能に依存してテキストを分類します。分類器の推論モデルを構成する必要があります。
(3) 分類メソッドの作成
各分類に適合するキーワードや説明文を作成することで、手動で複数の分類を追加できます。これらの条件の記述に基づいて、質問分類器は、ユーザーの入力のセマンティクスに従って、ダイアログを適切なプロセスパスにルーティングできます。
4-6. IF/ELSEノード
「IF/ELSEノード」を使用すると、if/else 条件に基づいてワークフローを2つの分岐に分割できます。このノードでは、1つ以上のIF条件を設定できます。IF条件が満たされると、ワークフローは「IS TRUE」分岐の下の次のステップに進みます。IF条件が満たされない場合、ワークフローは「IS FALSE」分岐の下で次のステップをトリガーします。
4-7. コードノード
「コードノード」は、ワークフロー内でデータ変換を実行するための「Python / NodeJS コードの実行」をサポートします。ワークフローを簡素化し、算術演算、JSON 変換、テキスト処理などのシナリオに適しています。
このノードにより開発者の柔軟性が大幅に向上し、ワークフローにカスタム Python または Javascript スクリプトを埋め込み、プリセットノードでは実現できない方法で変数を操作できるようになります。 設定オプションを使用して、必要な入力変数と出力変数を指定し、対応する実行コードを記述することができます。
「コードノード」内の他のノードの変数を使用する必要がある場合は、入力変数で変数名を定義し、これらの変数を参照する必要があります。
・ローカルデプロイ
ローカルにデプロイするユーザーの場合は、悪意のあるコードが実行されないようにサンドボックスサービスを開始する必要があります。 また、このサービスを起動するには Dockerが必要です。サンドボックスサービスに関する具体的な情報はここで見つけることができます。 docker-compose を使用してサービスを直接開始することもできます。
docker-compose -f docker-compose.middleware.yaml up -d
・セキュリティポリシー
実行環境は Python と JavaScript の両方に対してサンドボックス化されています。つまり、大量のシステムリソースを必要としたり、セキュリティ リスクを引き起こす特定の機能は利用できません。これには、ファイルシステムへの直接アクセス、ネットワーク呼び出し、オペレーティング システム レベルのコマンドが含まれますが、これらに限定されません。
4-8. テンプレートノード
「テンプレートノード」を使用すると、Pythonの強力なテンプレート構文である 「Jinja2」を使用して、前のノードの変数を動的にフォーマットし、単一のテキストベースの出力に結合できます。これは、複数のソースからのデータを後続のノードで必要な特定の構造に結合する場合に役立ちます。
4-9. 変数割り当てノード
「変数割り当てノード」は、ワークフロー内の分岐出力を収集するためのハブとして機能し、どの分岐が選択されるかに関係なく、単一の変数によって出力を参照できるようにします。その後、出力は下流のノードで操作できます。
「変数割り当てノード」は、文字列、数値、オブジェクト、配列などの複数のタイプの出力変数をサポートします。指定された出力タイプを指定すると、変数のドロップダウンリストから入力変数をノードに追加できます。変数のリストは前の分岐出力から導出され、指定されたタイプに基づいて自動フィルタされます。
4-10. HTTPリクエストノード
「HTTPリクエストノード」を使用すると、HTTPリクエストを作成して指定したエンドポイントにディスパッチできるため、「外部サービス」との幅広い統合やデータ交換が可能になります。このノードは、一般的なHTTPリクエストをすべてサポートしており、リクエストのURL、ヘッダー、クエリパラメータ、本文、認証を完全にカスタマイズできます。
HTTPリクエストの非常に便利な機能は、さまざまなフィールドに変数を挿入してリクエストを動的に構築できることです。たとえば、カスタマーサポートシナリオでは、ユーザー名や顧客ID などの変数を使用して、POSTリクエスト経由で送信される自動応答をパーソナライズしたり、顧客に関連する個人固有の情報を取得したりできます。HTTPリクエストは、本文、ステータスコード、ヘッダー、ファイルを出力として使用します。応答にMIMEタイプのファイル (現在は画像に限定されています) が含まれている場合、ノードはこれらをダウンストリームで使用するためのファイルとして自動的に保存します。
4-11. ツールノード
ワークフロー内で、「Dify」は「組み込みツール」と「カスタムツール」の両方を提供します。 これらのツールを使用する前に、「認証」する必要があります。
「ツールノード」の設定手順は、次のとおりです。
「組み込みツール一覧」は、次のとおり。
「カスタムツール」の作成と設定については、ツールの設定手順を参照してください。
関連
次回
この記事が気に入ったらサポートをしてみませんか?