メインコンテンツへスキップ
⚠️ このドキュメントはAIによって自動翻訳されています。不正確な部分がある場合は、英語版を参照してください。
サンドボックスランタイムでは、Agent ノードは LLM に自律的なコマンドライン実行能力を与えます。ツールの呼び出し、スクリプトの実行、内部ファイルシステムや外部リソースへのアクセス、マルチモーダル出力の生成が可能です。これにはトレードオフがあります:レスポンス時間が長くなり、トークン消費も増えます。シンプルなタスクをより速く効率的に処理するには、Agent モード をオフにしてこれらの機能を無効にできます。

モデルの選択

設定済みのプロバイダーからタスクに最適なモデルを選択します。選択後、モデルパラメータを調整してレスポンスの生成方法を制御できます。利用可能なパラメータとプリセットはモデルによって異なります。

プロンプトの作成

モデルに入力の処理方法とレスポンスの生成方法を指示します。/ を入力して変数やファイルシステム内のリソースを挿入したり、@ を入力して Dify ツールを参照したりできます。どこから始めればよいかわからない場合や、既存のプロンプトを改善したい場合は、AI アシスト付きプロンプトジェネレーターをお試しください。
プロンプトジェネレーターアイコン
プロンプトジェネレーターインターフェース

指示とメッセージの指定

システム指示を定義し、メッセージを追加をクリックしてユーザー/アシスタントメッセージを追加します。すべて順番にプロンプトとしてモデルに送信されます。モデルと直接会話するイメージです:
  • システム指示はモデルのレスポンスルールを設定します——役割、トーン、行動ガイドライン。
  • ユーザーメッセージはモデルに送信する内容——質問、リクエスト、タスク。
  • アシスタントメッセージはモデルのレスポンスです。

入力とルールの分離

システム指示で役割とルールを定義し、ユーザーメッセージで実際のタスク入力を渡します。例:
# システム指示
あなたは子ども向けの物語作家です。ユーザーの入力に基づいて物語を書いてください。簡単な言葉と温かいトーンを使ってください。

# ユーザーメッセージ
ウサギと恥ずかしがり屋のハリネズミが友達になる、おやすみ前のお話を書いてください。
すべてをシステム指示にまとめる方が簡単に見えるかもしれませんが、役割定義とタスク入力を分離することで、モデルにとってより明確な構造になります。

対話履歴のシミュレーション

アシスタントメッセージがモデルのレスポンスなら、なぜ手動で追加するのか疑問に思うかもしれません。ユーザーメッセージとアシスタントメッセージを交互に追加することで、プロンプト内に対話履歴をシミュレーションできます。モデルはこれらを過去のやり取りとして扱い、動作の誘導に役立ちます。

上流 LLM からの対話履歴のインポート

対話履歴の追加をクリックして、上流の Agent ノードから対話履歴をインポートします。これによりモデルは上流で何が起こったかを把握し、そのノードが中断したところから続けることができます。対話履歴にはユーザーメッセージ、アシスタントメッセージ、が含まれます。Agent ノードの context 出力変数で確認できます。
システム指示はノード固有のため含まれません。
複数の Agent ノードを連結する場合に有用です:
  • 対話履歴をインポートしない場合、下流ノードは上流ノードの最終出力のみを受け取り、それがどのように導き出されたかはわかりません。
  • 対話履歴をインポートすると、プロセス全体が見えます:ユーザーが何を質問したか、どのツールが呼び出されたか、どのような結果が返されたか、モデルがどのように推論したか。
自動追加されるユーザーメッセージで新しいタスクを指定してください。 インポートされた履歴は現在のノードのメッセージの前に追加されるため、モデルはこれを1つの連続した会話として認識します。インポートされた履歴は通常アシスタントメッセージで終わるため、モデルは次に何をすべきかを知るためのフォローアップユーザーメッセージが必要です。
2つの Agent ノードが順番に実行されるとします:Agent A はデータを分析してチャート画像を生成し、サンドボックスの出力フォルダーに保存します。Agent B はこれらのチャートを含む最終レポートを作成します。Agent B が Agent A の最終テキスト出力のみを受け取る場合、分析結論はわかりますが、どのファイルが生成されどこに保存されているかはわかりません。Agent A の対話履歴をインポートすることで、Agent B はツールメッセージから正確なファイルパスを確認でき、チャートをレポートに埋め込むことができます。Agent A の対話履歴インポート後に Agent B が受け取る完全なメッセージシーケンス:
# Agent B のシステム指示
1. System: "あなたはレポートデザイナーです。ビジュアルを埋め込んだプロフェッショナルなレポートを作成してください。"

# Agent A から
2. User: "Q3 の売上データを分析し、可視化を作成してください。"

# Agent A から
3. Tool: [bash] 棒グラフを作成:/output/q3_sales_by_region.png
4. Tool: [bash] トレンドラインを作成:/output/q3_monthly_trend.png

# Agent A から
5. Assistant: "Q3 の売上データを分析し、2つのチャートを作成しました..."

# Agent B のユーザーメッセージ
6. User: "生成されたチャートを含む PDF レポートを作成してください。"
Agent A の対話履歴をインポートすることで、Agent B はどのファイルが存在し、どこにあるかを正確に把握し、レポートに直接埋め込むことができます。
例 1 の続きとして、生成された PDF レポートをエンドユーザーに提供したいとします。アーティファクトはエンドユーザーに直接公開できないため、3つ目の Agent ノードでファイルを抽出する必要があります。Agent C の設定:
  • Agent モード:オフ
  • 構造化出力:有効にし、ファイル型の出力変数を追加
  • 対話履歴:Agent B からインポート
  • ユーザーメッセージ:「生成された PDF を出力してください。」
Agent B の対話履歴インポート後に Agent C が受け取る完全なメッセージシーケンス:
# Agent C のシステム指示(省略可)
1. System:(なし)

# Agent A からのユーザーメッセージとツールメッセージ(簡潔にするため省略)
2. ...

# Agent B から
3. User: "生成されたチャートを含む PDF レポートを作成してください。"

# Agent B から
4. Tool: [bash] レポートを作成:/output/q3_sales_report.pdf

# Agent B から
5. Assistant: "チャートを埋め込んだ PDF レポートを作成しました..."

# Agent C のユーザーメッセージ
6. User: "生成された PDF を出力してください。"
Agent C はインポートされた対話履歴からファイルパスを特定し、ファイル変数として出力します。その後、回答ノードまたは出力ノードでこの変数を参照し、ファイルをエンドユーザーに提供できます。

Jinja2 を使った動的プロンプトの作成

Jinja2 テンプレートを使って、プロンプトに条件分岐、ループ、その他のロジックを追加できます。例えば、変数の値に応じて指示をカスタマイズできます。
あなたは
{% if user_level == "beginner" %}忍耐強く親切な
{% elif user_level == "intermediate" %}プロフェッショナルで効率的な
{% else %}シニアエキスパートレベルの
{% endif %} アシスタントです。

{% if user_level == "beginner" %}
わかりやすい言葉で説明してください。必要に応じて例を示してください。専門用語は避けてください。
{% elif user_level == "intermediate" %} 一部の専門用語を使用できますが、適切な説明を付けてください。実践的なアドバイスとベストプラクティスを提供してください。
{% else %} 技術的な詳細に踏み込み、専門用語を使用してください。高度なユースケースと最適化ソリューションに焦点を当ててください。
{% endif %}
デフォルトでは、すべての可能な指示をモデルに送信し、条件を説明し、どれに従うかをモデルに判断させる必要がありますが、この方法は必ずしも信頼できるとは限りません。Jinja2 テンプレートを使えば、定義された条件に合致する指示のみが送信されるため、動作が予測可能になり、トークンの使用量も削減されます。

コマンド実行の有効化(Agent モード)

Agent モードをオンにすると、モデルが組み込みの bash ツールを使ってサンドボックスランタイムでコマンドラインを実行できるようになります。これはすべての高度な機能の基盤です:モデルが他のツールを呼び出す、ファイル操作を行う、スクリプトを実行する、外部リソースにアクセスする——これらすべては bash ツールを呼び出して基盤となるコマンドラインを実行することで行われます。これらの機能が不要なシンプルなタスクでは、Agent モードをオフにすることで、より高速なレスポンスと低いトークンコストを実現できます。最大イテレーション回数の調整高度な設定最大イテレーション回数は、モデルが1つのリクエストに対して推論-行動サイクル(思考、ツール呼び出し、結果処理)を繰り返す回数を制限します。複数のツール呼び出しを必要とする複雑なマルチステップタスクでは、この値を増やしてください。値が大きいほどレイテンシとトークンコストが増加します。

対話メモリの有効化(チャットフローのみ)

メモリはこのノード内でのみ有効です。異なる会話間では保持されません。
メモリを有効にすると最近の対話が保持され、LLM がフォローアップの質問に一貫して回答できるようになります。現在のユーザークエリとアップロードされたファイルを渡すためのユーザーメッセージが自動的に追加されます。これはメモリが最近のユーザー-アシスタント間のやり取りを保存することで機能するためです。ユーザークエリがユーザーメッセージを通じて渡されないと、ユーザー側で記録するものがなくなります。ウィンドウサイズは保持する最近のやり取り数を制御します。例えば 5 は、直近の5組のユーザークエリと LLM レスポンスを保持します。

コンテキストの追加

高度な設定 > コンテキストで、LLM に追加の参照情報を提供し、ハルシネーションを減らしてレスポンスの精度を向上させます。一般的なパターン:ナレッジ検索ノードから検索結果を渡すことで、検索拡張生成(RAG)を実現します。

マルチモーダル入力の処理

マルチモーダル対応モデルに画像、音声、動画、ドキュメントを処理させるには、以下のいずれかの方法を選択します:
  • プロンプトでファイル変数を直接参照する。
  • 高度な設定Vision を有効にし、ファイル変数を選択する。 解像度は画像処理の詳細レベルのみを制御します:
    • :複雑な画像でより高精度だが、より多くのトークンを使用
    • :シンプルな画像でより高速、より少ないトークンで処理
マルチモーダル機能を持たないモデルの場合は、サンドボックスへのファイルアップロードノードでファイルをサンドボックスにアップロードします。Agent ノードがコマンドラインを実行してツールのインストールやスクリプトの実行を行い、モデルがネイティブに処理できないファイル形式も処理できます。

思考プロセスとツール呼び出しをレスポンスから分離

モデルの思考プロセスやツール呼び出しを含まないクリーンなレスポンスを取得するには、generations.content 出力変数を使用します。generations 変数自体にはすべての中間ステップと最終レスポンスが含まれます。

構造化出力の強制

指示で出力形式を記述しても、一貫性のない結果が生じることがあります。より信頼性の高いフォーマットを実現するには、構造化出力を有効にして定義済みの JSON スキーマを強制します。
ネイティブ JSON をサポートしないモデルの場合、Dify はスキーマをプロンプトに含めますが、厳密な遵守は保証されません。
構造化出力
  1. 出力変数の横で構造化をオンにします。出力変数リストの末尾に structured_output 変数が表示されます。
  2. 設定をクリックし、以下のいずれかの方法で出力スキーマを定義します。
    • ビジュアルエディター:ノーコードインターフェースでシンプルな構造を定義。対応する JSON スキーマが自動生成されます。
    • JSON Schema:ネストされたオブジェクト、配列、バリデーションルールを含む複雑な構造のスキーマを直接記述。
    • AI 生成:自然言語でニーズを記述し、AI にスキーマを生成させる。
    • JSON インポート:既存の JSON オブジェクトを貼り付けて、対応するスキーマを自動生成。
ファイル型の構造化出力変数を使用して、サンドボックスからアーティファクトを抽出し、エンドユーザーに提供できます。詳細はエンドユーザーへのアーティファクトの出力を参照してください。

エラー処理

一時的な問題(ネットワークの不具合など)に対する自動リトライ、またはエラーが続く場合にワークフローの実行を継続するための代替エラー処理戦略を設定します。
エラー処理