🤖

LINE FAQ botを作る

2024/06/17に公開

はじめに

今回はLINE FAQbotを作ってみたので作成手順や作成中のメモを残します✍

動作
LINEからLINEに関する問い合わせがあった場合に問い合わせに関する回答をする。
それ以外の問い合わせがあった場合はサポートセンターにメールを送信するという流れとなります。

準備

LINE Developersのアカウント、make(integromat)のアカウント作成します。

FAQのデータの作成

LINEヘルプセンターからよくある質問をコピペしてデータを作る。

DifyでFAQアプリの作成

・FAQのデータをナレッジに登録。
・アプリを作成 (ワークフロー)
 【開始】
  入力変数追加
 【知識取得】
  クエリ変数:開始で追加した変数を設定
  知識:FAQデータのドキュメントを設定
 【質問分類器】
  質問の内容がFAQに関係ある内容か、関係ない質問や文言か判別する。
  ■FAQに関係する内容の場合
  【LLM】
   知識取得の出力内容をまとめる。
  【終了】
   LLMでまとめた内容を出力する。
  ■関係ない質問や文言の場合
 【コード】
 「xxxについて見つかりませんでした。」という文言を返す。
  【終了】
   コードで返却された文言を出力する。

LINE Botの作成

おうむ返しBotの作成

以下サイトを参考に「おうむ返しBotの作成」を行います。
https://qiita.com/watanabe-tsubasa/items/8342595d641143b780f7


以下についてはメモとして残します📃
おうむ返しBotの作成前にやっておくと良いかもしれません👍
■チャネル作成
LINE Developersにてチャネルを作成します。チャネルの種類はMessaging APIを選択。

新規チャネル作成画面で必須項目を入力し「作成」ボタンを押下します。

■チャネルアクセストークンの発行
LINE Developersのトップ > プロバイダー名 > チャネル名 > Messaging API設定の下に、チャネルアクセストークンがあるので発行しておきます。


LINEとDifyの接続

おうむ返しBotの作成が出来たらDifyとLINEを繋ぎます。
LINEとDifyでAPI通信を行います。私の場合ローカル環境のDifyでワークフローを組んでいるため、クラウドのDifyにワークフローを組み込む必要があります。
 
ローカルDifyで作成したワークフローと同じものをクラウドDifyで組むには以下の操作で出来ます👇
手順

  1. ローカルDifyのスタジオで作成したワークフローの右下にある「・・・」を押下し「DSLをエクスポート」でymlファイルをエクスポートします。

  2. クラウドDifyのスタジオで「DSLファイルをインポート」を押下して、先ほどエクスポートしたファイルをドラッグ&ドロップでインポートできます。

以下のサイトを参考にmakeを使ってLINEとDifyを接続します。
https://qiita.com/cog1t0/items/00a9e608925578e0cf44

makeで修正・追加した場合は下の「Save」ボタンで保存することを忘れないようにお気を付けください!

Difyのワークフローを修正した場合は右上の「公開する」→「更新」ボタンで保存ができます!

動作確認

  1. LINE Developersのトップ > プロバイダー名 > チャネル名 > Messaging API設定の下にQRコードがあるので、LINEでQRコードを読み込み友達追加を行います。
  2. makeの「▷Run once」を押下します。
  3. 「パスワードを忘れた場合」を送信すると、回答が返ってきます。
  4. 「こんにちは」と送信すると、「見つかりません」と回答が返ってきます。

回答が分からない場合にメールを送信する

GAS(Google Apps Script)を使ってメールを送信していきます。
・スプレッドシートの「拡張機能」→「Apps Script」を押下し、スクリプトエディタを開きます。

以下のコードをスクリプトエディタに記述します。

function sendEmail() {
  let to = "任意のメールアドレス";
  let subject = "テスト件名";
  let body = "本文です";

  GmailApp.sendEmail(to, subject, body);
}

今回は自分から自分へメールを送信します。

動作確認
「▷実行」ボタンを押下します。
初めて実行する場合は承認と許可が求められるため「権限を確認」をクリックし進みます。
結果:メール送受信が出来ました🎉

参考サイト🙇‍♂️
https://note.com/su3_hokkaido/n/n6213a6dec475
https://www.isfnet-services.com/blog/125/GoogleAppsScript

GASで作った関数を外部から呼び出す

GASで作った関数をアプリケーションとしてデプロイします。
デプロイする手順です👇
 
右上のデプロイ > 新しいデプロイを押下します。

 
種類の選択の右側にある歯車ボタンから「ウェブアプリ」を選択し「デプロイ」を押下するとURLが発行されます。

 
クラウドDifyのワークフローに戻り、質問分類器の後ろに「HTTPリクエスト」を追加します。
HTTPリクエストのURLに先ほど取得したURLを設定し、HTTPリクエストのみ単体で動かします。
 
実行結果は失敗してしまいました・・

 
スクリプトエディタの実行数を確認すると実行関数が「doGet」となっています。
Getの場合はdoGet関数、Postの場合はdoPost関数を実行するようです。
実行関数がdoGetとなっているため、doGet関数でsendEmail関数を実行するように修正します。

function doGet() {
  sendEmail();
}

function sendEmail() {
  let to = "任意のメールアドレス";
  let subject = "テスト件名";
  let body = "本文です";

  GmailApp.sendEmail(to, subject, body);
}

※GASの関数を修正した場合は再度デプロイし、新しく取得したURLをDifyのHTTPリクエストに設定します。
HTTPリクエスト単体で実行するとメールの送受信が確認できました🎉
スクリプトエディタで実行結果を確認するとステータスが「完了」となっています。

パラメータの設定

GASで作った関数を外部から呼び出すではGASの関数内でメールアドレス、件名、本文を記述していますが、GASではメールアドレスなどの情報を固定で持たずに、Difyでメールアドレスなどの情報を管理しようと思います。
GASはDifyから渡された情報でメール送信するという役割にします。

DifyのHTTPリクエストで設定しているAPIにメールアドレス、件名、本文(問い合わせ内容)の情報を渡します。
まず、ユーザーが入力した内容をGASに渡しメール本文に表示できるか試します。

Dify
API(URL):https://script.google.com/xxxxxx/exec
execの後ろに「?input=input」とパラメータを渡します。

GAS
e.parameter.inputの中に「input」(ユーザーが入力した質問内容「明日の天気は?」など)が入ります。
GASの関数は以下のように修正します。

function doGet(e) {
  // メール送信処理
  sendEmail(e.parameter.input);
}

function sendEmail(body) {
  let to = "任意のメールアドレス";
  let subject = "テスト件名";

  GmailApp.sendEmail(to, subject, body);
} 

動作確認
HTTPリクエスト単体で実行し動作確認を行います。
質問内容を入力し「実行を開始」します。
結果:メールの受信が出来ておりDifyで入力した内容がメール本文に表示されています。

メールアドレス、件名も同様に設定します。
メールアドレスや件名については入力するという操作がないため、コードブロックを使ってメールアドレスや件名の情報を管理します。

メールアドレス

function main() {
    return {
        address: "任意のメールアドレス"
    }
}

件名

function main() {
    return {
        subject: "ユーザーからの問い合わせ"
    }
}

本文
メール本文の内容を以下のようにするため本文にひと手間加えます。
【ユーザーからの問い合わせ内容】
xxxxxについて

function main() {
    return {
        body: "【ユーザーからの問い合わせ内容】"
    }
}

GASの関数を以下のように修正します。

function doGet(e) {
  // メールアドレス
  let address = e.parameter.address;
  // 件名
  let subject = e.parameter.subject;
  // 本文
  let body = e.parameter.body + "\n" + e.parameter.input;

  GmailApp.sendEmail(address, subject, body);
}

本文についてDifyのコードで改行処理を入れたかったのですが、改行コードが邪魔してメール送信が出来なかったためGASで改行処理を入れました。

動作確認
Difyの右上にある実行ボタンを押下しフロー全体を動かして確認します。
質問1:パスワードを忘れた場合
結果:ナレッジの内容を回答してくれました。

質問2:宇宙人はいますか?
結果:「サービスセンターにメールを送信しました。」と出力され、メール受信を確認しました。

Dify上での動作確認としては問題なさそうなため、LINEとDifyの接続と同じ手順でLINEとDifyを接続します👍

動作確認
LINEとDifyの接続が出来たらmakeのRun onceを押下します。
LINEで質問内容を入力し送信します。
質問1:パスワードを忘れた場合
質問2:今日の天気は?
結果:LINE FAQに関係する質問には回答をしてくれて、関係ない質問についてはメールを送信することが出来ました🎉

以上でLINE FAQbotの作成手順でした🫡

まとめ

はじめはmakeの使い方やLINE Developerの設定が不明だったり、DifyのフローからどうやってGASの関数呼び出すの!?など色々疑問があり試行錯誤しましたが、なんとかLINEbotが出来て良かったです!
Difyでメールアドレスや件名などの情報を管理方法はもっと良いやり方ないかな・・?といった感じです。良い方法あったら教えてください🙇‍♂️

未だにほしい回答を出せるようにプロンプト書くのが難しいなと・・!笑

今回はDifyはワークフローでフローを組んでいましたが、チャットフローを使ったほうが良いようなので、いつかチャットフローを使ってLINE FAQbotを作ってみようと思います!

以上となります🫡

Discussion