挂起的任务需要保存完整的中间状态
别名: 挂起要连槽一起存 · 不要只记住在办哪件事 · checkpoint of filled slots
概念解释
披萨已经记下大份、厚底,配料问到一半,用户插进去查烤箱预热时间。回来若只记得「在订披萨」,尺寸和饼底都空了,等于重开一张白单。挂起要保存完整中间状态(suspended-task mid-state)说的是:压栈的不是任务名字,是已填槽、半填槽、以及下一问是哪一个。能回去但状态残缺,对用户就是没回去。
机制
中间状态是一张检查点:哪些槽已接地、哪些只是识别假设、哪些还空、当前议程指到哪一步。只存技能 ID 的挂起,回来只能从技能入口再走,已付的轮次被作废。半填槽尤其脆:配料可能已经收了「蘑菇」,还在等「还要什么」——若只存「配料未完成」,蘑菇丢了;若把蘑菇写成已完成、把议程跳到确认,用户没说完的部分被截断。检查点还要分置信:低置信写进状态的项,回来时应仍标成待确认,不能因为挂起过一次就升成事实。插入期间若外界让槽失效(餐厅已过最后接单时间),完整保存也包括保存「这些值在挂起时是真的」,回来先校验再接着问。
怎么研究
做中断保持实验:在已知的已填集合处插入一段固定时长的旁路任务,回来后立刻探针每个槽(「饼底是什么」)以及下一问是否还停在中断点。自变量:已填槽数、是否含半填集合槽、插入时长、插入是否同会话。因变量:槽值存活率、议程位置偏移、用户发现丢失后的重复填报量。
日志对比「插入前后槽集合的对称差」。主任务 ID 还在但对称差很大,就是名字活着、检查点死了。实验室若在插入期间把表单画在屏幕上,测到的是视觉外存,不是对话状态机的保持。
边界
任务还没有任何已接地的槽(刚唤醒、刚选了技能名),挂起几乎是空检查点,丢了也不可惜,回来从入口走可以接受。有的槽依法不能在挂起期间保持(支付令牌、一次性验证码),完整保存不包括这些;回来必须重取。多人共用设备上,检查点还带着身份:下一个人不应继承上一张半成品披萨。把「完整」理解成把语音录音存下来重放,既不必也危险——要存的是结构化槽,不是音频。
怎么落地
- 挂起时序列化:技能、已接地槽、半填集合、下一议程拍、每槽置信。回来先反序列化,再说话。
- 恢复线索里带一两个已填项作校验(「大份厚底,还在加配料」)。用户说不对,先修检查点,再往下问。
- 插入期间使槽失效的外部条件,在恢复时重算;失效的项要说出来,不要用旧值默默提交。
- 验证:记下尺寸和饼底、配料收了一项之后插入无关查询,回来问「饼底是什么」且看下一句是不是还在问配料。饼底没了,或下一句跳到了确认,检查点不完整。