Zeals TECH BLOG

チャットボットでネットにおもてなし革命を起こす、チャットコマース『Zeals』を開発する株式会社Zealsの技術やエンジニア文化について発信します。

会話分析におけるGraphDBの活用

f:id:newton30000:20191215174040p:plain

こんにちは。ZealsでCTOをしている佐藤です。
Zealsでは AdventCalendarを開催しており、そちらの15日目の記事となります!

はじめに

会話分析とは?

私達が開発しているZealsは「ネットにおもてなし革命を!」をコンセプトにした、ユーザーと会話して商品を案内するチャットコマースのサービス です。

チャットコマースについて詳細が知りたい方は、同じくZeals AdventCalenarで公開された以下の記事をご覧ください!

qiita.com

このZealsの会話体験を向上させていく中で、ユーザーとチャットボットとの 会話データ を分析していく必要があります。

現在ではMySQLやBigQueryにデータを格納することで、 ETL分析や機械学習のためのマスターデータ を用意しています。 (機会があればこのテーマも記事にします)

www.ashisuto.co.jp

何がしたいか

f:id:newton30000:20191215173727p:plain

例えば会話構造の一部をサンキーチャートで表すと、上記のように表示されます。

ja.wikipedia.org

KPIの取得や特徴量の把握に関しては運用上の問題は特に発生していないのですが、機能が拡張する中で分析しきれない(あるいはしづらい)領域が出てきてしまいます。

例えば上記のサンキーチャートですが、再帰的な構造の会話には対応することができません。

  • ユーザー毎の会話の分岐を構造化
  • 会話が再帰的な構造に対するクエリ発行
  • ユーザーと会話の関係を表すデータが多様
  • 将来的にテーブルが肥大化することによって性能が悪化する

このような問題に対応するため、 RDB以外でデータ格納や分析を行うアプローチ を検討しました。

Neo4j

技術選定について

f:id:newton30000:20191215173838p:plain

引用 : 知らないなんて言えないNoSQLまとめ ― @IT

NoSQLといってもたくさん種類があるのですが、今回はGraphDBのNeo4jを選択しました。

neo4j.com

理由は以下の通りです。

  • 再帰的な構造に対しても一度のクエリで取得することができる
  • 分析用に用いるため、VelocityやAvailabilityが低い場合でも一定の範囲は許容できる
  • プラグインの拡張によって、様々なアルゴリズムを呼び出すことができる
  • GCPとの親和性が高いのではないかと予測される
    • 将来的にマネージドなサービスになることを期待しています
  • 様々な知見が社内に蓄積されそうなので試したい
    • ナレッジグラフのようなビッグデータを扱う際
    • 自然言語処理での構造化

グラフデータベースについて改めて解説しようと思ったのですが、以下の記事がわかりやすくまとめてあったので今回は割愛します。

qiita.com

補足すると、以下のようなことが実現できます。

  • 各ノードに対する重みの算出
  • ループ構造の検出
  • 重み付き最短経路問題
  • クラスタリング

環境構築・実行

公式のDockerImageがあるので使うと楽だと思います。

またneo4j開発者の方々は開発者にとても親切なので、docker構築サンプルの実行などが簡単にできたりします。

サーバーを立ち上げるとデータベースにアクセスすることができ、 f:id:newton30000:20191215173951p:plain

以下のようにビジュアライズしてくれます。 f:id:newton30000:20191215173951p:plain

DBにアクセスしているクエリはcypherというQueryLanguageなのですが、慣れたら感覚的に記述することができます。

環境構築でのハマりどころとしては、最初位にある程度 ノードの設計 を行った方が良いです。

当たり前の話ですが、他のデータベースと比較して一つのノードに対して複数のラベルを付けることができるため、後から整理をする時に手間が増えてしまいます。

また、 期待していたよりもInsertが遅い とも感じました。

以下の記事での例のように、Insertする際にはCSVでimportしたほうが良いと考えます。 Importする時も絶対pathでは指定できず、 /import/配下から指定する形になっているため、複数コンテナ立ち上げる際には気をつけてください。

cloud.google.com

Tipsとしては、上記のようなデフォルトのクライアントや外部ベンダーが出しているGraph DBのビジュアライズを活用すると、 データから思わぬインサイトを取得する ことができます。 隙さえあればポチポチと触って、 relationを展開していくと良いかもしれません。

振り返り

全体の所感としては、 ループ処理やアルゴリズムの呼び出しが容易であり、再帰的な構造があるデータに対してすごく楽 だと感じました。

まだ本番運用まで乗せる事ができていないのですが、先月JoinしてくれたMikeさん(記事)や、技術顧問としてご協力頂いている関根先生と一緒に進めているNLPでのアウトプットとも合わせて本番の運用に乗せていきたいと考えています。

zeals.co.jp

Cypherがデータに対し直感的にアクセスできるため、ビジネスサイドも分析に活用できるのではないかと考えております。 SQLを書いて分析業務を行っているビジネスサイドの方がZeals社内に居ますが、その方たちがCypherを書くことができる将来と考えると、エンジニアとしては非常にテンションが上ります。

またAIという点でも実用的かは定かでないですが、neo4j自体がAIに関するホワイトペーパーも出しているので、そちらも合わせて検証を進めたいと思っています。

さいごに

Zealsは”日本をぶち上げる”というビジョンを実現するためにコミュニケーションを科学しています。

Zealsでは、未だに世の中にスタンダードが存在しない会話データを構造化することに、一緒にチャレンジすることができる仲間を募集しています。

ご興味のある方はぜひ下記募集からご応募ください。お待ちしております!!

hrmos.co