大模型多轮问答的两种方式
前言
大模型的多轮问答
难点就是在于如何精确识别用户最新的提问的真实意图
,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式
:
- 一种是简单地直接使用
user
和assistant
两个角色将一问一答的会话内容喂给大模型,让它能够结合最新的问题靠自己去理解用户的最新的问题的含义。 - 另外一种方式是在会话过程中将历史的问题进行维护,再使用另外一个大模型结合最新的问题去理解用户当前的意图。
两种方式都可以,但是在我目前的业务上我目前使用的是后者
,因为比较容易实现,效果也不错。
第一种方式
这是使用的是 qwen
的多轮问答 api ,要使用这一种方式,需要维护一个相当长的历史会话记录 messages
,而且要保证 messages
中的 user/assistant
消息交替出现,这是一个必须要遵循的条件,如果是碰到异常,必须要对 messages 中最后的无效对话进行清理。这里就是将理解用户意图和解决用户的问题都混在了一块,对于我要做的业务,回答内容的不确定性太高,而且实现成本也高,需要在会话中加入大量业务代码,所以果断放弃了。
这里的代码主要实现了一个简易地关于烹饪的对话,只有两轮,实现逻辑比较简单,写的比较粗糙,理解意思即可。
def multi_round():messages = [{'role': 'system', 'content': '你是一个绝佳的烹饪助手'},{'role': 'user', 'content': '如何做西红柿炖牛腩?'}]response = Generation.call(model="qwen-turbo", messages=messages, result_format='message')if response.status_code == HTTPStatus.OK:print(response)messages.append({'role': response.output.choices[0]['message']['role'],'content': response.output.choices[0]['message']['content']}) # 将assistant的回复添加到messages列表中else:print(response.message)messages = messages[:-1] # 如果响应失败,将最后一条user message从messages列表里删除,确保 user/assistant 消息交替出现messages.append({'role': 'user', 'content': '不放糖可以吗?'}) # 将新一轮的user问题添加到messages列表中response = Generation.call(model="qwen-turbo", messages=messages, result_format='message', )if response.status_code == HTTPStatus.OK:print(response)messages.append({'role': response.output.choices[0]['message']['role'],'content': response.output.choices[0]['message']['content']}) # 将第二轮的assistant的回复添加到messages列表中else:print(response.message)messages = messages[:-1] # 如果响应失败,将最后一条user message从messages列表里删除,确保 user/assistant 消息交替出现
第二种方式
在我所做地业务中,对于 assistant
的回复不关心,主要关心的是用户的问题
,所以我只关注 user
的历史提问,在实现的时候只需要维护一个列表 history
,始终将最新的用户提问追加即可,为了保证列表信息的有效性,我始终只维护最后 10
个问题。我这里使用 qwen-max
模型对历史提问进行总结,并且按照我要求的方式进行输出。也就是说这个模型只负责总结历史问题,对于业务问题的回答是其他大模型干的事情,任务分工明确就减少了不确定性。
@app.route('/get_last_question', methods=["POST"])
def get_last_question():global user_datalogging.info("-"*20)data = request.get_json()if 'question' not in data or not data['question'] or 'userId' not in data or not data['userId']:return "无法理解或者无法解决,请重新输入问题"question = data['question']userId = data['userId']try:user_data = load_data(config) # 加载用户数据if userId not in user_data:user_data[userId] = []user_data[userId].append(question) # 获取 userId 对应的历史对话记录user_data[userId] = user_data[userId][-10:] # 只保留历史上 10 个对话记录logging.info(f"正在解析用户 【{userId}】 意图,问题历史是 {user_data[userId]}...\n\n")history = user_data[userId]history_str = ""if len(history)>1:history_str = "历史上我依次提问了以下问题:\n"for i,h in enumerate(history[:-1]):history_str += f"时间 10:06:0{i+1} ,问题是: {h}\n"else:history_str += "目前暂无用户提问历史记录。"messages = [{'role': 'system','content': '您是一名善于从历史提问中分析用户的最新意图的助手,请根据提问历史记录,分析并总结用户的最新问题的完整意图。'},{'role': 'user','content': f"根据提问历史记录,分析并总结用户的最新问题的完整意图。不要做冗余的解释或者赘述。如果用户提出的问题语义模糊不清无法识别,可以直接返回空字符串。答案的模板必循遵循“【{{我的最新的问题描述}}】”,总结出来的问题还必须要满足下面的要求:\n"f"1、如果用户的问题查询的是“杭州市”或者“杭州”范围的数据一律使用“全市”进行替换,因为业务数据范围默认就是全杭州市的数据,所以无需重复再提起,但是我们不对包含“杭州市”或者”杭州“字符串的单位名称进行任何处理,因为单位名称具有独特的含义。\n"f"2、用户的简短问题或者意图模糊的提问(如‘2024年呢’等)通常是对之前历史问题的追问或者补充,请根据历史问题记录推断出完整的问题。\n"f"例子:\n"f"输入的历史问题列表是:\n "f"时间 2024-6-6 ,问题是:升序统计2023年各项目类型下管线项目计划数和计划投资金额\n "f"我最新的问题是:统计杭州市2023年管线和管廊建设计划的执行率\n"f"经过分析历史问题列表发现最新的问题和前面的问题关系不大,所以直接最后总结出来的问题是 “统计杭州市2023年管线和管廊建设计划的执行率”, 从问题中可以看出要查询杭州市范围的数据,按照要求我们知道默认数据范围就是全杭州市,所以要用”全市“进行替换,所以输出结果为“【统计全市2023年管线和管廊建设计划的执行率】”。\n"f"例子:\n"f"输入的历史问题列表是: \n"f"时间 2024-6-6,问题是:升序统计杭州市2023年各项目类型下管线项目计划数和计划投资金额\n"f"我最新的问题是:2024年呢\n"f"经过分析发现列表中最新的问题和前面的问题关系有联系,所以经过分析最后总结出来的问题是 “升序统计杭州市2024年各项目类型下管线项目计划数和计划投资金额”, 从问题中可以看出要查询杭州市范围的数据,按照要求我们知道默认数据范围就是全杭州市,所以要用”全市“进行替换,所以输出结果为“【升序统计全市2024年各项目类型下管线项目计划数和计划投资金额】”。\n"f"例子:\n"f"输入的历史问题列表是: \n"f"时间 2024-6-6,问题是:升序查询杭州市2023年权属单位是杭州市政府的管线信息\n"f"我最新的问题是,问题是:2024年呢\n"f"经过分析发现列表中最新的问题和前面的问题关系有联系,所以经过分析最后总结出来的问题是 “升序查询杭州市2024年权属单位是杭州市政府的管线信息”, 从问题中可以看出要查询杭州市范围的数据,按照要求我们知道默认数据范围就是全杭州市,所以要用”全市“进行替换,所以输出结果为“【升序查询全市2024年权属单位是杭州市政府的管线信息】”,我们不对包含“杭州市”或者”杭州“字符串的单位名称进行任何处理。\n"f"\n{history_str}\n,现在我的最新的问题是 “{history[-1]}” ,请严格遵守上述要求并总结出用户的最新问题并给出完整的意图,并简要介绍思考过程。"}]logging.info(f"总结用户最新意图 prompt :{messages}")response = Generation.call(model="qwen-max-0428", messages=messages, result_format='message')resp = response.output.choices[0]['message']['content']logging.info(f"用户最新意图是:{resp}")g = re.search(r"【.*】", resp)if g:resp = g.group().replace("【", "").replace("】", "")save_data(user_data, config)return respreturn ""except Exception as e:logging.info("提取总结最新的问题过程中报错")logging.error(e)return ""
那么,我们该如何学习大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、大模型全套的学习路线
学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。
L1级别:AI大模型时代的华丽登场
L2级别:AI大模型API应用开发工程
L3级别:大模型应用架构进阶实践
L4级别:大模型微调与私有化部署
一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。
以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
相关文章:
大模型多轮问答的两种方式
前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式: 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型,…...
【无标题】1877A
足球锦标赛中有 n支球队。每对队伍匹配一次。每场比赛结束后,Pak Chanek收到两个整数作为比赛结果,即两队在比赛中得分的数量。一支球队的效率等于本队每场比赛的总进球数减去对手每场比赛的总进球数。 比赛结束后,Pak Dengklek会计算每支球…...
直播美颜工具解析:美颜SDK核心技术与性能优化方法
本篇文章,小编将深入解析直播美颜SDK的核心技术及其性能优化方法,以期为开发者提供有价值的参考。 一、美颜SDK核心技术 1.实时人脸检测与识别 美颜SDK的核心技术之一是实时人脸检测与识别。这项技术基于深度学习算法,能够快速、准确地识别…...
YOLOv10开源,高效轻量实时端到端目标检测新标准,速度提升46%
前言 实时目标检测在自动驾驶、机器人导航、物体追踪等领域应用广泛,近年来,YOLO 系列模型凭借其高效的性能和实时性,成为了该领域的主流方法。但传统的 YOLO 模型通常采用非极大值抑制 (NMS) 进行后处理,这会增加推理延迟&#…...
如何解决访问网站时IP被限制的问题?
在互联网上,用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时,却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象,而导致这种情况的原因多种多样,包括恶意行为、违规访问等。本文将解释IP地…...
springboot城市美发管理系统的设计与实现-计算机毕业设计源码71715
摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对城市美发管理系统等问题,对城市…...
微软 Windows 10 22H2 发布可选更新 19045.4474,修复窗口显示问题等
微软今天面向 Windows 10 22H2 版本,发布了 KB5037849 非安全可选更新,用户安装后版本号升至 Build 19045.4474。 IT之家 5 月 30 日消息,微软今天面向 Windows 10 22H2 版本,发布了 KB5037849 非安全可选更新,用户安…...
代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
309.最佳买卖股票时机含冷冻期 视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili代码随想录 解题思路 1. dp[i][0] 第i天持有股票的状态 dp[i][1]第i天不持股的状…...
Polar Web【中等】反序列化
Polar Web【中等】反序列化 Contents Polar Web【中等】反序列化思路&探索EXPPHP生成PayloadGET传递参数 运行&总结 思路&探索 一个经典的反序列化问题,本文采用PHP代码辅助生成序列字符串的方式生成 Payload 来进行手动渗透。 打开站点,分析…...
测试工具链
缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台,对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…...
【求助】ansible synchronize 问题
求助贴,不是解答贴哈 最近把一台服务器从centos7.9升级到alibaba cloud linux3之后,出现了一个ansible的问题。 版本是ansible8.3.0ansible-core-2.15.3,在使用synchronize模块时,我使用了别名(比如web1)会…...
sql server 把表的所有的null改为0,不要限制某列
DECLARE tableName NVARCHAR(256) Linear -- 替换为你的表名 DECLARE sql NVARCHAR(MAX) SELECT sql UPDATE tableName SET COLUMN_NAME 0 WHERE COLUMN_NAME IS NULL; FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME tableName AND TABLE_SCHEM…...
【C#】WinForm关闭新(二级)界面使主程序关闭
参考视频:https://www.bilibili.com/video/BV1JY4y1G7jo?p14&vd_source1c57ab1b2e551da5b65c0dfb0f05a493 1.背景介绍 主程序界面,点击弹出二级界面(同时隐藏主界面),不做任何设置,这时关闭二级界面…...
光伏电站绘制软件的基本方法
随着可再生能源的快速发展,光伏电站的建设日益受到重视。为了提高光伏电站设计的效率和准确性,光伏电站绘制软件的应用变得至关重要。本文将介绍光伏电站绘制软件的基本方法,包括绘制屋顶、屋脊、障碍物和参照物,铺设光伏板&#…...
【Python】selenium使用find_element时解决【NoSuchElementException】问题的方法
NoSuchElementException 是 Selenium WebDriver 中的一种异常,我们在写selenium.find_element 的时候也比较常见,它会在我们要尝试定位一个不存在的元素时抛出这类错误。 以下是一些解决NoSuchElementException 的常用方法: 检查元素定位器:…...
oracle表锁
--oracle提醒记录被另一个用户锁住: --问题描述:你去修改数据时,报错“ --问题分析:你用select t.*,t.rowid from qxt_logsend_0728修改数据结果集时,计oracle会通过事务锁锁住这个记录,点击记录改变&#…...
父组件调用子组件方法(组合式 API版)
在 Vue 3 中,defineExpose 是一个用于在组合式 API (Composition API) 中暴露组件内部方法或属性的函数。它允许父组件通过 ref 引用子组件实例,并调用子组件暴露的方法或访问其属性。 以下是子组件和父组件如何使用 defineExpose 和 ref 的详细解释和示…...
【动手学深度学习】使用块的网络(VGG)的研究详情
目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 多层感知机模型选择、欠拟合和过拟合 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 理解块的网络结构;比较块的网络与传统…...
JFinal学习07 控制器——接收数据之getBean()和getModel()
JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…...
二百三十九、Hive——Hive函数全篇
--创建测试数据库test show databases ; create database if not exists test; use test;一、关系运算 1、等值比较: select 1 where 1 1; --1 select 1 where 0 1; --NULL 2、不等值比较:<> select 1 where 1 <> 2; --1 sele…...
视频去水印电脑版,视频去水印软件
视频去水印怎么去,一直是视频编辑者们的热门话题。那么,如何去除频水印呢?接下来,我们将为您详细介绍视频去水印方法。 第一种方法: 首先通过浏览器打开 “ 51视频处理官网” 的网站。打开网站后,我们上传…...
北邮21硕后端开发笔记
blog 整理北邮21渣硕Java后端开发知识网络,阅读笔记以及技术博客,持续更新!欢迎Star! GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读你真…...
【Linux】系统优化:一键切换软件源与安装Docker
引言 在Linux系统安装完成后,进行一些必要的初始化设置是提升系统性能和用户体验的关键。本文将重点介绍两个实用的一键脚本:LinuxMirrors提供的软件源切换脚本和Docker安装脚本。这两个脚本将帮助我们简化配置安装过程。 一键切换软件源脚本 在Linux…...
【集装箱调度】基于粒子群算法实现考虑重量限制和时间约束的集装箱码头满载AGV自动化调度附matlab代码
% 交叉定位 - 最小二乘法定位算法模拟 % 参数设置 numIterations 1000; % 模拟迭代次数 maxDistance 1000; % 最远定位距离(设定范围) speedOfSound 343; % 声速(单位:m/s) % 预警机坐标 source [0, 0]; % 初始…...
使用 ESP32 和 PlatformIO (arduino框架)实现 Over-the-Air(OTA)固件更新
使用 ESP32 和 PlatformIO 实现 Over-the-Air(OTA)固件更新 摘要: 本文将介绍如何在 ESP32 上使用 PlatformIO 环境实现 OTA(Over-the-Air)固件更新。OTA 更新使得在设备部署在远程位置时,无需物理接触设…...
学习笔记——路由网络基础——汇总静态路由
4、汇总静态路由 (1)定义 静态路由汇总:多条静态路由都使用相同的送出接口或下一跳 IP 地址。(将多条路由汇总成一条路由表示) (2)目的 1.减少路由条目数量,减小路由表,加快查表速度 2.增加网络稳定性 (3)路由黑洞以及路由环路的产生…...
这10个python库,下载都超过5亿
python的库数不胜数。哪些库使用得最多呢。今天分享10个下载都超过5亿的python库。从高到低排序 第一名:Urllib3 下载次数:8.93亿次 介绍:Urllib3是一个功能强大且用户友好的HTTP客户端库,提供了许多Python标准库中没有的特性&…...
Vue3【十一】08使用toRefs和toRef
08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用,并返回一个对象,对象中的name和age属性都是响应式引用,具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用,并返回一个响应…...
离散数学---树
目录 1.基本概念及其相关运用 2.生成树 3.有向树 4.最优树 5.前缀码 1.基本概念及其相关运用 (1)无向树:连通而且没有回路的无向图就是无向树; 森林就是有多个连通分支,每个连通分支都是树的无连通的无向图&…...
【栈】1106. 解析布尔表达式
本文涉及知识点 栈 LeetCode 1106. 解析布尔表达式 布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定: ‘t’,运算结果为 true ‘f’,运算结果为 false ‘!(subExpr)’,运算过程为对内部表达式…...
有做浏览单的网站/站长工具网站测速
mysql如何字段引用和防止出现数据库关键字 ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器 数据库中…...
阿里妈妈网站怎么做/网站网络排名优化方法
说到XML,恐怕我们最深刻的印象也就是满眼的配置文件了,其实使用XML来交换数据也是比较常见的,我想就是因为它的灵活性好通用性强便于传输等原因吧。这样,对XML文件的解析就显得特别重要了,就好像我们的JDBC从数据库拿数…...
福州seo建站/优化关键词排名公司
2019独角兽企业重金招聘Python工程师标准>>> 摘要:本文要用Maven来构建一个多模块的web项目 项目结构如下: system-parent |----pom.xml |----system-domain |----pom.xml |---…...
做网站软件流程/武汉百度推广外包
写原生的时候,我们经常会用到广播,接口,回调等方法来实现发送和接受通知以及通信的。 那么在RN中,也有一套发送和接收通知的方法,用的组件是DeviceEventEmitter。下面看一下,RN中是如何发送和接收事件的&am…...
新闻网站建设可行性分析报告/整合营销什么意思
2019独角兽企业重金招聘Python工程师标准>>> 错误描述: "Your password has expired. To log in you must change it using a client that supports expired passwords." 错误原因: 解决方法: 转载于:https://my.oschin…...
阿狸网站建设/seo信息优化
R语言与统计分析第四章课后习题(汤银才) 题-1 模拟得到1000个参数为0.3的贝努里分布随机数, 并用图示表示出来 # 为了更清晰显示密度,通过cex把点画小点 plot(rbinom(1000,1,0.3),cex0.5)题-2 用命令rnorm( )命令产生1000个均值为10, 方差为4的正态分布随机数,用…...