見出し画像

Difyの質問分岐 高機能版考えてみた ~分岐だけじゃなくて引数も判定~

こんにちはRcatです。
皆さんはDify使ってますか?
オリジナルチャットボットやワークフローを作れてすごく便利ですよね。
その中に質問分岐というものがあると思いますが、それなりに素晴らしいんですが、ちょっと物足りないんですよね。
というわけで何が物足りなくてどういうことをしたいのか、説明してから解説までしていこうと思います。

質問分岐って

Difyのワークフロー機能の一つで、AIを使って入力の内容から分岐できる機能です。
例えば、以下のように入力された文字列によって、その先の処理を変更するといったことができます。
こういった簡単な分岐だけならいいのですが、次のような使い方をする場合、ちょっと物足りなく感じます。

アレOサ XXして的なのをやりたい

さて、やりたいことというのはタイトル通り言葉で指示して何かをしてもらいたいということです。
質問分岐器でもできないことはないですが、分岐しかできないと思っています。
プログラム風に言うと実行するコマンドは分岐できるけど、それ以降の引数まで認識できないといった状態です。あと、地味に使用トークンが多いです。

というわけで、入力した内容からコマンドの選択と引数の選択を自動で行う。質問分岐器的なものをこの記事では作っていきます。

ちなみに、この記事以前にも紹介していたりする

実はこちらの記事ですでに実証している内容ではあります。
今回はこれにさらに改造を加え、もう少し柔軟に使えるような工夫をしたので、新しく記事にしたという次第です。

とりあえず実行する

今回はこの仕組みをDiscordのBOTに組み込んでいます。
こうすることで冒頭で紹介したアレOサ XXして的なことをDiscordのチャットで行えるようになります。
今後制作するボットは全てこの技術がベースになりそうですね。

具体的には私が言葉に指示を出すと、その内容をコマンド化してプログラム内の関数を実行するという仕組みです。

例えば以下はとあるシステムに銘柄名と別称を追加する処理です。
NTTと日本電信電話は同じですがAIは分かりません。それらを結びつけるためのデータベースを作っているのですが、後から簡単に作れるようにチャットで受付ができるようなシステムです。

この例では、最初に追加のコマンドを実行して銘柄を追加しています。
その後に別名の追加を行っています。

ちなみに、このコマンドは登録の時点で別名の登録も同時に行うことができます。AIを使うことで、この辺も自動的に認識されます。

こんな感じのデータベースが作成される

直接コマンドで記述すると以下の通りです。
もしもAIを使わない場合、チャットに以下のフォーマットに従って正確に入力しなければなりません。
addbrand <BrandName> [alias]
addalias <BrandName> <alias>
delbrand <BrandName>

具体的な仕組み

プロンプト

まず、一番大事なのはAIへの指示になります。
以下がチャットボットのプロントになります。(テキストジェネレーターだけど)
今回、柔軟性を確保するために複数の変数を使用しています。
前作ではユーザーからの入力のみ変数にしましたが、コマンドの定義も変数にしました。
こうすることで、このテキストジェネレーターを1つ用意しておけば、どんなコマンドにも対応できるようになります。

黒いところは限定コンテンツ

CommandReference変数の中身

次に変数になっている部分です。指示の部分に変数を用いることで、動的にプロンプトを変える作戦です。
今回のクライアントはPythonなので、ソースコードの中で以下のように定義しています。

黒いところは限定コンテンツ

AIへの指示でどういうコマンドがあるのか、そのコマンドはどういう引数を必要とするのかといったことが書かれています。また、かっこ内でとある指示を追加することで精度を高めています。これがあるかないかで、チャットでの認識精度に差があることは確認済みです。

Infomation変数の中身

こちらに関しては、引数の内容に関する注意事項があれば追加で指示できるというものです。
一応前作でこういった指示を追加しておくことで、精度が向上することは確認済みです。

例えば、今回は以下のような指示が入っています。

コマンドリファレンスに書いてもいいかもしれませんが、エイリアスは他のコマンドでも参照するので、同じことを書いているとプロンプトが長くなってしまいます。トークン削減効果もありそうです。

実行する関数

AIの紹介が終わったところで、次はチャットボットでどういう実装をしているかという紹介をします。
次のソースコードはDiscordのボットがメッセージを受信した時のイベントの一部です。
一番最初の行でメッセージを取得しています。
次にメッセージが特定の形式に則ったコマンドである場合を先に処理しています。こうすることで、通常のコマンドとAIコマンドの共存ができます。
定型コマンドと認識できなかった場合は、メッセージを先ほどのテキストジェネレーターに送ってコマンドの自動認識を開始します。
そして、AIからの応答を確認し、定型コマンドと同じように分岐していきます。また、AIは引数を辞書形式で返してくるので、そのまま使えるのが魅力です。
あとはここの分岐の中で様々な処理を入れておけばいいわけですね。
今回はデータベース作成ですが、電子工作と連動させて現実に物を動かすなんてこともできそうですね。やるならhttpリクエストを使って連携とかでしょうかね。夢が広がりますね。

あまり関係のない部分を削除しています。

Select AI2関数は以下の通りです
最近のDify系の記事を見ていただいている方ならわかると思いますが、自作のクライアント関数を使ってAPIを叩いています。
今回は追加のパラメーターがあるので、その分を追加で渡しています。

余計なコメントは非表示にしています。

まとめ

今回はチャットポットをより本格的なチャットボットにできるような技術開発を行いました。
今回はそもそもPythonでできたDiscordのbot内に動く前提なので、Pythonはクライアントで動かしていますが、Difyの中でもPython自体は使えるので、ワークフローを使って自作質問分岐の後にコマンド分岐用のソースコードを書いてURLを作成し、httpリクエストにつなげて他のものを動かすなんてこともできそうですね。

そのうちこの機能を標準搭載したDiscordbotテンプレートでも公開しようかな…。


未公表部
本記事をお買い上げいただくことで、本編では黒塗りで伏せられていたプロンプトや指示の全体をご覧いただくことができます。

ここから先は

515字 / 2画像

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。