AI 情感聊天机器人之旅 —— 多轮对话存在的问题与数据积累

在 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 轮对话后,模型会出现百分百的重复回复(大量重复的短语或近似的语义)。我的推测是:

  • 对话到后期,用户与模型都陷入到“无话可说”的地步,用户没有“强烈”地转换话题。同时,模型在几轮雷同回复的条件约束下很难有“新颖”的表达方式。
  • 对数据的理解不够透彻、对数据的质量没有把控,尤其在 3000 - 3500 token(超过 3500 token 会被截断)范围内的数据质量没有肉眼审核过,如果这部分的数据大都是雷同的,那么模型学到的或许就不是先后顺序,而是类似 ICL 演示(few-shot)的并列关系,从而去模仿历史对话的表达方式和类比生成,这样就很容易重复。关于这部分的内容,后续会将相关的研究写一篇新的博客。
  • 统一数据格式(包括 prompt 的格式)时没有做好规范,导致模型的输出不“规范”,甚至有些“离经叛道”。按照上文中提到的关于 CoT 的描述,模型在行进途中的几步就走偏一步,走着走着就来到了“地图”上没有标识的地区(SFT 阶段没有训练好,不仅损坏了模型原本的知识,还让模型不知道该怎么合理地生成符合用户指令的响应)。

结合上述思考和缓解重复问题时的实践,提出一个猜想:随着聊天的进行,更多的 context 会有更强的 conditional 限制,使得模型的输出空间囿于小而窄的空间(实际上该表述并不准确,还需要加入一些限定,例如自研模型、训练数据质量受限,本质上还是模型训练的问题)。

但在使用 gpt-4-1106-preview 作为聊天模型时,很少出现或几乎不会出现多轮重复的问题。它完全按照我们的设想,在遵循用户当前轮的指令(聊天的话题与内容)的前提下,从历史对话中撷取所需的信息,然后生成满足用户需求的响应。一个很直观的感受是,gpt4 能很好地 get 到我们的意思,甚至很多时候我们都不知道该如何表达自己的问题,它也能给出我们所需的答案。因此,一个理解力强的模型,在情感聊天场景中已经具备足够的下限,我们只需要改写其输出,让其少点“AI 味”,多点“人情味”,除了用改写的方式,通过调整 prompt 也能实现,例如:

  • 论文《Guidling Large Language Models via Directional Stimulus Prompting》提出了一个名为“定向刺激 prompt”(Directional Stimulus Prompting)的新型 prompt 框架,先训练一个经过微调、强化学习后的小型模型,然后使用该小型模型根据用户的查询来生成对应的刺激(文本),将其添加到 prompt 中来引导黑盒大语言模型朝着所需的输出方向前进。
  • 论文《EmotionPrompt:Leveraging Psychology for Language Models Enhancement via Emotional Stimulus》的作者从心理学中汲取灵感,提出 EmotionPrompt(情感提示)来探索情商,以提高 LLM 的性能。具体来说,作者为 LLMs 设计了 11 句情感刺激句子,只需将其添加到原始 prompt 中即可。缺陷在于情绪刺激可能并不适用于其他任务,并且对不同 LLM 的效果无法保证。

数据积累

综其根本,还是模型能力的问题:模型的理解能力以及抗干扰能力(在存在冗余、干扰信息且较长的历史对话(context)中找寻能够帮助回答当前轮用户的内容)。

增强模型的指令遵循能力,寻找并清洗得到质量更好的多轮对话数据集,充分对齐模型(SFT + RLHF 的标准道路)。除此之外,也可以考虑扬长避短,将多轮对话“拍平”成单轮对话,发挥模型单轮对话的优势。那么该如何“拍平”成单轮对话呢?

最先想到的方法是减少送入模型的对话轮数,仅保留最近的 5 轮对话,将 context 控制在 2500 token 左右,与收集到的高质量对话数据集的平均 token 保持一致。缺点在于送入的历史信息较少,模型没有“记忆”。但在当时,即便送入 10 轮对话(20 句),历史对话中较为久远的信息,模型也大概率 get 不到,反而会因为大量重复的历史信息(闲聊场景中,大多数的历史对话并没有意义,甚至用户输入的指令也大都没有信息)干扰当前输出。如果 context 中干扰、冗余的信息越少,模型输出的效果越好,那么我们是可以减少送入模型的对话轮数,提升模型输出的质量,并以此积累多轮对话。

在使用 LLM 清洗数据时,发现 vicuna-v1.5 等指令遵循能力较强的模型(当然,现在可以选择能力更强的模型)可以对历史对话进行总结和评分,于是尝试提取历史对话中的核心内容,去除其中的“杂质”与“噪声”,从而规范“过去的道路”,避免其误入“藕花深处”。

  • 将历史对话全部进行摘要:将当前轮前面的所有历史对话转变成摘要,结合 Rethinking Historical Messages(后续有时间会写一篇博客,重点讲述历史对话对当前轮模型输出的影响)的研究结果,该做法可以减少历史几轮对话对当前轮模型输出的影响,《Calibrate Before Use:Improving Few-Shot Performance of Language Models》论文提到的三个偏见。其核心是可以缓解模型输出的重复问题,并且减少 ICL 对模型输出的影响。在多轮重复问题测试集上进行测试,发现该方式的确可以很好地解决模型输出重复的问题。

    但该方式的缺点在于摘要会丢失细节信息,而这些细节信息恰好是未来几轮对话的重点部分,这就会导致对话的不连贯和剧情发展的磕磕绊绊。

    当时对老板提出的一种解释是,原始的历史对话是人与模型的对话,而生成的摘要是模型的摘要,模型更容易理解自己的“语言”,而非人的“语言”,尤其在与人类对齐这方面有所欠缺的模型。此外,模型的摘要抽取能力仍然是模型自身的能力,没有受到 SFT 的影响,输出的摘要内容仍然是模型“语言”。没过多久,微软提出了 LLMLingua 方法,可以对 prompt 进行压缩,压缩后的 prompt 虽然人类不可读,但模型仍然能够识别并输出正确的结果,且可以反向还原。这说明,在对齐还没有达到一定程度(2024-02 使用 LLMLingua 测试 GPT4 时,GPT4 会在生成的响应中说明用户提供的文本存在格式错误的问题,这说明 GPT-4 已经能够很好地理解人类的语言)时,模型更容易理解自身的“语言”。

  • 将每一轮对话都进行摘要:每一轮对话并不一定有足够的信息,尤其在闲聊场景下,这会导致前后两轮的摘要内容几乎没有变化,那么模型的输出很大程度上取决于当前轮用户的输入内容,如果用户输入内容也没有太多变化,模型的输出很容易雷同,仍然存在重复问题。

  • 将久远历史对话进行摘要:不再将“多余”的历史对话删除,而是用 LLM(vicuna-13B-v1.5)从中抽取信息,以前情提要的形式添加到 system prompt 中,拼接成 system prompt + 前情提要 + 最近 5 轮历史对话的形式。上线后,平均对话轮数得到了提升。

将历史对话全部进行摘要类似 MQA、将每一轮对话都进行摘要类似 MHA,将两者折衷,每 N 轮进行一次摘要,或者当有较大变化时,进行一次摘要(类似 GQA,关于 GQA 可以参见我的另一篇博客《论文阅读:GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints》)。

核心思想是提供更好、冗余干扰信息越少的 context,提升模型每一轮输出的质量,从而积累多轮对话的训练数据

后续(23 年 12 月份)尝试对历史对话进行压缩(使用 LLMLingua),从表象上来看,对 prompt 进行压缩与抽取摘要相同,都是输入较长的 prompt,得到简短的、新的 prompt,但本质上是不同的。抽取摘要的核心还是将 prompt 进行精细加工,输出成人类可读的文本内容,而 prompt 压缩并不为人类可读而服务,压缩后的文本内容对于人类不一定可读,但模型能够正确识别,甚至可以还原回原先的 prompt,更像是压缩软件的压缩过程。该方法也可以缓解重复问题,但对模型的输出效果会有一定的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微RK3588驱动设计之DVP并口摄像头2

dts配置看瑞芯微RK3588驱动配置之DVP并口摄像头1_rockchip 调试dvp设备 直接显示摄像头数据-CSDN博客 这里看看驱动的具体实现,以gc2145为例。 gc2145的驱动源码如下: // SPDX-License-Identifier: GPL-2.0 /** GC2145 CMOS Image Sensor driver*** C…

高斯分布应用;高斯分布和高斯核有什么;正态分布的具体应用举例说明

目录 高斯分布应用 高斯分布和高斯核有什么 正态分布的具体应用举例说明 高斯分布应用

串,数组和广义表

2.1.求next和nextval的实现 代码&#xff1a; int next_one(char *str, int len) {int result 1;if(len 1 || len 0) return len;for (size_t i 1; i < len; i){ if(compare(str, strlen-i, i)) {result i1;//break;}}return result; }int next(char *str, int *…

MySQL-索引的增删改

1、索引的分类 从功能逻辑上划分&#xff1a; 普通索引 &#xff1a;创建索引时不加任何限制条件&#xff0c;只是用来提高查询效率。可以创建在任何数据类型中&#xff0c;其值是否唯一和非空由字段本身的完整性约束条件决定。唯一索引&#xff1a;使用UNIQUE参数可以设置索引…

nodeJs用ffmpeg直播推流到rtmp服务器上

总结 最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下 ffmpeg FFmpeg 是一个开源项目&#xff0c;它提供了一个跨平台的命令行工具&#xff0c;以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务&#xff0c;包括解封装、转封装、视频和音频…

国际化日期(inti)

我们可以使用国际化API自动的格式化数字或者日期&#xff0c;并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的&#xff0c;非常的简单&#xff1b; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…

DC-DC转换效率的影响因素和优化方向

一. 定义 DC-DC转换效率的定义是输入与输出功率之比&#xff1a; η P O U T P I N P O U T P O U T P L O S S η\frac{P_{OUT}}{P_{IN}}\frac{P_{OUT}}{P_{OUT}P_{LOSS}} ηPIN​POUT​​POUT​PLOSS​POUT​​ 其中POUT代表输出功率&#xff0c;PIN代表输入功率&#x…

ADS FEM 仿真设置

1、EM Simulator 选择FEM。 2、在layout界面打开的EM功能&#xff0c;这里不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建&#xff0c;过孔可以在叠层处右键添加。 5、端口需要设置GND layer。 6、设置仿真频率。 7、Output plan。 8、Options 设置 介质…

网络学习(三)|Feign与RPC在微服务架构中的应用对比

文章目录 一、概述二、设计理念与实现方式三、协议与传输层四、应用场景与性能考量五、性能与效率六、结论七、其他Feign与HTTP的关系 在构建分布式系统和微服务架构时&#xff0c;选择合适的服务间通信技术至关重要。Feign和RPC&#xff08;Remote Procedure Call&#xff09;…

ITSS认证流程详解!

ITSS,是Information Technology Service Standards的缩写&#xff0c;中文意思是信息技术服务标准&#xff0c;是在工业和信息化部、国家标准化委的领导和支持下&#xff0c;由ITSS工作组研制的一套IT服务领域的标准库和一套提供IT服务的方法论。 国家标准化委的领导和支持下&…

你好 GPT-4o!

你好 GPT-4o&#xff01; OpenAI公司宣布推出 GPT-4o&#xff0c;这是OpenAI的新旗舰模型&#xff0c;可以实时对音频、视觉和文本进行推理。 GPT-4o&#xff08;“o”代表“o​​mni”&#xff09;是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意组合作…

[AI]-(第1期):OpenAI-API调用

文章目录 一、OpenAI API中使用GPT-3.5-turbo模型充值方式使用模型计费方式价格说明相关限制和条款 二、接入一个OpenAI API流程1. 获取OpenAI API 密钥2. 集成ChatGPT到小程序3. 处理用户输入4. 调用OpenAI API5. 返回回复至小程序6. 持续优化7. Postman请求示例 三、通用AI客…

43k Star!推荐一款功能强大的开源笔记软件!

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

每日学习 - APK解包

文章目录 APK的定义解析APKAPK 是什么每个文件的意义classes.dexAndroidManifest.xmlassetslibres & resources.arsc 反编译工具apktool apk解包 秒了~ APK的定义 APK&#xff08;Android Package Kit&#xff09;是用于部署和分发Android操作系统上应用程序的软件包格式。…

pytest教程-47-钩子函数-pytest_sessionfinish

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_sessionstart钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionfinish钩子函数的使用方法。 pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用&#xff0c;…

自然语言处理通用框架BERT原理解读

相关代码见文末 1.概述 问题背景: 传统Seq2Seq模型的局限性: 早期的机器翻译和文本生成任务常采用基于循环神经网络(RNN)的序列到序列(Seq2Seq)模型,这类模型在处理长序列时容易遇到梯度消失/爆炸问题,导致训练效率低,难以捕捉长期依赖。 RNN网络的问题: RNN及其变…

中国农业大学:学硕11408复试线上涨40分,今年还会持续涨吗?中国农业大学计算机考研考情分析!

中国农业大学&#xff08;China Agricultural University&#xff09;&#xff0c;简称“中国农大”&#xff0c;坐落于中国首都北京&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;水利部、农业部和北京市共建&#xff0c;位列国家“双一流…

【PostgreSQL支持中文的全文检索插件(zhparser)】

PostgreSQL本身是支持全文检索的&#xff0c;提供两个数据类型&#xff08;tsvector,tsquery&#xff09;&#xff0c;并且通过动态检索自然语言文档的集合&#xff0c;定位到最匹配的查询结果。其内置的默认的分词解析器采用空格进行分词&#xff0c;但是因为中文的词语之间没…

Vue3:分类管理综合案例实现

综合案例 实现分类管理功能 路由 在main.js中引入router 访问根路径’/后跳转到布局容器 加载布局容器后重定向到’/nav/manage’ 加载我们需要的组件 这样可以在布局容器中切换功能模块时,只对需要修改的组件进行重新加载 const router createRouter({history: create…

APP封装后防止破解的全方位策略

移动应用开发完成后&#xff0c;封装&#xff08;编译打包&#xff09;是发布前的重要步骤。然而&#xff0c;一旦APP发布&#xff0c;就可能面临被逆向工程破解的风险&#xff0c;从而导致源代码泄露、数据被盗取等严重后果。 本文将介绍一系列实用的策略和技术&#xff0c;帮…