Difyで長期記憶エージェントのコア機能をモジュール化した


Dify上で、随時ナレッジを作成させることでAIに長期記憶を持たせることは技術的に可能であり、チャットボットもいくつか開発されています。


一方、既存の例では

  • チャットボットごとに複雑なワークフローを用意する必要がある

  • 中身を変更する場合、全てのチャットボットを変えなきゃいけない

  • エージェントモードでは使えない

などの課題がありました。

これは"ページを読み込んでナレッジに追加する"というコア機能がモジュール化できなかったためです。
v0.6.9でワークフローのtool化が可能になったことで、この問題を解決できました。


このnoteでは、ページを読み込んでナレッジに追加するモジュールとしてのワークフローとその使い方を紹介します。



構築方法

以下のDSLファイルをダウンロードし、自分の環境に複製する


HTTPノードを設定する
dockerでセルフホストしている場合、URLをapi.dify.aiをhost.docker.internalにします
また、ナレッジの画面からAPIキーも取得して設定してください。


公開してツールとしてのワークフローを設定する
以下のように設定します。

  • Name: Knowledge creator from URL

  • Tool call name: knowledge_creator

  • Description: Analyze a web page or a PDF file hosted on the web and save it to the long-term memory database.

  • Tool Input:

    • input:

      • METHOD: Parameter

      • DESCRIPTION: The URL to analyze. Only a single URL is accepted, not a list.

    • if_existing_document:

      • METHOD: Setting

      • DESCRIPTION: Whether to overwrite or skip if the document already exists.

    • document_type:

      • METHOD:Parameter

      • DESCRIPTION: Whether it is a web page, a PDF file hosted on the web, or a local file.

    • dataset_id:

      • METHOD: Setting

      • DESCRIPTION: The dataset ID of the document. If empty, a new dataset will be created for each document.


これでモジュールが完成です。


試す

実際にこのモジュールを使って長期記憶持ちチャットボットを作ってみると以下のようになります。

だいぶスッキリ


以下がDSLファイルです。先ほど作ったツールの登録が必要です。

DATASET_IDは、空のナレッジを作成したのちにURLから取得できます。
(例: aed9fbb7-f439-49dc-80c2-e189464f121a)


既存のチャットボットとの違い

いろんなチャットボットに簡単に組み込める
一度作ってしまえば、このツールと結果をパースするコードノードを追加するだけで、ナレッジの追加機能が実装できます。
変更する時もこのツールを修正するだけで、全てのチャットボットに反映されます。


エージェントモードでも使える
ワークフローをツール化することの大きなメリットは、エージェントモードに定型的な処理を組み込めることだと思います。


資料のアップデートも自動検出
すでに同じ名前の資料がある場合、アップデートするように設定できます。
モジュール化されているから複雑なロジックも修正しやすい。


課題

まだモジュール化の最適解には達していない
何を入力して何を処理させて何を出力するのか、まだ最適解がある気がするのでもう少し模索します。


ハイブリッド検索ができない(?)
現在、DifyのAPIではハイブリッド検索としてのRAG化ができないみたいです。デフォルトではベクトル検索になっています。


ファイルやテキストの学習には対応していない
Difyのチャットインターフェースではファイルアップロードができないので実装してませんが、ゆくゆくは多様な入力に対応したいですね。

テキストの入力は簡単に実装できますが、ユースケースがパッと思い当たらないので省いています。ChatGPTのmemory的なやつはRAGとは違うシステムだし、、
今後追加する可能性はあります。


パラメーター抽出ノードでselectが使えない
selectが使えないのでツールの説明で選択肢を伝え、Stringで出力させる必要があります。


学んだこと

Max steps 50 reached.
最初はiterationノードを使って複数資料の同時登録をしようとしたのですが、イテレートが増えてステップ数上限のエラーが出ます。
こちらついさっきコミットされたので、次のバージョンでは問題なくなるかと思います。


The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
この謎エラーに僕はiterationの中で作ったノードを複製してiterationの外で使って遭遇しました。
DSLファイルを覗いて気づきました。
エラーの原因判明が難しいエラーだと思うので頑張りましょう。


Document名は.txtで追加される
create_by_text APIで追加した資料には、.txtが付与されます。
"すでにその資料が存在するか"の判定には.txtを付与して照合する必要があります。




感想

これはワークフローのtool化、Difyの使用感を知る実験的な取り組みです。

「こんなにもワークフローが長くなるなら自分でコードを書けばいいじゃん」と言うツッコミもありそうですが、それだと非エンジニアが手も足も出なくなってしまうので本末転倒です。

一方で、エンジニアと非エンジニアの橋渡しがLLMという考え方もできるわけで、エンジニアにとってもAIにとってもGUIは最適解じゃないとするなら全体としてはどんなインターフェースが最適なのか

非エンジニアが開発に参加する必要性がある分野ではそういうインターフェースが必要だと感じました。



この記事が気に入ったらサポートをしてみませんか?