每个状态都需要退出路径
别名: 陷阱状态 · absorbing state · 状态死胡同
概念解释
对话图里的每一个节点都要有离开这个节点的路,包括用户没按剧本说话的时候。问「几点出发」的节点如果只接受时钟表达式,用户说「还没定」「嗯……」或一直不说话,就会被留在原地反复追问——这是吸收态,不是「还在收集」。整段任务有成功/失败/退出三种终点,并不自动保证中间每个提问节点都走得出来。
机制
有限状态对话把「当前在问什么」编成节点,合法填充是一条出边。非法输入、沉默、答非所问如果没有出边,图论上就是吸收:无论再来什么,还停在同一节点。设计师以为「再问一遍」是在服务,实际是把重试做成了自环且没有环的上限。语音里用户看不见自己被卡在哪一格,只能听见同一问换着说法出现,于是提高音量或放弃。
出边不必等于立刻成功。可以去「降级提问」、去「跳过此槽」、去「任务失败」、去「挂起等待」。关键是事件被消费掉,状态改变。自环只在有计数器时合法:第三次仍填不上,必须离开。把「取消」当成唯一逃生口也不够——用户不一定会说那个词,沉默和「不知道」同样需要出口。
怎么研究
把对话规格编成有向图,对每个非终点节点检查四类事件是否都有后继:合法填充、沉默/超时、域外话语、「不知道/跳过」。因变量是无后继的节点数、带无界自环的节点数,以及日志里在同一提示停留超过 N 轮的会话占比。
模型检测可以找吸收态;现场更便宜的做法是对每个节点做探针话轮:在该节点注入沉默和一句明显不相关的话,看是否离开或有限次后离开。不要用任务完成率代替:完成的人根本没进过陷阱节点。
边界
等待后端返回的短暂自旋是过渡态,不是提问态;它的出口是超时去失败,而不是接受用户话语。法定必须听完的播报,中途插话可能被规定为无效,出口被延后到播报结束——要明示,不要假装在听。测验、验证码这类「必须答对才能走」的节点,出口是次数用尽后的失败,而不是无限猜。单轮无状态命令几乎没有中间节点,这条约束主要落在多轮填槽。
怎么落地
- 给每个提问节点列一张四格表:听懂了去哪、沉默去哪、听不懂去哪、用户说不知道去哪。缺一格就补边,不要靠「再问一次」顶上。
- 自环必须带次数:同一节点第几次重问后离开,离开后去失败、跳槽还是转人工,写进表里。
- 「再问一遍」如果措辞完全不变,用户无法判断系统是否还活着;变换问法不算新出口,出口是状态迁移。
- 验证:从每个节点各打三条探针(沉默、域外、「跳过」)。仍停在原节点超过设定次数,这个节点就还是吸收态。