借助“客户体验分析洞见”,您可以从 Agent Assist 导入对话以进行分析。本文档将引导您完成对导入的 Agent Assist 数据计算多个重要对话指标的过程。
前提条件
使用 Agent Assist 通过智能回复或总结功能生成对话数据。
在“客户体验数据洞见”中启用 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 的建议数量除以提供的建议总数。 |
| 好评比率 | 针对建议的正面反馈占建议总数的比例。 | 计算获得正面反馈的建议数除以建议总数。 |
| 负面反馈比率 | 针对建议的负面反馈占建议总数的比例。 | 计算收到负面反馈的建议数量除以建议总数。 |
智能回复
本部分列出了智能回复特有的指标。
有效点击率
与常规点击率指标相比,有效点击率能更准确地反映客服人员点击智能回复注释的频率。以下查询会提取每位客服人员的回答,以及专门针对该客服人员的回答制作并由该客服人员点击的智能回复注释。然后,它会统计智能回复建议被用于起草代理回答的次数,再将此次数除以代理回答的总次数。

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;