通话后处理:那份摘要比通话本身多活好几年,而没有人评测它。
来电者只听一次对话;而你的智能体写下的处置码与摘要,会在接下来三年里被反复阅读——被下一个接手这位客户的坐席、被决定回拨去向的路由、被清点退款原因的分析师,最终还可能被那个要去回应监管的人。一个语音智能体可以把每一轮都处理得漂漂亮亮,却在来电者挂断后的四秒里把这一切都污染掉;因为通话后处理是在没有听众纠正的情况下,往一份持久记录里做生成。请评测这些产物,而不是评测那段对话。
四样产物,四种消费者,四种「弄错了」的代价。
「通话后处理」是一个标签,底下盖着几种失败方式毫不相干的产出;把它们当成一个生成任务,正是根子上的错误。在动手建任何东西之前先把它们拆开:
- 叙述式摘要。由下一个碰到这个账户的人来读。错了代价不小,但可挽回,因为读它的人离原始记录只有一次点击。
- 处置码 / 结案码。取自一个封闭词表的单一取值,驱动着路由、报表、补偿,有时还有监管口径的计数。错了是无声的,而且会累积——没有人会回头重读一个处置码,人们是把它聚合起来用的。
- 结构化字段写入。地址改了、套餐升了、回拨排上了、同意标记置位了。这些是副作用而不是文本,并且继承了 语音工具与状态 里的每一项风险。
- 后续待办。一张工单、一次回拨、一次向某个队列的升级。这里错了,通常意味着一项只存在于通话录音里、别处一概没有的对客户的义务。
按「下游的人有多容易抓住这个错误」给它们排个序,你的复核预算就自动出来了。摘要是自纠的,因为它就挨着自己的证据;处置码不是,因为它是被当成数字消费的。把你的评测投入,按产物的可见度反着分配。
处置码是一个披着生成外衣的分类问题。
让模型「选一个结案码」看上去是个小活儿,却是本页上杠杆最大的一件事——因为它是唯一一个会被拿去计数的通话后产出。这里有两件事会出错,而其中只有一件是模型的错。
- 把输出约束在词表内。处置码必须来自那个枚举集合,且在解码层或 schema 层强制,而不是在提示词里请求——这是 结构化输出 的标准论证。一个 CRM 里根本不存在的近似码会被抓住;一个真实存在但选错了的码不会。
- 你的分类体系多半本来就是坏的,而智能体会把它暴露出来。多数结案码集合是为「在时间压力下点鼠标的人」设计的,所以里面有互相重叠的类别、一个占比奇高的「其他」,以及自 2019 年起没人用过的码。人工坐席靠习惯、靠班组把这些歧义消化掉了;模型则每通电话都消化得不一样,而由此产生的分布漂移会被算到模型头上。在拿它做自动化之前,先拿一个月的真实通话把这套分类体系审一遍。
- 强制留出「弃权」。必须有一个表示「模型没有把握」的码,它要与「其他」区分开,并且必须路由到某个人看得见的地方。没有弃权,模型会把它的不确定性均匀摊到几个说得通的码上——那是最糟的失败方式,因为它在聚合结果里完全看不见。
- 盯分布,而不是盯准确率。对着人工标签做的逐码混淆矩阵会告诉你该在哪儿介入;一个笼统的准确率数字,会掩盖智能体正在系统性地把三个账单类的码压成一个。
摘要不得断言任何原始记录支撑不了的东西——而那份记录本身已经是错的。
这里叠着两个误差来源,而且它们朝同一个方向复合。模型会过度宣称,用一项凭空捏造的承诺去填一个看似合理的空缺;而它所摘要的那份转写文本,本身就带着识别错误,并且这些错误恰恰集中在最要紧的姓名、账号与金额上——那正是 语音栈 所描述的实体错误问题。一份摘要会把这两者一并洗成笃定的散文,再也不带任何「当时其实不确定」的信号。
- 凡有后果的内容,引用来电者的原话。「说 14 号那笔扣款不是她的」可以拿录音去核;「对一笔欺诈交易提出异议」则是智能体自己得出的结论,而且是一个没人请它去做的法律定性。
- 把推断标记为推断。凡是智能体推出来的、而不是听到的东西,都该放在记录中一个单独的、显眼标注的部分,好让读它的人分得清——这就是 幻觉与接地 那套纪律,用在了没有人会去核查的地方。
- 绝不生成智能体未曾核实过的实体。摘要里的账号、金额与日期应当来自记录系统或一个已确认的槽位,而绝不能只来自 ASR 的输出。如果某个值从未向来电者回读确认过,它就不该进入一个持久字段。
- 把承诺过的事写在显眼处。破坏力最大的那种遗漏,是通话中做出、却只存在于录音里的一项承诺——一次回拨、一笔减免、一个期限。把承诺抽成它自己的结构化输出,而不是叙述里的一个句子。
- 保留原始记录,并把它链上。摘要是一份有损的派生物;「究竟说了什么」的记录才是你的 审计轨迹 真正需要的那件产物,而这两者永远不该可以被拆开。
写入是副作用,而通话已经结束了。
通话后处理最危险的性质,是它在没有人在听的时候执行。通话中的工具失败会产出死寂,以及一个会投诉的来电者;通话后的写入失败产出的是沉默,而第一个症状是三周后一位客户坚称自己改过地址。
- 每通电话一个幂等键,带在每一次写入上。重试、重复的 webhook,以及某位主管重跑一个失败批次,都会把同一次写入再触发一遍,而第二次被排上的回拨是一个客户看得见的缺陷。这是最寻常形态的 幂等 问题,而它之所以经常被跳过,就因为「电话已经打完了」。
- 把「写了一半」这件事设计出来。摘要落了、处置码落了、字段更新失败了。事先决定:是留下一份不一致的记录,还是把整个包扣住待重试;并让那个半写状态可被检测出来,而不是看上去挺像回事。
- 显式处理被转接的通话。当这通电话被升级过,就有一个人也在往这份记录里写——见 升级与温转接。要约定好处置码归谁,并且绝不允许智能体的异步写入盖掉人工接手之后写下的内容。
- 把合规状态带进记录。录音同意、「您正在与 AI 通话」的告知,以及任何监管标记,都是这份持久产出的一部分,而不是那段对话的一部分。一通在发生时合规的电话,一年之后必须仍然可被证明是合规的。
- 绝不让通话后处理写到来电者授权之外去。来电者认证 所确立的东西,约束这些写入的方式,与它约束通话中那些写入的方式完全一样;写入路径不能变成那个让权限范围悄悄扩大的地方。
通话后处理也有延迟预算,而且它在跟下一通电话抢资源。
人工联络中心会测它,还给它起了名字;智能体部署则通常忘了它的存在,因为那些秒数并不在任何人正盯着的那份 轮次延迟预算 里。由此推出三个决策:
- 同步还是异步。就地做完会占住会话、上下文与音频,并把线路堵着。异步做则释放线路,但要求你把摘要器所需的一切持久地留住——包括是哪个模型、哪个提示词版本产出了它。
- 异步意味着队列,而队列意味着积压。一条落后的回写队列会造出一个滞后几分钟甚至几小时的 CRM——而那位立刻回拨的来电者,正是「记录最该已经就绪」的最高价值时刻,也恰恰是撞进这个空档的那个人。请对队列年龄告警,而不是对队列深度告警。
- 做对账。每一通完成的电话都必须以一份记录收尾,而且必须有某个东西在没有记录时发出声音。每日把通话与已写记录对一遍,这件事毫不光鲜,却是唯一能抓住「回写路径静默失败了一周」的控制。
优先选择「异步 + 一条短且被监控的队列」:那是唯一一种在你把摘要器改好之后,还能让你重跑通话后处理的形状。如果这些产物是「一份存好的转写、一个提示词版本、一个分类体系版本」的纯函数,你就能把一个月的产物重新生成一遍——这会把一次摘要器升级,从「只影响未来通话的变更」变成「一次你可以拿过去来评测的变更」。
去评测这些产物,因为你的语音评测没有评它们。
一套语音评测在给对话打分:智能体听懂了没有、回应得如何、解决了没有。它通常止步于来电者挂断的那一刻——这意味着,半衰期最长的那些产出,恰恰是整个系统里唯一没被评测的部分。把黄金集延伸到通话结束之后:
- 处置码与人工标注的一致性。让有经验的坐席独立给一批通话编码,并逐码测一致性。同时也测你的人与人之间的一致性——如果他们彼此都不一致,那缺陷在分类体系,没有哪个模型能修好它。
- 摘要的忠实度,按「原始记录里没有的断言」计分。一句无据可依的断言就是一次失败,不论那一段其余部分读起来多好;请数断言,而不是评质量。
- 承诺召回率。通话中做出的承诺里,有多大比例出现在了记录中?这是客户直接感受得到的那个数,而且通常比摘要质量所暗示的要糟得多。
- 写入成功率与重复率。运维层面的、无趣的,而且是当 CRM 的 schema 在你脚下变动时,第一个坏掉的东西。
- 下游重复率。当客户回拨时,下一个坐席手上有没有他需要的东西,还是来电者又得从头讲一遍?把它作为整条通话后路径的结果指标,喂给 评估语音智能体。
从处置码开始,因为它是一个「驱动的下游行为比整份摘要还多」的输出,也是本页上把它做对最便宜的那件事。把它约束在词表内,加一个明确的、会路由给人的弃权选项,并且在为分布漂移责怪模型之前,先拿一个月的真实通话把你的分类体系审一遍。然后让摘要去引用而不是去定性,把承诺抽成结构化输出而不是散文,给每一次写入配一个幂等键,并每日把通话与记录对账。那段对话是被一个能当场反驳你的人实时评判的;而之后写下的一切,没有人评判——这恰恰正是它需要评测的原因。