LINEボットとDifyエージェントを用いた対話型AIキャラクターの実装|GoogleAppScript
はじめに
近年、対話型AIは急速に発展し、様々なサービスに導入されています。その中でも、LINEボットはユーザーとの接点として広く普及しており、Dify APIのような高性能なAIプラットフォームとの連携によって、さらに魅力的なサービスを構築することが可能となっています。
本記事では、Google Apps Script (GAS) を用いてLINEボットを開発し、Dify APIと連携することで、高度な対話型AIサービスを実現する方法を解説します。提供されたコードを基に、各関数の機能と処理の流れを詳細に説明し、LINEボット開発の基礎から応用までを網羅します。
システム構成
本システムは、以下の4つの主要なコンポーネントで構成されています。
- LINEボット: ユーザーからのメッセージを受信し、Dify APIとのやり取りを仲介します。
- Dify API: 自然言語処理を用いてユーザーのメッセージを理解し、適切な応答を生成します。今回はエージェントを使用しました。
- Google Apps Script (GAS): LINEボットとDify APIを連携させるためのロジックを記述します。
-
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サービスを提供できるでしょう。
Discussion
github
github