サーバーレス機械学習でサポート チケットを整理する: チュートリアル

このチュートリアルでは、イベントベースのサーバーレス アーキテクチャを使用した Cloud AI でチケットデータを拡充して、一般的なヘルプデスクのシナリオを拡張する方法について説明します。このチュートリアルでは、関連記事(サーバーレス機械学習モデルのアーキテクチャサーバーレス機械学習モデルの構築)で概説しているアーキテクチャを構築する方法を説明します。

このアーキテクチャでは、顧客がカスタム フォームを使用してサポート チケットを記録できるワークフローを実装します。チケットが送信されるたびに、チケットデータを拡充する機械学習(ML)ステップがトリガーされます。次に、顧客のフロントエンド データストアとして機能するリアルタイム データベースにチケットが保存されます。同時に、チケットの送信により、Salesforce.com ケースが作成されます。このケースは、ヘルプデスク アプリでデータをミラーリングします。その後、サポート エージェントが Salesforce を使用してサポート チケットを管理し、ML から提供される追加のインテリジェンスを利用します。その結果、サポートに関する決定に要する時間が短縮し、決定の質も向上します。

このチュートリアルは、次のコンポーネントで構成される広範なソリューションの一部です。

  • サポート チケットを記録して一覧表示するシンプルなフロントエンド HTML ページ。
  • 次の処理を行う方法を詳しく説明した 2 つのノートブック:

    • TensorFlow を使用したカスタム回帰モデルの構築。
    • TensorFlow を使用したカスタム分類モデルの構築。
    • AI Platform へのモデルのデプロイ。これにより、Cloud Functions でモデルを利用できるようになります。
  • デプロイされた Cloud Functions を含む Node.js ファイル。次の関数が含まれています。

    • チケットを拡充する 4 つの関数。
    • Salesforce への書き込みを実行する 1 つの関数。
    • Firebase データベースを更新するために Salesforce が呼び出す 1 つの関数。

このチュートリアルを終了すると、次の機能が完成します。

  • 顧客がチケットを記録できるようにするシンプルな UI。
  • 以下に示すサーバーレス ML チケットの拡充。

    • 説明の中にある顕著性が高い単語を維持するための自動タグ付け機能。
    • チケット説明の感情分析
    • チケットの解決にかかる時間の予測。
    • 割り当てられる可能性が高いチケットの優先順位に関する予測。
  • Salesforce ケースの更新手段。

目標

  • シンプルな Firebase ウェブ クライアントを実装します。
  • Firebase のリアルタイム データベースへの書き込みによってトリガーされる Cloud ファンクションを作成します。
  • AI Platform 分類モデルを構築して提供します。
  • AI Platform の回帰モデルを構築して提供します。Cloud Functions を呼び出し、2 種類の ML モデル(Cloud Natural Language API と AI Platform)を生成します。
  • チケットのコンテキストを増やすために機械学習を利用し、サポート エージェントが迅速かつ適切な判断を下せるようにします。
  • Cloud Functions を利用して、システムとサードパーティ ツールをサーバーレス方式で同期します。たとえば、このソリューションではシステムと Salesforce を同期します。同様のプロセスでシステムと Jira を同期することもできます。

費用

このチュートリアルでは、以下の課金対象の Google Cloud Platform コンポーネントを使用します。

  • Natural Language API
  • AI Platform トレーニング API と予測 API
  • Firebase

料金計算ツールを使用して、予測される使用量に基づき、費用の見積もりを出すことができます。 GCP を初めてご利用の場合は、無料トライアルをご利用いただけます。

始める前に

開始する前に、環境をセットアップする必要があります。

  1. 端末で、サーバーレス ML 拡張リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/ml-functions-helpdesk
  2. Firebase プロジェクトをまだ作成していない場合は作成します。

    Firebase コントロール パネルを開く

  3. Firebase コントロール パネルで、[プロジェクトを追加] をクリックします。

  4. [プロジェクトを作成] をクリックします。

    プロジェクトの作成

    このプロセスでは、GCP Console からアクセス可能な GCP プロジェクトも作成されます。

    後で必要となるため、プロジェクト ID を覚えておいてください。また、Firebase コンソールから [インポート] ボタンを使用して既存の GCP プロジェクトをインポートすることもできます。

  5. ターミナル ウィンドウで、次のコマンドを使用して Firebase クライアントをインストールします。

    npm install -g firebase-tools
  6. Firebase コンソールで、customer_site/public/index.html ファイル内の Firebase インスタンスに関連する値を更新します。

    var config = {
      apiKey: "<API_KEY>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
      storageBucket: "<BUCKET>.appspot.com",
      messagingSenderId: "<SENDER_ID>",
    };

    各要素の説明は次のとおりです。

    • <API_KEY> は、[概要] > [プロジェクトの設定] > [全般] > [ウェブ API キー] で確認できます。
    • <PROJECT_ID> は、前のセクションで生成したプロジェクト ID です。
    • <DATABASE_NAME> は、[データベース] > [データ] で確認できます。
    • <BUCKET> は、[ストレージ] > [ファイル] で確認できます(「gs://」接頭辞は無視してください)。
    • <SENDER_ID> は、[概要] > [プロジェクトの設定] > [クラウド メッセージング] > [送信者 ID] で確認できます。

    Firebase プロジェクトを作成すると、バックグラウンドで GCP プロジェクトも作成されるため、プロジェクト ID をメモしておいてください。

  7. セキュリティ ルールを設定します。このチュートリアルでは、Firebase コンソールの [データベース] > [ルール] で、すべてのルールを true に設定します。

    セキュリティ ルール

    アプリケーションを保護する方法の詳細については、次のステップをご覧ください。

  8. 関連付けられている GCP プロジェクトを開きます。[PROJECT_ID] は Firebase プロジェクト ID に置き換えてください。

    https://console.cloud.google.com/project/[PROJECT_ID]
  9. Natural Language and Machine Learning API を有効にします。

    APIを有効にする

サービス アカウントを作成する

サービス アカウントは、GCP サービスの認証に使用されます。Cloud Functions で使用されているすべてのサービスから、必要なすべての GCP API とサービスにアクセスできることを確認してください。

デフォルトの Firebase サービス アカウントがプロジェクト エディタまたはオーナーであることを確認してください。 AI Platform のスコープは広いため、このタイプの包括的な権限が必要です。プロジェクトでまだ何も変更していない場合、通常は操作を行う必要はありません。

Salesforce を構成する

このチュートリアルでは、Salesforce などの顧客関係管理(CRM)システムをすでに使用しており、その構成と操作の方法を理解していることを前提としています。

必要に応じて、Salesforce デベロッパーのサインアップ ページで無期限のデベロッパー アカウントを作成できます。Cloud Functions が Salesforce ケースを作成するときに使用する JavaScript ライブラリ(JSforce)について理解している必要があります。

機械学習

サーバーレス機械学習モデルの構築で説明したように、2 種類の ML モデルを使用できます。

  • Cloud Natural Language API

    Natural Language API は、Google によりトレーニング済みの ML モデルに基づいて自然言語処理を使用する REST API です。

  • カスタムモデル

    AI Platform を使用してカスタム ML モデルをトレーニングし、REST API としてデプロイします。

Natural Language API を呼び出す

Natural Language API を使用して自動タグ設定と感情分析を行うには、REST API を呼び出します。その後、デプロイした Cloud Functions から Natural Language API に直接アクセスします。

Natural Language API 認証は、google-gcloud 言語用ライブラリにより、Cloud Functions 内で自動的に処理されます。

カスタム トレーニングおよび解決時間と優先順位の予測には、AI Platform を使用する必要があります。以降のセクションでこのプロセスの概要を説明します。

AI Platform のモデルを設定する

API からアクセスできる AI Platform のモデルを有効にするには、次の操作を実行できる必要があります。

  1. データを収集する。
  2. データを整理する。
  3. モデルを設計する。
  4. モデルをトレーニングして生成する。
  5. モデルをデプロイする。

この手順を実行する最も簡単な方法は、Cloud Datalab を使用することです。Cloud Datalab では、カスタム ML モデルの構築、テスト、デプロイに必要なすべての GCP ツールにアクセスできます。

モデルを構築してデプロイするには、次の 2 つのノートブックを使用します。

  • Resolution Time Regression ノートブック
  • Priority Classification ノートブック

この 2 つのノートブックは似ていますが、以下の点が異なります。

  • 出力列
  • 呼び出されるモデル
  • デプロイされたモデルの位置

これらのノートブックを実行すると、AI Platform に 2 つの ML モデルがデプロイされます。どちらのモデルも REST API 呼び出しで使用できます。

ノートブックを実行する

  1. Cloud Shell を開きます。

  2. シェルが開いたら、Cloud Datalab インスタンスを起動します。[YOUR_DATALAB_INSTANCE_NAME] はインスタンス名に置き換えてください。

    datalab create [YOUR_DATALAB_INSTANCE_NAME] --zone us-central1-f

    すべて正常に実行されると、次のメッセージが表示されます。

    The connection to Datalab is now open and will remain until this command is
    killed. Click on the *Web Preview* (up-arrow button at top-left), select
    *port 8081*, and start using Datalab.
  3. シェルの上部をクリックし、[ポートの変更] メニューでポートを 8081 に変更して、Cloud Datalab インスタンスにアクセスします。

    ポートを 8081 に変更する

    Cloud Datalab ウィンドウが表示されます。

    [Cloud Datalab] ウィンドウ

  4. GitHub からノートブックをダウンロードします。右上にある次のアイコンをクリックして、ノートブックをダウンロードします。

    ノートブック アイコン

    リポジトリに次の URL を使用します。

    https://github.com/GoogleCloudPlatform/ml-functions-helpdesk
  5. 右上の [Fetch from origin] をクリックします。結果は次のようになります。

    原点からフェッチする

  6. [Checkout] をクリックします。

    Cloud Datalab UI が更新され、GitHub からのすべてのフォルダが表示されていることを確認します。

  7. 両方のノートブックを実行します。ノートブックには、ML モデルを作成してデプロイする方法を段階的に示したガイドなどがあり、詳しく説明されています。

  8. 両方のノートブックが完了すると、両方のモデルが GCP Console の [機械学習] > [モデル] に表示されます。

    2 つのモデル

    いずれかのモデル名をクリックすると、バージョン名が表示されます。

    モデル バージョン名

これで、AI Platform に両方のモデルがデプロイされました。次に、Cloud Functions を使用してモデルを呼び出すことができます。

Cloud Functions を使用してモデルを拡張する

次のステップは、関数をデプロイする前に、Cloud Functions スクリプトでいくつかのパラメータを更新することです。

モデル パラメータを更新する

Cloud Functions がモデルを呼び出すには、モデルの仕様に一致するように Cloud ファンクション スクリプトのパラメータを更新する必要があります。functions/index.js スクリプトで次のモデル定数を定義します。

モデル定数 説明
MDL_PROJECT_NAME モデルをホストするプロジェクトの名前。
RESOLUTION_TIME_MODEL_NAME チケット解決時間を予測するモデルの名前。これは、Cloud Datalab にモデルをデプロイするときに設定されます。
PRIORITY_MODEL_NAME チケットの優先順位を予測するモデルの名前。これは、Cloud Datalab にモデルをデプロイするときに設定されます。
const MDL_PROJECT_NAME = <YOUR_PROJECT_HOSTING_MODELS>;
const RESOLUTION_TIME_MODEL_NAME = 'mdl_helpdesk_priority'; # Matches Notebook
const PRIORITY_MODEL_NAME = 'mdl_helpdesk_resolution_time'; # Matches Notebook
const SFDC_URL = <YOUR_SFDC_URL>;
const SFDC_LOGIN = <YOUR_SFDC_LOGIN>;
const SFDC_PASSWORD = <YOUR_SFDC_PASSWORD>;
const SFDC_TOKEN = <YOUR_SFDC_TOKEN>;

認証を更新する

AI Platform の認証は、Natural Language Processing API の認証よりも複雑です。AI Platform の認証には GCP のラッパーがないため、デフォルトの認証情報を使用してコード認証を有効にする必要があります。また、AI Platform には完全なプロジェクト スコープも必要です。

認証の例については、次の functions/index.js コード スニペットを参照してください。

if (authClient.createScopedRequired && authClient.createScopedRequired()) {
  // https://developers.google.com/identity/protocols/googlescopes#mlv1
  authClient = authClient.createScoped([
  'https://www.googleapis.com/auth/cloud-platform'
  ]);
}

//Create authenticated ml engine client
var ml = google.ml({
  version: 'v1',
  auth: authClient
});

Cloud Functions をデプロイする

Cloud Functions をデプロイするには、ターミナルでリポジトリのルートフォルダから Firebase の deploy コマンドを実行します。

firebase deploy --only functions --project [YOUR-PROJECT-ID]

ファンクションが 1 つしかない場合は、次のコマンドを実行します。[FUNCTION_NAME] は、functions/index.js ファイルで定義されている事前作成ファンクション prioritysentimenttagsupdateSFDCresolutiontime のいずれかに置き換えてください。

firebase deploy --only functions:[FUNCTION_NAME] --project [YOUR-PROJECT-ID]

Cloud ファンクションを初めてデプロイするときには時間がかかることがあります。これは、複数の API が自動的に起動し、実行に時間がかかるためです。

また、以下に示すように、コードで直接定義されたファンクションのトリガーにも注意してください。

exports.[FUNCTION_NAME] = functions.database.ref('/tickets/{ticketID}').onWrite(event => {
  // Handle the new write to the Firebase database
});

モデルのデプロイは、Firebase コンソールの [Functions] の下で確認できます。

モデルのデプロイ

また、GCP Console の [Cloud Functions] の下でも確認できます。

Cloud Functions

サードパーティ ヘルプデスクと同期する

このチュートリアルでは、サードパーティ ツール(この実装では Salesforce.com)向けに拡張されたサポート チケットを作成する方法を説明します。

デプロイ時には、次に示すように、双方向の更新フローが必要です。

  • ユーザーがチケットを更新すると、そのチケットが Salesforce でも更新される。
  • Salesforce でチケットが更新されると、そのチケットがクライアントでも更新される。

クライアントを Salesforce と同期する

クライアントを Salesforce と同期するには、次のツールを使用します。

Cloud Functions
チケットが拡張されると、イベントベースの Cloud ファンクションがトリガーされます。本番環境では、Firebase が更新されると常にチケット更新がトリガーされるように Cloud ファンクションを変更します。
JSforce
JSforce は Salesforce API の Node.js ラッパーで、Salesforce データベースへの書き込みと更新を可能にします。
Salesforce Case インターフェース
Salesforce Case インターフェースには、カスタム アプリケーションで作成された拡張チケットを反映するチケット情報が表示されます。

フィールドをコピーする

Salesforce とクライアントを同期するには、Salesforce のフィールドとクライアントのフィールドをマップする必要があります。このチュートリアルでは単純化のために、少数のフィールドの値を対応するフィールドにコピーしますが、この操作をすべてのフィールドで繰り返すことができます。定義されているフィールドを次に示します。

  • SuppliedEmail: 'user@example.com'
  • Description: 説明。
  • Type: タイプ ['Issue', 'Request']
  • Reason: カテゴリ ['Technical', 'Performance', 'Authentication', 'Billing']。
  • Priority: 予測される優先順位。
  • ResolutionTime: 予測される解決時間。

Salesforce UI の [SETUP] > [OBJECT MANAGER] で、フィールド マッピングを設定します。

Salesforce フィールド マッピング

適切なフィールドを表示するように Salesforce ページをカスタマイズすると、2 つのデータベース間の同期が簡単になります。なお、Salesforce では Case originStatus, などの特定のフィールドにデフォルト値が設定されており、そのままにすることができます。

updateSFDC 関数を実行する

functions/index.htmlupdateSFDC 関数は、ML 拡張データを使用して Salesforce チケットを作成します。この関数は、Firebase リアルタイム データベースになんらかのデータが書き込まれるとトリガーされます。シーケンスは次のように記述します。

  1. Salesforce インスタンスは updateSFDC 関数を認証する必要があります。

    conn = new jsforce.Connection({
      loginUrl : SFDC_URL
    });
    conn.login(SFDC_LOGIN, SFDC_PASSWORD + SFDC_TOKEN, function(err, res) {
  2. 次に、この関数により、拡張データに基づいて Salesforce でチケットが作成されます。

    conn.sobject("Case").create({
      SuppliedEmail: 'user@example.com',
      Description: ticket.description,
      Type: ticket.type,
      Reason: ticket.category,
      Priority: ticket.priority,
      ResolutionTime__c: ticket.t_resolution
    }, function(err, ret) {
  3. すべてが正常に実行されると、Salesforce UI に次のようなチケットが表示されます。

    Salesforce チケット

Salesforce をクライアントと同期する

この同期の実装のほとんどは Salesforce 側で行われるので、このチュートリアルでは実装方法について詳しく説明しませんが、主な手順を次に示します。Salesforce からクライアントに同期するには、次のものが必要です。

  • Salesforce から webhook として呼び出すことができる HTTPS ベースの Cloud ファンクション。
  • エージェントがチケットを更新すると即時に Salesforce によりトリガーされるイベント。

HTTPS ベースの関数をデプロイするために、ステージング Cloud Storage バケットを設定します。

gsutil mb gs://[YOUR-PROJECT-ID]-staging-functions

次に、関数をデプロイします。

gcloud functions deploy fromSFDCtoFirebase --local-path=extras/functions/fromSFDCtoFirebase --stage-bucket=gs://mam-cloud-staging-functions --trigger-http

HTTPS によりトリガーされる Cloud ファンクションの呼び出しは、使用するサードパーティ ヘルプデスク ツールに応じて異なるので、このチュートリアルでは説明しません。Salesforce では、トリガー機能を使用できます。APEX スクリプトを利用すると、Cloud Functions を使用して HTTP エンドポイントを容易に呼び出すことができます。APEX を使用して HTTP エンドポイントを呼び出す方法の詳細については、Salesforce のドキュメントをご覧ください。

試してみる

複製したフォルダの中には単純な HTML ファイルがあり、これをローカルで実行して設定をテストできます。

  1. index.html をダブルクリックして開きます。
  2. すべてのフォーム フィールドに入力します。
  3. [作成] をクリックします。

すべて正常に動作する場合、新しいチケットが表示され、しばらくしてから --Predictions-- ヘッダーの下のフィールドが次のような値に更新されます。

--Predictions--
sentiment: -0.6000000238418579
tags: reasons,image,instance,screen
priority: P2
t_resolution: 6.791423797607422

フロントエンドの設計についてはこのチュートリアルでは扱いませんが、たとえば CSS と AngularJS を使用して、次のような多彩なフロントエンドを作成できます。

フロントエンド設計

クリーンアップ

リソースを削除する

  1. Cloud Datalab インスタンスを削除します。[YOUR_DATALAB_INSTANCE_NAME] は Cloud Datalab インスタンス名に置き換えてください。

    datalab delete [YOUR_DATALAB_INSTANCE_NAME] --zone us-central1-f
  2. デプロイしたモデルを削除します。変数は対応するモデル名に置き換えてください。

    gcloud ml-engine models delete [PRIORITY_MODEL_NAME]
    gcloud ml-engine models delete [RESOLUTION_TIME_MODEL_NAME]
  3. Firebase データベースのデータを削除します。[PROJECT_ID] はプロジェクト ID に置き換えてください。

    firebase database:remove / --project [PROJECT_ID]
  4. デプロイされた Cloud Functions の関数を削除します。

    gcloud functions delete priority
    gcloud functions delete resolutiontime
    gcloud functions delete tags
    gcloud functions delete sentiment
    gcloud functions delete updateSFDC

プロジェクトの削除

あるいは、プロジェクトを完全に削除することもできます。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

  • このチュートリアルのフロントエンドはシンプルです。高度な UI を作成するには、AngularFire による Firebase と Angular JS の統合の使用を検討してください。
  • マネージド環境で顧客のフロントエンドをホストするには、Firebase Hosting のチュートリアルをご覧ください。
  • アプリケーションを保護するには、適切なセキュリティ ルール認証と承認の義務付けなど)を使用してください。
  • このチュートリアルでは例として Salesforce.com を使用していますが、その他のオプション(Jira や、REST API を提供するその他の CRM / ヘルプデスク ツールなど)も使用できます。
  • Google Cloud Platform のその他の機能を試す。チュートリアルをご覧ください。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...