数据与任务描述
数据为客服与销售的通话之后的转录会话数据。
任务是预先设好的会话类别,对转录的会话数据进行内容分割,并对分割的结果做打标。
论文研究(GPT-Calls)
论文题目:GPT-Calls: Enhancing Call Segmentation and Tagging by Generating Synthetic Conversations via Large Language Models
论文链接: arxiv.org/abs/2306.07...
微软的一篇文章。研究结果用在了微软的Dynamic 365 Sales平台。如下图所示:
提出了一种新的方法,即基于GPT的呼叫分割和打标(GPT-Call),用于高效准确的呼叫分割和主题提取。
分析离线转录会话的作用:
-
更好的培训销售。销管只需听重要片段,就能对销售进行指导和培训,而不用把所有的通话记录都听完。
-
对客户的需求,喜好,痛点进行洞察。对会话的分割和打标,可以更好的帮助销售制定策略,提升客户经验。
-
质检。分析销售与客户的对话过程中遵守了公司的政策和规则。
-
对销售表现和客户行为产出报告和看板。做出更好的数据驱动的决策,提升商业整体收入。
-
识别出对话出和最终收入相关的关键点。从而用来训练销售,提升个人绩效。
论文针对的问题是打标和分割的不准确,打标主题多变,需要大量的标注数据,需要较多的领域专业知识去生产groud truth训练数据。
本文提出一种不需要标注数据的方法。基于GPT模型,我们先模拟生产出类似实际通话的主题数据,这些打标主题都是预先定义的。然后合成的模拟数据用一个小的transformer网络模型对会话数据进行分割和打标。
主要流程如下图所示:
主要包括离线和在线两个阶段。下面详细介绍。
离线用GPT生成anchor
离线阶段,先用GPT模型给每一个主题生产出很多模拟的会话句子。
然后,将生产出来的合成模拟句子向量化,然后聚类,抽取出anchor vector.
具体而言,对于每一个topic, 首先让GPT模型输出几千个和这个topic相关的句子。这个prompt主要包括几个示例句子,让模型产出其他相关的句子。产出的topic锚点句如下图所示:
对于一个topic, 用同一个prompt, 通过gpt模型产出合成的句子。跑几千遍,生成几千个合成的句子。例如,pricing这个主题的prompt如下:
vbnet
"This is a prefix of a call between two people,
where they greet and introduce each other:
"Thank you for calling Spencer and Bryce. This
is Tracy. How can I help you? Hey Tracy, I'm Jeremy
King from sales looking to reach Paul Lana. Uh, you
know what? Give me your name again. Jeremy king.
Calling regarding what Jeremy? I'm a salesperson
working for" Here is part of the middle of a different
phone call between two different persons from
different companies, where they are discussing the
pricing of a product:"
每个主题产生的1000多个句子。再用Sentence-Bert进行向量化。输出维度为384维。
然后使用DBSCAN算法(向量聚类算法,A density-based algorithm for discovering clusters in large spatial databases with noise,1996)对产出的句子进行聚类,聚类的结果称为anchor.
这些anchor再在在线阶段对会话句子进行聚类。
总体来说,offline步骤主要包括:topic定义,模拟会话主题句生成,SBERT向量化,用DBSCAN聚类,抽取anchor。最终生成的anchor将用到在线流程中。
offline流程归纳如下图:
在线根据anchor相似度给每一句会话打标
在线阶段,用language model计算出每一个conversation utterance的向量,然后和anchor向量计算相似度。
然后,通过对每个utterance score在时间维度的分析,将utterance按照时间维度进行分组,每一组就是属于一个特定的topic. 对于那些不属于任何主题的句子就标记为"backgroud"
具体而言,对于每一个utterance, 先计算出其和topic中每一个anchor的向量相似度,然后取最大值,作为topic-utterance分数,topic-utt分数再以topic维度 按照Softmax函数转化为概率。这样就得到了一组向量,每一个向量代表一个utterance属于每个topic的概率。
分数修正、滑动窗口判断
为提升topic打标的准确性,本文对上述向量按时间顺序维度进行分析。首先识别出每一个时刻的utterance对应的主题峰值heat sources(所有主题分数的最大值),然后第每一个heat source的相邻句子采用热扩散策略(heat diffusion strategy)对sequence的每个样本的分数进行修正。比如某个句子的前后两句都属于同一个主题,那这个句子也大概率属于这个主题(于是就把这个句子相对这个主题的分数进行人为提升)。
这个温度扩散策略方法主要是处理一些噪声的情况(论文未说明温度扩散策略的具体操作方法,只是定性的进行了说明)。
温度扩散策略修正分数后,再次使用softmax函数对主题分数进行归一化,使其和为1.
然后使用一个窗口对所有的utterance进行滑动判断。窗口大小和每个topic有关系,为预定义的参数,如果窗口内这个主题的分数之和超过一定阈值(这个阈值也是事先定义的,每个topic都不一样),则对这个窗口打上topic的标签。
最后将属于同一个主题的窗口进行合并,就完成了会话的分割和打标。
如果一个窗口同时命中了多个主题,则按分数最大值取那个主题,其他窗口的分数相应得进行调整。
示例如下:
online在线处理的流程示例如下:
文章方法不需要打标数据,只需要预先提供少部分示例锚点句。而且可以做到接近实时。用标准硬件,分割和打标速度可以到2-3s.
目前的研究成果在Dynamics 365 Sales, 看板如下图所示:
实验结果:
评估指标为PK score/WinDiff, 越低越好。
人工评估是否合理结果如下:
PK分数(Pk)和WinDiff分数都是衡量自动文本段落分割质量的评价指标。
- PK分数:
PK分数根据随机选择的两个相邻字之间是否应该存在分段点以及是否确实存在分段点来计算。如果应该存在分段点但实际上并不存在,或者不应该存在分段点但确实存在,那么这两个字之间就会有一个"错误"。PK分数就是所有可能的相邻字符对中的错误比例。
- WinDiff分数:
WinDiff分数的计算方法比较复杂,它考虑了分段的前后连续性。这个度量将真实分段和预测分段看作是由一系列的短文本窗口组成。假设所选择的窗口长度为"win",那么在两个分段之间,WinDiff会找出每一个长度为"win"的窗口,然后计算窗口内的差异。如果窗口中某个字符在真实分段中属于当前窗口,但在预测分段中不属于,则该字符会被看作是一个"错误",反之亦然。WinDiff分数是所有可能窗口的平均错误比例。
两者都是衡量分段质量的重要标准,但是不一定每种情况下都适合,需要根据具体的应用场景进行选择和使用。