👧

LINEボットとDifyエージェントを用いた対話型AIキャラクターの実装|GoogleAppScript

2024/05/20に公開
2

はじめに

近年、対話型AIは急速に発展し、様々なサービスに導入されています。その中でも、LINEボットはユーザーとの接点として広く普及しており、Dify APIのような高性能なAIプラットフォームとの連携によって、さらに魅力的なサービスを構築することが可能となっています。

本記事では、Google Apps Script (GAS) を用いてLINEボットを開発し、Dify APIと連携することで、高度な対話型AIサービスを実現する方法を解説します。提供されたコードを基に、各関数の機能と処理の流れを詳細に説明し、LINEボット開発の基礎から応用までを網羅します。

システム構成

本システムは、以下の4つの主要なコンポーネントで構成されています。

  1. LINEボット: ユーザーからのメッセージを受信し、Dify APIとのやり取りを仲介します。
  2. Dify API: 自然言語処理を用いてユーザーのメッセージを理解し、適切な応答を生成します。今回はエージェントを使用しました。
  3. Google Apps Script (GAS): LINEボットとDify APIを連携させるためのロジックを記述します。
  4. Googleスプレッドシート: ユーザー情報、LINEボット設定、会話履歴などのデータを管理します。

コード解説

以下では、提供されたコードの主要な関数を解説します。

  • doPost(e): LINEプラットフォームからWebhook経由で送信されたリクエストを処理するメイン関数です。ユーザーから送信されたメッセージを解析し、shouldStopProcessing関数で処理を継続する必要があるかを判断します。処理を継続する場合、handleMainResponse関数を呼び出してDify APIとのやり取りを行い、その結果をLINEに返信します。エラーが発生した場合は、handleErrors関数でエラー処理を行います。

  • retrieveLineBotProperty(name): LINEボットの名前を受け取り、スプレッドシートから該当するボットの設定情報を取得します。取得した情報は、LINEへのメッセージ送信などに利用されます。

  • retrieveUser(userId): ユーザーIDを受け取り、スプレッドシートから該当するユーザーの情報を取得します。ユーザー情報には、会話履歴の管理に必要なconversationIdや、1日の会話回数制限を確認するためのresponseCountなどが含まれます。

  • sendChatMessage(userMessage, conversation_id, user_id): ユーザーのメッセージ、会話ID、ユーザーIDをDify APIに送信し、AIからの応答を取得します。Dify APIはストリーミング形式で応答を返すため、data: で始まる行を解析して応答を組み立てます。また、message_endイベントから取得した会話IDを更新し、スプレッドシートに保存します。

function sendChatMessage(userMessage,conversation_id,user_id) {
  var options = {
    'method': 'post',
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + DIFY_API_KEY
    },
    'payload': JSON.stringify({
      'inputs': {},
      'query': userMessage,
      'response_mode': 'streaming',
      'user': user_id,
      'conversation_id': conversation_id
    }),
    'muteHttpExceptions': true
  };


  try {
    var response = UrlFetchApp.fetch(DIFY_API_URL + "chat-messages", options);
    var result = "";
    var lines = response.getContentText().split("\n");

    for (var i = 0; i < lines.length; i++) {
      var line = lines[i];
      if (line.startsWith("data: ")) {
        var data = JSON.parse(line.substring(6));
        if (data.event === "agent_message") {
          result += data.answer;
        } else if (data.event === "message_end") {
          // レスポンスからconversation_idを取得
          var conversation_id = data.conversation_id;
          // ユーザーのconversationIdを更新
          var user0 = retrieveUser(user_id);
          user0['conversationId'] = conversation_id;
          modifyUser(user0);
          return result;
        } else if (data.event === "error") {
          // Logger.log(data);
          return result + data.event + String(data);
        }
      }
    }
    var json = JSON.parse(response)
    // Logger.log(json.code)
    if(json.code = "not_found"){
      return json.message
    }
  } catch (e) {
    Logger.log(e.toString());
    logMessage(arguments.callee.name, e.toString());
    return { error: 'An error occurred while processing the request.' };
  }
}
  • handleErrors(userId, error, replyToken, userMessage): Dify APIとのやり取り中にエラーが発生した場合に、エラー内容をログに記録し、ユーザーに謝罪メッセージを送信します。また、エラー発生時の状況に応じて、ユーザーに再試行を促すクイックリプライを送信します。

  • その他の関数: 上記以外にも、LINEへのメッセージ送信、スプレッドシート操作、ログ出力、現在日時取得など、様々な関数が定義されています。これらの関数は、システム全体を円滑に動作させるための役割を担っています。

応用

本システムは、様々な機能拡張が可能です。

  • 会話履歴の表示機能: 過去の会話履歴をスプレッドシートに保存し、ユーザーからのリクエストに応じて表示する機能を追加できます。
  • 複数ボットの管理: 複数のLINEボットを管理できるように、スプレッドシートの構造を変更し、ボットごとに設定情報を管理できます。
  • Dify APIの高度な機能の利用: Dify APIは、画像生成や音声認識など、様々な機能を提供しています。これらの機能を活用することで、よりリッチな対話型AIサービスを構築できます。

まとめ

本記事では、GAS、LINEボット、Dify APIを用いた対話型AIサービスの実装方法について解説しました。提供されたコードを基に、各関数の機能と処理の流れを詳細に説明し、システム全体の動作原理を明らかにしました。また、会話履歴の表示機能やDify APIの高度な機能を活用した拡張例を紹介することで、本システムの可能性を示しました。

今回紹介したシステムは、カスタマイズや機能拡張が容易であり、様々なニーズに対応できる柔軟性を備えています。LINEボットとDify APIを組み合わせることで、ユーザーに寄り添った、より高度な対話型AIサービスを提供できるでしょう。

https://lin.ee/8uIBT8r

Discussion