Save 37% off PRO during our Black Friday Sale! »

ElasticsearchとKibelaを活用した SlackでのCSお問い合わせ対応業務の改善

D8ca2261592f73dc422829e1e20feea0?s=47 tawamura1224
October 02, 2021

ElasticsearchとKibelaを活用した SlackでのCSお問い合わせ対応業務の改善

ユーザからのお問い合わせに対して適切な回答を行うことは、様々なサービスを提供する上でとても重要です。弊社ではその中でも技術的なお問い合わせについて、Slack上で問い合わせ担当エンジニアへ調査を依頼する業務フローが存在します。現在、問い合わせ担当エンジニアは当番性であり、担当領域以外の問い合わせについても対応しています。この業務フローに関して、新しいお問い合せのうち、一部は過去に対応したお問い合わせと類似したものや一致するものが存在し、回答の参考になることがあります。
本セッションでは、新しいお問い合わせについて、過去のお問い合わせから類似するものをAmazon Elasticsearch Serviceを使用して自動で抽出し、同時にKibela Web APIを使用して関連するドキュメントを検索した上で、Slackのスレッドに投稿するシステムについて導入した話を紹介します。

D8ca2261592f73dc422829e1e20feea0?s=128

tawamura1224

October 02, 2021
Tweet

Transcript

  1. © 2012-2021 BASE, Inc. BASE株式会社 Data Strategy Section 粟村 誉

    @tawamura1224 ElasticsearchとKibelaを活用した SlackでのCSお問い合わせ対応業務の改善
  2. © 2012-2021 BASE, Inc. BASEから1人目の刺客です 2

  3. © 2012-2021 BASE, Inc. 自己紹介 3 2010〜 大学・大学院で自然言語処理の研究 2016〜 ヤフー株式会社       Entity Linkingパッケージの基礎開発など

    2018〜 ITベンチャー企業       不正行動の検知モデル作成など 2019〜 BASE株式会社       不正決済対策など検知系全般 粟村 誉 (Awamura Takashi)
  4. © 2012-2021 BASE, Inc. 4 世界のすべての人に、 自分の力を自由に価値へと変えて 生きていけるチャンスを。 あたらしい決済で、あなたらしい経済を。 Payment

    to the People, Power to the People. Philosophy & Mission
  5. © 2012-2021 BASE, Inc. 5 Confidential ネットショップ作成サービス「BASE」 ショップ開設数 (個人・法人・行政を含む) 160万ショップ以上

    BASEかんたん決済利用料 3.6%+40円 サービス利用料 3% 初期費用・月額費用 0円 ショップオーナーのサポート機能が充実!(BASE Apps) コンセプト:「誰でも簡単に使えるネットショップ作成サービス」 個人でも決済機能をかんたん導入。審査もスピーディー! クレジットカード 銀行振込 コンビニ決済・Pay-easy 後払い キャリア決済 PayPal Amazon Pay
  6. © 2012-2021 BASE, Inc. 今回の話💡 去年、弊社プロダクトチームブログのアドベントカレンダーで書いた内容についてです コード等は省きますので下記リンクで 6 https://devblog.thebase.in/entry/2020/12/11/113000 BASE

    Tech blog [検索]
  7. © 2012-2021 BASE, Inc. 背景: ユーザからのお問い合わせへの調査業務 7 CS担当の人から、主に技術的な 内容に関してエンジニアに ヘルプを求める仕組み

    経緯や結果はSlackのスレッドと Kibelaという社内Wikiツールに 残している https://devblog.thebase.in/entry/2020/12/10/113000
  8. © 2012-2021 BASE, Inc. 過去に類似するお問い合わせも・・ 8 また1から調査をするのは効率が 悪いので、過去にそんな事例が ないかをSlack内で単語検索などで 調べたりする場合もある

    過去事例を取ってくる部分、 自動化できたら便利なのでは? →作ってみよう
  9. © 2012-2021 BASE, Inc. DSでの取り組み: HackWeek Data Strategy Sectionでは、普段業務でやれないような内容について、1週間ほど 技術検証をすることができるHackWeekの取り組みがある

    今回の内容もそのHackWeekでの成果物 9 https://devblog.thebase.in/entry/2020/12/04/130000
  10. © 2012-2021 BASE, Inc. こういうものを作りたい 10 新規のお問い合わせ 過去のお問い合わせ群 過去の対応結果・仕様書 ドキュメント群

    類似のお問い合わせ 自動返信 関連するドキュメント 自動返信 自動返信内容などを 見て対応 担当エンジニア
  11. © 2012-2021 BASE, Inc. システム概略図 (AWS環境下で作成) 11 Slack投稿イベントを取得 Slack Amazon

    API Gateway AWS Lambda クエリ検索 (VPCなどについての説明は省く) 投稿に取得結果を自動返信 Amazon Elasticsearch Service 類似投稿を全文検索、 新規お問い合わせをESへ追加 検索結果 検索結果
  12. © 2012-2021 BASE, Inc. Elasticsearchについて Apache Luceneを基盤として構築された分散検索/分析エンジン 様々な特徴があるが、今回はその中でも全文検索に優れた性能を発揮する点に注目 過去のお問い合わせ内容を保存し、新規のお問い合わせに類似するものを取得する処理を 全文検索で実現できると考えた

    今回はマネージド型サービスであるAmazon Elasticsearch Serviceを使用 (現在はAmazon OpenSearch Serviceに名称変更) 12
  13. © 2012-2021 BASE, Inc. Kibelaについて 社内情報共有サービスの一つであり、弊社でドキュメント管理として利用中 プロダクトの仕様設計、ミーティングの議事録、個人の覚書など多岐にわたるドキュメント が管理されており、お問い合わせ対応のログもここに残されている GraphQLを使用したクエリによってドキュメントの検索などを行えるAPIが存在 13

  14. © 2012-2021 BASE, Inc. 具体的な処理、実装について ピックアップして説明 14 ここから

  15. © 2012-2021 BASE, Inc. Slackお問い合わせ投稿の事前取得、処理 2018年以降の投稿を該当チャンネルから取得(取得までの具体的な流れもブログにて) この時、そのチャンネルのお問い合わせ投稿のみと全投稿の2種類に分けて取得しておく (今回は省略しますが、全投稿は投稿テキストの解析時に一部使用するため) 取得した内容に軽いテキスト処理を入れる -

    タグ・emojiの削除 - 文字列の正規化(英数字は半角小文字化、かなは全角化)  : 15 全投稿 お問い合わせ投稿
  16. © 2012-2021 BASE, Inc. 検索に使うクエリ作成のために、お問い合わせ文の解析や特徴語の抽出が必要になる これを形態素解析とTFIDFのスコア付けによって実現する 形態素解析とは 自然言語で書かれた文を言語上で意味を持つ最小単位(=形態素)に分け、それぞれの品詞や 変化などを判別する処理。日本語においては特に単語分割ができることが重要。 基本的に辞書を持つ形態素解析器を使用する。今回は導入のし易さからJanomeを使用。

    例.「非公開の商品で」の形態素解析結果 非公開 名詞,一般,*,* の   助詞,連体化,*,* 商品  名詞,一般,*,* で   助詞,格助詞,一般,* Slack投稿文の解析、処理: 形態素解析 16 $ pip install janome
  17. © 2012-2021 BASE, Inc. TFIDFとは 単語の重要度の様なもの。対象文書中に登場する頻度(TF)と、登場する文書頻度の逆数 (IDF)によって計算されるスコア。その文書でよく出てくる特徴ある単語は高スコアにな る傾向がある。 例.文書A「私はラーメンが好きだ。特に味噌ラーメンは味噌の旨味がたまらない。」   文書B「私は焼きそばが好きだが、ラーメンもよく食べる。」

    文書Aには「ラーメン」が2回も出ているが、文書Bにも出ているので単語としてありふれている 文書Aの「味噌」は他の文書では出ていないので、この文書特有の単語と言える。しかも2回も出ている →文書Aは「味噌」という単語が特徴的である Slack投稿文の解析、処理: TFIDF 17 文書A 味噌: 0.64 文書B 焼きそば: 0.58 ラーメン: 0.46 ラーメン: 0.41  : :
  18. © 2012-2021 BASE, Inc. お問い合わせ投稿を、以下のような形でElasticsearchのインデックスに追加 日本語全文検索用にtextとkeywordにはkuromoji_analyzerを使う 'orig_text': {'type': 'text'}, #

    元投稿本文 'text': {'type': 'text', 'analyzer': 'kuromoji_analyzer'}, # 処理済本文 'keyword': {'type': 'text', 'analyzer': 'kuromoji_analyzer'}, # 形態素解析結果 'ts': {'type': 'text'}, 'thread_ts': {'type': 'text'}, 'link': {'type': 'text'}, # 投稿リンク ElasticsearchへのSlack投稿文保存 18
  19. © 2012-2021 BASE, Inc. リクエスト処理Lambdaの実装 LambdaはAWSのサーバーレスコンピューティングサービス 新規お問い合わせのEventを受けて、 - お問い合わせ投稿のテキスト処理 -

    TFIDFによる特徴語抽出 - ESからの投稿検索 - Kibela記事検索 - 結果のSlack投稿 - ESへの投稿保存 を一挙に行う 19 詳しくは同ブログで!
  20. © 2012-2021 BASE, Inc. システム概略図 (再掲) 20 Slack投稿イベントを取得 Slack Amazon

    API Gateway AWS Lambda クエリ検索 (VPCなどについての説明は省く) 投稿に取得結果を自動返信 Amazon Elasticsearch Service 類似投稿を全文検索、 新規お問い合わせをESへ追加 検索結果 検索結果
  21. © 2012-2021 BASE, Inc. 過去の類似お問い合わせ記事の取得でElasticsearchの 日本語全文検索を使う 新規お問い合わせについてテキスト処理と形態素解析、 TFIDFスコアの計算を行う TFIDFで得られるスコアは名詞形態素ごとだが、連続す る名詞は名詞句として結合し、TFIDFスコアも合算値

    とする 例.「非公開(0.4)/商品(0.2)」とあった場合は、 「非公開商品(0.6)」とする Elasticsearch検索に関しての調整① 21 NEW ・テキスト処理 ・形態素解析 ・TFIDFスコア TFIDF計算済 名詞句合算済 ・名詞句作成 非公開: 0.4 商品: 0.2  : 非公開商品: 0.6 カウント: 0.1  :
  22. © 2012-2021 BASE, Inc. Elasticsearch検索に関しての調整② 22 TFIDFスコアの高い名詞句20件をスペースで結合した ものを、ESに保存されたタグなど削除済み本文(text) に対して全文検索で検索をかける 例.

    「非公開商品 カウント 閲覧 非公開 ショップデータ    商品 表示...」をmatchクエリに使用 (他にもいい方法があるかもしれませんが、あまり  精査できていません😖) 名詞句合算済 お問い合わせ投稿 ・上位名詞句で  検索 類似お問い合わせGET
  23. © 2012-2021 BASE, Inc. システム概略図 (再掲) 23 Slack投稿イベントを取得 Slack Amazon

    API Gateway AWS Lambda クエリ検索 (VPCなどについての説明は省く) 投稿に取得結果を自動返信 Amazon Elasticsearch Service 類似投稿を全文検索、 新規お問い合わせをESへ追加 検索結果 検索結果
  24. © 2012-2021 BASE, Inc. ・上位名詞句 Kibela検索に関しての調整① Kibela検索では、シンプルなクエリ検索によって行われる 多くの単語を指定するとカバレッジの問題で検索結果が 0件になってしまう、など調整必要 TFIDFで得られるスコアは名詞形態素ごとだが、連続する

    名詞は名詞句として結合し、TFIDFスコアも合算値とする 例.「非公開(0.4)/商品(0.2)」とあった場合は、 「非公開商品(0.6)」とする 上記で得られた名詞・名詞句についてスコア上位2件の スペース区切りクエリで検索 24 名詞句合算済 非公開商品: 0.6 カウント: 0.1  : 非公開商品 カウント
  25. © 2012-2021 BASE, Inc. Kibela検索に関しての調整② 問い合わせ対応記事はKibelaの特定のフォルダ下に保存 する運用なので、該当フォルダIDを指定した検索と、 全体検索の2種類で実施。前者の結果を優遇する 特定の不要だと分かっている記事はルールベースで フィルタをかける(自己紹介など)

    25 非公開商品 カウント ・フォルダ指定検索 ・全体検索 ・検索結果フィルタリング 関連記事GET
  26. © 2012-2021 BASE, Inc. 動きそう! 26 新規のお問い合わせ 過去のお問い合わせ群 過去の対応結果・仕様書 ドキュメント群

    類似のお問い合わせ 自動返信 関連するドキュメント 自動返信 自動返信内容などを 見て対応 担当エンジニア 👍
  27. © 2012-2021 BASE, Inc. 非公開商品が閲覧されてしまうという お問い合わせ TFIDFスコア高い順 - 非公開商品 -

    カウント - 閲覧 - 非公開 - ショップデータ - 商品  : 実際のレスポンス例(お問い合わせ再掲) 27
  28. © 2012-2021 BASE, Inc.             実際のレスポンス例 28 Kibela記事 それ以外はESから取得した過去お問い合わせ

  29. © 2012-2021 BASE, Inc.             実際のレスポンス例 29 「非公開商品についてのお問い合わせ」 っぽいものが取れていそう

  30. © 2012-2021 BASE, Inc. うまくワークしていそう😌 30

  31. © 2012-2021 BASE, Inc. CSお問い合わせ対応業務改善を通して 今回の改善はプロダクトへの直接の改善ではない ただ、細かい業務の改善をやっていくのは大事。その分やるべき仕事にリソースを割ける 特に何度も発生することは自動化すべき 一番良いものを作るよりも、早く80点以上のアウトプットを出すのが大事な場合もある 課題に対して会社、ユーザが本当に求めてるもの(時間・質)が何かを判断する

    31
  32. © 2012-2021 BASE, Inc. 様々なポジションを積極採用中です! https://binc.jp/jobs 32

  33. © 2012-2021 BASE, Inc. Appendix 33

  34. © 2012-2021 BASE, Inc. Slack、API Gatewayの接続 Slackでの投稿をLambdaで処理できるようにするために、Slackの投稿イベントをAWS側で 取得できる様にする必要がある 今回はSlackのEvent APIを使用し、API

    Gatewayのエンドポイントを指定することで実現 (設定の詳細はブログの内容から参照できます) 34
  35. © 2012-2021 BASE, Inc. TFは新規お問い合わせについて計算できるが、IDFは事前に計算が必要 チャンネル全投稿を形態素解析で名詞のみにし、IDF値を計算 全投稿を使用するのは、問い合わせ投稿のみだとデータ量が少ないため 単品 9.973116006811027 匿名

    9.839584614186505 カーソル 9.21097595476413 ショップ 3.3278392845417772 : このスコア表は今後新規お問い合わせがきた時のTFIDFスコア計算に使用する Slack投稿文の解析、処理: IDF値の事前計算 35