$30 off During Our Annual Pro Sale. View Details »

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

tawamura1224
October 02, 2021

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

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

tawamura1224

October 02, 2021
Tweet

Other Decks in Programming

Transcript

  1. © 2012-2021 BASE, Inc.
    BASE株式会社 Data Strategy Section
    粟村 誉 @tawamura1224
    ElasticsearchとKibelaを活用した
    SlackでのCSお問い合わせ対応業務の改善

    View Slide

  2. © 2012-2021 BASE, Inc.
    BASEから1人目の刺客です
    2

    View Slide

  3. © 2012-2021 BASE, Inc.
    自己紹介
    3
    2010〜 大学・大学院で自然言語処理の研究
    2016〜 ヤフー株式会社
          Entity Linkingパッケージの基礎開発など
    2018〜 ITベンチャー企業
          不正行動の検知モデル作成など
    2019〜 BASE株式会社
          不正決済対策など検知系全般
    粟村 誉 (Awamura Takashi)

    View Slide

  4. © 2012-2021 BASE, Inc. 4
    世界のすべての人に、
    自分の力を自由に価値へと変えて
    生きていけるチャンスを。
    あたらしい決済で、あなたらしい経済を。
    Payment to the People,
    Power to the People.
    Philosophy & Mission

    View Slide

  5. © 2012-2021 BASE, Inc. 5
    Confidential
    ネットショップ作成サービス「BASE」
    ショップ開設数
    (個人・法人・行政を含む)
    160万ショップ以上
    BASEかんたん決済利用料 3.6%+40円
    サービス利用料 3%
    初期費用・月額費用 0円
    ショップオーナーのサポート機能が充実!(BASE Apps)
    コンセプト:「誰でも簡単に使えるネットショップ作成サービス」
    個人でも決済機能をかんたん導入。審査もスピーディー!
    クレジットカード
    銀行振込
    コンビニ決済・Pay-easy
    後払い
    キャリア決済
    PayPal Amazon Pay

    View Slide

  6. © 2012-2021 BASE, Inc.
    今回の話💡
    去年、弊社プロダクトチームブログのアドベントカレンダーで書いた内容についてです
    コード等は省きますので下記リンクで
    6
    https://devblog.thebase.in/entry/2020/12/11/113000
    BASE Tech blog [検索]

    View Slide

  7. © 2012-2021 BASE, Inc.
    背景: ユーザからのお問い合わせへの調査業務
    7
    CS担当の人から、主に技術的な
    内容に関してエンジニアに
    ヘルプを求める仕組み
    経緯や結果はSlackのスレッドと
    Kibelaという社内Wikiツールに
    残している
    https://devblog.thebase.in/entry/2020/12/10/113000

    View Slide

  8. © 2012-2021 BASE, Inc.
    過去に類似するお問い合わせも・・
    8
    また1から調査をするのは効率が
    悪いので、過去にそんな事例が
    ないかをSlack内で単語検索などで
    調べたりする場合もある
    過去事例を取ってくる部分、
    自動化できたら便利なのでは?
    →作ってみよう

    View Slide

  9. © 2012-2021 BASE, Inc.
    DSでの取り組み: HackWeek
    Data Strategy Sectionでは、普段業務でやれないような内容について、1週間ほど
    技術検証をすることができるHackWeekの取り組みがある
    今回の内容もそのHackWeekでの成果物
    9
    https://devblog.thebase.in/entry/2020/12/04/130000

    View Slide

  10. © 2012-2021 BASE, Inc.
    こういうものを作りたい
    10
    新規のお問い合わせ 過去のお問い合わせ群
    過去の対応結果・仕様書
    ドキュメント群
    類似のお問い合わせ
    自動返信
    関連するドキュメント
    自動返信
    自動返信内容などを
    見て対応
    担当エンジニア

    View Slide

  11. © 2012-2021 BASE, Inc.
    システム概略図 (AWS環境下で作成)
    11
    Slack投稿イベントを取得
    Slack Amazon API Gateway
    AWS Lambda
    クエリ検索
    (VPCなどについての説明は省く)
    投稿に取得結果を自動返信
    Amazon Elasticsearch
    Service
    類似投稿を全文検索、
    新規お問い合わせをESへ追加
    検索結果
    検索結果

    View Slide

  12. © 2012-2021 BASE, Inc.
    Elasticsearchについて
    Apache Luceneを基盤として構築された分散検索/分析エンジン
    様々な特徴があるが、今回はその中でも全文検索に優れた性能を発揮する点に注目
    過去のお問い合わせ内容を保存し、新規のお問い合わせに類似するものを取得する処理を
    全文検索で実現できると考えた
    今回はマネージド型サービスであるAmazon Elasticsearch Serviceを使用
    (現在はAmazon OpenSearch Serviceに名称変更)
    12

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. © 2012-2021 BASE, Inc.
    検索に使うクエリ作成のために、お問い合わせ文の解析や特徴語の抽出が必要になる
    これを形態素解析とTFIDFのスコア付けによって実現する
    形態素解析とは
    自然言語で書かれた文を言語上で意味を持つ最小単位(=形態素)に分け、それぞれの品詞や
    変化などを判別する処理。日本語においては特に単語分割ができることが重要。
    基本的に辞書を持つ形態素解析器を使用する。今回は導入のし易さからJanomeを使用。
    例.「非公開の商品で」の形態素解析結果
    非公開 名詞,一般,*,*
    の   助詞,連体化,*,*
    商品  名詞,一般,*,*
    で   助詞,格助詞,一般,*
    Slack投稿文の解析、処理: 形態素解析
    16
    $ pip install janome

    View Slide

  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
     : :

    View Slide

  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

    View Slide

  19. © 2012-2021 BASE, Inc.
    リクエスト処理Lambdaの実装
    LambdaはAWSのサーバーレスコンピューティングサービス
    新規お問い合わせのEventを受けて、
    - お問い合わせ投稿のテキスト処理
    - TFIDFによる特徴語抽出
    - ESからの投稿検索
    - Kibela記事検索
    - 結果のSlack投稿
    - ESへの投稿保存
    を一挙に行う
    19
    詳しくは同ブログで!

    View Slide

  20. © 2012-2021 BASE, Inc.
    システム概略図 (再掲)
    20
    Slack投稿イベントを取得
    Slack Amazon API Gateway
    AWS Lambda
    クエリ検索
    (VPCなどについての説明は省く)
    投稿に取得結果を自動返信
    Amazon Elasticsearch
    Service
    類似投稿を全文検索、
    新規お問い合わせをESへ追加
    検索結果
    検索結果

    View Slide

  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
     :

    View Slide

  22. © 2012-2021 BASE, Inc.
    Elasticsearch検索に関しての調整②
    22
    TFIDFスコアの高い名詞句20件をスペースで結合した
    ものを、ESに保存されたタグなど削除済み本文(text)
    に対して全文検索で検索をかける
    例. 「非公開商品 カウント 閲覧 非公開 ショップデータ
       商品 表示...」をmatchクエリに使用
    (他にもいい方法があるかもしれませんが、あまり
     精査できていません😖)
    名詞句合算済
    お問い合わせ投稿
    ・上位名詞句で
     検索
    類似お問い合わせGET

    View Slide

  23. © 2012-2021 BASE, Inc.
    システム概略図 (再掲)
    23
    Slack投稿イベントを取得
    Slack Amazon API Gateway
    AWS Lambda
    クエリ検索
    (VPCなどについての説明は省く)
    投稿に取得結果を自動返信
    Amazon Elasticsearch
    Service
    類似投稿を全文検索、
    新規お問い合わせをESへ追加
    検索結果
    検索結果

    View Slide

  24. © 2012-2021 BASE, Inc.
    ・上位名詞句
    Kibela検索に関しての調整①
    Kibela検索では、シンプルなクエリ検索によって行われる
    多くの単語を指定するとカバレッジの問題で検索結果が
    0件になってしまう、など調整必要
    TFIDFで得られるスコアは名詞形態素ごとだが、連続する
    名詞は名詞句として結合し、TFIDFスコアも合算値とする
    例.「非公開(0.4)/商品(0.2)」とあった場合は、
    「非公開商品(0.6)」とする
    上記で得られた名詞・名詞句についてスコア上位2件の
    スペース区切りクエリで検索
    24
    名詞句合算済
    非公開商品: 0.6
    カウント: 0.1
     :
    非公開商品 カウント

    View Slide

  25. © 2012-2021 BASE, Inc.
    Kibela検索に関しての調整②
    問い合わせ対応記事はKibelaの特定のフォルダ下に保存
    する運用なので、該当フォルダIDを指定した検索と、
    全体検索の2種類で実施。前者の結果を優遇する
    特定の不要だと分かっている記事はルールベースで
    フィルタをかける(自己紹介など)
    25
    非公開商品 カウント
    ・フォルダ指定検索
    ・全体検索
    ・検索結果フィルタリング
    関連記事GET

    View Slide

  26. © 2012-2021 BASE, Inc.
    動きそう!
    26
    新規のお問い合わせ 過去のお問い合わせ群
    過去の対応結果・仕様書
    ドキュメント群
    類似のお問い合わせ
    自動返信
    関連するドキュメント
    自動返信
    自動返信内容などを
    見て対応
    担当エンジニア
    👍

    View Slide

  27. © 2012-2021 BASE, Inc.
    非公開商品が閲覧されてしまうという
    お問い合わせ
    TFIDFスコア高い順
    - 非公開商品
    - カウント
    - 閲覧
    - 非公開
    - ショップデータ
    - 商品
     :
    実際のレスポンス例(お問い合わせ再掲)
    27

    View Slide

  28. © 2012-2021 BASE, Inc.
                実際のレスポンス例
    28
    Kibela記事
    それ以外はESから取得した過去お問い合わせ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. © 2012-2021 BASE, Inc.
    Slack、API Gatewayの接続
    Slackでの投稿をLambdaで処理できるようにするために、Slackの投稿イベントをAWS側で
    取得できる様にする必要がある
    今回はSlackのEvent APIを使用し、API Gatewayのエンドポイントを指定することで実現
    (設定の詳細はブログの内容から参照できます)
    34

    View Slide

  35. © 2012-2021 BASE, Inc.
    TFは新規お問い合わせについて計算できるが、IDFは事前に計算が必要
    チャンネル全投稿を形態素解析で名詞のみにし、IDF値を計算
    全投稿を使用するのは、問い合わせ投稿のみだとデータ量が少ないため
    単品 9.973116006811027
    匿名 9.839584614186505
    カーソル 9.21097595476413
    ショップ 3.3278392845417772

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

    View Slide