哪个模型能听准来电客户说的话?
厂商的页面给语音转文字模型打了高分,那通电话的转写文本看上去也没什么问题。包裹却还是放在了邻居家,而这正是来电客户特意交代智能体不要做的事。
拿自己的通话测一测
今年夏天的一个周二晚上,一位来电客户打电话给为网店配送包裹的[公司],对它的 AI 智能体说:“您好,我想问一下快递单号 PX 4827 3315 的包裹。请不要放在隔壁邻居家。我周四才回来,到时候自己取。”转写文本里每个字词都对,只少了“不要”。少了这个词,整句话的意思就反了,包裹放在了邻居家。到了周四,这位来电客户又打了进来,火气很大。
负责[公司]客服热线的郑琳,第二天早上看了这份转写文本。少了一个词,偏偏是这通电话最要紧的那个词。整个夏天,智能体都在试点中接晚间来电,用的是厂商方案自带的语音转文字模型,本文称它为模型 A。厂商的页面上,模型 A 的整体字词准确率得分很高。本文里的[公司]、郑琳、试点、通话、两个模型和所有数字,都是示例,不是真实数据。
光凭这样的分数,郑琳根本看不出问题。它对每个字词一视同仁,可一通电话真正靠的只有几个:快递单号、姓氏、日期、地址,还有能把请求整个翻过来的否定词。能听准来电客户的,就是把这几个词听对的那个模型。给电话挑语音转文字(也叫语音识别)的模型,请拿您自己的通话录音,把每个候选模型都测一遍。先在每段录音里标出通话的关键字词,再数一数每个模型能完全答对多少,最后看每次听错是怎么收场的。选哪个模型,要看词表日后补救不了的那些方面。另外,凡是要改动安排的请求,都让智能体复述确认。
厂商给的分数靠得住吗?
厂商的页面把一个模型概括成一个数字,就是每 100 个字词答对多少个。有的页面反过来数答错了多少,给出的是词错误率。不管哪种,都是把测试里每个字词一起平均出来的结果,所以一声“嗯”和快递单号的第三位数字,分量完全一样。
按这种算法,周二那份转写文本几乎挑不出毛病。模型把快递单号、邻居、日期和来电客户说的其余内容都写了下来,只丢了“不要”,而请求的意思恰恰系在这个词上。
这个分数还是在别人的录音上测出来的。您的来电客户有的在车里,有的开着免提,有的站在街上,声音要经过电话线路才传到模型那里,快递单号则是照着手机上的消息飞快念出来的。在相信厂商的数字之前,先问问它测试用的录音,和这样的通话有多接近。
- 录的是谁的声音,说的是什么语言,带哪个地区的口音?
- 说话的人是照稿子念,还是自由交谈?
- 声音是通过电话线路传来的,还是用录音棚话筒收的?
- 周围有杂音,还是在安静的房间里?
通话的关键字词有哪些?
郑琳从试点期间的一个普通星期里抽出 50 段通话录音,那个星期就是周二那通电话所在的一周,所以那通电话也在其中。这些录音和她每天晚上接到的电话差不多:有人在车里,有人开着免提,有人在户外,有年纪大的来电客户,有带口音的,还有几位用另一种语言念街名。请只选团队有权用于这类测试的录音,转写文本也要和录音一样妥善保管。
这些通话的转写文本,模型 A 在试点期间就已经有了。郑琳请厂商再用第二个候选模型,也就是模型 B,把同样的录音转写一遍,并给两个模型在这批通话上的整体字词准确率各打一个分。接着,两位每天接这类电话的客服把每段录音听一遍,照来电客户说的原话记下通话的关键字词,只在这些字词上核对两份转写文本。
核对很严格。快递单号必须每个字母、每个数字都对才算对,因为差一位的号码,要么查不到包裹,要么查到别人的包裹。姓氏要和包裹上的姓名一致,否定词要在转写文本里保留下来,才算对。
一通电话里可能同时有快递单号、姓氏和日期,所以两位客服数出的总数 150,指的是字词的个数,不是通话的数量。
| 来电客户说的话 | 在 50 通电话里出现的次数 | 模型听错了会怎样 |
|---|---|---|
| 快递单号 | 44 | 智能体查不到包裹 |
| 姓氏 | 36 | 智能体没法核实对方是谁 |
| 日期 | 30 | 包裹送错了日子 |
| 地址 | 22 | 包裹送错了门 |
| 否定词 | 18 | 智能体做了相反的事 |
| 通话的关键字词 | 150 |
哪个模型把它们听对了?
按厂商对这 50 通电话打的分,模型 A 领先,每 100 个字词答对 94 个,模型 B 是 92 个。两位客服的核对结果,却是模型 B 领先。
| 模型 A | 模型 B | |
|---|---|---|
| 整体字词准确率 | 100 个中对 94 个 | 100 个中对 92 个 |
| 快递单号答对(共 44 个) | 30 | 40 |
| 姓氏答对(共 36 个) | 20 | 23 |
| 日期答对(共 30 个) | 29 | 30 |
| 地址答对(共 22 个) | 18 | 20 |
| 否定词保留下来(共 18 个) | 15 | 18 |
| 通话的关键字词答对(共 150 个) | 112 | 131 |
在通话的关键字词上,模型 B 在 150 个里答对了 131 个,模型 A 是 112 个。差距最大的是快递单号,44 个里模型 B 对 40 个,模型 A 只对 30 个。来电客户报得快的时候,模型 A 会漏掉一位数字,或者把两位数字颠倒。
模型 A 还丢了 18 个否定词中的 3 个,其中一个就是周二那位来电客户的“不要”。这 50 通电话里,模型 B 把 18 个都留住了。姓氏对两个模型都不容易。模型 A 在 36 个里对了 20 个,模型 B 对了 23 个,所以不管哪个模型的转写文本,都不能单凭它确认姓氏。
让模型 B 在整体分数上落后的,大多是虚词和口头语,比如“嗯”“那个”“的”,没有人会照着这些字词办事。郑琳为客服热线选了模型 B。如果在您自己的测试里,两个模型在通话的关键字词上相差无几,就先多加一些通话,再做决定。
听错了会怎样?
一次听错有三种收场:被记录核对拦下,被智能体复述请求时发现,或者就这样放行。
模型 A 在通话的关键字词 150 个里听错了 38 个。其中 14 个错误的快递单号对不上任何包裹,智能体于是请来电客户再报一遍。16 个错误的姓氏和包裹上的姓名不符,智能体则请对方说一下是哪个字。剩下的 8 个,没有任何环节能拦住:4 个地址、1 个日期、3 个否定词。试点里智能体没有做复述确认,所以这 8 个都照模型听到的样子办了。
模型 B 听错了 150 个里的 19 个。照它的转写文本推算,记录核对本来能拦下 4 个错误的快递单号和 13 个错误的姓氏。它的 2 个错误地址,要是没有复述确认,就没有任何环节能拦住。
模型把快递单号听对时,智能体一次就能找到包裹。这些通话里,没有哪个听错的号码恰好对上别人的包裹,但这种事可能发生,所以智能体还要再核对姓氏。
新的地址、新的日期、来电客户想把包裹放在哪里,这些您的记录都核对不了。所以智能体会把每一项要改动安排的请求复述一遍,先用自己的话说出打算怎么做,再问对不对。这样来电客户听到的是智能体要做的事,而他们要核对的,正是这件事。对否定词来说,复述确认是唯一的核对办法,没有哪份记录能说明来电客户到底说没说“不要”。
要是智能体当时做了复述确认,周二那通电话会是这样,转写文本还是模型 A 的那一份。
来电客户:“请不要放在隔壁邻居家。我周四才回来,到时候自己取。”
智能体:“好的,那我们把包裹放在您邻居家。这样对吗?”
来电客户:“不对,请不要放。我周四回来后自己去取。”
智能体:“实在抱歉。那包裹我们先留在配送站,等您周四来取。这样对吗?”
来电客户:“对,谢谢。”
模型 A 丢掉的“不要”,当场就在这通电话里改正了,用不着等到周四再接一通火气很大的电话。智能体只道歉一次,接着直接说出改正后的安排,来电客户也就把新的安排核对了一遍。复述确认拦不住每一次听错,但这一次,周二的包裹本来能留在配送站。
词表能补救什么?
选定模型之后,您还可以再给它配一份词表。对[公司]来说,就是它送货的街道和城镇名称、两个字母加八位数字的快递单号格式,以及各项服务的名称。厂商一般叫它“热词”或“自定义词汇”,遇到模型没见过的词,不管哪个模型,它都帮得上忙。
郑琳把[公司]服务区域内的街道和城镇都加了进去,让模型 B 把同样的 50 通电话再转写一遍。第二遍,22 个地址全部听对了。
所以比较模型,要比词表补救不了的那些方面。任何词表都教不会模型留住否定词,也教不会它听懂来电客户平时的说话方式,不论是地方话、各种口音,还是年纪大的来电客户。车里、免提或街边带进电话线路的杂音,有没有词表都一样吵。选哪个模型,还决定了它是在来电客户说话的同时就开始写,还是等对方说完才写。等对方说完的模型,会让智能体的每一次回答都慢一拍,这段停顿,我们在 AI 智能体为什么让来电客户干等一文里谈过。
姓氏也一样难。没有哪份词表能装下所有来电客户的姓氏,所以智能体还是要核对包裹上的姓名。
模型转写之后,文本还要经过哪些处理,从整理数字和日期,到弄清来电客户想要什么,我们在语音 AI 如何纠正听错的内容一文里专门讲过。
如果您的客服热线接多种语言的来电,每一种语言都要把测试重做一遍。最能听懂德语来电客户的模型,未必也是最能听懂土耳其语来电客户的那个。
DRING 在哪一步帮得上忙?
DRING 不会把智能体绑定在某一个语音转文字模型上。在 DRING 的语音核心里,语音、语言和声音模型按智能体和语言分别选择,业务流程也可以路由到另一个模型,无需迁移平台。说德语的来电客户和说土耳其语的来电客户,可以由不同的模型来听。通话被实时转写,并在智能体推理之前完成纠错和规范化。
Agent Factory 是 DRING 搭建、测试和优化智能体的地方,您的通话和业务流程在这里变成能干活的智能体,难缠的对话变成测试用例。像周二那样的一通电话,也可以成为其中一条。更强的语音转文字模型,必须先通过整个技术栈都要跑的回归测试集,才会上线。