カテゴリー: BackEnd

Rubyを使ってDialogflowのお勉強

はじめに

Google HomeやAmazon Echoなどが話題になっていますね。
私も欲しいんですが、Amazon Echoは11月現在、招待制でしか買えないようなので、どうしようかなと悩んでいます。

普段はWeb担当ですが、Web APIを利用してスマートデバイスで便利なこともやっていきたいです。
手始めにDialogflowの勉強をしてみました。
元はAPI.AIという名前でしたが、昨年Googleに買収されて名前が変わったようです。

こちらの方の記事を読んで、とりあえず試してみました。
まだDialogflowを使ったことがないという方には非常に分かりやすいかと思います。
自然言語処理を容易に実装できるDialogflow(旧:API.AI) を使ってみる

上記の記事を踏まえた上で、DialogflowのAPIを叩いてレスポンスを取得することを主眼にしていきます。
Rubyに、DialogflowのAPIを叩くGemがあるので、そちらのドキュメントを見ながら進めたいと思います。
https://github.com/dialogflow/dialogflow-ruby-client

環境

Rubyバージョンは2.4.2で、irbを使って確認しました。

とりあえずAPIで叩いてみる

テスト用のIntentを作成

Intents

Intentでは「このワード」だったら「こういうレスポンス」という流れを決めます。
今回はとりあえずのテストとして、「Nice to meet you」と受け取ったら、「Nice to meet you, too」と返すようにします。

色々設定できますが、「User says」と「Text response」を埋めておけばとりあえず大丈夫です。

Gemの設定

まずはアクセストークンを控えます。
Dialogflowのアプリ設定画面から取得します。

次に自分のRuby環境にて、Gemをインストールします。

$ gem install api-ai-ruby

とりあえず叩いてみましょう。
まずはクライアントの初期化です。

irb(main):001:0> require 'api-ai-ruby'
=> true
irb(main):002:0> client = ApiAiRuby::Client.new(
irb(main):003:1* :client_access_token => 'ACCESS_TOKEN'
irb(main):004:1> )
=> #<ApiAiRuby::Client:.........>

`text_request`というメソッドを使用することで、単語を投げることができます。
「Nice to meet you」と投げてみます。

irb(main):042:0> response = client.text_request 'Nice to meet you'
=> {.....
       :result=>{
         .....
         :resolvedQuery=>"Nice to meet you",
         .....
         :fulfillment=>{
           :speech=>"Nice to meet you, too",
           :messages=>[{:type=>0, :speech=>"Nice to meet you, too"}]},
         .....
    }

レスポンスの中を見てみると、ちゃんと「Nice to meet you, too」が返ってきていることが分かります。

次はわざと間違えてみます。

irb(main):044:0> response = client.text_request 'hogehoge'
=> {.....
       :result=>{
         .....
         :resolvedQuery=>"hogehoge",
         .....
         :fulfillment=>{
           :speech=>"今、なんておっしゃいましたか?",
           :messages=>[{:type=>0, :speech=>"ちょっと分かりませんでした。"}]},
         .....
    }

Eventについて

WELCOMEイベント

Events

Intentでは Eventを設定することができます。
APIで叩く際に、わざわざクエリ指定しなくてもイベント名で叩くことができます。

デフォルトでは、以下のウェルカムメッセージが用意されています。

  • WELCOME
  • GOOGLE_ASSISTANT_WELCOME
  • FACEBOOK_WELCOME
  • TELEGRAM_WELCOME
  • KIK_WELCOME
  • SLACK_WELCOME
  • SKYPE_WELCOME

それではWELCOMEというイベントを叩いてみます。

irb(main):005:0> response_zero = client.event_request 'WELCOME'
=> {
  .....
  :result=>{
    .....
    :resolvedQuery=>"WELCOME",
    .....
    :fulfillment=>{
      :speech=>"こんにちは!",
      :messages=>[{:type=>0, :speech=>"こんにちは!"}]},
      .....
}

「こんにちは」というレスポンスが得られました。
特に何も設定していないので、FACEBOOK_WELCOMEだろうが、SLACK_WELCOMEだろうが、「こんにちは」と返ってきます。

パラメータ付きで叩く

リクエストする際に、user_nameのパラメータを渡し、「こんにちは、〇〇さん」と返してくれるようにしたいと思います。

新しくIntentを作ります。

注釈する項目としては、Actionでリクエストパラメータを設定できます。
PARAMETER NAMEで設定した名前をText responseで使用できます。
user_nameと設定したなら、$user_nameになります。

また、VALUEにはリクエストパラメータの場所を指定します。

叩いてみる

それでは実際に叩いてみます。
第一引数でイベント名、第二引数でパラメータを渡します。

irb(main):007:0> client.event_request 'my_custom_event', { user_name: 'naoki85' }
=> {
  .....
  :result=>{
    .....
    :resolvedQuery=>"my_custom_event",
    .....
    :parameters=>{:user_name=>"naoki85"},
    .....
    :fulfillment=>{
      :speech=>"こんにちは, naoki85",
      :messages=>[{:type=>0, :speech=>"こんにちは, naoki85"}]},
      .....
}

`parameters`でリクエストパラメータが入っていることが分かります。
また、レスポンスではしっかりリクエストが反映されています。

さいごに

Contextについて

今回はあまり試さなかったのですが、Intentの中でContextと呼ばれるものを設定できます。
初めはよく分からなかったのですが、下記のSlackボットを作った記事を読んで、「一連の会話の流れ」を定義するものだと勝手に理解しています。
API.AIのコンテキストを使ってChatOps環境を作る

この辺は実際に何か作ってまたブログにしたいと思います。

naoki85

シェア
執筆者:
naoki85
タグ: RubyGoogleHome

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前