你走进一家常去的餐厅,刚落座,服务员就迎上来:“还是老样子?牛排七分熟、配西兰花、柠檬水?”你点头:“对,饮料换成可乐。”他低头在单子上划了一笔。二十分钟后你招招手:“我的菜好了吗?”他立刻接话:“我去后厨催一下。”结账时你随口问:“我说过牛排要七分熟吗?”他翻出写得密密麻麻的点单本:“您第一轮就交代过啦。” 对服务员来说,这不过是职业本能;但对语音助手而言,做到这一切需要一整套技术:他手里的点单本是“对话状态管理”,他逐项追问细节是“槽位填充”,他捕捉你从点菜到催菜的转变是“意图切换检测”,他听懂“那个”所指是“指代消解”,他记忆有限却抓得住重点是“上下文窗口管理”,他适时确认、及时纠错是“多轮对话策略”。这六项能力,共同构成多轮对话管理与上下文追踪的完整图景。本文用这位服务员的故事贯穿始终,把每一项都掰开揉碎讲给你听。

岗位关联

掌握多轮对话管理与上下文追踪,是语音产品从“单轮问答工具”进化为“自然对话伙伴”的分水岭。对AI产品经理、对话设计师与语音算法工程师而言,这是设计流畅VUI体验、诊断对话瓶颈的必修课。

目录
  1. 可视化演示
  2. 对话状态管理:服务员手中的点单本
  3. 槽位填充:逐栏填满点单本
  4. 意图切换检测:客人突然改主意
  5. 指代消解:“那个”到底是哪个
  6. 上下文窗口:服务员的有限记忆
  7. 多轮策略:一气呵成的服务流程
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示多轮对话中意图识别、槽位填充与上下文累积过程,对话流程模式展示用户与AI的轮次交互,上下文追踪模式以矩阵展示槽位状态演化。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多轮对话管理核心 意图识别:每轮识别用户意图 槽位填充:逐步补全信息槽 上下文累积:跨轮维护对话状态 状态:open→ask→fill→done

对话状态管理:服务员手中的点单本

一桌客人坐下来,点的东西越来越多、改来改去。服务员从不靠脑子硬记——客人多、单子杂,记错一次就砸招牌。他的底气来自手里那本点单本:客人每说一句,他添一笔;客人改主意,他划掉重写。这本点单本,就是多轮对话里的“对话状态”。

在语音交互系统中,“点单本”的角色由对话状态管理(Dialog State Tracking,DST)承担。DST 要做的事,是每轮都清楚“目前确认了什么、还缺什么”。它不会把用户的话原封不动存起来,而是翻译成结构化记录:当前意图是什么,每个槽位填了什么值。就像点单本只写“牛排七分熟、配西兰花”,而不是把“我要一份牛排,嗯……七分熟的吧,配菜要西兰花”整句话抄上去。

技术上,状态更新是一个递推过程:每一轮的新状态,由上一轮记忆与本轮新话语共同决定。

状态还需要持久化——客人中途去接电话,回来时服务员依然记得他的单。语音助手也一样:对话中断几分钟后恢复,状态不能丢;用户在手机和音箱之间切换设备,状态最好也能“随身带走”。没有点单本的服务员会张冠李戴,没有状态管理的语音助手,往往撑不过第三轮就会被用户放弃。

St=DST(St−1,Ut)S_t = \mathrm{DST}(S_{t-1}, U_t)
这是对话状态管理的核心公式:系统通过一个可学习的更新函数 DST,把“过去的记忆”和“本轮的新信息”融合成“最新的记忆”。
  1. 当前状态 $S_t$点单本上此刻的完整记录,包含当前意图和所有已填槽位,是系统决定下一步动作的唯一依据。
    StS_t
  2. 上一轮状态 $S_{t-1}$上一轮结束时点单本上已有的记录,是本轮更新的起点,代表系统过去的记忆。
    St−1S_{t-1}
  3. 本轮用户话语 $U_t$客人刚说的一句话,比如“配菜换成沙拉”,是驱动状态变化的新信息。
    UtU_t
  4. 状态更新函数 $\mathrm{DST}(\cdot)$服务员把新话语誊写、划改到点单本上的整套动作规则,在系统中对应训练好的神经网络或状态机。
    DST(St−1,Ut)\mathrm{DST}(S_{t-1}, U_t)

槽位填充:逐栏填满点单本

客人只说了一句“我要一份牛排”,但一份完整的订单还需要熟度、配菜、饮料。有经验的服务员不会干等着,他会逐栏追问:“牛排要几分熟?配菜选什么?喝点什么?”点单本上的空白栏,在对话系统里叫“槽位”(Slot),把客人话语中的信息提取出来填入对应栏位的过程,就是槽位填充。

槽位不是凭空产生的,产品设计阶段就要定义“点单本长什么样”——餐饮有菜单模板,对话系统也有槽位模板:主菜、熟度、配菜、饮料,每个槽位允许的取值集合(比如熟度只能是三分、七分、全熟)就是槽位定义。客人说出“七分熟”时,系统需要判断这句话在多大程度上能确认“熟度=七分熟”这个填法。这种判断天然带有不确定性,所以用概率来表达:

槽位不是填一次就完事。客人说“牛排七分熟”,服务员复述“七分熟对吗”是确认;客人改口“还是全熟吧”,服务员划掉重写是修正。发现某栏还空着,主动问“配菜需要什么”是追问。一套成熟的 VUI 产品,必须把追问、确认、修正都设计进流程——否则就会出现“用户以为说完了,系统却闷头去下单”的翻车事故,就像服务员漏问熟度就把牛排扔进锅里。

P(si=vj∣Ut,St−1)P(s_i = v_j \mid U_t, S_{t-1})
这个公式回答“听到这句话后,我有多少把握把某项填成某个值”——把握不够高时,就追问、确认或等更多证据。
  1. 槽位 $s_i$点单本上的某个具体栏目,比如“熟度”这一栏。
    sis_i
  2. 候选取值 $v_j$该栏目可填的候选值,比如“三分”“七分”“全熟”。
    vjv_j
  3. 条件下的概率给定本轮话语和上一轮状态,算出把“熟度”填为“七分”的置信度。
    P(si=vj∣Ut,St−1)P(s_i = v_j \mid U_t, S_{t-1})
  4. 被观察的用户话语 $U_t$ 与历史状态 $S_{t-1}$填充判断所需的两个证据来源——客人刚说了什么,以及之前已经确认过什么。
    Ut,  St−1U_t, \; S_{t-1}

意图切换检测:客人突然改主意

客人刚点完菜,过了几分钟突然问:“我的牛排好了吗?”有经验的服务员立刻明白,这不是要加菜,而是在催菜。同样是“牛排”两个字,放在“我要一份牛排”里是点餐,放在“我的牛排好了吗”里就是催菜——话语背后的“目的”变了,这个目的在对话系统里叫“意图”(Intent)。

意图切换检测,就是捕捉用户目的在轮次之间的变化。它不能只看当前这一句话,还要结合上一轮意图。如果客人上一轮在点餐,这一轮说“我的牛排好了吗”,系统要算出“催菜”这个新意图的概率明显高于“点餐”;如果上一轮就在催菜,这一轮再说一遍,更可能是重复催促而非新意图。用条件概率可以写成:

现实中,一句“不要辣”同时包含否定和需求,一句“再加个汤”在确认已有订单的同时发起新任务——多个意图可能在一句话里共存。更麻烦的是冲突:客人先说“牛排七分熟”,后说“算了,全熟”。系统要判断这是修改槽位还是新开一单。处理不好,就会出现“客人已经改主意,系统却按旧信息执行”的尴尬。好的意图切换检测,能像那位服务员一样,准确捕捉“改主意”的信号并迅速调整后续动作。

P(It=k∣It−1,Ut)P(I_t = k \mid I_{t-1}, U_t)
系统综合“上一轮客人想干什么”和“本轮客人说了什么”,来判断“本轮客人最想干什么”。
  1. 当前意图 $I_t$本轮话语背后想做的事,比如“催菜”。
    ItI_t
  2. 上一轮意图 $I_{t-1}$上一轮对话中系统认定的意图,比如“点餐”,是意图切换的参照点。
    It−1I_{t-1}
  3. 条件概率 $P(I_t = k \mid I_{t-1}, U_t)$在已知上一轮意图和本轮话语的前提下,当前意图取某个类别 $k$ 的概率。
    P(It=k∣It−1,Ut)P(I_t = k \mid I_{t-1}, U_t)

指代消解:“那个”到底是哪个

“那个配菜换成沙拉吧。”服务员抬起头问:“您说的是西兰花吗?”——“那个”这个词,单独看没有任何信息量,但放在对话里,它指向明确:之前提到的配菜。让机器理解这种“指代”,就是指代消解(Coreference Resolution),它是多轮对话中最考验“人情味”的一项能力。

指代消解要处理的不仅是“那个”“它”这类代词,还有省略。客人说“还是老样子”,省略了整个订单内容;客人说“和刚才一样”,省略了全部细节。这类省略补全的难度更高,因为系统要在历史对话中找到被省略的实体并恢复完整语义。无论代词还是省略,核心都是同一个动作:从对话历史中挑选出被指代的那个对象。

挑选不能靠猜,要综合多方证据打分。最常见的做法是把“候选对象和当前话语的语义契合度”与“候选对象在历史中的显著性”加权求和:

当多个候选对象分数接近时,就产生了歧义。客人说“换成沙拉”,到底是换配菜还是换饮料?此时不能硬猜,而要像服务员那样追问一句“您是说配菜换成沙拉对吗?”同时,真正成熟的系统还会跨轮次追踪实体——把第1轮提到的“西兰花”和第5轮的“那个”连成一条线,即使中间夹了好几轮无关对话。听懂“那个”,是语音助手从“能问答”走向“会聊天”的关键一步。

Score(e)=λ1⋅Sim(e,Ut)+λ2⋅Rec(e)\mathrm{Score}(e) = \lambda_1 \cdot \mathrm{Sim}(e, U_t) + \lambda_2 \cdot \mathrm{Rec}(e)
每个候选对象拿两门分数:和当前话语句子意思像不像,以及之前在对话里是否频繁出现、是否刚刚被提到。总分最高的就是“那个”。
  1. 候选实体 $e$对话中出现过的可被指代的对象,比如“牛排”“西兰花”“柠檬水”。
    ee
  2. 语义相似度 $\mathrm{Sim}(e, U_t)$候选实体与当前话语在语义空间中的接近程度,“那个”和“西兰花”虽然字面无关,但上下文语义可以很接近。
    Sim(e,Ut)\mathrm{Sim}(e, U_t)
  3. 指代显著性 $\mathrm{Rec}(e)$候选实体在历史中被提及的频次与新鲜度,刚被提过的对象更可能是“那个”。
    Rec(e)\mathrm{Rec}(e)
  4. 权重系数 $\lambda_1, \lambda_2$两路证据的相对重要性,由训练数据学习得到。
    λ1,  λ2\lambda_1, \; \lambda_2

上下文窗口:服务员的有限记忆

再厉害的服务员也不会记住每个客人三个月前点过什么。他的记忆是“有窗口的”——记住本桌客人从落座到结账这段时间的关键信息,就够了。对话系统同样面临记忆资源的约束:把全部历史一股脑塞给模型,既消耗算力,又引入大量噪声。

“上下文窗口”管理要回答三个问题:记住多少轮(窗口范围)、哪些信息值得记(记忆管理)、旧信息如何处理(遗忘策略)。窗口太窄,系统会忘记客人最初强调的“不要香菜”;窗口太宽,无关闲聊会干扰核心槽位的判断。现代语音助手常用注意力机制来动态决定“该重点参考哪一轮记忆”,就像服务员在客人催菜时,会重点回忆“这道菜是什么时候下单的”,而不是客人的穿衣打扮:

对于更长的对话,还有一种策略:把早期轮次压缩成摘要再保留。客人聊了半小时,系统可以把“已点:牛排七分熟、西兰花、柠檬水;饮料后来换成可乐”浓缩成一段摘要,替代冗长的原始记录。这就像服务员在交接班时,不会把每句话都复述给同事,而是说“这桌点了这些菜,其中饮料换过一次”。好的助手,既记得住,也懂得忘。

αt=exp⁡(q⋅kt/d)∑j=1nexp⁡(q⋅kj/d)\alpha_t = \frac{\exp(q \cdot k_t / \sqrt{d})}{\sum_{j=1}^{n} \exp(q \cdot k_j / \sqrt{d})}
系统为每一轮历史对话计算一个“相关度权重”,相关度高的历史在后续决策中占更大比重。
  1. 查询向量 $q$拿当前问题当“搜索词”,比如“客人是不是在催菜?”。
    qq
  2. 键向量 $k_t$每一轮历史对话被存储时附带的“索引标签”。
    ktk_t
  3. 缩放因子 $1/\sqrt{d}$防止点积数值过大,导致权重分布过于极端、模型失去分辨力。
    1d\frac{1}{\sqrt{d}}
  4. 归一化分母把各轮相关度压缩成总和为1的权重分布,相当于服务员把有限注意力按重要程度分配给各轮记忆。
    ∑j=1nexp⁡(q⋅kj/d)\sum_{j=1}^{n} \exp(q \cdot k_j / \sqrt{d})

多轮策略:一气呵成的服务流程

单有能力还不够,服务员能把整桌客人的用餐体验安排得明明白白,靠的是服务流程的编排:什么时候该问、什么时候该确认、什么时候该结束、出了岔子怎么补救。这些“服务流程”,在多轮对话系统中就是多轮策略。

信息不足时,系统要主动澄清。客人说“来个牛排”,系统要追问“熟度选什么”——与其猜错重来,不如一次问清。涉及关键操作时,系统要先确认再执行。客人说“帮我退掉这道菜”,系统在发起退菜前会复述一遍:“您确认要退掉这份七分熟的牛排吗?”这种确认不是啰嗦,而是对用户负责。经过多轮确认,系统对“用户真实意图”的把握会不断累积——每一轮肯定都让可信度往上涨一分:

对话终有尽头。结束判定要区分“用户主动结束”(“就这些,谢谢”)和“任务完成后的自然收尾”(点完菜后系统确认完毕)。万一系统理解失败——客人说“你搞错了”,要能优雅地进入失败恢复流程:道歉、引导用户重新描述、必要时转接人工。就像服务员不小心上错了菜,会立刻道歉、撤下、重做,而不是和客人争论“你刚才明明点的是这个”。这一整套策略共同决定了语音助手的“职业素养”——技术再强,流程乱了,用户依然觉得这服务员不靠谱。

Cconf=∏i=1nP(confirmi)C_{\text{conf}} = \prod_{i=1}^{n} P(\text{confirm}_i)
系统把每一轮获得的“确认可信度”相乘,得到对当前理解的总体把握。轮次越多、确认越一致,系统就越敢放心执行。
  1. 单轮确认概率 $P(\text{confirm}_i)$某一轮中,用户用“对”“没错”等方式表达肯定的可信度。
    P(confirmi)P(\text{confirm}_i)
  2. 累积乘积 $\prod_{i=1}^{n}$把每一轮的可信度乘起来,形成对整体理解的置信度。
    ∏i=1n\prod_{i=1}^{n}

AI 应用场景

银行电话客服语音导航

阶段:智能语音导航(IVR)中的多轮对话管理

解决的问题:传统电话银行按键菜单层级深、效率低。用户说“查余额”后改口“不,帮我转账”,传统系统会重新进入另一条菜单树,让用户重复验证身份。引入多轮对话管理与上下文追踪后,系统保留已验证的身份信息,检测到意图从“查询”切换为“转账”,只需追问“转账给谁”,槽位得以延续。

具体案例:某银行语音客服中,用户说“我要查余额”,系统正在播报余额时用户打断“算了,直接转给张三五千块”。意图切换检测识别出“转账”意图,上下文中的身份验证信息自动复用,槽位“收款人=张三、金额=5000”被填充,系统确认一次后即执行转账。整个流程比传统按键导航缩短约40秒。

车载语音助手的多轮操控

阶段:车载场景的上下文追踪与指代消解

解决的问题:驾驶场景下用户双手被占用,语音是唯一安全交互方式。但用户话语碎片化严重——“导航去公司”“那个地方今天封路”“换一家最近的咖啡店”。传统单轮问答无法理解“那个地方”指什么、“换一家”从哪里换。

具体案例:某车联网语音助手通过指代消解与上下文窗口,将“那个地方”映射到上一轮导航目的地“公司”,将“换一家”理解为主目的地切换,从“公司”改为“最近咖啡店”,并保持“导航”意图不变。槽位修正流畅完成,用户全程没碰屏幕。

语音点餐小程序

阶段:电商/本地生活场景的槽位填充与多轮确认

解决的问题:用户用语音点外卖时,一次性说清所有需求的概率极低。没有槽位管理的系统会机械地反复让用户重说;有了槽位填充与多轮策略,系统像服务员一样逐项追问、确认、修正。

具体案例:某语音点餐应用收到“来一份牛排”后,自动追问“熟度”“配菜”,确认“七分熟、配西兰花对吗”;用户说“换成沙拉”,系统更新配菜槽位并再次确认。上下文窗口确保用户早期说的“不要香菜”不被后续轮次覆盖。

Python 演示

python76 行
# -*- coding: utf-8 -*-"""多轮对话状态跟踪器:用点单比喻实现 DST 的核心逻辑."""  class DialogStateTracker:    """对话状态跟踪器:模拟服务员手中的点单本."""     def __init__(self):        self.slots = {}          # 槽位表: {'主菜': '牛排'}        self.intent = None       # 当前意图        self.history = []        # (意图, 话语) 历史        self.entity_list = []    # 已出现的实体,供指代消解        self.slot_schema = {            '主菜': ['牛排', '鸡肉', '鱼'],            '熟度': ['三分', '七分', '全熟'],            '配菜': ['西兰花', '沙拉', '薯条'],            '饮料': ['柠檬水', '可乐', '咖啡'],        }     def detect_intent(self, utterance):        """意图识别:判断客人这句话想做什么."""        if '好了' in utterance or '好' in utterance:            return '催菜'        if '买单' in utterance or '结账' in utterance:            return '结账'        if '再来' in utterance or '还要' in utterance:            return '加菜'        if '要' in utterance or '点' in utterance:            return '点餐'        return self.intent if self.intent else '点餐'     def fill_slot(self, utterance):        """槽位填充:从话语中提取槽位值写入点单本."""        for slot, values in self.slot_schema.items():            for value in values:                if value in utterance:                    self.slots[slot] = value                    self.entity_list.append(value)                    break     def resolve_reference(self, utterance):        """指代消解:把'那个/它'映射到最近提到的实体."""        if '那个' in utterance or '它' in utterance:            for entity in reversed(self.entity_list):                if entity in self.slots.values():                    return entity        return None     def update(self, utterance):        """状态更新:DST 入口,每轮调用一次."""        self.intent = self.detect_intent(utterance)        self.fill_slot(utterance)        ref = self.resolve_reference(utterance)        self.history.append((self.intent, utterance))        missing = [s for s in self.slot_schema if s not in self.slots]        return {'intent': self.intent, 'ref': ref, 'missing': missing}     def run(self, turns):        """跑完整段对话."""        for turn in turns:            info = self.update(turn)            print('话语: {:<12} 意图: {:<4} 槽位: {:<20} 缺失: {}'.format(                turn, info['intent'], self.slots, info['missing']))  if __name__ == '__main__':    tracker = DialogStateTracker()    dialog = [        '我要一份牛排',        '七分熟,配菜西兰花',        '再来一杯柠檬水',        '我的牛排好了吗?',        '那个配菜换成沙拉',        '买单',    ]    tracker.run(dialog)
目的:用不到 80 行代码模拟一个完整的对话状态跟踪器,展示意图识别、槽位填充、指代消解如何协同工作。
  1. self.slot_schema = {...}定义点单本的模板:每个槽位允许的取值集合,相当于产品阶段定义的槽位 schema。
  2. def detect_intent(self, utterance)意图识别函数,用关键词规则判断客人这句话想做什么(点餐、加菜、催菜、结账)。
  3. def fill_slot(self, utterance)槽位填充函数,逐槽位检查话语中是否出现 schema 中的候选值,命中即填入。
  4. '熟度': ['三分', '七分', '全熟']槽位定义明确了取值边界,防止“半熟”这类非法值被写入。
  5. self.entity_list.append(value)每当槽位被填充,就把该实体记为“候选项”,供后续指代消解使用。
  6. def resolve_reference(self, utterance)检测到“那个”时,从最近的实体列表向前回溯,找到仍在槽位中的对象。
  7. missing = [s for s in self.slot_schema if s not in self.slots]对比模板和已填槽位,算出还缺哪几栏,这驱动后续追问逻辑。
  8. self.history.append((self.intent, utterance))把每一轮“意图+原话”存入历史,构成上下文窗口的原始素材。
  9. tracker.run(dialog)执行入口,依次处理六轮对话并打印每轮的状态快照,观察槽位逐渐填满、意图逐轮变化。

常见误区

误区“只要把用户前面说过的所有话拼成一段长文本,再丢给大模型,上下文就自然管理好了,没必要单独做状态管理。”

正解原始文本拼接有两个致命问题:一是噪声——用户大量口语填充词、闲聊会被无差别保留,干扰核心意图判断;二是结构缺失——状态管理要的是“当前意图+槽位值”这种结构化信息,而不是逐字历史。就像服务员不会把客人每句话都背下来,而是提炼成点单本上的条目。大模型可以直接阅读长文本,但对话系统仍然需要 DST 维护一份干净、稳定的“点单本”。

为何常见:大语言模型普及后,很多人误以为上下文能力被模型“包办”了,忽略了工程上依然需要显式的状态管理来保证准确性和可靠性。

误区“点单本上所有栏目都填上了,系统就应该立刻执行,不用再多问。”

正解槽位填满只代表信息完整,不代表信息正确。用户可能说“七分熟”但实际想要“全熟”,系统通过追认来纠偏;用户可能中途改口,系统通过槽位修正来更新。跳过确认直接执行,一旦理解偏差,纠错成本远高于多问一句。关键操作(转账、下单、退订)前的确认不是低效,而是必要保险。

为何常见:单轮问答的“输入-输出”惯性让人忽略了多轮对话中“信息是逐步累积且可被推翻的”这一本质。

误区“'那个'指什么?把历史里的名词和当前词做相似度匹配不就完事了。”

正解指代消解依赖的不仅是语义相似度,还有实体的显著性、时间近因性、句法角色等多路证据。而且“省略补全”比代词消解更难——客人说“还是老样子”,历史里根本没有与“老样子”相似的词,系统得恢复整个被省略的订单结构。真实系统中,还要处理多个候选实体分数接近时的歧义,必要时主动澄清。

为何常见:从静态文本处理的经验出发,容易把动态对话中的指代问题简化为词面匹配问题。

误区“窗口设到 100 轮,记住所有对话,总比忘了强。”

正解窗口过大的代价是双重的:计算开销线性上涨,且早期无关信息会对当前决策产生噪声干扰。更合理的做法是分层管理——近期对话保留原始细节,远期对话压缩成摘要,再结合注意力机制动态聚焦相关轮次。就像服务员不会死记三个月前的流水,但会记得“这位客人不吃香菜”这种关键偏好。

为何常见:直觉上“记住更多”更安全,但实际系统中“精准地记住”远比“贪婪地记住”重要。

误区“系统没听懂用户改主意了,那就清空重来,让用户再重复一遍。”

正解粗暴地清空重来会丢失已确认的槽位,用户体验极其糟糕——用户刚验证过身份、确认过订单,系统却让他从头再来。正确的失败恢复应保留已验证的上下文,只对存疑部分进行澄清和修正。这就像服务员发现有道菜理解错了,会只重做那道菜,而不是把整桌菜都倒掉重上。

为何常见:开发者从“单轮对话”的思维出发,把一次意图切换失败视为一次全新对话的开始,忽略了积累的上下文是宝贵资产。

面试题

Q1. 对话状态管理(DST)的核心职责是什么?

单选题 · mid

  • A.忠实记录用户说过的每一句话
  • B.维护并更新当前的意图与槽位← 正确答案
  • C.负责生成面向用户的自然语言
  • D.将语音信号转写为文本

答案:B。DST 的职责是把对话历史提炼成结构化的“点单本”——当前意图和槽位值,而非存储原话。A 只是录音机,C 是自然语言生成的事,D 是语音识别的事。所以选 B。

Q2. 槽位填充指的是什么?

单选题 · mid

  • A.将全部对话内容临时缓存到本机
  • B.从用户话语中提取信息填入预设字段← 正确答案
  • C.自动为对话内容添加表情符号
  • D.对用户语音进行降噪和增强处理

答案:B。槽位填充对应服务员把客人的话誊写到点单本对应栏位。A 是存储,C 是无意义操作,D 是前端信号处理。只有 B 描述了“从话语中提取结构化信息”这一核心。

Q3. 用户说“还是老样子”时,最可能涉及哪项能力?

单选题 · mid

  • A.语音信号的降噪与回声消除
  • B.依据槽位模板追问缺失的信息
  • C.省略补全与指代消解← 正确答案
  • D.对说话人身份进行声纹校验

答案:C。“老样子”省略了整个订单,系统需要在历史对话中恢复被省略的结构化信息,这正是省略补全和指代消解的任务。追问缺失信息(B)是好习惯但不是本题核心,A/D 与语义理解无关。

Q4. 意图切换检测的主要目标是?

单选题 · mid

  • A.判断用户语音中的情感倾向性
  • B.捕捉意图从点餐到催菜的转换← 正确答案
  • C.提升自动语音识别的准确率
  • D.对音频文件进行压缩和缓存

答案:B。意图切换检测关注用户“目的”在轮次间的变化。B 精确描述了“点餐→催菜”这种典型切换。A 是情感分析,C 是前端识别,D 是工程存储,都与意图无关。

Q5. “系统在转账前追问'您确认转给张三五千元吗?'”属于哪种多轮策略?

单选题 · mid

  • A.主动澄清模糊的信息
  • B.对关键操作进行二次确认← 正确答案
  • C.检测对话是否应当结束
  • D.压缩历史对话为摘要

答案:B。信息已完整(收款人、金额都有),系统做的是“执行前确认”,这是多轮策略中的关键确认。主动澄清(A)用于信息不足时,C 管结束,D 管记忆压缩。

Q6. 对话状态通常被表示为什么结构?

单选题 · easy

  • A.音频波形文件
  • B.意图假设与槽位取值集合← 正确答案
  • C.用户头像与昵称信息
  • D.网络延迟统计表

答案:B。对话状态是结构化的“点单本”,核心内容是“当前意图+各槽位的取值”。A/D 是底层信号与性能数据,C 是用户画像,均不属于对话状态。

Q7. 上下文窗口管理主要解决什么问题?

单选题 · easy

  • A.语音信号在远场环境下的失真
  • B.历史信息过多时的取舍与压缩← 正确答案
  • C.麦克风阵列的物理布局规划
  • D.蓝牙设备连接的稳定性保障

答案:B。上下文窗口决定“该参考哪些历史信息、如何压缩旧信息”,是对记忆资源的管理。A/C/D 都是硬件与信号层面的问题。

Q8. 一段成功的多轮点餐对话中,系统可能依次用到哪些能力?

多选题 · hard

  • A.意图识别确认“点餐”这一目的← 正确答案
  • B.槽位填充记录“七分熟”等细节← 正确答案
  • C.指代消解解析“那个配菜”的所指← 正确答案
  • D.声纹识别区分男女说话人

答案:ABC。点餐流程天然需要意图识别(判断在点餐)、槽位填充(记录熟度、配菜)、指代消解(听懂“那个”)。声纹识别用于区分说话人身份,不是多轮对话管理的核心能力。

Q9. 指代消解通常会利用哪些证据?

多选题 · mid

  • A.候选实体与话语的语义相似度← 正确答案
  • B.候选实体在历史中的被提及次数← 正确答案
  • C.说话人语音频率的高低特征
  • D.候选实体被提及的时间近因性← 正确答案

答案:ABD。指代消解看“语义像不像”(A)、“是否常被提及”(B)、“是否刚提过”(D)。C 描述的是语音声学特征,与语义层面的指代无关。

Q10. 当系统在对话中理解失败时,合理的恢复手段包括哪些?

多选题 · hard

  • A.主动向用户提问澄清模糊信息← 正确答案
  • B.重新引导用户描述完整需求← 正确答案
  • C.假装听懂并继续随机执行
  • D.提供让用户纠错的兜底渠道← 正确答案

答案:ABD。失败恢复的要点是“保留已确认信息、只澄清存疑部分、必要时引导重述、提供纠错入口”。C 是错误示范——装懂盲猜最伤信任,应坚决避免。