借助 Customer Experience Insights,您可以从 Agent Assist 导入对话以进行分析。本文档将引导您完成对导入的 Agent Assist 数据计算几个重要对话指标的过程。
前提条件
使用 Agent Assist 通过 智能回复或 摘要功能生成 对话数据。
在 Customer Experience Insights 中启用 Dialogflow 运行时集成。
将数据从 CX Insights 导出到 BigQuery。
触发率
触发率描述了某种类型的注解在对话中出现的频率。
句子级触发率
句子级触发率适用于每句话至少出现一次的注释。
| 注释名称 | 注释类型 | 条件 |
|---|---|---|
| 文章建议 | 'ARTICLE_SUGGESTION' |
为对话中的每条消息发送至少一个 SuggestArticles 请求。 |
| 常见问题解答助理 | 'FAQ' |
为对话中的每条消息发送至少一个 SuggestFaqAnswers 或 AnalyzeContent 请求。 |
| 智能回复 | 'SMART_REPLY' |
为对话中的每条消息发送至少一个 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;
对话级触发率
对话级触发率适用于每条对话最多出现一次的注释。
| 注释名称 | 注释类型 | 条件 |
|---|
| 生成式知识助理 (GKA) | 'KNOWLEDGE_SEARCH' | 为对话中的每条消息发送至少一个 SearchKnowledge 请求。|
| 主动型生成式知识助理 | 'KNOWLEDGE_SEARCH' | 为对话中的每条消息发送至少一个 SearchKnowledge 或 AnalyzeContent 请求。|
| 摘要 | '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' |
为对话中的每条消息发送至少一个 SuggestFaqAnswers 或 AnalyzeContent 请求。 |
| 智能回复 | 'SMART_REPLY' |
为对话中的每条消息发送至少一个 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;
对话级点击率
对话级点击率适用于呼叫客服人员可以每条对话多次点击的注释。呼叫客服人员必须主动发送请求,以创建对话级注解。
| 注释名称 | 注释类型 | 条件 |
|---|---|---|
| 生成式知识助理 (GKA) | 'KNOWLEDGE_SEARCH' |
为对话中的每条消息发送至少一个 SearchKnowledge 请求。 |
| 主动型生成式知识助理 | 'KNOWLEDGE_SEARCH' |
为对话中的每条消息发送至少一个 SearchKnowledge 或 AnalyzeContent 请求。 |
特定于功能的指标
本部分列出了特定于每个功能的指标。
生成式知识助理
生成式知识助理 (GKA) 会根据您提供的文档中的信息,回答客服人员提出的问题。如果客服人员找不到答案,GKA 会建议提出类似的问题并提供答案。此功能会生成以下知识搜索指标:
| 指标名称 | 定义 | 计算 |
|---|---|---|
| 结果计数 | 为所有对话向单个客服人员提供的答案总数。 | |
| 客服人员查询来源比率 | 客服人员提出的问题占问题总数的比例。 | 计算客服人员提出的问题数除以问题总数。 |
| 建议的查询来源比率 | 建议的问题占问题总数的比例。 | 计算建议的问题数除以问题总数。 |
| URI 点击率 | 至少点击一个 URI 的答案占答案总数的比例。 | 计算客服人员点击 URI 的答案数除以答案总数。 |
| 正面反馈比率 | 对答案的正面反馈占答案总数的比例。 | 计算收到正面反馈的答案数除以答案总数。 |
| 负面反馈比率 | 对答案的负面反馈占答案总数的比例。 | 计算收到负面反馈的答案数除以答案总数。 |
主动型生成式知识助理
主动型生成式知识助理会根据当前的对话上下文建议问题,并根据您提供的文档中的信息提供答案。主动型生成式知识助理不需要客服人员互动。此功能会生成以下知识助理指标:
| 指标名称 | 定义 | 计算 |
|---|---|---|
| 结果计数 | 为所有对话向单个客服人员提供的建议总数。 | |
| URI 点击率 | 至少点击一个 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 ;
修改距离
摘要的修改距离衡量的是客服人员修改后的摘要与建议的摘要之间的差异程度。此指标与客服人员修改建议的摘要所花费的时间相关。
查询摘要及其修订后的摘要(如果有)。
由于呼叫客服人员可以提交摘要修订,而无需将
clicked布尔值设置为true,因此请查询摘要,无论其clicked状态如何。如果客服人员的摘要为 null,则表示客服人员未修订推荐摘要,或者修订后的摘要未使用 Agent Assist 的 首选反馈路线发送。使用 您首选的 修改距离算法 将建议的摘要与客服人员修订后的摘要进行比较,以计算摘要修改距离。例如, 插入、删除和替换的惩罚相等时的 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;