Pocket

 

機械学習。今すごく熱いですよね。
少し前にリクルートが機械学習、ディープラーニングを用いたAPI群「A3RT」を無料公開しました。

A3RT(アート)

現在は6つのAPIが公開されています。
個人的には画像の影響度を図るImage Influence APIとか面白そうですね。今は肉の画像の影響度が調べられるAPIが用意されています。

今回はその中の一つTalk APIを触ってみたのでご紹介します。

Talk APIとは

Talk API

 

ユーザのリクエストに対してインタラクティブな会話を提供するAPIです。
マイクロソフトの女子高生AIりんなのような感じですね。話しかけて会話を行うことができます。

公式より引用

Talk APIはChatbotを作成するためのAPIです。 Recurrent Neural Network(LSTM)を用いた入力文からの応答文生成による日常会話応答機能を提供します。 Talk APIを活用したChatbotによって様々なアプリケーション上でユーザとの対話を自動化し、 どのようなタイミングにおいても即座にユーザからの問いかけに対して応答することができます。

API KEYはメールアドレスだけで簡単に取得することができます。

 

Google Apps Scriptでスクリプトを作成

早速Google Apps Script(以降:GAS)でアプリケーションを作成します。

 

もし選択肢に出てこなかったら『アプリを追加』から追加してください。

まずは画面を表示できるようにしましょう。
ファイル-新規作成-HTMLファイルからHTMLファイルを作成し、ファイルの中身を書き換えます。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    Hello World
  </body>
</html>

コード.gsの中身を変更し、HTMLファイルを読み込むようにします。

function doGet() {
  t = HtmlService.createTemplateFromFile('index.html');
  return t.evaluate();
}

画面で確認できるようにアプリケーションを公開します。
公開-ウェブアプリケーションとして導入を選択。

導入ボタンを押すとURLが発行されるので、アクセスしてみます。

画面が表示されました。

APIにアクセスしてみる

APIにアクセスしましょう。API KEYはファイルを分けることにします。

function getConf() {
  return {
    apikey: 'API KEY'
  }
}

コード.gsに新しい関数を追加します。

function talk()
{
  var conf = getConf();
  var formData = {
    apikey: conf.apikey,
    query: 'いい天気だね'
  }
  var options = {
    'method' : 'post',
    'payload' : formData
  }
  
  var result = UrlFetchApp.fetch("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk", options)
  var jsonData = JSON.parse(result.getContentText());
  Logger.log(jsonData);
}

GASで外部APIにリクエストするときにはUrlFetchApp.fetchを使います。
関数を実行してみます。

承認を求められると思うので許可し、表示-ログで実行ログを確認してみます。

ちゃんとレスポンスが返ってきました。

画面から会話できるようにしてみる

画面がないと味気ないので画面をつくります。
画面の作り方は特に解説しませんが、よくある入力ボックスに言葉を入れて応答が画面に表示されるようにします。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style type="text/css">
       .message {
           border-radius: 3px; 
           padding: 5px
       }
       .message.me {
           background-color: #cccccc;
       }
       .message.api {
           background-color: #ffe0e0
       }
    </style>
    <script type="text/javascript">
        function talk() {
            var message = document.getElementById('message').value;
            if (!message) return;
            var el = createMessageEl(message, 'me')

            document.getElementById('talkbox').appendChild(el);
            google.script.run.withSuccessHandler(success).talk(message);
        }
        function success(result) {
            var el = createMessageEl(result, 'api')
            document.getElementById('talkbox').appendChild(el);
            document.getElementById('message').value = '';
            document.getElementById('message').focus();
        }
        function createMessageEl(message, target) {
            var p = document.createElement('p');
            p.innerText = message;
            p.className = 'message ' + target;
            return p;
        }
    </script>
  </head>
  <body>
    <div class="container">
        <h2>リクルートのTalk APIを試してみる</h2>
        <div class="chatbox form-group row">
            <div class="col-xs-8"><input class="form-control" type="text" id="message" /></div>
            <div class="col-xs-4"><button class="btn btn-primary" onClick="talk()">話しかける</button></div>
        </div>
        <div id="talkbox" class="talkbox"></div>
    </div>
  </body>
</html>

var STATUS_SUCCESS = 0;

function doGet() {
  t = HtmlService.createTemplateFromFile('index.html');
  return t.evaluate();
}
function talk(message)
{
  var conf = getConf();
  var formData = {
    apikey: conf.apikey,
    query: message
  }
  var options = {
    'method' : 'post',
    'payload' : formData
  }
  
  var result = UrlFetchApp.fetch("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk", options)
  var jsonData = JSON.parse(result.getContentText());
  if (jsonData.status != STATUS_SUCCESS) {
    return;
  }
  return jsonData.results[0].reply;
}

画面を確認します。

画面ができましたね。
それではちゃんと会話できるか試してみましょう。

ちゃんと会話できてますね。
(わかりづらいですが灰色がこちらの入力した値、ピンクがレスポンスです)

おわり

こういったサービスを触ってみるとAIが身近に感じますよね。

まだちょいちょい返答がおかしいですが、こうしたサービスを仕事にも上手く取り込んでいけると出来ることがどんどん広がっていくのかなと思います。