大模型多轮问答的两种方式

前言

大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式

  • 一种是简单地直接使用 userassistant 两个角色将一问一答的会话内容喂给大模型,让它能够结合最新的问题靠自己去理解用户的最新的问题的含义。
  • 另外一种方式是在会话过程中将历史的问题进行维护,再使用另外一个大模型结合最新的问题去理解用户当前的意图。

两种方式都可以,但是在我目前的业务上我目前使用的是后者,因为比较容易实现,效果也不错。

第一种方式

这是使用的是 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大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

光伏电站绘制软件的基本方法

随着可再生能源的快速发展,光伏电站的建设日益受到重视。为了提高光伏电站设计的效率和准确性,光伏电站绘制软件的应用变得至关重要。本文将介绍光伏电站绘制软件的基本方法,包括绘制屋顶、屋脊、障碍物和参照物,铺设光伏板&#…

spark复习

第一章 1.​大数据特点:4V 2.​大数据计算模式 3.​hadoop生态系统 4.​spark提供了内存计算和基于DAG的任务调度机制,遵循一个软件栈满足不同应用场景的理念。 5.​hadoop中MapReduce计算框架的缺点,对应的spark的优点 第二章 1.​spark生态系统 …

HTML做成一个炫酷跳动爱心的页面

大家好,今天制作制作一个炫酷跳动爱心的页面! 先看具体效果: 要创建一个炫酷跳动爱心的HTML页面,你可以使用HTML、CSS和JavaScript的组合。以下是一个简单的示例,它使用CSS动画和JavaScript来实现跳动效果。 首先&…

vue项目中oss网络图片无法显示的问题

问题说明 如果后台给你烦返回了oss地址的图片,也许会出现如下情况 在图片路径无误的情况下,图片无法正常预览和回显 但是在浏览器中打开却没问题 解决方案 就需要在项目的index.html中做出如下配置,便能正常回显 <meta name"referrer" content"no-referr…

将二叉排序树转换成双向链表--c++【做题记录】

【问题描述】 编写程序在不增加结点的情况下&#xff0c;将二叉排序树转换成有序双向链表&#xff08;如下图&#xff09;。 链表创建结束后&#xff0c;按照从前往后的顺序输出链表中结点的内容。 【输入输出】 【输入形式】 第一行输入数字n&#xff0c;第二行输入n个整数…

LNMP与动静态网站介绍

Nginx发展 Nginx nginx http server Nginx是俄罗斯人 Igor Sysoev(伊戈尔.塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。 Nginx以高效的epoll.kqueue,eventport作为网络IO模型&#xff0c;在高并发场景下&#xff0c;Nginx能够轻松支持5w并发连接数的响应&#xff0c;并…

【文献阅读】LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

目录 1. motivation2. overall3. model3.1 low rank parametrized update matrices3.2 applying lora to transformer 4. limitation5. experiment6. 代码7. 补充参考文献 1. motivation 常规的adaptation需要的微调成本过大现有方法的不足&#xff1a; Adapter Layers Introd…

Vue2入门(安装/创建Vue,安装devtools)

1.下载并安装Vue &#xff08;1&#xff09;Vue是一个基于JavaScript&#xff08;JS&#xff09;实现的框架。要使用它就需要先拿到Vue的js文件&#xff0c;可以从官网(https://v2.cn.vuejs.org/)下载vue.js文件 &#xff08;2&#xff09;下载&#xff1a;开发生产版本更小&a…

Centos7 安装配置SFTP

Centos7安装配置SFTP 更新源安装 OpenSSH 服务启动服务设置为开机自启动新建一个用户 (sftpuser为你要设置的用户的用户名)编辑配置文件设置sftp用户的根目录重启SSH服务代码实现 由于最近工作中需要实现动态上传文件到帆软服务器&#xff0c;但是帆软没有提供相关API&#xff…

【SpringBoot + Vue 尚庭公寓实战】房间支付方式管理接口实现(三)

【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09;1、查询全部支付方式列表2、保存或更新支付方式3、根据ID删除支付方式 房间支付方式管理…

【机器学习】深度卷积生成对抗网络(DCGAN)用于图像生成

1. 引言 1.1 DGGAN是什么&#xff1f; DGGAN&#xff08;Directed Graph embedding framework based on Generative Adversarial Network&#xff09;是一种基于生成对抗网络&#xff08;GAN&#xff09;的有向图嵌入方法&#xff1a; 基本定义&#xff1a;DGGAN是一种结合了…

Java 的循环

Java 有三种循环&#xff1a;for&#xff0c;while&#xff0c;do while。 for 基本语法&#xff1a; for (循环变量初始化; 循环条件; 循环变量迭代){循环语句; }程序示例&#xff1a; public static void main(String[] args) {for (int i 0, j 0; i < 3; i, j--) {…

在虚拟机上搭建 Docker Kafka 宿主机器程序无法访问解决方法

1、问题描述 在虚拟机CentOS-7上搭建的Docker Kafka ,docker内部可以创建Topic、可以生产者数据、可以消费数据&#xff0c;而在宿主机开发程序无法消费Docker Kafka的数据。 1.1、运行情况 [dockerlocalhost ~]$ docker ps -a CONTAINER ID IMAGE COMMAND…

还不会线程池?JUC线程池源码级万字解析

线程池主要解决了两个问题&#xff1a; 第一个是当大量执行异步任务的时候提供较好的性能&#xff1b;在不使用线程池的时候&#xff0c;每次需要执行一个异步任务都需要新建一个 Thread 来进行&#xff0c;而线程的创建和销毁都是需要时间的&#xff0c;所以可以通过线程池来实…

AI论文速读 | 2024[ICML]FlashST:简单通用的流量预测提示微调框架

题目&#xff1a; FlashST: A Simple and Universal Prompt-Tuning Framework for Traffic Prediction 作者&#xff1a;Zhonghang Li, Lianghao Xia&#xff08;夏良昊&#xff09;, Yong Xu&#xff08;徐勇&#xff09;, Chao Huang 机构&#xff1a;华南理工大学&#xf…

【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;死信队列 RabbitMQ的工作模式 死信队列的工作模式 二、&#x1f349;RabbitMQ相关的安装 三、&#x1f34e;SpringBoot引入RabbitMQ 1.引入依赖 2.创建队列和交换器 2.1 变量声明 2.2 创建…

在群晖上通过Docker部署DB-GPT

最近一直有网友在后台私信&#xff0c;发的内容高度统一&#xff0c;只有后面 8 位数字不一样&#xff0c;都是 &#xff03;22232 xxxxxxxx&#xff0c;有谁知道是什么意思吗&#xff1f;在我印象中&#xff0c;这是第二次这么大规模的发类似的字符串了 什么是 DB-GPT ? DB-G…

Linux lvm卷扩容之SSM

介绍 SSM&#xff08;System Storage Manager&#xff09;是系统存储管理器&#xff0c;它是一种统一的命令行界面&#xff0c;用于管理各种存储设备。通过SSM&#xff0c;用户可以方便地管理、配置和监控存储系统。检查关于可用硬驱和LVM卷的信息。显示关于现有磁盘存储设备、…

O2OA(翱途)开发应用平台(v9)开发实战(3)-如何做信息发布

内容管理就是用来发布信息的&#xff0c;比如说发布单位的内部信息&#xff1a;像公司新闻、通知公告、规章制度等等。 接下来我们来介绍一下如何创建&#xff0c;比如我要创建一个栏目&#xff0c;专门用来发布公司的规章制度 需求 规章制度 首先从菜单打开“内容管理设置…

平衡二叉树AVL

平衡二叉树是一种特殊的二叉查找树&#xff0c;其中每个节点的左右子树的高度差不超过1。这种树的平衡性质使其在多种操作下保持较高的效率。 平衡二叉树的定义与性质 严格定义&#xff1a;在平衡二叉树中&#xff0c;任一节点的两个子树的高度最大差别为一&#xff0c;这使得…