エージェント戦略プラグイン

エージェント戦略プラグインは、LLMが推論や意思決定ロジックを実行するのを支援します。具体的には、ツール選択、呼び出し、結果処理といった一連の動作をより自動化された方法で実行し、問題を解決します。

この記事では、ツール呼び出し(Function Calling)機能を備え、現在の正確な時刻を自動的に取得するプラグインの作成方法を説明します。

事前準備

  • Difyプラグインの足場ツール

  • Python環境(バージョン3.12以上)

プラグイン開発の足場ツールを準備する方法については、開発ツールの初期化を参照してください。

ヒント:ターミナルで dify version コマンドを実行し、バージョン番号が表示されることを確認することで、足場ツールが正常にインストールされたことを確認できます。

1. プラグインテンプレートの初期化

以下のコマンドを実行して、Agentプラグイン開発テンプレートを初期化します。

dify plugin init

表示される指示に従い、必要な情報を入力します。以下のコードのコメントを参考に設定してください。

 ./dify-plugin-darwin-arm64 plugin init                                                                                                                                 ─╯
Edit profile of the plugin
Plugin name (press Enter to next step): # プラグイン名を入力
Author (press Enter to next step): # プラグイン作者を入力
Description (press Enter to next step): # プラグインの説明を入力
---
Select the language you want to use for plugin development, and press Enter to continue,
BTW, you need Python 3.12+ to develop the Plugin if you choose Python.
-> python # Python環境を選択
  go (not supported yet)
---
Based on the ability you want to extend, we have divided the Plugin into four types: Tool, Model, Extension, and Agent Strategy.

- Tool: It's a tool provider, but not only limited to tools, you can implement an endpoint there, for example, you need both Sending Message and Receiving Message if you are
- Model: Just a model provider, extending others is not allowed.
- Extension: Other times, you may only need a simple http service to extend the functionalities, Extension is the right choice for you.
- Agent Strategy: Implement your own logics here, just by focusing on Agent itself

What's more, we have provided the template for you, you can choose one of them below:
  tool
-> agent-strategy # Agent戦略テンプレートを選択
  llm
  text-embedding
---
Configure the permissions of the plugin, use up and down to navigate, tab to select, after selection, press enter to finish
Backwards Invocation:
Tools:
    Enabled: [✔]  You can invoke tools inside Dify if it's enabled # デフォルトで有効
Models:
    Enabled: [✔]  You can invoke models inside Dify if it's enabled # デフォルトで有効
    LLM: [✔]  You can invoke LLM models inside Dify if it's enabled # デフォルトで有効
  → Text Embedding: [✘]  You can invoke text embedding models inside Dify if it's enabled
    Rerank: [✘]  You can invoke rerank models inside Dify if it's enabled
    TTS: [✘]  You can invoke TTS models inside Dify if it's enabled
    Speech2Text: [✘]  You can invoke speech2text models inside Dify if it's enabled
    Moderation: [✘]  You can invoke moderation models inside Dify if it's enabled
Apps:
    Enabled: [✘]  Ability to invoke apps like BasicChat/ChatFlow/Agent/Workflow etc.
Resources:
Storage:
    Enabled: [✘]  Persistence storage for the plugin
    Size: N/A  The maximum size of the storage
Endpoints:
    Enabled: [✘]  Ability to register endpoints

プラグインテンプレートを初期化すると、プラグインの開発に必要なすべてのリソースを含むコードフォルダが生成されます。エージェント戦略プラグインのコード構造を理解することで、開発プロセスがスムーズになります。

プラグインの機能コードは、strategies/ ディレクトリにまとめられています。

2. プラグイン機能の開発

エージェントプラグインの開発は、主に以下の2つのファイルを中心に行います。

  • プラグイン定義ファイル:strategies/basic_agent.yaml

  • プラグイン機能コード:strategies/basic_agent.py

2.1 パラメータの定義

Agentプラグインを作成するには、まず strategies/basic_agent.yaml ファイルでプラグインに必要なパラメータを定義します。これらのパラメータは、LLMモデルの呼び出しやツールの使用など、プラグインの核となる機能を決定します。

次の4つの基本パラメータを優先的に設定することをお勧めします。

  1. model:呼び出すLLM(GPT-4、GPT-4o-miniなど)を指定します。

  2. tools:プラグインが使用できるツールリストを定義し、プラグインの機能を拡張します。

  3. query:モデルとの対話に使用するプロンプトまたは入力内容を設定します。

  4. maximum_iterations:プラグインの最大反復回数を制限し、過剰な計算を避けます。

パラメータ設定が完了すると、プラグインは対応する設定ページを自動的に生成し、直感的かつ使いやすく調整や利用ができます。

エージェント戦略プラグインの使用ページ

2.2 パラメータの取得と実行

ユーザーがプラグインの設定ページで基本情報を入力すると、プラグインは入力されたパラメータを処理する必要があります。そのため、まず strategies/basic_agent.py ファイル内で、後で使用するためのAgentパラメータクラスを定義します。

入力パラメータの検証:

パラメータを取得した後、具体的な処理ロジックを実行します。

2.3 モデルの呼び出し

エージェント戦略プラグインでは、モデルの呼び出しが中心的な処理ロジックの1つです。SDKが提供する session.model.llm.invoke() メソッドを使用すると、LLMモデルを効率的に呼び出して、テキスト生成や対話処理などの機能を実現できます。

モデルにツール呼び出し機能を持たせたい場合は、まず、モデルがツール呼び出し形式に沿ったパラメータを出力できることを確認する必要があります。つまり、モデルはユーザーの指示に従って、ツールインターフェースの要件を満たすパラメータを生成する必要があります。

以下のパラメータを構築します。

  • model:モデル情報

  • prompt_messages:プロンプト

  • tools:ツール情報(Function Calling関連)

  • stop:停止記号

  • stream:ストリーミング出力をサポートするかどうか

メソッド定義のサンプルコード:

完全な実装については、モデル呼び出しのサンプルコードを参照してください。

このコードでは、ユーザーが指示を入力すると、エージェント戦略プラグインが自動的にLLMを呼び出し、その結果に基づいてツールの呼び出しに必要なパラメータを構築し、渡します。これにより、モデルは連携されたツールを柔軟に活用し、複雑なタスクを効率的に完了できます。

生成されたツールのリクエストパラメータ

2.4 モデルへのメモリ機能の追加

Agentプラグインを使用してモデルを呼び出す際、メモリ機能を追加することで対話体験が大幅に向上します。メモリ機能により、モデルは完全な対話コンテキストを理解し、一貫性のある対話と正確なツール呼び出しを実現できます。

実装手順:

  1. メモリ機能の設定

AgentプラグインのYAML設定ファイルstrategies/agent.yamlhistory-messages機能を追加します:

  1. メモリ設定の有効化

プラグイン設定ファイルを修正して再起動後、ノード設定画面にメモリトグルが表示されます。右側のトグルボタンをクリックしてメモリ機能を有効にします。

Memory

有効化後、ウィンドウサイズスライダーでメモリウィンドウを調整できます。これはモデルが「記憶」できる過去の対話の量を決定します。

  1. 履歴メッセージのデバッグ

以下のコードを追加して、履歴メッセージの内容を確認します:

History messages

コンソールには以下のような出力が表示されます:

  1. 履歴メッセージのモデル呼び出しへの統合

最後に、モデル呼び出しコードを修正して、履歴メッセージを現在のクエリに連結します:

  1. 効果の検証

メモリ機能を追加後、モデルは履歴に基づいて応答できるようになります。以下の例では、モデルは以前の対話で言及されたユーザー名を正しく記憶し、対話の一貫性を実現しています。

Outcome

2.5 ツールの呼び出し

ツールパラメータを設定した後、エージェント戦略プラグインに実際にツールを呼び出す機能を追加する必要があります。これは、SDKの session.tool.invoke() 関数を使用して行えます。

以下のパラメータを構築します。

  • provider:ツール提供者

  • tool_name:ツール名

  • parameters:入力パラメータ

メソッド定義のサンプルコード:

LLMで直接パラメータを生成してツールを呼び出したい場合は、以下のツール呼び出しのサンプルコードを参照してください。

完全な機能コードについては、ツール呼び出しのサンプルコードを参照してください。

この機能コードを実装すると、エージェント戦略プラグインは自動的にFunction Callingを実行できるようになります。例えば、現在の時刻を自動的に取得するなどが可能です。

ツール呼び出し

2.6 ログの作成

エージェント戦略プラグインでは、複雑なタスクを完了するために、通常、複数回の操作が必要です。各操作の実行結果を記録することは、開発者にとって非常に重要です。Agentの実行プロセスを追跡し、各ステップの意思決定の根拠を分析することで、戦略の効果をより適切に評価し、最適化できます。

この機能を実装するために、SDKの create_log_messagefinish_log_message メソッドを利用してログを記録できます。この方法では、モデル呼び出しの前後に操作状態をリアルタイムで記録できるだけでなく、開発者が問題を迅速に特定するのに役立ちます。

シナリオ例:

  • モデルを呼び出す前に、「モデルの呼び出しを開始」というログを記録することで、開発者はタスクの実行状況を明確に把握できます。

  • モデル呼び出しが成功した後、「呼び出し成功」というログを記録することで、モデルの応答の完全性を追跡できます。

設定が完了すると、ワークフローログに実行結果が出力されます。

Agentの実行結果の出力

Agentの実行中には、複数ラウンドのログが生成される場合があります。ログに階層構造を持たせることで、開発者がログを確認しやすくなります。ログを記録する際に parent パラメータを渡すことで、異なるラウンドのログ間に親子関係が形成され、ログの表示がより明確になり、追跡が容易になります。

使用方法:

プラグイン機能のサンプルコード:

モデルの呼び出し

以下のコードは、エージェント戦略プラグインにモデルを呼び出す機能を追加する方法を示しています。

3. プラグインのデバッグ

プラグインの設定ファイルと機能コードを記述したら、プラグインのディレクトリ内で python -m main コマンドを実行してプラグインを再起動します。次に、プラグインが正常に動作するかどうかをテストする必要があります。Difyのリモートデバッグ機能を利用するには、「プラグイン管理」にアクセスしてデバッグキーとリモートサーバーのアドレスを取得してください。

プラグインプロジェクトに戻り、.env.example ファイルをコピーして .env にリネームします。そして、取得したリモートサーバーのアドレスとデバッグキーを、.envファイルの REMOTE_INSTALL_HOST および REMOTE_INSTALL_KEY パラメータにそれぞれ入力します。

python -m main コマンドを実行してプラグインを起動します。プラグインページで、プラグインがワークスペースにインストールされたことを確認できます。このプラグインは、他のチームメンバーも利用可能です。

プラグインへのアクセス

プラグインのパッケージ化(オプション)

プラグインが正常に動作することを確認したら、以下のコマンドラインツールを使用してプラグインをパッケージ化し、名前を付けることができます。実行後、現在のフォルダに google.difypkg ファイルが生成されます。これが最終的なプラグインパッケージです。

おめでとうございます!これで、ツールタイプのプラグインの開発、デバッグ、パッケージ化の全プロセスが完了しました。

プラグインの公開(オプション)

作成したプラグインは、Dify Plugins コードリポジトリにアップロードして公開できます。アップロードする前に、プラグインがプラグイン公開規約に準拠していることをご確認ください。審査に合格すると、コードはメインブランチにマージされ、Dify Marketplaceに自動的に公開されます。

さらに詳しく

複雑なタスクでは、複数回の思考とツール呼び出しが必要になることがよくあります。より高度なタスク処理を実現するために、通常は反復実行戦略が採用されます。つまり、「モデル呼び出し → ツール呼び出し」という流れを、タスクが完了するか、設定された最大反復回数に達するまで繰り返します。

このプロセスにおいて、プロンプト管理は非常に重要です。モデル入力を効率的に整理し、動的に調整するために、プラグイン内のFunction Calling機能の実装コードを参照し、標準化された方法でモデルが外部ツールを呼び出し、その結果を処理する方法を理解することを推奨します。

Last updated