大模型——如何实现超长多轮对话
在自然语言处理的领域中,多轮对话系统是构建智能化交互应用的关键。无论是聊天机器人、虚拟助手,还是客户服务系统,能够保持连贯的对话并记住上下文信息是用户体验的核心。然而,大规模语言模型(如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分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。 服务器会等待连接,客户端连接后,服…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
