Dialogflowで今すぐ始めるサーバレスChatOps
ainoya
こんにちは。開発支援グループマネージャーの@ainoyaです。最近はゼノブレイド2を買おうかどうか迷っています。この記事では、Dialogflow(旧api.ai)について、社内での活用例について紹介します。
Unstructured Infomation Management Frameworkとしての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とも連携可能です。
利用者のリテラシが高い場合は、利用者もDialogflowの管理画面でBotをtrainingできるように権限を解放しておくと良いです。専任のメンテナがいなくとも、誰かが気が向いたときにBotを賢くしてくれます。また、予め大量のQ&Aが想定される場合は、csv形式のQ&A表などを用意して、DialogflowにAPI経由でIntentsを初期投入するのがよいでしょう。2)非エンジニアが多い組織で特に有効です
活用例その2:ChatOpsのフロントエンドとして
次は、Fulfillmentを使ってみた例として、DialogflowからCircleCIのジョブを実行してみます。Fulfillmentの設定画面にはCloud Functionの機能がインテグレーションされており、Dialogflowの設定画面内でスクリプトの編集とデプロイを完結させることができます。シンプルなインラインエディタが付いているだけですが、簡単なスクリプティング程度であれば不自由はありません。
CircleCIはapi経由でのjob実行をサポートしています。これをCloud Functionから呼ぶことで、簡単なChatOpsをサーバーレスに実現してみます。
「railsアプリAを本番環境にデプロイして!」というユーザの入力を受けて、CircleCIのデプロイjobを起動する例を考えてみます。まずはIntentを設定しましょう。IntentやEntityの細かい設定は割愛しますが、以下の設定例をみれば大枠は理解できるかと思います3)詳細な解説資料 [Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る – RE:ENGINES。
入力を正しくパースできているかどうかは、右ペインのチャット画面からデバッグできます。正しくパースされていれば、PARAMETERS
とVALUES
に値が入っています。
次に、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]
のような命令を人間がわざわざ覚えていなくてもチャットボットに命令できるというメリットがあります。
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もより一層便利にしていきたいと思います。
参考リンク
- 自然言語処理を容易に実装できるDialogflow(旧:API.AI) を使ってみる #dialogflow - Qiita
- API.AIのコンテキストを使ってChatOps環境を作る - 偏った言語信者の垂れ流し
脚注