LINE公式アカウントのBotモードによる応答でojichatに喋ってもらいました

LINE公式アカウントのトークルーム上で、ojichatに自動応答させてみました。LINEのMessaging APIを使用し、Webhookを処理するLambdaとojichatが動作するLambdaを連携させて、自動応答を行うボットを作成しました。
2021.04.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

LINE公式アカウントのトークルームと自動応答

近年、システムによる自動応答の活用されるケースが、様々なシーンで見られるようになってきました。LINE公式アカウントのトークルームも、そのうちのひとつに数えられるでしょう。あいさつメッセージや応答メッセージの設定を初めとして、視覚的なメッセージアイテム、AIがユーザーの発言内容を判別するAI応答メッセージといった機能が使えます。また、開発者は独自にAPIを作成してwebhookに設定し、APIのバックエンドで動作する対話アプリケーションに応答させることもできます。このようにLINE公式アカウントは、ニーズに応じた自動応答を活用できるプラットフォームです。

ojichatの魅力とリアリティ

ojichatについては、つい先月にもAPI化されるなど話題性に事欠かず、一部界隈では本稿で改めて紹介するまでもないほどの知名度を誇るソフトウェアです。「独特のキャラクター性に裏打ちされた多様なセリフを自動生成する」という強力な機能が独立したライブラリとして実装されている点に、このソフトウェアの存在意義は凝縮されています。出力された文字列をあらゆる場所で使用でき、応用の可能性は無限に拡がります。

この決定的なインパクトを持つキャラクター性は、ある種の「リアリティ」を人の心に植え付けるのに、実際、十分すぎるものです。しかし、真の意味でのリアリティを最大化しようと考えたとき、私たちの思いは「ojichatの出力結果を実物のメッセージングアプリの画面上で何としてでも目撃したい」という願望に収束するのではないでしょうか。それを実現する場として今回取り上げるのが、LINE公式アカウントのトークルームです。

システムの構成

LambdaとAPI Gatewayとを使用して、LINE公式アカウントのBotモードによる応答の設定でwebhookのURLに指定するためのAPIを作成します。ここで動作するLambda関数が、ojichatが動作するLambda関数やMessaging APIと協働して処理を行い、LINE公式アカウントのトークルームにいるユーザと対話します。

構成図

大まかなシステム構成図を以下に示します。

ojichat webhook システム構成図

Webhookの処理

Webhook用のLambda関数では以下のような処理を行います。

  1. リクエストの署名を検証する
  2. イベント配列を要素ごとに処理する
    1. イベント型がメッセージイベントであることを確認する
    2. イベントのソース型が送信元ユーザであることを確認する
    3. LINE Messaging APIでユーザのプロフィール情報を取得する
    4. ユーザのプロフィール情報から表示名を取り出す
    5. 取り出した表示名を入力としてojichat関数を呼ぶ
    6. ojichat関数から出力としてメッセージ本文を得る
    7. LINE Messaging APIでユーザへの応答メッセージを送信する

今回は、既に多くのコードがTypeScriptで書かれている場合を想定し、ojichatが動作するLambda関数以外は全てTypeScriptで実装しています。筆者の所属するチームでもTypeScriptを使用する場合が多く、筆者自身も書き慣れており、技術的な情報を得やすいためです。

複数のLambda関数の連携とデプロイ

ojichat自体の実装言語はGoですが、Lambda関数としてデプロイしてあれば、他のLambda関数からSDKを用いて、JSONフォーマットによる入出力を行えます。API化された際の記事で用いられているインタフェースを変更し、ojichatの薄いラッパー関数として実装しました。また、ojichatの全てのオプションを外から使用できるような形としました。

Lambda関数を複数の言語で実装したため、CDKデプロイ時にはそれぞれの言語のソースコードについて、デプロイの前処理を行う必要があります。この前処理についてもCDKで管理できるとのことなので、実際にやってみました。使用している言語が複数であっても、一度コマンドを打つだけで手元のDocker環境でそれぞれが自動的にビルドされ、デプロイまでスムーズに完了できました。

完成してしまったもの

なんだこれは……

「どうしてヒトは、言葉という手段に頼らざるを得なかったのだろう」

そんな静かな絶望に苛まれるほどに状況を詳述する語彙を逸してしまう瞬間が、人生には時としてあります。ただ、今回の出来事がそれだったというのは不覚です。

反省

サーバーレスであっても、計算機資源を有効に使えているかどうかについては、常に考える必要があります。効率の良い構成で最大限の価値を提供することに、インフラエンジニア、サーバーサイドエンジニアは、日頃から全霊をかけて取り組んでいると言っても過言ではありません。高い理想を目指して想定していた以上に試行錯誤を繰り返すことになる場合も、決して少なくないでしょう。貴重なフィードバックをいただきながら私たちが皆様と共に日々進めていく力強い歩みに、無駄と呼んでよいものなどひとつとして存在しないのです。でも今回作ったものは計算機資源の無駄です。

恐る恐るojichatとの対話を試みると、まるで自分自身と向き合っているかのような錯覚を覚えましたが、すぐに考えることをやめました。いわゆる「不惑」のステージに近づきつつあるプログラマーが、このようなものを拵えていて本当に大丈夫なのか? クラスメソッドとは、一体何をしている会社なのか? サーバーサイドエンジニアのあるべき姿とは? 人間とは——

ojichat向けに用意したLINE公式アカウントのアイコンを管理画面で設定しているとき、自分が今何をやっているのか一瞬わからなくなりましたが、得てして人間の迷いというものは、そういうところに立ち現れてくるものではないでしょうか。そのような迷いを振り切ってしまうことが、時には必要なのかもしれません。

まとめと今後の展望

今回は、LINE公式アカウントのトークルーム上でojichatに登場してもらいました。複数のLambda関数を連携させ、常用している開発言語とは異なる言語で書かれたソフトウェアと協働するシステムを構成しました。実際のLINEの画面上に様々なセリフを表示できるようになり、ojichatというソフトウェアの魅力を最大限に引き出す効果が得られました。

実際に触ってみるとわかりますが、トークルームからメッセージを送信してみるとすぐに既読となり、尚且つ間を置かずに応答メッセージが返ってきます。これはいかにも自動化されたシステムらしい挙動です。バックエンドで動作するアプリケーションの内容によっては、こうした挙動が不自然に感じられるようなケースもあるかもしれません。そのような場合は、webhookが叩かれたのを契機に、時間を置いて発火するリプライ用のジョブをキューイングするような構成にすることで、より自然な雰囲気を出せると考えられます。

皆さんも是非、いろいろなボットをLINE公式アカウントで喋らせて、横溢する技術スキルを盛大に無駄遣いしてみてはいかがでしょうか。