当前位置: 首页 > news >正文

大模型——如何实现超长多轮对话

在自然语言处理的领域中,多轮对话系统是构建智能化交互应用的关键。无论是聊天机器人、虚拟助手,还是客户服务系统,能够保持连贯的对话并记住上下文信息是用户体验的核心。然而,大规模语言模型(如GPT等)的对话能力往往受限于其上下文窗口的长度,这就给实现超长多轮对话带来了挑战。想想很多思想的交流,都是通过不断地对话实现的。(这里抛出一个问题,对于双方对话可以很容易实现交互,那么对于三者及三者以上呢?现在有比较好的方法来实现嘛?)那么,如何在上下文长度有限的情况下实现超长多轮对话呢?这里将探讨大模型如何通过多种上下文管理技术来克服这一挑战,提供流畅、连贯的长时间对话体验。

首先为什么实现超长多轮对话有难度?

1. 上下文窗口的限制

大多数基于Transformer架构的语言模型有一个固定的上下文窗口限制,即模型可以处理的最大文本长度(通常以token为单位)。这个限制意味着,模型一次只能处理一定数量的文本,当对话超过这个限制时,早期的对话内容将被裁剪掉。因此,如何管理对话历史成为了一个关键问题。

1.1 什么是Token?

Token是模型处理语言的基本单元,可能是一个单词、部分单词,甚至是标点符号。每一轮对话中的所有单词都会被拆分为若干个token,当这些token数量超出模型的最大处理能力时,模型就无法直接记住所有对话内容。一般而言,对于英语文本,1个token大约是34个字符;而对于中文文本,则大约是1.51.8个汉字。

现有的一些解决方案有哪些?

大致可以总结为下述方法:

优点缺点
常用:拼接所有的历史对话,长度不够就进行截断简单直接,完整存储了历史对话记录,对历史对话的理解肯定是对全面的token消耗大,内容冗余,超过限制会损失信息
摘要:对历史对话记录总结记录相比直接记录历史对话减少了冗余内容,只抓关键点,大大增强了多轮对话能力摘要效果取决于模型,模型不好可能会大量丢失关键信息,且需要额外的token去总结摘要
存储增加记忆数据库,可以存储更多多轮对话的内容,在时间和容量上跨度很大需要构建外部记忆系统,并需要具备对应的检索能力
trunk & retrieval综合了上面方法的优点效果取决于检索能力,关键点把握不住会存在语义偏差

2. 实现超长多轮对话的技术策略

为了应对模型上下文窗口的限制,开发者可以使用以下几种技术策略来实现超长多轮对话。

2.1 截断历史记录

最直接的方式是截断对话历史记录。模型将根据上下文窗口的大小,保留最近几轮对话,而丢弃早期的内容。这种方法简单有效,但如果早期对话中的信息对后续交互至关重要,则可能会导致上下文信息丢失,影响对话的连贯性。

策略

  • 保留最近的对话轮次,以确保用户与模型的当前对话具有连续性。
  • 在必要时,通过询问用户或模型复述之前的关键点来重建上下文。

挑战:截断历史记录的主要缺点是,当早期对话包含重要信息时,信息丢失会影响后续对话的质量。

2.2 摘要生成(Summarization)

摘要技术是一种优化的解决方案。当对话内容变得过长时,模型可以通过生成一个摘要,将之前的对话压缩成一个短小的表示形式。这种方式不仅节省了上下文窗口的空间,还可以保留对话的核心信息。

实现方式

  • 模型在每隔几轮对话后生成一个总结,将之前的内容简化为几个关键点。
  • 在后续对话中,使用这些摘要代替完整的对话历史,从而保证上下文信息的持续性。

优点:通过摘要技术,模型可以保持对重要信息的“记忆”,而不会丢失有价值的上下文。

示例: 假设用户与模型讨论了一项复杂的项目,模型可以在每轮对话结束时生成一个简短的总结,例如:“你正在开发一个新项目,主要挑战是资金不足和技术团队扩展。”

2.3 记忆机制(Memory Mechanism)

高级对话系统可以通过“记忆机制”来实现更持久的上下文管理。虽然大多数基础模型没有“长期记忆”的概念,但在系统层面,可以实现一个外部的记忆系统。该系统在每次对话结束时保存关键信息,并在后续对话中根据需要将其重新引入上下文。

具体方式

  • 在每轮对话中,系统提取重要的用户偏好、意图、需求等,并存储到一个独立的数据库中。
  • 在后续对话中,系统可以根据对话内容或特定关键词,从记忆系统中提取相关信息,动态填充到当前的对话中。

优势:记忆机制可以有效地模拟长期上下文记忆,使模型在多轮对话中能够记住用户的偏好、需求和目标,提升用户体验。

2.4 外部存储与动态调用

通过结合外部存储系统,模型可以将之前的对话历史或关键信息存储在外部数据库中,而不是完全依赖上下文窗口。在需要时,系统可以从存储中动态调用这些信息并更新当前对话的上下文。这种方法对于超长时间或跨多天的对话特别有用。

工作流程

  • 每次对话结束时,重要的对话内容被存储在外部存储系统中,如数据库或缓存。
  • 当用户在未来的某一时刻重新与系统进行对话时,系统可以检索之前存储的内容,填充到当前上下文中。

场景:假如用户和模型讨论了一周前的一个项目细节,通过外部存储,模型可以重新加载项目的关键信息,而无需用户重新解释。

2.5 基于主题的上下文聚焦

在一些复杂对话中,用户可能会同时涉及多个主题。为了更好地管理超长对话,模型可以使用基于主题的上下文聚焦策略。模型会识别当前对话的主题,并只保留与该主题相关的上下文,而忽略或简化其他不相关的内容。

示例: 如果用户与模型讨论了多个不同的项目,模型可以根据当前对话的主题选择性地回顾与之相关的上下文,而忽略不相干的主题信息。

优点:这种方法帮助模型在复杂多主题对话中保持清晰的上下文结构,并避免无关信息占用上下文窗口。

注意:

1、现在很多大模型对上下文窗口的限制已经优化很多了,Qwen2 模型可以处理 32K 或 128K token 长的文本,其中 8K 长度可作为输出。ChatGPT-4o支持128K tokens的上下文输入,16K tokens的输出。

2、多轮对话技术优化主要看重时间上的跨度和有用信息的集中程度(个人理解)

3、不同技术的细节需要根据实际需求调整

参考文献:

1、(22 封私信 / 37 条消息) 大模型如何实现超长多轮对话? - 知乎 (zhihu.com)

2、解读大模型(LLM)的token-腾讯云开发者社区-腾讯云 (tencent.com)

相关文章:

大模型——如何实现超长多轮对话

在自然语言处理的领域中,多轮对话系统是构建智能化交互应用的关键。无论是聊天机器人、虚拟助手,还是客户服务系统,能够保持连贯的对话并记住上下文信息是用户体验的核心。然而,大规模语言模型(如GPT等)的对…...

大数据面试-笔试SQL

一个表table: c_id u_id score;用SQL计算每个班级top5学生的平均分(腾讯) select class_id,avg(score) as score_avg from (select *,row_number() over(partition by class_id order by score desc) as score_rank from table ) t1 where t…...

希尔排序和直接插入排序

因为排序这些比较复杂点我就分几期给大家来讲~~~ 直接插入排序 直接插入排序是一种简单的排序算法,主要用于对少量数据进行排序。其基本思想是将待排序的元素逐个插入到已经排好序的部分中,从而形成一个有序序列。 具体步骤如下: 初始化&…...

IDEA 配置 Git 详解

本文将介绍在IntelliJ IDEA 中如何配置Git 没有安装配置 Git 的可以参考我的这篇文章:安装配置 Git 一、操作环境及准备 1.win 10 2.已安装且配置了Git 3.有Gitee账户 4.安装了IntelliJ IDEA 2023.2.1 5.全程联网 二、配置步骤 2.1 配置git 1.采用全局设置&…...

Docker 部署 Redis 监控系统实战:Redis Exporter 与 Prometheus 完整配置指南

Docker 部署 Redis 监控系统实战:Redis Exporter 与 Prometheus 完整配置指南 文章目录 Docker 部署 Redis 监控系统实战:Redis Exporter 与 Prometheus 完整配置指南一 缓存简述二 redis exporter 部署三 环境变量配置四 修改文件权限五 验证 exporter …...

高级算法设计与分析-MaxFlow网络流基础知识

MaxFlow网络流 1 网络流基础概念 source:源点 sink:终点 Flow:流量 capacity:容量 Residual:残量 Residual Network:残量网络 Augmenting path:增广路径,表示从源点 s 到终点 t 不包含环的路径 Bottleneck capacity:瓶颈容量 2 最大流 2.1 基础概念 2.2 增广路算法 …...

Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 桂林,以其独特的喀斯特地貌、秀美的自然风光闻名遐迩,每年吸引着无数国内外游…...

C语言-输入输出

实验一:编写一个输出两行自定义字符的 C 程序 一、实验目的 熟悉 C 语言的基本结构和语法。掌握 printf() 函数的使用方法。了解在 Code::Blocks 中编写、编译和运行程序的过程。 二、实验内容 编写一个 C 程序,要求输出两行字符,内容自定…...

如何在GitHub上传自己的项目?(一文看懂,每一步的操作和解决常见错误的方法)

目录 步骤一:准备 Git 环境 1. 安装 Git 2. 配置 Git 步骤二:在 GitHub 创建一个新的仓库 1. 登录到你的 GitHub 账号。 2. 点击右上角的 号,然后选择 New repository。 3. 填写以下信息: 步骤三:将本地项目上…...

数据结构_day1

目录 大纲 1.数据结构基础知识 1.1 什么是数据结构 1.2 数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储结构 1.4.4 散列存储 1.5 操作 2.算法基础知识 2.1 什么是算法 2.2 算法的设计 2.3 算法的特性 2.4 评价算法的好坏 大纲 数据结构、算法(理…...

c# using 声明进行资源管理

在 C# 8 中,using 声明引入了一种新的语法,称为 using 声明,它使得开发人员在处理资源时的代码更加简洁和清晰。主要的变化包括 使用声明 和 使用上下文(using declaration) 的引入。 使用语句的简化 在 C# 8 中&…...

Kafka之基本概念

1、Kafka是什么? Kafka是由Scala语言开发的一个多分区、多副本,基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢? 回答这个问题要从发展的角度来看:起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…...

倪师学习笔记-天纪-斗数简介

一、学习过程 学习->验证->思考 二、算命方法 算命方法特点铁板神数适合核对六亲子平法准确度一般紫微斗数天文地理融合最好,批六亲不准,配合相可以提升准确率 三、果 天地人三者一起影响果,天时地利人和促成成功1/31/31/31算命部…...

Python酷库之旅-第三方库Pandas(143)

目录 一、用法精讲 646、pandas.Timestamp.is_quarter_start属性 646-1、语法 646-2、参数 646-3、功能 646-4、返回值 646-5、说明 646-6、用法 646-6-1、数据准备 646-6-2、代码示例 646-6-3、结果输出 647、pandas.Timestamp.is_year_end属性 647-1、语法 647…...

细说QT各种线程锁的特点和用法

文章目录 QMutex特点用法QReadWriteLock特点用法QSemaphore特点用法QWaitCondition特点用法在Qt框架中,提供了多种线程同步机制,包括互斥锁(Mutex)、读写锁(Read-Write Lock)、信号量(Semaphore)和条件变量(Wait Conditions)。这些机制用于处理多线程编程中的数据一致性和线程…...

Caffeine+Redis两级缓存架构

CaffeineRedis两级缓存架构 在高性能的服务项目中,我们一般会将一些热点数据存储到 Redis这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 但是在一些场景下单纯使用 Redis 的分布…...

kafka和zookeeper单机部署

安装kafka需要jdk和zookeeper环境,因此先部署单机zk的测试环境。 zookeeper离线安装 下载地址: zookeeper下载地址:Index of /dist/zookeeper 这里下载安装 zookeeper-3.4.6.tar.gz 版本,测试环境单机部署 上传服务器后解压缩 …...

别了,公有云!下云迁移真的是大趋势么?

【科技明说 | 科技热点关注】 不知道你们还有没有印象,早在2022年,IBM发布了《IBM 企业转型指数:云现状》中也反映了这一趋势:80%的企业已经考虑或正在考虑将已经部署到公有云上的工作负载迁回私有的基础设施。 然而&…...

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用,展示了其作为信息与物理世界交汇点的广泛影响力,尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …...

C++ socket编程(1)

这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。 Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。 服务器会等待连接,客户端连接后,服…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...