見出し画像

GASからDifyのAPIを叩くときにハマったポイント

こんにちは。マインディアでマーケティングを担当している石渡です。

突然ですが、みなさんDify使ってますか?

Difyとは、「先進的なAIアプリケーションのためのイノベーションエンジン」です。もう少し分かりやすく言えば、「ノーコードやローコードで生成AIを組み込んだアプリを作れるプラットフォーム」みたいな感じでしょうか。詳しく解説した記事もたくさん出てますので、初めて聞くという方は検索してみてください。

実際使ってみると思ったより簡単で、「文系管理職なのに〜♪画期的な業務アプリを〜♪シュシュっと作れちゃう、俺〜♪」感が味わえます。

そんなDifyですが、GASと組み合わせて使うときにハマったポイントを書き残しておきます。

書いている人

現在は株式会社マインディアという会社でBtoC・BtoB両方のマーケティングをしています。
何か気になる点があればお気軽に下記Xまでご連絡ください!フォローもしていただけると嬉しいです!
X @takahirostone

なぜGASと組み合わせるのか

日常的にGoogle Workspaceの各種ツールを使っている方は多いのではないでしょうか。GASを組み合わせることで、Difyで作成したアプリへのinput、またアプリからのoutputとして

  • Googleスプレッドシート

  • Googleスライド

  • Googleドキュメント

  • Gmaiil

などをそのまま活用することができます。例えば「もともと持っているデータがスプレッドシートにあり、それを分析してスライドにテキストを挿入し、スライドが完成したらメールで送る」というユースケースにそのまま使えるようになるんです。

GASからDifyのAPIを叩くときにハマったポイント

GASは実行時間の上限が6分でそれを超えるとタイムアウトする(実際には6分超えても動いていることもあり、よくわからない)というのは、GASをよく使う方であればご存知かと思います(公式リファレンス)。

GASからDifyのAPIを叩くときには通常以下のような流れになります。

  1. GASからDifyにUrlFetchAppでPOSTリクエストを送る

  2. Difyで何らかの処理が走る

  3. レスポンスをGASで受け取る

この流れを6分以内に処理できれば良いのかとDifyでの処理の内容を調整して実行しても、実際にはDifyでの実行時間が100秒を超えるとエラーが返ってきてしまいます。

実行時間が100秒を超えるとGASにはエラーが返ってきます

100秒というのは思ったよりも短く、特にLLMでの処理に数十秒かかることもあるので、ループ(Difyのイテレーション)で同じ処理を何度も回すようになっているとすぐに100秒を超えてしまいます。そもそも、1回LLMに質問を投げて回答を得るくらいの単純なタスクであればわざわざDify使わずにLLMのAPIを直接叩けば良いので、Difyを使っている以上はある程度複雑な処理になっていると思います。

ただし、GASにエラーが返ってきたあとしばらくしてからDify側のログを見ると、100秒を超えても処理は続いていて、最終的にはSUCCESSとなっていました。

Dify側では最後まで実行されています

解決策

リクエストを送る関数とレスポンスを受け取る関数をGAS側で分ける

上述の通り、GASからリクエストを送ったところにエラーが返ってきたあとも、Difyではアプリの実行が続いています。そのため、リクエストを送る関数がエラーで止まってしまっても、別の関数でレスポンスを受け取ればよいのです。GASには外部から送られたHTTPリクエストを受け取るdoPost関数があります。Dify側で、HTTPリクエストのノードを使ってGASにリクエストを送ればOKです。

Dify内での処理時間を早くするよう調整する

これは処理の内容次第ですが、まったく同じ処理でもLLMのモデルによって精度や実行時間が異なります。下表は、ある2つのタスクを各モデルで3回ずつ実行したときの実行時間と正解数です。モデルによって正解数のバラつきがあり、また、実行時間も6倍ほどの開きが出ています。本来claude 3.5 sonnetはベンチマークのスコアなどを見ても早いはずなのですが、このタスクは苦手だったようですね。また、プロンプトを変えてみたり、LLM以外の部分を調整することでも早くすることはできるかもしれません。

モデルを変えてみるのも手です

最後に

何か気になることがある方、ぜひお気軽にXで絡んでください!


よろしければサポートお願いします!そのうちオリジナルドメインにしたいなと思っているのでその資金にさせていただきます!