DifyのAgentでパーソナルメンターを創る--1(検討)
はじめに
GeminiのDeep Reserchに感動
最近、GoogleのGemini2.5ProのDeepResearch(以下、Gemini)に驚嘆の日々。
なんせ、驚異的なリサーチ力を背景として課題(質問)への解析プランを自ら設定、必要な検索を行って、考えをまとめ、最後は丁寧な報告書を作ってくれる。それをGoogleDocの形式にそのまま変換、自分のGoogleDriveに自動的に追加。
コピペとか不要。手間要らず。
さらに、5月に入って、それをベースに内容の要約を男女の軽妙な会話形式で作成してくれるようにもなりました。それも日本語で。出力はMP3で結構長い。
この会話のイントネーションや間の取り方、ハイテンポなやり取り。思わず聞き入ってしまいます。GoogleのTTSも進化してるのがよくわかる。
Artificial AnalysysのTTSのランキング見ると、かなり下位だが。内部用は違うのか、最近の全体のレベルが高いのか、わからないが、かなりいい、と感じます。
そもそも、まず、元ネタの生成過程がすごい。いわゆるThinkingとDeepResearch が相まって検討してくれるのですが、まず、検討の計画を出してくれる。(修正可)
で、スタートすると計画の方針に基づき検索開始、次に検索結果を見て、次の手段(検索式等)を設定して再び検索、データを得て、検討、で、次、、、いままでの最高は、その繰り返しが11回。
その過程を見ていると、そのボリュームと内容、とても自分では、できる気がしない。
その速さに敵わないのは、ともかく、、次々と繰り出す課題へ対応する論理構成、検索式設定、2桁ある検索結果の内容検討。
私はギブアップだが、これを超える人間は、はたしているのだろうか?
この思考過程だのを見てると、そうだなぁ、確かに、2027にはAGIかもね、と感じてしまう。
わがままな思い
で、ふと思ったのが、この能力を私専用にカスタマイズしたい、ということ。
つまり、自分の、自分のためのメンター、パーソナルメンターがほしい、ということだ。
OpenAIのChatGPTは、すでにメモリー機能があって、個人情報を覚えさせることで、回答が自動的にカスタマイズされ、さらに対話ができるらしい。
Zunさんが、Chat GPTの反応で、色々と興味深い事柄を報告してくれてる。
Geminiも、個人の有料課金ではメモリー設定ができるらしいが、私の場合、結構前からWorkSpaceを設定して使っていて、一人なのに、、なんと、そのWorkSpaceでは個人のメモリーは今の所ない、とのこと。
大規模企業を考えてのことでしょうね。きっと。
一方、Gemini AdvanceとかnotebookLM PlusとかWorkSpaceにやっとメリットを感じ始めてたということでもあるのだが、、、この点は、とほほ、です。
で、現状、ChatGPTは1月で有料を辞めてて、個人メモリーは限定機能?
Geminiも個人メモリーは使えない。
Grok3も試したけど、会話が変わると個人データは消える。長期記憶はできない。がっかり。中華系は、個人情報の入力はちょっとパス。
ということで、Difyのコミュニティ版でパーソナルメンターがつくれるか、試してみることにした。まぁ、お勉強だ。
この環境を造ればLLMやツールなども色々試せるし、、、
なお、今回のDifyは、V1.4.0 コミュニティ版 on MacOS15.5のMacbookAir-M2(内部メモリー24GB,SSD;1TB)の前提。
現状、今回の内容
Dify V1.0.0からプラグイン経由でのあらたなツール類、モデル類、とりわけエージェントノードなどが導入された。
これらDifyの状況について、前記のGeminiに色々とアドバイスをもらった結果、その意味を、今、次のように感じている。
まず、特にV1から導入されたAgent Nodeとツール類の組み合わせにより、従来は煩雑なフローとなっていたものが、シンプルに機能を構成できるようになった、ということ。
下手すると、開始ーエージェント(LLM+ツール類)ー終了(回答)のシンプルなフローで、フレキシブルに相当な機能が発現できる。
なぜか、、
それはDifyのAgent Nodeには、LLMが組み込まれる、ということにある。
この中核となるLLMに、指令を与えるのがInstructionの記述。
この記述によって、自分の役割と目的、関係する手持ちのツールの役割を把握し、状況に応じて、どのツールを使うか判断してもらい、実際にツールを駆使して、ユーザーの質問に対応する。
だから、このInstructionにツールとの関係を記述しなければならない。
逆に言えば、使われる側のツール側の説明文も重要。どうやらDify提供の説明文では、不足。LLMが理解しやすようにカスタマイズが必須なようだ。
さらに、Agentには、ReactとFunction Callingの二つの機能から選択できるが、これの実際の動作を規定するのも、Instructionの記載内容だ。
Reactの機能を十分に発揮させるには、相応の記述がInstruction に必要、ということ。
例えば、Geminiとの何度かのやりとりで、目的をパーソナルメンター機能の構築、と伝えたら、これまでのInstructionは、if-then-else形式になっており、これはCalling-Function向けで、ReActの性能を十分に発揮できない、と指摘されてしまった。
それぞれに合った適切なInstructionの記述が必要だ、ということだ。
Instructionの重要性
Geminiは、Indtructionの重要性を次のように述べている。
LLMエージェントの性能は、与えられるInstructionの質に大きく左右されます。
明確かつ適切に設計されたInstructionは、エージェントの推論能力、ツール選択の精度、ユーザー意図の理解度、そして全体的なタスク達成能力を向上させるための基盤となります。特にReActのような、LLMが内部で「思考」し、その結果に基づいて「行動」を選択するフレームワークにおいては、Instructionがその思考と行動の質を方向づけるため、その設計は極めて重要です 。
効果的なInstructionは単なる命令セットではなく、LLMエージェントの思考と行動の「OS」として機能し、その設計思想がエージェントの能力上限を決定づけると言っても過言ではありません。
各ツールの説明文
Difyの各ツールには、Agent用に選択する際、それぞれオリジナルの説明文がある。この説明文は、前記のLLM用のInstructionが、ユーザーのリクエストに対して、手持ちのツールをどのように適用するかを判断するための重要な情報となる。
Geminiは、この説明文(ツール記述)を次のように説明する。
ツール記述は単に人間が理解するためだけのものではなく、ReActエージェントの意思決定(「思考」)プロセスの主要な入力となります。
LLMはこれらを「読み取り」、次の「行動」を選択します。ReActエージェントは、現在のサブプロブレム(ユーザーのクエリまたは以前のステップから派生)をツール記述に概説されている機能と照合することによって、どのツールが最も適切かを決定する必要があります。明確で簡潔、かつ区別のはっきりした記述は、曖昧さを減らし、ツール選択の精度を向上させます。ツール記述が不十分だと、ReActエージェントによるツール選択が不適切になり、結果としてタスクの完了が不正確または非効率になり、反復回数が増加し、コストも増大します。
特にReActや同様の推論フレームワークを使用するエージェントにとって、ツール記述の品質は、エージェント全体のパフォーマンスと信頼性を向上させるための非常に効果的なポイントです。典型的な入力/出力やユースケースの例を記述に直接含めることは非常に有益です。
各ツールには、それぞれ事前に説明文が記述されている。ただ、これらの指摘を見ると、どうやらそのままでは、不十分なようだ。改定が必要、というか必須。
以上から、今回(-次回)は、Difyでパーソナルメンター機能を発現させることを目的とした場合のフローの一例を示します。
特に、Agent NodeのReActを用いた場合の、LLM用のInstructionと各ツール用の説明分の例を具体的に示します。
パーソナルメンターの検討
必要な機能
私の求めるパーソナルメンターとは何かとつらつら考えてみると、
私という個人を、深く理解してくれていて、都度、適切なアドバイスをしてくれる
様々な質問に対して、その真の意図などを深く考察して答えてくれる
人間の一般的な悩みなどを知っていて、適切にアドバイスしてくれる
興味のある分野、例えば生成AIとかロボティクスとか、生物音響学とか、の学習をサポートしてくれる
私の最近の活動、目標、または課題に基づいて、内省的な質問を私に投げかけてくれる。ある種の問答ができる。
最終的には、見たり、聴いたりしてくれる。会話ができる。
などなど、ちょっと実現には難しそうなテーマがいくつか浮かんできます。通常のDeepReserchやThinkingだけでは、難しいかもしれない内容もあります。少なくともマルチモーダル化は必須なようです。
この実現のためには、次のような機能が少なくも必要だと思われます。
考えてくれる機能
検索機能(様々なジャンルの)
今を特定する機能(時間把握)
短期記憶機能
長期記憶機能
目標管理、トレース機能
内省サポート機能
学習サポート(学習リソース提案等)機能
マルチモーダル機能
現状できているのは1-4です。
今回(次回)は、1-4についてツール等を検討して、実装した結果を示します。
1. 考えてくれる機能
まず、必須なのが、考えてくれる機能、です。
そこで、Agentで導入されているReActがまず浮かびます。ReActフレームワークの核心は、LLMが「思考(Reason)」し、その思考に基づいて「行動(Act)」を決定するという反復的なプロセスにあるからです。
Reason-Action-Reason-Action----ですね。ここでは、その能力を発揮してもらうためにInstructionの記述がとても大事なようです。
次に、考える、という機能を標榜するツールを探してみました。
The "Think" Toolというそのものズバリの名称のツールがありました。
マーケットプレイスに以下の説明があります。
説明
「think」ツールは、LLMが複雑なタスクに取り組む際に構造化された思考を行うための専用スペースを提供します。このツールは、複雑な状況下で推論を行うためのサンドボックスを提供することで、LLMの問題解決能力を向上させます。
複数のツールを使用したり、複数段階の意思決定を行ったりする場合、LLMは情報を分析し、ポリシーの遵守状況を検証し、一連のアクションを計画するための場所を持つことでメリットを得られます。「think」ツールは、新しい情報を取得したりデータを変更したりすることなく、思考プロセスを記録するだけで、このスペースを提供します。
このツールは、Anthropicの「think」ツール研究から着想を得たシンプルな実装です。詳細については、https: //www.anthropic.com/engineering/claude-think-toolをご覧ください。
Anthropicの研究成果となると、結構期待できそうです。
深く考える機能に寄与する可能性が高いと思われます。大きな課題は、これを使いこなすInstructionの記述。
Geminiと相談して、使ってみたいと思います。
2.検索機能(様々なジャンルの)
この機能は、様々なジャンルのたくさんのツールがあります。
Geminiと相談したりして、今回は、次の4つのツールをピックアップしてみました。
各々の詳細は、後述のツールの説明文やそれに対応したInstructionで述べたいと思います。
Tavily Search
Perplexity Search
Arxiv Search
WolframAlpha
他にも、DuckDuckGo、Brave、Google系、などを俎上に乗せ、Geminiに比較表を作ってもらい、比較検討した結果です。
ただし、判断基準はそれぞれ違うと思います。また、各々は、進化しています。GeminiとかCHatGPT, AnthropicなどのDeepResearchで最新の情報を調べてもらい、コメントをもらうとか、比較表を作ってもらって比べるといいと思います。
今後、この選択は変わっていくかもしれません。
3.今を特定する機能(時間把握)
これは、実際に動かしてみて、必要性に気づきました。Difyのフローは、教えないと今がわからないんですね。
例えば、誕生日を教えて、年齢を聞くとわからない、とか。
標準のプラグインとして準備されているCurrent Timeを使います。
4.短期記憶機能
これには、今回、mem0AIのAdd Memory/Retrieve Memoryを使います。
このツールには、本来長期記憶機能を期待したのですが、現時点では、一旦ログアウトすると、記憶させた情報が消えてしまいます。
.envファイル等の記載に不具合があるのかもしれません。検討予定です。
今の所、チャットフローの同じループの中での記憶保持はできるようです。
仕方がないので、今の所、私の個人プロファイルの文章を用意し、それを最初に読み込ませています。
5.長期記憶機能(予定)
Geminiからは、現時点では、Difyのナレッジベースを用いた方法を提案されています。今後対応していきたいと考えています。
この機能がないと、パーソナルではないので。これは本来必須です。
Difyの組み込みナレッジベースを長期記憶の保存場所として活用する方法が非常に有効です 。このアプローチは、Dify自体の堅牢なデータ永続化メカニズムを利用するため、サードパーティプラグインに起因する問題を回避できる可能性があります。
具体的な実装例:rainchen/dify-tool-LongTermMemoryツールの活用
GitHubで公開されているrainchen/dify-tool-LongTermMemoryというカスタムツールは、まさにこの目的のために設計されています 9。このツールは、DifyのナレッジベースAPIを使用して、ユーザーごとの情報をDifyのナレッジベース内にドキュメントセグメントとして保存・検索します。各ユーザーの情報はcurrent_user_idでフィルタリングされるため、ユーザーごとに独立した長期記憶スペースを確保できます。
ちょっと長くなってしまったので、ここで、一旦くぎります。
次回は、次のような項目を予定しています。
