Skip to content

共享热词召回与请求隔离 ​

同一个姓名在普通识别中正确、在目标识别中变成同音词,不一定是词库无效。曾出现普通 Finalizer 带请求热词及词库召回、目标 Finalizer 却只带固定提示词的路径遗漏;当前共享解析器已补齐两条路径。热词要进入最终使用的解码提示词,网关收到字段并不等于模型使用了它;传入成功也不保证拼写正确。

共享热词解析器与独立解码路径

在 Finalizer 边界共享解析能力 ​

将热词能力提取为解析接口,网关构造一份实例,并显式注入普通、角色子段和目标 Finalizer。解析结果属于请求,不存回共享对象;普通和目标模型仍各自解码。

go
// 简化的接口示例,省略具体错误与计时结构。
type HotwordRequest struct {
    PCM       []int16
    PoolID    string
    Explicit  []string
}

type HotwordResolver interface {
    Resolve(ctx context.Context, request HotwordRequest) ([]string, error)
}

父请求的显式词和 pool ID 传给角色子段,子段以自己的 PCM 做召回。若直接复用父句所有召回词,会给无关角色施加错误先验。目标识别只编码待识别混合音频做词库召回,不把登记参考里的词带入当前内容。

解析顺序与可选依赖预算 ​

text
清洗显式请求词
  -> 按场景选择内置池与客户池快照
  -> 有效词池为空:跳过音频编码
  -> 非空池:编码当前 PCM,按 pool ID 召回
  -> 合并去重、同音词处理与字符预算
  -> 普通提示词 / 目标约束 + 热词提示词

显式词优先,召回词补充上下文。提示词成本取决于总字符和分词结果,条目数不能代表输入长度。当前支持字符预算,默认 0 表示不限制;是否设置上限应结合模型上下文和质量回归决定,不能把未经验证的截断数当作推荐配置。词库容量与单次导入限制是两件事,批量导入不必将整个池塞进提示词。

召回是可选依赖,使用请求剩余时间中的部分预算。音频编码或检索失败时退回清洗后的显式词;文本合并服务失败时至少做精确去重。目标约束以及已启用的身份门控不能套用相同回退方式。

空池快照只对当前请求有效。下一次请求重新观察更新,不能缓存“永远为空”而跳过后续新增词条。模型重试保留原任务的热词与目标约束,不能第一次带热词、恢复识别时丢掉。

实时检索与词库管理隔离 ​

内置池和客户池使用独立文件与缓存,内置词仅在满足目标/参考条件的场景参与召回,客户池不受这项内置策略影响。普通场景不能因为内置词较多就自动加入。判断空池应针对当前场景的有效集合:客户池为空而内置池符合场景时,仍有候选词;不符合场景的内置词也不能让普通请求启动无效检索。

实时 worker 处理语音召回,管理 worker 处理大词库的文本编码、增删和重载。两者分开可以避免一次词库更新堵住所有语音请求,普通与目标场景无需各建一套实时 worker。

词库更新采用快照切换:先在临时状态解析、校验和构建新索引,成功后原子替换;失败保留旧快照。坏编码文件不能先清空旧池再报错。缓存文本向量时,键包含规范化词条和编码模型身份,模型变化使旧向量失效。

并发隔离 ​

共享对象保存模型客户端、词库和只读配置;每个请求单独保存 PCM、pool ID、显式词、召回结果和提示词。两组并发请求使用不同姓名及不同池,检查模型实际提示词,能发现仅看最终文字不易察觉的串词。

回归场景断言
仅显式词三种模式的实际提示词都包含对应词
仅词库当前音频触发召回,不借用登记参考内容
空池后新增当前跳过编码,后续请求看到新快照
召回超时保留显式词与解码剩余预算
坏文件重载旧池继续可用
多池并发请求局部变量和模型提示词无交叉污染
目标重试登记参考、目标约束与热词均保留

相关性与 Top-K 的区别 ​

Top-K 总能给出排名靠前的候选,即使输入与整个词库无关。实测相关和无关音频的分数分布存在重叠,尚不能选出稳定的全局分界。当前提供召回分数下限机制,但默认关闭,不应将某个猜测阈值写成生产最佳值。

验收同时使用命中音频、同音不同字、无关语音与空池;比较候选相关性及最终文字中的诱导错误。日志按 session/trace 关联召回分数和耗时,诊断不必输出词条原文。当前原生 RAG 编码/检索使用 CPU/OpenBLAS,不能把它与运行在设备上的角色或声纹图混为同一 NPU 负载。

模型提示与受限同音纠正 ​

固定 PCM、登记参考和解码设置,仅改变热词列表时,目标模型输出会变化,却未必稳定选择要求的字形;列表变长还可能影响漏字。该对照说明传输已生效,同时说明提示能力仍有限。共享解析器解决路径遗漏,不能独自解决拼写质量。

当前目标路径在模型转写解析之后、ITN 之前增加受限拼音纠正。候选为 2 至 16 个汉字,只替换已有等长文字片段,不补造缺失语音。同一拼音对应多个候选时保留原文。三个字及以上的完全同音匹配可不要求共享汉字;两字词及近音匹配需要共享字符锚点。近音匹配还限制为至少三字、仅一处音节差异且韵母相同,并要求候选唯一。

这些约束避免无锚点短词的大面积替换,但不能保证每个姓名都正确。保留原始文本与纠正文本,测试正确原文不被改坏、歧义候选不替换、缺失词不被补写。普通路径不应被描述为已经采用相同纠正策略。

ITN 随后处理数字和格式,应保护姓名与排行称谓中的汉字数字,例如“王一鸣”“一号楼”。计数序列与手机号、身份证式长数字分别处理,不能用一次全局替换将姓名或标识符改写。纠正与 ITN 的顺序是合同的一部分,交换顺序会改变匹配对象。

热词的作用边界 ​

热词改变解码先验,不等于确定性拼写替换。过量或错误召回可能诱导无音频依据的文字;后处理字符串替换也无法恢复漏掉的语音。保留原始模型文本与规范化结果,对照同音词、无关词和空词库反例。热词质量、目标过滤与角色归属各自验证。

别急,先让缓存热一下。