当这通电话是一次紧急情况:模型绝不该拥有的那条路径。
不会有人递给你一份「智能体接到了一个处于危险中的人的电话」的合规清单——没有任何标准要求语音智能体把一通危机来电转去某个特定的地方,而正是这份缺席让团队根本不建这条路径就上线了。倒是有两项义务在你的电话系统装上去的那一刻就一起到了,而它们绑定的是电话系统本身,而不是由谁来接听。其余一切都归你设计,而撑得住的那份设计会把探测器放在音频栈里模型的下面,因为最需要人的那位来电者,往往是在智能体说到一句话中间时才说出口的,而一个正处在生成中途的模型没法行动。
步骤 1你已经背着的两项义务,以及它们绑定在谁身上。
从这里开始,因为这是本页唯一有规则手册的部分,也因为团队总习惯性地以为这是别人的问题。在美国,一套多线电话系统——也就是你的 PBX、你那个云呼叫中心租户,以及你的智能体所在的 SIP 中继合起来的东西——背着两项联邦要求,而两者都没提是谁或什么来接入向来电。
- Kari's Law:直接拨号与现场通知。用户必须能通过拨 911 直接拨通 911,不加前缀、不用接入码;而当这件事发生时,系统必须通知现场的某个人——前台、安保办公室、某个指定联系人。FCC 于 2019 年 8 月通过了实施规则;它们适用于 2020 年 2 月 16 日之后制造、进口、首次销售或租赁要约、首次售出或租出、或安装的多线电话系统,这基本覆盖了此后搭起来的任何语音栈。
- RAY BAUM's Act 第 506 条:可派遣位置。一次 911 呼叫必须传递来电者的可派遣位置——其定义是街道地址,加上足以识别来电者所在位置的附加信息,如房间号或楼层号。这些期限早已过去:驻地内固定设备自 2021 年 1 月 6 日起,驻地内非固定设备自 2022 年 1 月 6 日起(在技术可行时)。
请读它的含义,而不只是读条文。这些规则讲的是系统,所以加上一个智能体既不会创设一项新义务,也不会免除一项已有义务——但一个智能体会剧烈改变失效模式。拨你主线并接到智能体的来电者并不是在打 911,所以上面的规则并不直接适用;而一旦你的流程提出要把人接通到紧急服务,或者你的部署是在驻地内、有话机与同一条中继共用,你就在它们里面了。而一个把外呼走经模型驱动编排器的栈,可能悄悄破坏直接拨号,因为一个会对所拨字符串做规范化的编排器,正是那种会把一个三位数字吃掉的组件。
有两项具体的核查值得本周就做,与本页其他一切无关:在与本地 PSAP 协调好的测试窗口内、或通过你的提供方的测试号码,从同一系统上的一台设备拨 911;并确认那条现场通知真的到了某个有人会读的地方。两者的失败频率都高于任何人的预期,而且两者都是无声地失败。
步骤 2探测器属于模型的下面,而不是模型的里面。
这是决定其余一切能否奏效的那个架构决定,而大多数设计都把它弄错了——它们把紧急处理放进了提示词,或者放进了一个模型可以选择要不要调的工具。
想一想真实的时序。智能体正在念菜单或念确认,已经念了三秒。来电者打断:「后面那间屋子在冒烟。」在级联栈里,部分转写稿立刻就存在于 ASR 流中;在语音到语音的栈里,那段音频已经在模型的输入里了。两种情况下,模型都处在生成中途,而且它会先把这一轮说完再去推理任何事;而如果插话打断为了避免误打断而调得保守,它甚至可能根本没把那句话登记成一轮。这中间的每一毫秒,都是一个「对部分转写稿做确定性匹配的东西本可以已经拆掉智能体并把电话拨出去」的毫秒。
# two places the detector can live model-owned pipeline-owned ------------ -------------- prompt says "if emergency, matcher runs on every partial call transfer_urgent()" ASR hypothesis, always fires: after the turn fires: mid-utterance, <300 ms depends on: model available depends on: ASR available fails when: context is full, fails when: ASR is down tool list changed, model (and then the call is dead is mid-generation, the anyway, so the dependency router picked a smaller is one you already have) model, a guardrail ate it # the right answer is BOTH, with the pipeline one load-bearing.
所以:在媒体通路上,对每一个部分 ASR 假设跑一个确定性分类器,并给它抢占智能体的权限。模型侧那个工具也留着——它能抓住匹配器漏掉的那些改述——但绝不要让它成为唯一的路径。一次工具调用是模型在健康且专注时发出的一个请求;而紧急情况恰恰是你两者都不能假定的那种情形。这与「急停开关必须在它所停的那个东西之外」是同一套推理。
一个语音到语音的部署正因此需要第二路 ASR 流,而团队会抗拒这笔成本。它是本页最便宜的保险:一个小的流式识别器,唯一的工作就是盯一张很短的短语模式清单,从不用于对话本身。
步骤 3「确定性路径」端到端究竟意味着什么。
确定性不等于只认关键词。它意味着链条上的每一环在每一次触发时行为都一样,而且没有哪一环去向模型请求许可。
- 触发词集合,像代码一样做版本管理与评审。显式的说法(「打 911」「叫救护车」「我心脏病发作了」)、间接的说法(「我喘不上气」「他醒不过来」「着火了」),以及来电者自己要求别再跟机器说话。把它放在一个有归属人的受评审文件里,而不是放在提示词里。要预期它并不完美——它的工作是在一个你故意设得偏低的阈值上覆盖常见情形。
- 一个在任何提示语之前与之中都生效的 DTMF 逃逸键。一个按键,早早播报、写进文档,并在电话层处理,这样即使智能体进程已经不再响应它也仍然有效。这也是一位无法说话的来电者唯一可用的路径,而这个人群与紧急情况高度重叠。
- 抢占,不要协商。一旦触发,立刻停 TTS、停生成、然后走。不要确认(「我确认一下,这是紧急情况吗?」)、不要做摘要、不要问账号。确认要花掉几秒,而且有可能碰上一位已经把电话放下、去处理她打这通电话所为之事的来电者。
- 永远不要排队。紧急路径必须终结在一个会接的东西上:一个专用 DID、一个带级联的值班组,或者 PSTN。如果你唯一的人工路径是一条要等的队列,那么紧急路径就不是一条路径。
- 万一其余一切都失败,要有一句终局播报。如果既没有人、也没有可用转接,智能体的最后一个动作是一句固定录音——「请挂断并拨 911」——然后它留在线上而不是把通话丢掉。沉默之后一次掉线是可得的最坏结果,而当编排器崩掉时它正是默认结果。请把失效方向做成一个明确的选择,而不是「哪个进程先死」的一次意外。
请像写一份延迟预算那样,把整条链条写成一个带时序预算的序列,然后靠触发它来测试它,而不是靠读它。一条没人点过火的路径,就是一条不存在的路径。
步骤 4那次转接,以及它失败的三种方式。
常规升级设计偏爱热转接:智能体做摘要,人带着简报到场,来电者不必重复自己。对一笔账单纠纷来说那是对的,在这里却是错的;而理由值得说得精确——热转接多出一条咨询腿、一次保持,以及一项「接方要先应答、来电者才被接通到任何东西上」的依赖。
- 它慢慢地失败。一次要花八秒才撮合成的热转接,就是来电者在紧急情况下听八秒保持音。请用盲转,并把上下文从带外推出去——一个 webhook、一次屏幕弹出、一条发到值班手机的短信——这样人拿到摘要而不必让来电者等着它。热转接是其余一切的默认,而在这里是例外。
- 它在接方那头失败。没人接;那个组的手机都在免打扰;班次换了。紧急路径需要一个以几声铃计的超时级联,以及一个不是另一个人的最终兜底。
- 它靠丢掉来电者来失败。一次把腿丢掉、或者在没有媒体的情况下就交出去的转接,会让通话结束。请给转接本身装上仪表:已尝试、已接通、已掉线——并对这一类里的任何一次掉线立刻告警,而不是写进日报。
把你已经掌握的位置与身份附上去,并且抵住去多收集一点的冲动。如果来电者是一位已认证的账户持有人,那么你档案里的服务地址比你能在十秒内从一个惊慌的人嘴里提取出来的任何东西都更可靠,而且它已经是结构化的。如果她没有认证,就不要先跑来电者认证——在紧急路径前面摆一道身份检查,就是给那一通绝不该设关的电话设了关。
如果你的智能体是为一家有实体场所的企业服务——一家诊所、一家餐厅、一家公共事业公司、一位物业经理——那么最值得附上的那个字段是场所地址,而不是来电者的地址。打给这类企业的大多数紧急来电都是关于那个场所的,而你已经知道它在哪儿。
步骤 5请不对称地评测它,因为代价本来就不对称。
你的智能体里其他每一个意图,得分靠的都是精确率与召回率之间的平衡。这一个不是;而把它当成其余那些来对待,正是「一个为了看板好看而调的阈值悄悄抬高了漏检率」的途径。
一次误报的代价是一次不必要的转接,加上一个略感困惑的人。一次漏检的代价是无界的,而且它是你整个系统里唯一一个无法重试的结果。所以先把漏检率钉住,精确率落到多少就接受多少。
- 用真实音频、而不是生成短语来建标注集。从录音里捞出一百条紧急与准紧急的话语,由人标注,再加两百条难负例——那位愤怒的来电者、那个假设句(「要是着了火怎么办?」)、那句习语(「我快急死了,就想把这事弄完」)。生成的测试短语会过度代表显式措辞,并会严重美化你的探测器。
- 在一个固定工作点上报召回率,并把假阳性率当作其后果。「在难负例上 4% 假阳性率下召回 0.97」是一个决定。「F1 为 0.91」是一个把你选了哪种错误藏起来的数字。
- 把那些会击破探测器的人群包进来。非母语与带口音的语音、语码转换、在压着嗓子说话的来电者、在哭的来电者、以及什么都没说的来电者。如果你的服务是多语言的,那么触发词集合与它的评测是按语言各做一份的工作,而不是把一张英文清单翻译一遍。
- 测那条路径,不只是测那个分类器。每周一次,在生产里端到端点一通合成的紧急来电,并断言有人在你的预算之内接了。一个召回完美、却接到一条坏掉的转接上的探测器得零分,而只有端到端探测才抓得住这个。它属于你其他的故障注入演练。
- 永远人工复核每一次漏检。它们会少到一个人能把全部读完,而这对你其他任何失败类别都不成立。每一次漏检,要么扩充触发词集合,要么暴露出一处路径缺陷。
步骤 6该拒绝建什么,以及上线之后该盯什么。
本页最有力的东西是一条边界。好几个听起来很负责的功能,其实比它们声称要填的那道缺口更糟,而设计评审是扼杀它们最便宜的地方。
- 拒绝分诊。一个评估严重程度的智能体——「这是 911 级别的情况,还是可以等?」——是在用一个语言模型做临床或安全判断,而且是在那一通「错了就无可挽回」的电话上。识别并路由;不要评级。同一套逻辑适用于任何读起来像调度建议的东西。
- 拒绝给指导。不做心肺复苏指导,不说「保持冷静,看看他还有没有呼吸」,不做急救。一位受训的调度员做这件事时有协议卡和一条有录音的线路;你的智能体两样都没有,而责任并非理论上的。说那一句固定的话,然后让开。
- 拒绝去当危机热线。如果一位来电者透露了自伤风险,路径是一个人,并且在相关情况下是既有的危机服务——在美国是 988,而运营商另有一项要求:把 988 呼叫按地理区域、而不是按区号来做地理路由,全国性无线运营商自 2025 年 1 月起、其余自 2026 年 12 月起。请注意那条规则是什么、不是什么:它管的是运营商如何把一通电话路由到 988,而对你的智能体的义务一字未提。你的义务是不要卡在当中。
- 拒绝让智能体挂断这一类电话。不管你平常的通话结束逻辑是什么,把紧急路径从里面排除掉。这里的一次挂断与一次弃线无法区分,而它正是那个会出现在被当着监管机构念出来的转写稿里的东西。
- 拒绝让录音策略成为事后才想起的事。这些通话里装着一些来不及斟酌任何同意告知的人所透露的健康与安全信息。请为这一类缩短留存、限制访问、并激进脱敏——录音、同意与脱敏讲的是其中的机制;这里变的是:默认值应当是你手上最紧的那一档,而不是最有利于你评测集的那一档。
在运维上,有四个数字属于某块真有人看的看板,而它们讲的都是那条路径、不是那段对话:每千通电话中紧急路径的触发次数、从触发到有人应答的时长(p50 与 p95)、这一类里转接失败的绝对次数,以及复核中发现的漏检数。请在任何提示词或模型变更之后盯住第一个数字有没有出现阶跃,并把持续为零当作探测器坏了,而不是当作一个平静的月份。