7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AIアシスタントAdvent Calendar 2018

Day 11

Actions on Googleでパーソナライズ化

Last updated at Posted at 2018-12-10

はじめに

あなたのGoogleアシスタントアクションで、ユーザ情報に適した情報を提供をしたいと思いませんか?
例えば、連続で起動してくれているユーザには「毎日起動してくれて、ありがとう😸」って言ってみたり、ユーザの位置情報に応じた情報提供したり、ゲームでの最高得点を保存してみたり。

ユーザデータが保存できると作れるアクションの幅も広がるかと思います!💪
次から、Actions on Googleで利用できるユーザデータの保存方法を紹介していきます。

会話中だけデータ保存する

利用例:

  • フレーズを話したかフラグとして保存しておく。
  • 1つ以上前の質問の回答を利用したい。

使い方

1つの会話中だけ(起動->終了まで)情報を保存したい時、 conversationTokenを利用してみましょう。
使い方はアクションのFullfillment処理でActions on Google Node.js client libraryconv.dataに対して、
新しい変数と値をセットするだけです。

↓のサンプルコードはconv.data.countを作って、呼ばれるたびにカウントアップしています。

app.intent('今何回目', conv => {
  if (!conv.data.count) {
    conv.data.count = 0;
  }
  const count = ++conv.data.count;
  conv.ask("今は" + count + "回目ですよ");
});

アクションのユーザストレージに保存する

利用例

  • アクションの起動回数に応じて、起動時の会話を変更したい。
  • 位置情報を毎回ユーザにリクエストしないようにしたい。

使い方

ユーザストレージとは、Actions on Googleが提供してくれるアクションごとのデータ保存領域で、会話をまたいでデータを保存しておけます。
これも使い方は簡単でconv.user.storageに対して、新しい変数と値をセットするだけです。

:warning: 注意点 :warning:

  • 保存できるデータの最大サイズは10KBまで。超える場合は外部のDBの活用を考えましょう。
  • iOS, Androidでの共有はできない。 (Action起動であれば可能でしたので訂正です。)
app.intent('住所を設定', conv => {
  // ユーザストレージのaddressに保存
  conv.user.storage.address = '今夜月の見える丘';
  conv.ask("おすすめの住所を設定しましたよ");
});

app.intent('どこ住んでるの?', conv => {
  // ユーザストレージのaddressを取得
  conv.ask("私は" + conv.user.storage.address + "に住んでますよ。とてもいいところです。");
});

lastseenの活用

lastseenはユーザが最後に訪れた時間をタイムスタンプで返してくれます。
1週間ぶりに起動した場合に「2週間ぶりですね、お待ちしていましたよ🌝」みたいな愛着が湧くフレーズの制御ができます。

使うには、conv.user.last.seenにアクセスするだけです。
そのまま使うと2018-12-09T13:59:07.000Zの様にUTCなので、Moment Timezone等を使って簡単に利用できるようにすると良いでしょう。

const moment = require('moment-timezone');

app.intent('Default Welcome Intent', conv => {
  // 前回の起動情報があるか確認
  if (conv.user.last.seen) {
    // 
    const lastSeen = moment(conv.user.last.seen).tz("Asia/Tokyo").format('YYYY年MM月DD日 HH:mm:ss');
    conv.ask(lastSeen + " 以来ですね。久しぶりだね、元気にしてたかい?");
  } else {
    conv.ask("Let's start developing on Actions on Google!");
  }
});

ユーザIDの取得

ここまでは、Actions on Googleが提供してくれるストレージに関して書いてきましたが、外部のDBにデータを保存するためにはユーザのIDが必要になります。
ユーザIDはActions on Googleから提供されておらず、自分で作って管理する必要があります。
(2018年3月まではconv.user.idというプロパティがあったが、Deprecateになっており、来年2019年3月には削除される予定です。【参考:Anonymous User Identity】 )

扱う場合は、ユーザIDの生成後はユーザストレージで管理といいでしょう。
サンプルコードでは、ユーザIDをuuid npmライブラリを使って生成しています。
ユーザストレージになければ生成し、セットしています。

const uuid = require('uuid/v4');

// 例: uuidv4を用いて生成する。
const generateUUID = () => {
  return uuid();
}

let userId;
// ユーザIDがユーザストレージに保存済みかどうか
if ('userId' in conv.user.storage) {
  userId = conv.user.storage.userId;
} else {
  // なければ生成する
  userId = generateUUID();
  conv.user.storage.userId = userId
}

const data = "Something you want to save";
saveDataToDB(userId, data);

開発ノウハウ: ユーザストレージをリセットする方法

デバッグ時には、テストデータで何度もユーザストレージをリセットしたくなるはずです。
そんな時は、ユーザストレージを空オブジェクトで上書きしてあげましょう。

conv.user.storage = {}; 

また、アクションがリリース済みならばActions Directoryのアクションの詳細画面下部にある「アプリをリセット」から可能です。

まとめ

ちょっとした情報なら、外部のDBを使わなくても簡単に保存できます。
ひと工夫入れて、ちょっと気が利くアシスタントを作ってみてはどうでしょうか。

参考リンク

7
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?