Difyで「My Assistant」をちょっと再現してみた件
★本記事の対象者
・GPTs開発してみたい!と思われている方
・GPTsの機能をいろんな人に届けたい!と思われている方
・Dify興味あるよ!と思われている方
・チーム間でうまく情報連携できる方法はないか・・・と探されている方
はじめに
みなさまお仕事お疲れ様です!光森です。
標題の件、Xでの投稿や2024/04/26の朝に@passion_tanakaさんの朝LIVEにて@MarinaShimodaさんと一緒に共有をさせていただきましたが、Difyを使ってGPTs「My Assistant」をちょっと再現してみましたので、こちらの記事にて内容を共有させていただきます!
そもそもGPTs「My Assistant」って何?
こちらの疑問につきましては、こちらの記事を参照ください。@MarinaShimoda(https://x.com/marinashimoda?s=21&t=dPrh0uwpY0IDSxM4gtbNTA)さんと共同開発し、東京AI祭(https://www.aisai.tokyo/)にてファイナルまで出場させていただいたGPTsがMy Assistantになります。
そもそも「Dify」って何?
こちらの疑問につきましては、marumarumaruさんのこちらの記事を参照ください。(いつもありがとうございます!)
本当にざっくりとだけ説明をしますと・・・
DifyはオープンソースのLLM(大規模言語モデル)アプリ開発基盤。直感的なインターフェースでAIワークフローやRAGパイプラインを構築できる
→私レベルだとGUIはすごくありがたい・・・GPT-4など最新のAIモデルをサポート(API keyの登録などは必要)しており、ノーコードでアプリを構築・デプロイできる
→ClaudeやLlama、command-rだって使えちゃいます・・・エージェント機能により、Google検索、DALL·E、Stable Diffusionなど50以上の組み込みツールを使ったAIエージェントを定義できる
→code interpreter機能とかもあります・・・また、GPTsのActionsのように自分でスキーマを書くことができれば組み込みツール以外のAPI連携も可能(カスタムツール)
→これできたらGPTsは・・・
みたいなところでしょうか。可能性は無限大です!
Difyの環境構築について
私はDifyをローカル環境でdockerを立ち上げて動かしてますが、Difyはクラウド環境でも無料で動かせるようです!
ただ、料金プランを確認すると無料プランでは今回使用しているカスタムツールが「Unavailable(使用不可)」ということになってますので、My Assistant試してみたいよ!という方は、dockerでローカルに環境構築いただくか、$59/月払ってやってみるかのどちらかになりますね・・・
dockerでローカルに環境構築するぞ!という方は、またまたmarumarumaruさんのこちらの記事をご参考に。(いつもありが(ry)
DifyでのMy Assistantのワークフロー
2024/04/26現在ですが、ワークフローはこんな感じにしております。
上の図に示すように現状3つのパートに分かれておりまして、ざっくりそれぞれのパートの説明は以下の通りです。
①モード分岐パート
・「入力モード」と「出力モード」の選択を行う
・入力モードの場合は、メモを入力する
・出力モードの場合は、キーワードを入力する
②入力モードパート
・①から入力されたメモを受け取り、LLMを使ってメモの内容を整理
・整理した内容をカスタムツールを使ってスプレッドシートに連携
・出力した内容を表示して終了
③出力モードパート
・①から入力されたキーワードを受け取り、スプレッドシートに連携
・収集した情報を表示して終了
では、それぞれのパートの説明にいきましょう!
・・・と言いたいところなのですが、まずこのワークフローに入る前に「前準備」を済ませてしまいましょう!
前準備1:スプレッドシートとGASの作成
My AssistantはスプレッドシートとGAS(Google Apps Script)を使ってGPTsとAPI連携をしています。今回のDifyでもその部分は同じですので、まずは以下の記事を参考にスプレッドシートとGASの準備をお願い致します。
前準備2:カスタムツールの作成
そもそもカスタムツールって何?
GPTsのActionsを使ってGPTsを作成されたことがある方はパッとわかるかなと思いますが、カスタムツールというのは外部APIとの連携を行うための機能でして、カスタムツールを作成することで独自の機能をDifyで活用することができるようになります。
カスタムツールの作成
カスタムツールの作り方としては本当にGPTsのActionsとUIはほぼほぼ一緒です。My Assistantの場合は、以下の記事を参考にスキーマの部分をそのまま流用すればカスタムツールをが作ることができました!
ですので、先ほど作成したスプレッドシートやGASの情報を参考に、スキーマを頑張って作ってみてください!
My Assistantのスキーマを元に作成すれば、以下の2つのカスタムツールが作られたかなと思います。
これで前準備は完了です!いよいよワークフローの作成に移っていきたいと思います!
作成:アプリの作成を選択
Difyにはアプリの作成でも色々な作成方法があるのですが、今回は真っ白なところからスタートしましょう。下の図の赤枠の部分をまずはクリック。
次にワークフローを選択し、名前と説明文を記載。
そしたらこんな画面が立ち上がるかなと思います。ここから本格的に作成がスタートです!
作成:①モード分岐パートの作成
本パートの全体像
本パートは2つのブロックで構成されています。
・開始(デフォルトで必ず初めから存在)
・質問分類器
開始
開始には3つの入力フィールドを準備していきます。下の図を参考に作成してみてください。
※ちなみに、sys.filesは初めからありますがそのままでOK
mode
この後の質問分類器に渡すための変数になります。またmodeは必ず入力して欲しいので、必須にしています。
Input_Memo
modeをInputにした場合に、メモを保存するための変数となります。
OutPut_Keyword
modeをOutputにした場合に、スプレッドシートから情報を収集するためのキーワードを保存するための変数となります。
ポイントは「mode」だけは必ず入れてもらう必要があるので必須にしておき、あとは必須でなくても良いので必須にはしていないところですね。
質問分類器
このブロックで入力モードと出力モードの分岐をコントロールしています。
まず、入力変数を開始のmodeを選択しましょう。これで、先ほどmodeでInputとOutputを選択できるようにしていましたが、質問分類器にその変数を入力することができます。
次にモデルはお好きなモデルを選択してください。
ちなみにcommand-rはアカウント登録をすれば無料でAPIキー使えますので、おすすめです。(2024/04/26現在)
クラスはトピック名をInput、Outputとすれば、モデルがちゃんと分類してくれますので、一旦はこれで完了です!
作成:②入力モードパートの作成
本パートの全体像
本パートは何やらLLMだらけで難しそう・・・な雰囲気を出していますが、全然そんなことはありません。
大きく分けると以下の4つのブロックで構成されています。
・LLM
ーInput_Date_LLM
ーInput_Name_LLM
ーInput_Tag_LLM
ーInput_Memo_LLM
ーInput_All_LLM
・addPost(前準備2で作成したカスタムツール)
・テンプレート
・終了(出力モードから作ったので2になってますが気にしないで下さい)
LLM
ここの部分では、前のパートにて入力されたMemoの情報をスプレッドシートに保存するために、LLMを使ってMemoから
・Date(投稿日)
・Name(担当者)
・Tag(キーワードとなるようなもの。あったら検索とかするときに便利かなと思い付けました)
・Memo(メモ本文)
の情報をそれぞれピックアップしています。My Assistantは営業さん向けに作っているところがあるので以下の構成にしていますが、ここはみなさんいろいろ試してみてください!
(構成を変更したらスプレッドシート、GAS、そしてカスタムツールの変更もお忘れなく)
★注意点:Max Tokensについて
LLMのモデル選択時にMax Tokensを変更することができるのですが、ここのLLMにはMemoの内容が入力されるので、Memoが長文になるとトークン数が大きくなりエラーとなってしまうことがあります。
ですので、初期値ではなくちょっと大きめに設定しておきましょう。私は3,000とかに設定しています。
Date(投稿日)
{{#context#}}から日付情報を抽出する。
###注意点
・抽出したデータはyyyy/mm/dd形式とすること。
Name(担当者)
{{#context#}}から訪問者情報を抽出する。
###注意点
・訪問者情報は名前のみで良い。
例:
入力文->佐藤がXXX会社のYYYさんに訪問
訪問者情報->佐藤
Tag(キーワードとなるようなもの。あったら検索とかするときに便利かなと思い付けました)
{{#context#}}からメモのキーワードを抽出する。
###注意点
・キーワードとしては訪問先の会社名などとする。
・出力はキーワードのみでよく、「キーワード:XXX」といったようにしないこと。
例:
入力文->佐藤が2024年2月4日に株式会社XXXのYYYさんに訪問した。
キーワード->株式会社XXX、YYYさん
Memo(メモ本文)
{{#context#}}から内容を要約する。
###注意点
・要約は日本語とし、箇条書きは使用しないこと。
All(こちら上記では説明しておりませんでしたが、ユーザーが入力した情報をすべての情報をひとまとめにしたもの。この列は「出力」時に、情報検索をする際に参照されています)
以下の変数を一つのデータとして出力する。
###変数
{{#1713834200257.text#}}
{{#1713834721250.text#}}
{{#1713834884707.text#}}
{{#1713835663906.text#}}
###注意点
・出力する際は整理や要約などは必要なく、そのままで良い。
★備考:それぞれLLMを分けている理由
大きな理由としては、現状私が知る限りではなのですが「各ブロックから出力が一つしか出せないから」ということになります。
というのが、このあと「addPost」のブロックにそれぞれの情報を個別に設定をしなければならないのですが、一つのLLMでやってしまうと変数の設定がうまくできないんですよね・・・少なくとも自分はうまくできていません・・・
また、一つのLLMに一つずつタスクを持たせた方が精度も良くなるかなとも思ったので、今はこのような運用としています。
addPost
ここでようやく前準備で作成したカスタムツールのaddPostが登場します。
addPostには先ほどLLMで作成したそれぞれの変数を設定する必要があります。ただ、その設定さえちゃんとできれば、ここはそれほど難しくはありません。
テンプレート
テンプレートブロックは、変数を一つのテキストにまとめることができます。最後の終了ブロックで出力するために、今回はとりあえずDate、Name、Tag、Memoを一つにまとめているだけにしています。
終了
前のテンプレートブロックで作成されたテキストを出力し、入力モードの処理を終了します。
③出力モードパートの作成
本パートの全体像
入力モードに比べるとすごくシンプルな構成になっています。このパートは以下の3つのブロックで構成されています。
・searchPostsByKeyword(前準備2で作成したカスタムツール)
・Output_LLM
・終了
searchPostsByKeyword
このカスタムツールは開始のブロックで入力したキーワードを入力変数として渡しているだけです。
Output_LLM
ここではLLMを使って収集した情報を日付と概要に整理してもらっています。
{{#context#}}を以下の{出力形式}に習って日本語で整理して。
###出力形式
・日付
・概要
終了
最後の終了ブロックでは、Output_LLMの出力を表示して出力モードの処理を終了しています。
試しに動かしてみよう!
ここまでできれば画面右上の赤色の「実行」ボタンを押下してみてください。そうするとTest RunというUIが新たに右側に立ち上がるはずです。
ここでmodeを選んでInputならInput_Memoにメモを入力し、OutputならOutput_Memoにキーワードを入力してから「実行を開始」を押下すれば、あとは設定がうまく行っていれば最後まで実行できるはずです!!
アプリにしてみよう!
テストでちゃんと動いたら、今度はさらにWEBアプリにしてしまいましょう。
またまた画面右上の「公開する」ボタンを押下し、さらに立ち上がった画面で「公開する」ボタンを押下してみてください。
すると「公開済み」になって下のボタンが押せるようになっていると思いますので、「アプリを実行」を押下してみてください。すると・・・
以下のような素敵なWEBアプリ画面が新たに立ち上がったかと思います!
これでこの画面上でMy Assistantを使うことができるようになりましたね!おめでとうございます!
今はローカルのdockerなので自分の環境下でしか使えませんが、AWSなどの上でデプロイすれば誰でもどこからでもアクセスできるような、そんなサービス開発だって全然できちゃいますね。
番外編:Chromの拡張機能「Dify Chatbot」を使ってみよう
実はちらちらとたまに画面の右下にこの子が居たのですがお気づきだったでしょうか?
こちらはChromの拡張機能である「Dify Chatbot」になりまして、WEBアプリのURLを登録しておけば、Chromさえ開いていればどこからでもアプリを起動して使うことができます!
例えば今はnoteの記事を書いている途中なのですが、右下のこの子を押下するだけで、画面の右側に作成したWEBアプリを表示させて、実際に使うこともできるんです!
GPTsだといちいちGPTsを開かないとMy Assistantは使うことができませんでしたよね?
また、WEBアプリになったとしても、そのURLにアクセスしないともちろん使えないわけです。
ただ、この拡張機能を使えばChromさえ開いていればパパッとメモが取れるようになるので、My Assistantとすごく相性がいい機能だと思っています!
※こちらについてもmarumarumaruさんに情報をいただきました!ほんとうにいつもあ(ry
さいごに 〜 とはいえ・・・
実はなんですが・・・現状ではMy Assistantの全機能を再現できたわけではないんですよね・・・
一番再現できていないのは「出力モード」でして、現状は出力モードにして情報をスプレッドシートから収集するだけにとどまっていて、収集した情報をもとにLLMに情報の整理や新たな気づき/アイデアを考えてもらうなどといった、My Assistantの一番の強みの部分についてはまだ再現ができていません・・・
出力モード単体のアプリにすればチャットボットのChatflowを使えばできるんですが、入力モードも合わせてアプリにするとなると、ちょっとまだうまくいく方法を見つけられていません・・・情報求む・・・
とはいえ、Difyの可能性について、少しでも皆様にお届けできたのであれば幸いです。
GPTsでは「有料会員」にしかあなたが作ったGPTsを届けることができませんでしたが、Difyを使えばもっと多くの方々にあなたが作ったアプリを使ってもらえるチャンスがあるかと思っております!
皆様もぜひぜひDifyを、そしてMy Assistantをお試しいただければ!!