多轮对话的工程问题:指代、跑题与收尾
单轮答得好的系统,到了多轮经常失控。本文说明指代消解该在哪一层做、历史怎么裁剪、以及对话什么时候应该主动收尾。
- 指代消解必须放在检索之前,否则「它多少钱」这类问题检索不到任何有用内容。
- 已确认的关键信息应单独存成结构化状态,不依赖模型从历史里重新读出。
- 摘要要定期重新生成而非叠加,叠加会让早期信息反复压缩直至失真。
- 检测到话题切换时应重置上下文并与用户确认,避免被无关历史干扰。
- 连续两三轮没有进展就该转人工,而不是让用户反复换说法尝试。
单轮问答调好之后,接上多轮往往会出现一批新问题:用户说「那它多少钱」,系统不知道「它」指什么;聊到第八轮时系统忘了第二轮已经确认过的信息;或者话题早已偏离,系统还在按最初的场景作答。
指代消解放在检索之前
「它多少钱」这句话直接拿去检索,几乎检索不到任何有用的东西,因为句子里没有实体。正确的处理是在检索之前先把指代补全,变成「某某产品多少钱」,再用补全后的问题去检索。
做法是用一次轻量的模型调用,输入最近几轮对话和当前问题,输出一个独立成立的完整问题。这一步成本很低,但对多轮场景下的检索质量影响很大 —— 它往往比调整检索参数更有效。
历史怎么裁剪
- 保留最近几轮原文,更早的压缩成摘要,这是成本与效果平衡较好的做法;
- 已经确认的关键信息(用户身份、所问的产品、已排除的选项)单独存成结构化状态,不依赖模型从历史里重新读出来;
- 摘要要定期重新生成,而不是在旧摘要上继续叠加 —— 叠加会让早期信息被反复压缩直至失真;
- 超过一定轮数时提示用户开启新对话,长对话的质量下降往往比成本上升更明显。
话题漂移
用户在一次会话里可能换好几个话题。如果系统把全部历史一视同仁地带着,后面的回答会被前面无关的内容干扰。可行的处理是检测话题切换 —— 当前问题与近期历史的相关度明显下降时,重置上下文并确认一句「您是想问另一件事吗」。
该收尾时要收尾
对话不是越长越好。问题已经解决时主动确认并结束,比继续追问「还有什么可以帮您」更有礼貌也更有效率。反过来,连续两三轮没有进展时应当转人工,而不是让用户在同一个问题上反复尝试不同说法。
判断是否有进展,可以用几个简单信号:用户是否重复了同一个问题、是否出现了否定表达、是否已经给过相同的答案。这些都不需要复杂模型就能检测。
测试要按对话测
评测集里只有单轮问答,测不出上面这些问题。多轮场景需要把完整对话脚本作为测试用例,包括中途换话题、中途纠正信息、以及用户表达不满的情况。相关设计见AI 智能体解决方案,整体节奏参考合作流程。
常见问题
多轮对话中指代不清怎么解决?
在检索之前增加一步指代消解:用一次轻量模型调用,结合最近几轮历史把当前问题改写成独立成立的完整问句,再用改写后的问题去检索。这一步成本很低,对多轮场景下的检索质量提升通常大于调整检索参数。
对话历史要保留多少轮?
保留最近几轮原文,更早的内容压缩为摘要,并把已确认的关键信息单独存为结构化状态。摘要应定期重新生成而非在旧摘要上叠加。超过一定轮数时建议提示用户开启新对话。
什么时候该把对话转给人工?
连续两三轮没有实质进展、用户重复同一问题、出现明显否定表达,或涉及投诉与金额争议时。这些信号用简单规则即可检测,不需要复杂模型。转交时必须携带完整上下文。
参考资料
- 大模型服务平台百炼文档 · 阿里云
- AI Risk Management Framework · NIST