Agent Assist の会話データを使用して指標を計算する

Customer Experience Insights では、Agent Assist から会話をインポートして分析できます。このドキュメントでは、インポートされた Agent Assist データでいくつかの重要な会話指標を計算するプロセスについて説明します。

前提条件

  1. Agent Assist を使用して、スマート リプライ機能または要約機能のいずれかを使用して会話データを生成します。

  2. Customer Experience Insights で Dialogflow ランタイムの統合を有効にします。

  3. CX Insights から BigQuery にデータをエクスポートします。

トリガー率

トリガー率は、特定のタイプのアノテーションが会話に表示される頻度を表します。

文レベルのトリガー率

文レベルのトリガー率は、文ごとに少なくとも 1 回表示されるアノテーションに適用されます。

アノテーション名 アノテーション型 条件
記事の候補 'ARTICLE_SUGGESTION' スレッド内のメッセージごとに、少なくとも 1 つの SuggestArticles リクエストが送信されます。
FAQ アシスト 'FAQ' スレッド内の各メッセージに対して、少なくとも 1 つの SuggestFaqAnswers リクエストまたは AnalyzeContent リクエストが送信されます。
スマート リプライ 'SMART_REPLY' スレッド内の各メッセージに対して、少なくとも 1 つの SuggestSmartReplies リクエストまたは AnalyzeContent リクエストが送信されます。

WITH calculation AS
(
  SELECT
    COUNTIF(
      (
        SELECT COUNT(*)
        FROM UNNEST (sen.annotations) AS annotation
        WHERE annotation.type = 'ANNOTATION_TYPE'
      ) > 0
    ) AS numSentencesAtLeastOneAnnotation,
    COUNT(*) AS numSentencesTotal
  FROM BIGQUERY_TABLE,
  UNNEST (sentences) AS sen
)
SELECT
  numSentencesAtLeastOneAnnotation,
  numSentencesTotal,
  numSentencesAtLeastOneAnnotation / numSentencesTotal AS triggerRate
FROM calculation;

会話レベルのトリガー率

会話レベルのトリガー率は、会話ごとに 1 回のみ表示されるアノテーションに適用されます。

アノテーション名 アノテーション型 条件

| 生成ナレッジ アシスト(GKA) | 'KNOWLEDGE_SEARCH' | 会話内の各メッセージに対して、少なくとも 1 つの SearchKnowledge リクエストが送信されます。| | プロアクティブ生成ナレッジ アシスト | 'KNOWLEDGE_SEARCH' | スレッド内の各メッセージに対して、少なくとも 1 つの SearchKnowledge リクエストまたは AnalyzeContent リクエストが送信されます。| | 要約 | 'CONVERSATION_SUMMARIZATION' | 各会話に対して 1 件以上の SuggestConversationSummary リクエストが送信されます。|

WITH calculation AS
(
  SELECT
    COUNTIF(
      (
        SELECT COUNT(*)
        FROM
          UNNEST (sentences) AS sen,
          UNNEST (sen.annotations) AS annotation
        WHERE annotation.type = 'ANNOTATION_TYPE'
      ) > 0
    ) AS numConversationsAtLeastOneAnnotation,
    COUNT(*) AS numConversationsTotal
  FROM BIGQUERY_TABLE
) SELECT
  numConversationsAtLeastOneAnnotation,
  numConversationsTotal,
  numConversationsAtLeastOneAnnotation / numConversationsTotal AS triggerRate
FROM calculation;

クリック率

クリック率は、通話エージェントに提案されたアノテーションがクリックされた頻度を示します。

文レベルのクリック率

文レベルのクリック率は、エージェントが文ごとに複数回クリックできるアノテーションに適用されます。

アノテーション名 アノテーション型 条件
記事の候補 'ARTICLE_SUGGESTION' スレッド内のメッセージごとに、少なくとも 1 つの SuggestArticles リクエストが送信されます。
FAQ アシスト 'FAQ' スレッド内の各メッセージに対して、少なくとも 1 つの SuggestFaqAnswers リクエストまたは AnalyzeContent リクエストが送信されます。
スマート リプライ 'SMART_REPLY' スレッド内の各メッセージに対して、少なくとも 1 つの SuggestSmartReplies リクエストまたは AnalyzeContent リクエストが送信されます。

WITH calculation AS
(
  SELECT
    COUNTIF(
      (
        SELECT COUNT(*)
        FROM UNNEST (sen.annotations) AS annotation
        WHERE
          annotation.type = 'ANNOTATION_TYPE' AND
          annotation.displayed = TRUE AND
          annotation.clicked = TRUE
      ) > 0
    ) AS numSentencesAtLeastOneClickedAndDisplayedAnnotation,
    COUNTIF(
      (
        SELECT COUNT(*)
        FROM UNNEST (sen.annotations) AS annotation
        WHERE
          annotation.type = 'ANNOTATION_TYPE' AND
          annotation.displayed = TRUE
      ) > 0
    ) AS numSentencesAtLeastOneDisplayedAnnotation,
  FROM BIGQUERY_TABLE,
  UNNEST (sentences) AS sen
)
SELECT
  numSentencesAtLeastOneClickedAndDisplayedAnnotation,
  numSentencesAtLeastOneDisplayedAnnotation,
  numSentencesAtLeastOneClickedAndDisplayedAnnotation / numSentencesAtLeastOneDisplayedAnnotation AS clickThroughRate
FROM calculation;

会話レベルのクリック率

会話レベルのクリック率は、通話エージェントが 1 つの会話で複数回クリックできるアノテーションに適用されます。通話エージェントは、会話レベルのアノテーションを作成するリクエストを事前に送信する必要があります。

アノテーション名 アノテーション型 条件
生成ナレッジ アシスト(GKA) 'KNOWLEDGE_SEARCH' スレッド内のメッセージごとに、少なくとも 1 つの SearchKnowledge リクエストが送信されます。
プロアクティブ生成ナレッジ アシスト 'KNOWLEDGE_SEARCH' スレッド内の各メッセージに対して、少なくとも 1 つの SearchKnowledge リクエストまたは AnalyzeContent リクエストが送信されます。

機能固有の指標

このセクションでは、各機能に固有の指標を一覧表示します。

生成ナレッジ アシスト

生成ナレッジ アシスト(GKA)は、提供されたドキュメント内の情報に基づいて、エージェントの質問に回答します。エージェントが回答を見つけられない場合、GKA は同様の質問を提案し、回答を提供します。この機能では、次のナレッジ検索指標が生成されます。

指標名 定義 計算
結果の件数 すべての会話で 1 人のエージェントに提供された回答の総数。
エージェントのクエリソースの比率 質問の総数に対するエージェントの質問の割合。 エージェントの質問数を質問の合計数で割って計算します。
提案されたクエリのソース比率 質問の総数に対する候補の質問の割合。 提案された質問数を質問の総数で割って計算します。
URI クリック率 少なくとも 1 つの URI がクリックされた回答の割合。回答の総数に対する割合です。 エージェントが URI をクリックした回答の数を、回答の総数で割って計算します。
高評価の割合 回答に対する肯定的なフィードバックの割合。 肯定的なフィードバックを受けた回答の数を、回答の総数で割った値を計算します。
低評価率 回答に対する否定的なフィードバックの割合。 否定的なフィードバックを受けた回答の数を、回答の総数で割った値を計算します。

プロアクティブ生成ナレッジ アシスト

プロアクティブな生成ナレッジ アシストは、現在の会話のコンテキストに基づいて質問を提案し、提供されたドキュメントの情報に基づいて回答を提供します。プロアクティブ生成ナレッジ アシストでは、エージェントの操作は必要ありません。この機能では、次のナレッジ アシスト指標が生成されます。

指標名 定義 計算
結果の件数 すべての会話で 1 人のエージェントに提供された提案の合計数。
URI クリック率 提供された候補の総数のうち、少なくとも 1 つの URI がクリックされた候補の割合。 エージェントが URI をクリックした候補の数を、提供された候補の合計数で割って計算します。
高評価の割合 提案に対する肯定的なフィードバックの割合。提案の総数に対する肯定的なフィードバックの割合です。 肯定的なフィードバックを受けた提案の数を提案の総数で割って計算します。
低評価率 候補に対する否定的なフィードバックの割合。候補の総数に対する否定的なフィードバックの割合。 否定的なフィードバックを受けた提案の数を、提案の総数で割った値を計算します。

スマート リプライ

このセクションでは、スマート リプライに固有の指標について説明します。

有効クリック率(有効 CTR)

有効クリック率は、通常のクリック率の指標よりも、コールセンターのエージェントがスマート返信のアノテーションをクリックする頻度をより正確に反映しています。次のクエリは、各エージェントのレスポンスと、そのエージェントのレスポンスに対してのみ行われ、エージェントがクリックしたスマート返信のアノテーションを取得します。次に、エージェントがスマート返信候補を使用して返信を作成した回数をカウントし、この数値をエージェントの返信の合計数で割ります。

WITH calculation AS (
  SELECT
    sen.sentence AS agentResponse,
    (
      # Get a list of effective smart replies that map to each agent response.
      SELECT ARRAY_AGG(JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.annotationRecord)), "$.reply"))
      FROM
        UNNEST (sentences) AS sen2,
        UNNEST (sen2.annotations) AS annotation
      WHERE
        annotation.type='SMART_REPLY' AND
        annotation.clicked=TRUE AND
        annotation.annotationRecord IS NOT NULL AND
        annotation.createTimeNanos >= (
          # Get the timestamp of the agent response that immediately precedes
          # the current agent response. The timestamp of the effective smart
          # reply must be greater than this timestamp.
          SELECT MAX(sen3.createTimeNanos)
          FROM UNNEST(sentences) AS sen3
          WHERE
            sen3.participantRole = 'HUMAN_AGENT' AND
            sen3.createTimeNanos < sen.createTimeNanos
        ) AND
        annotation.createTimeNanos <= sen.createTimeNanos
    ) AS effectiveSmartRepliesPerAgentResponse
  FROM BIGQUERY_TABLE,
  UNNEST (sentences) AS sen
  WHERE sen.participantRole = 'HUMAN_AGENT'
)
SELECT COUNTIF(ARRAY_LENGTH(effectiveSmartRepliesPerAgentResponse) > 0) / COUNT(agentResponse) AS effectiveCTR
FROM calculation;

レートを編集

エージェントは、提案されたスマート リプライの回答をそのまま使用するか、回答を編集してからお客様に送信するかを選択できます。スマート リプライの回答の編集率を計算すると、候補の回答が編集される頻度を確認できます。次のクエリは、提案された各スマート リプライと、そのスマート リプライの直後に続くエージェントのレスポンスを取得します。次に、エージェントのレスポンスに対応するスマート リプライが含まれていない回数をカウントし、この数をスマート リプライの合計数で割ります。

WITH calculation AS
(
  SELECT
    JSON_VALUE(PARSE_JSON(JSON_VALUE(annotation.annotationRecord), wide_number_mode=>'round'), "$.reply") AS smartReply,
    (
      # Get the agent response that immediately follows the smart reply.
      SELECT sen2.sentence
      FROM UNNEST (sentences) AS sen2
      WHERE sen2.createTimeNanos = (
        SELECT MIN(sen3.createTimeNanos)
        FROM UNNEST (sentences) AS sen3
        WHERE
          sen3.createTimeNanos > sen.createTimeNanos AND
          sen3.participantRole = 'HUMAN_AGENT'
      )
    ) AS agentResponseThatFollows,
  FROM BIGQUERY_TABLE,
  UNNEST (sentences) AS sen,
  UNNEST (sen.annotations) AS annotation
  WHERE
    annotation.type='SMART_REPLY' AND
    annotation.clicked=TRUE AND
    annotation.annotationRecord IS NOT NULL
)
SELECT COUNTIF(REGEXP_CONTAINS(agentResponseThatFollows, smartReply)) / COUNT(smartReply) AS editRate
FROM calculation;

要約

このセクションでは、要約に固有の指標について説明します。

  • GENERATOR_SUGGESTION_RESULT 型には、要約を含むすべての生成結果が含まれます。
  • CONVERSATION_SUMMARIZATION_SUGGESTION 型には以前の要約が含まれます。

生成ツールの概要

JSON としてジェネレータの要約と要約に対するエージェントの編集にアクセスするクエリの例:

SELECT
IF
  (JSON_VALUE(annotation.annotationRecord) != '', 
   JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.annotationRecord)), "$.generatorSuggestion.summarySuggestion"),
   NULL) AS generator_summary,
IF
  (JSON_VALUE(annotation.detailedFeedback) != '',
   JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.detailedFeedback)), "$.summarizationFeedback.summaryText"),
   NULL) AS feedback,
FROM
  BIGQUERY_TABLE AS c,
  UNNEST(c.sentences) AS sentences,
  UNNEST(sentences.annotations) AS annotation
WHERE
  annotation.type = 'GENERATOR_SUGGESTION_RESULT'
  AND JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.annotationRecord)), "$.generatorSuggestion.summarySuggestion") IS NOT NULL
LIMIT
  10 ;

編集距離

要約の編集距離は、エージェントが編集した要約と提案された要約の差を測定するものです。この指標は、エージェントが提案された要約の編集に費やした時間と相関関係があります。

  1. 要約とその修正された要約(存在する場合)をクエリします。

  2. 通話エージェントは clicked ブール値を true に設定せずに要約の修正を送信できるため、clicked のステータスに関係なくクエリの要約が可能です。エージェントの要約が null の場合、エージェントは提案された要約を修正しなかったか、修正された要約が推奨されるフィードバック ルートを使用して Agent Assist に送信されませんでした。

  3. 推奨される要約とエージェントが修正した要約を、好みの編集距離アルゴリズムを使用して比較し、要約の編集距離を計算します。たとえば、挿入、削除、置換に同じペナルティが適用されるレーベンシュタイン距離などです。

SELECT
  JSON_VALUE(PARSE_JSON(JSON_VALUE(annotation.annotationRecord)), "$.text") AS suggestedSummary,
IF
  (JSON_VALUE(annotation.detailedFeedback) != '', JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.detailedFeedback)), "$.summarizationFeedback.summaryText"), NULL) AS feedback,
FROM
  BIGQUERY_TABLE,
  UNNEST (sentences) AS sen,
  UNNEST (sen.annotations) as annotation
WHERE
  type='CONVERSATION_SUMMARIZATION_SUGGESTION';

レートを編集

要約の編集率は、編集距離を編集された要約の文字列の長さで割ることで計算できます。この指標は、エージェントが要約を編集した割合を示します。この編集率に上限はありませんが、値が 1 以上の場合は、生成された要約が不適切であることを意味し、この機能を無効にすることをおすすめします。

割合を編集する

編集率は、エージェントがそのまま使用せずに編集した、提案された要約の合計数に対する割合です。エージェントが編集した要約の数を、提案された要約の数で割って算出されます。この指標は、値が 0 に近い場合にモデルの品質を示す優れたシグナルとなります。ただし、1 に近い場合でも、編集が軽微で、提案された要約が編集されたとカウントされるため、モデルの品質が低いとは限りません。

WITH
  summaryAndEdits AS (
  SELECT
    JSON_VALUE(PARSE_JSON(JSON_VALUE(annotation.annotationRecord)), "$.text") AS suggestedSummary,
  IF
    (JSON_VALUE(annotation.detailedFeedback) != '', JSON_QUERY(PARSE_JSON(JSON_VALUE(annotation.detailedFeedback)), "$.summarizationFeedback.summaryText"), NULL) AS editedSummary,
  FROM
    BIGQUERY_TABLE,
    UNNEST (sentences) AS sen,
    UNNEST (sen.annotations) AS annotation
  WHERE
    type='CONVERSATION_SUMMARIZATION_SUGGESTION' )
SELECT
  countif (suggestedSummary IS NOT NULL) AS totalSummaries,
  countif (editedSummary IS NOT NULL) AS editedSummaries,
  countif (editedSummary IS NOT NULL) / countif (suggestedSummary IS NOT NULL) AS editRate
FROM
  summaryAndEdits;