新一轮的槽位是覆盖还是叠加需要判断
别名: 槽位更新 · 覆盖还是追加 · replace or merge
概念解释
「三点提醒我给妈妈打电话」,下一句「改成四点」是把时间覆盖掉;「也给爸爸发条消息」是再叠加一个对象;「改成每天」是在同一对象上叠属性。新一轮提到已填槽时,对话状态更新有三种算法,不能见槽就最后写入。覆盖还是叠加(overwrite versus overlay)问的是这一次写入的类型,不是上下文还在不在。
机制
同一槽名再次出现,话语标记往往已经说了算法。「其实 / 不是 / 改成」标记替换:旧值收回。「也 / 再加一个 / and also」标记新增实体。「顺便 / 再」有时是给同一实体加字段。本体也在约束:导航的目的地通常是单槽,加法不合法;购物清单默认加法;闹钟的时间既可能改点也可能再设一只。
写错算法的后果不对称。把「也」做成覆盖,妈妈那条提醒消失;把「改成四点」做成叠加,三点的那条还在,用户会接到两次。这是对话状态上的 replace / merge / add-entity,不是指代找错对象——对象可能已经对了,错在更新算子。没有标记的光杆重说(「四点」)最含糊,需要靠槽的基数(这个槽能不能有两个值)来打折扣,而不是一律后写覆盖(last-write-wins)。
怎么研究
做话语标记的最小对:同一槽名、同一上一状态,只改跟句里的标记(「改成四点 / 也订四点 / 四点」)。请标注者写出意图中的状态操作:替换、合并字段、还是新增实体。用当前 DST 跑完后的实体数、槽值与标注对齐。因变量是更新类型错误,不是指代准确率。
再按槽的基数分层:本体规定单值的槽、多值列表、以及可变成列表的单值(第二只闹钟)。不要在这项里测上下文隔了多久还在——上一状态被假定仍有效。
边界
法律或支付里「改成另一张卡」必须覆盖且留下审计,叠加会变成两笔。用户用屏幕改了一个槽、嘴里只说了别的槽,语音侧的覆盖可能打到已经过时的语音副本上。多意图一句里既有改又有加(「时间改四点,再加一个给爸爸的」)要拆成两次更新,不能共用一个算子。纠正发音(「是四点不是三」)看起来像覆盖,其实是对识别的修复,应先当修复。
怎么落地
- 从标记和槽基数把跟句分成替换、合并、新增。单值槽拒绝新增时要说出来(「目的地只能有一个,是改到这家吗」)。
- 分不清时问操作,不问槽名:「是改成四点,还是再设一个四点的?」
- 更新后在回复里读出实体个数和关键槽,覆盖应当少一个旧值,新增应当多一个对象。
- 回归用例至少各两条:改时间、加第二条、给同一条加重复规则。看完状态,不要只看 NLU 标签。