Dialogflowで今すぐ始めるサーバレスChatOps

この記事は RECRUIT MARKETING PARTNERS Advent Calendar 2017 の投稿記事です。

こんにちは。開発支援グループマネージャーの@ainoyaです。最近はゼノブレイド2を買おうかどうか迷っています。この記事では、Dialogflow(旧api.ai)について、社内での活用例について紹介します。

Unstructured Infomation Management FrameworkとしてのDialogflow

dialogflowの概要

活用例の紹介の前に、Dialogflowはチャットボット・ビルダーとしてどのように動作しているのか、上の引用図1)引用元: Chatbots made easy with Dialogflowをベースに簡単に解説してみます。Dialogflowは、ユーザからの入力を理解し、答えを出力するまでに次のような要素をたどります。

要素名 概要
Query 自然言語の入力を受け取り、後段のIntentに合わせた構造化データ(JSON)に変換する
Intent Queryで処理された構造化データを理解し、それに合わせた出力を返す
FulFillment Intentでの処理を外部APIに移譲するための機構。webhookで構造化データを外部のエンドポイントにPOSTできる。複雑な処理や、既存システムにチャットボット機能を増設したい場合に活用する

このように全体の機構を眺めてみると、「自然言語のような非構造化情報を構造化情報に変換し、任意の処理を行う」という観点でApache UIMAと似ています。しばらく使ってみて、Dialogflowは次の点が優れていると感じました。

  • 専門的な知識なしでは確実にハマるであろう自然言語の構造化処理を丸ごとサポートしてくれている
  • 難しすぎないUI。「入力」と「出力」というn対nのディスパッチがIntentsという概念でうまく表現されている。
  • 拡張のしやすさ。Fulfillmentを使ってwebhook経由で外部へ処理を引き回せる

上記の利点を踏まえ、次のような用途でdialogflowを使ってみました。

活用例その1:社内ヘルプデスク1次受けのチャットボットとして

私のグループではインフラ開発のほか、社内ツールの管理等も担当している業務上、「同じ質問が何度も来て、同じ回答を返すのが面倒」と感じることがよくあります。そこでDialogflowを使うと、簡単にQ&Aチャットボットを構成できました。チャットサービスとの連携は、Integrationsを利用します。もちろんSlackとも連携可能です。

slackでの利用例

利用者のリテラシが高い場合は、利用者もDialogflowの管理画面でBotをtrainingできるように権限を解放しておくと良いです。専任のメンテナがいなくとも、誰かが気が向いたときにBotを賢くしてくれます。また、予め大量のQ&Aが想定される場合は、csv形式のQ&A表などを用意して、DialogflowにAPI経由でIntentsを初期投入するのがよいでしょう2)非エンジニアが多い組織で特に有効です

活用例その2:ChatOpsのフロントエンドとして

次は、Fulfillmentを使ってみた例として、DialogflowからCircleCIのジョブを実行してみます。Fulfillmentの設定画面にはCloud Functionの機能がインテグレーションされており、Dialogflowの設定画面内でスクリプトの編集とデプロイを完結させることができます。シンプルなインラインエディタが付いているだけですが、簡単なスクリプティング程度であれば不自由はありません。

Dialogflowの設定画面でCloudFunctionを直接編集可能です

CircleCIはapi経由でのjob実行をサポートしています。これをCloud Functionから呼ぶことで、簡単なChatOpsをサーバーレスに実現してみます。

「railsアプリAを本番環境にデプロイして!」というユーザの入力を受けて、CircleCIのデプロイjobを起動する例を考えてみます。まずはIntentを設定しましょう。IntentやEntityの細かい設定は割愛しますが、以下の設定例をみれば大枠は理解できるかと思います3)詳細な解説資料 [Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る – RE:ENGINES

intentとentityの構成例

入力を正しくパースできているかどうかは、右ペインのチャット画面からデバッグできます。正しくパースされていれば、PARAMETERSVALUESに値が入っています。

次に、Fullfillmentを設定してみます。インラインエディタ上に載っているサンプルコードを読むと、 const actionHandlers に行いたい処理の内容を記述すれば動きそうです。CircleCIのAPIを叩く次のようなコードを埋め込めばOKです。

const request = require('request');
const CIRCLECI_TOKEN = 'your-token';
const circleciUrl =  'https://circleci.com/api/v1.1/project/github/ainoya/rails5-example/tree/master';
request(
  { method: 'POST',
    url: circleciUrl,
    form: { 
      build_parameters: {
          CIRCLE_JOB: 'deploy',
          RAILS_ENV:  parameters['rails-env'], //Intentから受け取ったパラメータをCircleCIに渡す
          RAILS_APPS: parameters['rails-apps']
        }
      },
    auth: { user: CIRCLECI_TKEN, password: '' } }
  , function(error, response, body) {
  //CircleCIへのジョブ命令が完了したら、ユーザへ答えを返す
  sendResponse(responseToUser);
});

それでは実際にslackで動かしてみます。欠けているパラメータは追加質問で取得するように設定しているので、雑な命令にも柔軟な対応ができるようになっていることがわかるでしょう。Dialogflowを使用すると、[コマンド名] [引数1] [引数2]のような命令を人間がわざわざ覚えていなくてもチャットボットに命令できるというメリットがあります。

slackからdialogflowを動かしてみた例1

slackからdialogflowを動かしてみた例2

DialogflowはCustom Payloadもサポートしているので、もう少し作りこめばInteractive Messageを活用したかっこいいChatOps4)GolangでSlack Interactive Messageを使ったBotを書く - Mercari Engineering Blogも実現できそうです

Google assistant以外の使い道でも便利に使えるDialogflow

本記事では、Dialogflowを使用して、Q&AやChatOpsができるチャットボットの構成例を紹介しました。さらにContextを利用すれば、会話の中に状態を保持できるので、ChatOpsにより幅をもたせることができるでしょう。また、チャットボットの処理が複雑化する場合、ユーザにどう機能を提供するか考えるためには会話型UIのデザインガイドラインが重要な指針になると感じました。こうした技術を活用して、プロダクトのUXだけでなく、社内ツールのUXもより一層便利にしていきたいと思います。

参考リンク