使用 Agent Assist 对话数据计算指标

借助“客户体验分析洞见”,您可以从 Agent Assist 导入对话以进行分析。本文档将引导您完成对导入的 Agent Assist 数据计算多个重要对话指标的过程。

前提条件

  1. 使用 Agent Assist 通过智能回复总结功能生成对话数据。

  2. 在“客户体验数据洞见”中启用 Dialogflow 运行时集成

  3. 将数据从 CX Insights 导出到 BigQuery。

触发率

触发率用于描述某种类型的注解在对话中出现的频率。

句子级触发率

句子级触发率适用于每句至少可显示一次的注释。

注释名称 注释类型 条件
文章建议 'ARTICLE_SUGGESTION' 针对对话中的每条消息,至少会发送一个 SuggestArticles 请求。
常见问题解答助手 'FAQ' 对于对话中的每条消息,系统至少会发送一个 SuggestFaqAnswersAnalyzeContent 请求。
智能回复 'SMART_REPLY' 对于对话中的每条消息,系统至少会发送一个 SuggestSmartRepliesAnalyzeContent 请求。

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;

对话级触发率

对话级触发率适用于每个对话最多可显示一次的注释。

注释名称 注释类型 条件

| 生成式知识辅助 (GKA) | 'KNOWLEDGE_SEARCH' | 对对话中的每条消息至少发送一次 SearchKnowledge 请求。| | 主动生成式知识辅助 | 'KNOWLEDGE_SEARCH' | 系统会针对对话中的每条消息发送至少一个 SearchKnowledgeAnalyzeContent 请求。| 总结 | 'CONVERSATION_SUMMARIZATION' | 每次对话至少发送一次 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' 针对对话中的每条消息,至少会发送一个 SuggestArticles 请求。
常见问题解答助手 'FAQ' 对于对话中的每条消息,系统至少会发送一个 SuggestFaqAnswersAnalyzeContent 请求。
智能回复 'SMART_REPLY' 对于对话中的每条消息,系统至少会发送一个 SuggestSmartRepliesAnalyzeContent 请求。

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;

对话级点击率

对话级点击率适用于代理在每次对话中可多次点击的注释。通话代理必须主动发送请求,以创建对话级注解。

注释名称 注释类型 条件
生成式知识助手 (GKA) 'KNOWLEDGE_SEARCH' 针对对话中的每条消息,至少会发送一个 SearchKnowledge 请求。
主动式生成知识辅助 'KNOWLEDGE_SEARCH' 对于对话中的每条消息,系统至少会发送一个 SearchKnowledgeAnalyzeContent 请求。

特定于功能的指标

本部分列出了每项功能特有的指标。

生成式知识助理

生成式知识辅助 (GKA) 功能可根据您提供的文档中的信息回答客服人员的问题。如果代理找不到答案,GKA 会建议一个类似的问题并提供答案。此功能会生成以下知识搜索指标:

指标名称 定义 计算
结果数 针对所有对话向单个代理提供的回答总数。
代理查询来源比率 代理问题占问题总数的比例。 计算方式:代理提出的问题数/问题总数。
建议的查询来源比率 建议问题占问题总数的比例。 计算建议问题数除以问题总数。
URI 点击率 至少有一个 URI 被点击的回答占回答总数的比例。 计算方式:客服人员点击 URI 的回答数/回答总数。
好评比率 对回答的正面反馈占回答总数的比例。 计算获得正面反馈的回答数量除以回答总数。
负面反馈比率 回答的负面反馈占回答总数的比例。 计算收到负面反馈的回答数量除以回答总数。

主动式生成知识辅助

主动生成知识辅助功能会根据当前的对话内容建议问题,并根据您提供的文档中的信息提供答案。主动生成式知识辅助功能无需客服人员互动。此功能会生成以下知识辅助指标:

指标名称 定义 计算
结果数 为单个代理在所有对话中提供的建议总数。
URI 点击率 至少有一个 URI 被点击的建议占所提供建议总数的比例。 计算客服人员点击 URI 的建议数量除以提供的建议总数。
好评比率 针对建议的正面反馈占建议总数的比例。 计算获得正面反馈的建议数除以建议总数。
负面反馈比率 针对建议的负面反馈占建议总数的比例。 计算收到负面反馈的建议数量除以建议总数。

智能回复

本部分列出了智能回复特有的指标。

有效点击率

与常规点击率指标相比,有效点击率能更准确地反映客服人员点击智能回复注释的频率。以下查询会提取每位客服人员的回答,以及专门针对该客服人员的回答制作并由该客服人员点击的智能回复注释。然后,它会统计智能回复建议被用于起草代理回答的次数,再将此次数除以代理回答的总次数。

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. 使用您偏好的编辑距离算法比较建议的摘要与客服人员修改后的摘要,以计算摘要编辑距离。例如,插入、删除和替换的惩罚相等时的 Levenshtein 距离

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;