在 QA、逻辑推理等领域,多跳问答比单跳问答难得多。在聊天机器人场景中亦是如此,模型需要结合历史对话和用户当前的输入内容生成合适的响应。然而,现有的指令数据大都是单轮或者两轮的对话(截止这篇文章落笔的日期 2023-09-10),模型在对话轮数较少时,还能很好地遵循指令、记住历史信息以及输出合适的内容。但对话轮数多了后,模型的输出往往会变得不可控,例如越来越长、格式出现错误、遗忘历史信息、指令遵循能力变弱(人设不符)。一方面是因为上下文变长、加上 Lost in the middle 等 prompt 层面的影响;另一方面是模型在多轮对话下的对齐能力较弱(多轮对话数据的训练数据质量较差,且在 long context 场景下“锻炼”得不够)。
在处理多跳问题和数学推理等较难任务时,除了在模型层面做优化外,往往会使用 CoT 系列的 prompt 工程,例如“Let’s think step by step”的方式。我理解它们能提升 LLM 推理能力的一部分原因在于将任务拆解,输出中间步骤,对于从左到右的生成式模型来说,这些补齐的中间步骤的生成为输入空间带来了更细致的条件约束,而这些条件约束引导模型输出更为准确的结果。
Prompt 对于模型的生成有着至关重要的影响,在另外一个将对话内容抽取摘要和标题的项目中,对 prompt 做一些细微的调整,例如仅删除个别词语,先后两次模型的 greedy 输出的相似度相差就非常大。如果将模型的输出过程比作一条长长的道路,前面每一步的偏差都会通往不同的终点。有的道路一帆风顺,而有的道路布满荆棘、高山险阻、沟壑纵横。“Let’s think step by step” 就像路途中的补给站,当你来到这里,补给站中的人给你指向了一条缓慢但平坦的道路,虽然要多走几步路,但更容易通往正确的终点。CoT 等后续发展的一系列思维链相关的 prompt 工程都通过人为添加或者引导模型自行生成中间“道路”的方式,来“安稳”抵达期望的“终点”。
多轮对话存在的问题
我们的 AI 情感聊天机器人在对话轮数多了之后,效果会明显下降。甚至产品反馈,当超过 50 轮对话后,模型会出现百分百的重复回复(大量重复的短语或近似的语义)。我的推测是:
- 对话到后期,用户与模型都陷入