M2.07.6dialogue state-space explosion设计研究

状态数量增长会超出可测试范围

别名: 状态爆炸 · combinatorial dialogue states · 不可测状态

概念解释

对话状态不是图上那些看得见的提问框,而是槽值 × 追问次数 × 确认标记 × 错误类型拼出来的元组。每加一个槽或一种确认,可达组合按乘法涨,不是按加法涨。涨过测试脚本和人力能走遍的规模,未覆盖的组合就是用户卡住而没人演过的地方。这是可测性被数量吃掉,不是某一个节点缺出口。

机制

线性叙事(「再问一个问题」)符合设计会议的讲法,真实状态却是笛卡尔积。六个槽各有空/已填/低置信,再乘每槽零到两次重试,再乘要不要确认,节点数就上百。测试按主路径写十条脚本,覆盖的是加法切片,漏的是乘出来的边角:第三槽低置信且第一槽已确认且用户突然改第二槽。上线后这些边角才会被碰到,于是现场出现「偶发卡死」。

显式枚举每一种组合会逼着人复制粘贴节点,复制时漏一条边,爆炸和陷阱会一起出现;但根子是乘积,不是漏边。帧加策略(当前帧是什么、下一步问空着的最高优先级槽)把要枚举的节点压回去,测试面变成策略规则加典型帧,而不是每一格。

怎么研究

从规格导出可达状态数(或可达帧的等价类数量),再对照测试脚本与日志实际到过的状态。因变量是覆盖率、从未被测试却在日志出现的状态数、以及这类状态下的任务失败率。组合测试可以用成对覆盖(槽 A 的值 × 槽 B 的值)代替全组合,看漏掉的高阶交互是否仍在日志里伤人。

不要用「测试用例条数」当进度:十条全是成功链,对乘积几乎没有覆盖。把新增一个槽之前与之后的可达数算出来,能把「只是多问一句」的加法错觉拆掉。

边界

单轮、无槽的技能几乎没有乘积。很小的按键菜单(四个节点)可以穷尽。基于提示的大模型对话没有显式节点,爆炸变成隐式:同一句在不同上文下的行为无法枚举,可测性更差,不是被豁免。专业调度系统状态虽多,但用户路径高度重复,有效状态远小于理论乘积,覆盖可以按真实路径而不是按理论格点来做。

怎么落地

  • 加槽、加重试、加确认之前先算乘数:新可达数是多少、现有脚本还能覆盖百分之几。乘数写不出来就先别加。
  • 不要为每种槽组合各画一个节点;用帧表示已填内容,用少数规则决定下一问。等价状态合并后再测。
  • 测试集至少覆盖:全空开场、全满首句、中途改一个已填槽、单槽连续失败到上限。成对组合优先于再堆成功链。
  • 验证:给每个上线状态一个是否被脚本走过的标记。日志里出现未标记状态,就补测或合并该状态,而不是再加一条主路径演示。

延伸

  • 同组M2.07.1 流程需覆盖成功、失败与中途退出 · M2.07.2 每个状态都需要退出路径 · M2.07.3 流程图不能替代真实语料验证 · M2.07.4 槽位填充顺序应允许乱序 · M2.07.5 取消、重来与帮助在任何状态下可用
  • 相邻M1.03 对话轮次 · M2.03 确认策略 · M1.05 话题切换与任务嵌套
  • 站内检索state-space explosion · combinatorial testing · frame-based dialogue

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/M2.07.6