だって楽したいじゃんか!

大学院(機械工学科)を首席で卒業した男がこれまでの経験を生かさず殺さず発信していく

【GAS】人工知能APIを使って自然な返答をするLINEチャットボットを作ってみる【LINE】

f:id:makimakimakino:20190114224927p:plain
以前、Google Apps ScriptとLINEのMessaging APIを使って短時間かつ無料でサーバーレスLINEのチャットボットを作りました。
makimakimakino.hatenablog.com

とはいえ、こちらから送ったメッセージをそのまま返しているだけなので、ちょっと味気ない感じがします。
なので、いろいろと使える機能を追加していきたいと思います。
そこで今回は、送ったメッセージにより自然な返信をしてくれるような機能を実装していこうと思います。


まず、より自然な会話を実現するにはどうしたらいいでしょうか。
自分で1から会話ロジックを実装するには、何万通りも会話のパターンを収集し、文をベクトル化 (Word2VecとかSeq2Seqとか) したり、
機械学習を使って会話の学習をさせていくのでしょうけれど、そこまで1人で頑張るにはちょっと時間がかかりそうです。

ということで、今回は既にあるAPIを使って楽しちゃいましょう。
ユーザーローカル社が無料で提供している人工知能APIがとても素敵なのでお借りします。


今回のゴール

今回作るものはこんな感じです。
f:id:makimakimakino:20190408004954p:plain:w300
Botに対して何か送ったら、それっぽい文章を返してくれます。

思っていた以上に自然な応答で、結構愛着がわきます。

人工知能APIの利用申請

まず、人工知能APIを使うにはユーザーローカル社のサイトからボットAPIの利用申請が必要です。
ai.userlocal.jp

こちらから、登録をし、認証用の「APIキー」を取得します。このAPIキーを使って、会話を取りに行きます。

APIキーに「sample」を使えば、登録なしでも使うことができますが、1時間に10回しかAPIを使えないなどの制約があるので、登録したほうが無難です。(テストなんかしているとあっという間に超えちゃいますし)

人工知能APIの利用方法

使い方は簡単で、次のように使います。

人工知能APIの使い方


https://chatbot-api.userlocal.jp/api/chat?key=APIキー&message=メッセージ

Getでリクエストを投げ、クエリとしてAPIキーとメッセージを渡すことで、 APIをたたけます。
APIキーには人工知能APIを申請したときに発行されるAPIキーを、メッセージには、APIに話しかけたい任意のメッセージを指定します。

うまくAPIを渡すことができると、


Result

{"status":"success","result":"なーん"}

のようにステータスと、結果が帰ってきます。

気を付けるべきはポイントはクエリとして渡すAPIキーやメッセージはURLエンコードが必要で、そのまま日本語を渡してもうまいこと機能しないということです。

また、リクエストはGetなので、URL全体で255文字を超える長さの文字列を送れないこと、パスワードのような機密な情報は送らないことに注意してください。
(今回はそういうことに使うことはないと思いますが。)

GAS&LINE Messaging APIと連携

さて、それでは実際に使えるようにしていきましょう。

Botの作り方は【GAS】無料!!30分で作れるLINEチャットボット - だって楽したいじゃんか!を参考にしてください。

コードはGASのエディターに次を記載します。

コード


コード.gs

//APIキー
var ai_api_key = '※APIキー※';
var chat_endpoint = 'https://chatbot-api.userlocal.jp/api/chat';
// line developersに書いてあるBotのChannel Access Token
var access_token = '※Channel Accessトークン※';
 
/**
 * postされたときの処理
 */
function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };
 
//人工知能APIに送信するGetURLを生成し、
  var res = UrlFetchApp.fetch(chat_endpoint + '?key=' + encodeURIComponent(ai_api_key) + '&message=' + encodeURIComponent(data.events[0].message.text));
  reply_messages = [JSON.parse(res).result];
  
  var messages = reply_messages.map(function (v) {
    return {'type': 'text', 'text': v};
  });
 
  var postData = {
    "replyToken" : data.events[0].replyToken,
    "messages": messages
  };
 
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
  return UrlFetchApp.fetch(url, options);}

解説

少し解説します。

LINEのBotにメッセージを送った時、LINE Messaging APIがメッセージを受け取り、GASにPostでリクエストを投げます。

GASはdoPostの処理を実行していきます。

この辺りは過去記事と同じです。

今回新しいのは、人工知能APIにメッセージを送信するところです。

UrlFetchApp.fetch関数は引数として渡したURLをリクエストとして投げる関数でレスポンスの結果が戻り値として返ってきます。

今回は結果がJSON形式で帰されるので、それをパースしてreply_messagesの変数に格納しています。

そこから今度はLINEのMessaging APIに送信する形に変換しているのがreply_messages.mapのところです。

また、APIキーやメッセージのテキストはLINEから送ったテキストデータはそのまま使えないのでencodeURIComponent関数を使ってURLエンコードをしています。

それが終わるとBotに呟かせるオブジェクトを作成するために、replyTokenやmessagesを設定します。

最後にUrlFetchApp.fetchを使ってにMessaging APIのURLに、Postデータを渡しています。その結果がLINEに表示されます。

まとめ

以上が、人工知能APIを使ったLINEの会話機能の実装になります。

試しにLINEでメッセージを送ってみましょう。
f:id:makimakimakino:20190408004954p:plain:w300

こんな感じで送ったメッセージに対してちょっとAIっぽい返答が返ってきてるのがわかると思います。

APIを使ってしまえば自分で1から作らなくても簡単に機能拡張していけるという所はとても便利ですよね。

他のAPIについても基本的に同じような使い方をします。無料で使えるAPIもたくさんありますし、自作アプリもAPI化してしまえばいろんな所とLINEがつながることで、より面白いことができるのではないかなと思います。