多轮对话的工程问题:指代、跑题与收尾

单轮答得好的系统,到了多轮经常失控。本文说明指代消解该在哪一层做、历史怎么裁剪、以及对话什么时候应该主动收尾。

要点速览
  • 指代消解必须放在检索之前,否则「它多少钱」这类问题检索不到任何有用内容。
  • 已确认的关键信息应单独存成结构化状态,不依赖模型从历史里重新读出。
  • 摘要要定期重新生成而非叠加,叠加会让早期信息反复压缩直至失真。
  • 检测到话题切换时应重置上下文并与用户确认,避免被无关历史干扰。
  • 连续两三轮没有进展就该转人工,而不是让用户反复换说法尝试。

单轮问答调好之后,接上多轮往往会出现一批新问题:用户说「那它多少钱」,系统不知道「它」指什么;聊到第八轮时系统忘了第二轮已经确认过的信息;或者话题早已偏离,系统还在按最初的场景作答。

指代消解放在检索之前

「它多少钱」这句话直接拿去检索,几乎检索不到任何有用的东西,因为句子里没有实体。正确的处理是在检索之前先把指代补全,变成「某某产品多少钱」,再用补全后的问题去检索。

做法是用一次轻量的模型调用,输入最近几轮对话和当前问题,输出一个独立成立的完整问题。这一步成本很低,但对多轮场景下的检索质量影响很大 —— 它往往比调整检索参数更有效。

历史怎么裁剪

  • 保留最近几轮原文,更早的压缩成摘要,这是成本与效果平衡较好的做法;
  • 已经确认的关键信息(用户身份、所问的产品、已排除的选项)单独存成结构化状态,不依赖模型从历史里重新读出来;
  • 摘要要定期重新生成,而不是在旧摘要上继续叠加 —— 叠加会让早期信息被反复压缩直至失真;
  • 超过一定轮数时提示用户开启新对话,长对话的质量下降往往比成本上升更明显。

话题漂移

用户在一次会话里可能换好几个话题。如果系统把全部历史一视同仁地带着,后面的回答会被前面无关的内容干扰。可行的处理是检测话题切换 —— 当前问题与近期历史的相关度明显下降时,重置上下文并确认一句「您是想问另一件事吗」。

该收尾时要收尾

对话不是越长越好。问题已经解决时主动确认并结束,比继续追问「还有什么可以帮您」更有礼貌也更有效率。反过来,连续两三轮没有进展时应当转人工,而不是让用户在同一个问题上反复尝试不同说法。

判断是否有进展,可以用几个简单信号:用户是否重复了同一个问题、是否出现了否定表达、是否已经给过相同的答案。这些都不需要复杂模型就能检测。

测试要按对话测

评测集里只有单轮问答,测不出上面这些问题。多轮场景需要把完整对话脚本作为测试用例,包括中途换话题、中途纠正信息、以及用户表达不满的情况。相关设计见AI 智能体解决方案,整体节奏参考合作流程。

常见问题

多轮对话中指代不清怎么解决?

在检索之前增加一步指代消解:用一次轻量模型调用,结合最近几轮历史把当前问题改写成独立成立的完整问句,再用改写后的问题去检索。这一步成本很低,对多轮场景下的检索质量提升通常大于调整检索参数。

对话历史要保留多少轮?

保留最近几轮原文,更早的内容压缩为摘要,并把已确认的关键信息单独存为结构化状态。摘要应定期重新生成而非在旧摘要上叠加。超过一定轮数时建议提示用户开启新对话。

什么时候该把对话转给人工?

连续两三轮没有实质进展、用户重复同一问题、出现明显否定表达,或涉及投诉与金额争议时。这些信号用简单规则即可检测,不需要复杂模型。转交时必须携带完整上下文。

参考资料

  1. 大模型服务平台百炼文档 · 阿里云
  2. AI Risk Management Framework · NIST
# 多轮对话# AI 客服# 上下文# 对话设计
免费咨询

聊聊你的项目

留下联系方式,我们一个工作日内联系你。先沟通需求和现状,再给方案;报价当面沟通。

  • 一个工作日内回复
  • 需求沟通免费,不强推方案
  • 交付管理后台与文档,可自行维护
仅用于本次咨询联系,不会用于其他用途。