使用 flask + qwen 实现 txt2sql 流式输出

前言

一般的大模型提供的 api 都是在提问之后过很久才会返回对话内容,可能要耗时在 3 秒以上了,如果是复杂的问题,大模型在理解和推理的耗时会更长,这种展示结果的方式对于用户体验是很差的。

其实大模型也是可以进行流式输出,也就是像 chatgpt 一个字一个字往出崩,这样用户可以一直追踪输出的内容,而不是枯燥的没有止境的等待,本文以我的 txt2sql 实际项目为例,简单介绍使用通义千问 api + flask 框架搭建出一个可以流式输出结果的服务。

txt2sql 任务

我的 txt2sql 任务是基于我的业务数据库内容,用户会提出相关的业务问题,我会让大模型在理解数据库内容的情况下,输出对于问题的理解和思考过程,并最终返回正确的 sql 。

服务

这里的代码虽然很长,但是内容不多,这里需要关心的点有以下几个:

  1. flask 的路由函数 getAnwser 正常写即可,但是最后的返回为了支持流输出,需要另外封装定义一个函数 getStream,并在 getAnwser 最后使用下面方式调用 getStream 进行流式输出:
Response(stream_with_context(getStream()), content_type='text/event-stream')
  1. 很多关于大模型的 tools 回调、 rag 框架细节、prompt 模板都被我封装了,剩下的就是使用 get_llm_prompt 获取最终的 prompt ,然后喂给通义千问最强模型 qwen-max-longcontext,设置到参数 stream=True 和 incremental_output=True,让通义千问进行流式输出,将获得的 responses 结果进行处理即可,结果要用 yield 生成输出流数据。
  2. 其他的代码是日志管理和异常处理。
import logging
from http import HTTPStatusimport dashscope
from flask import request, Flask, Response, stream_with_context
from config import config
from llm import MyCustomLLM
from tools_imp import get_llm_prompt
from my_util import get_question_sqlapp = Flask(__name__)
model = MyCustomLLM(config.DB_HOST, config.DB_PORT, config.DB_NAME, config.DB_USER, config.DB_PASS)
logging.basicConfig(level=logging.INFO, encoding="utf-8",filename=config.LOG_PATH, filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
question_sql = get_question_sql()@app.route('/getAnwser', methods=["POST"])
def getAnwser():def getStream():data = request.get_json()if 'question' not in data or not data['question']:yield "无法理解,请重新输入问题"question = data['question']try:prompt = get_llm_prompt(model, question, question_sql)dashscope.api_key = config.API_KEYllm_response = ""responses = dashscope.Generation.call(model="qwen-max-longcontext", messages=prompt, result_format='message', stream=True, incremental_output=True )r = Nonefor r in responses:if r.status_code == HTTPStatus.OK:info = r['output']['choices'][0]['message']['content']llm_response += infoyield infoelse:raise Exception("大模型执行报错")logging.info(f"llm_response: {llm_response}")logging.info(f"input_tokens: {r['usage']['input_tokens']}, output_tokens: {r['usage']['output_tokens']}")except BaseException as e:logging.error(f'question:{question}, Error: {e}')yield f"Error: {str(e)}\n\n".encode()return Response(stream_with_context(getStream()), content_type='text/event-stream')if __name__ == '__main__':app.run(config.FLASK_HOST, config.FLASK_PORT, debug=True)

测试

另外写一个访问 post 请求的测试代码,请求我的服务接口,结果会持续地一点一点打印完整。

import requestsurl = 'http://localhost:9001/getAnwser'
payload = {"question": "沈塘桥地铁站的信息"}
response = requests.post(url, json=payload, stream=True)
if response.status_code == 200:try:for chunk in response.iter_content(chunk_size=1024):if chunk:print(chunk.decode('utf-8'), end="")   except Exception as e:print(f"流处理过程中出现错误: {e}")

控制台中会一点点持续输出以下内容,就是流式输出样式,但是我没法使用 gif 动态展示,只能直接显示最后的整体内容:

您的问题是:沈塘桥地铁站的信息思考过程:
- 用户想了解关于“沈塘桥地铁站”的具体信息。
- 关键点在于定位到名为“沈塘桥”的地铁站,这涉及到模糊匹配站名。
- 需要从dtzpt表中查询,因为该表存储了地铁站点的详细信息。
- 查询时,需确保返回所有字段信息,以便提供完整详情。```sql
SELECT * FROM dtzpt WHERE name LIKE '%沈塘桥%'```

那么,我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的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/bicheng/25170.shtml

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

相关文章

Vue3 一 快速启动基于Vite 创建项目

编码规范 TypeScript 组合式API setup语法糖 基于Vite 创建项目 WinR输入 CMD 回车后打开CMD命令行 已安装 18.3以上版本的NodeJS,js(安装) 我们用 NPM 方式安装 输入命令npm create vuelatest PS D:\WORK\NodeJS> npm create vuelatest Need to install the following …

《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV:下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层: 基础设施层由经过资源抽象的网络设备组成,仅实现网络转发等数据平面的功能,不包含或仅包含有限的控制平面的功能。…

Python语言读取图像

import cv2 import numpy as np width 640 # 图像宽度height 480 # 图像高度channels 3 # 颜色通道数imgEmpty np.empty((height, width, channels), np.uint8) # 创建空白数组imgBlack np.zeros((height, width, channels), np.uint8) # 创建黑色图像 RGB0imgWhite …

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标: 学习嵌入式实时操作系统(RTOS&#xf…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 论文及代码详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世,解决了很多计算机和机器人领域的覆盖路径问题,今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

办理公司诉讼记录删除行政处罚记录删除

企业行政处罚记录是可以做到撤销消除的,一直被大多数企业忽略,如果相关诉讼记录得不到及时删除,不仅影响企业招投标,还影响企业的贷款申请,严重的让企业资金链断裂,影响企业长远发展和企业形象。行政处罚是…

SpringBoot整合RabbitMQ实现消息延迟队列

环境依赖 SpringBoot 3.1.0 JDK 17 前期准备 安装MQ: liunxdockerrabbitmq安装延迟队列插件 实例 实现延迟队列的一种方式是在 RabbitMQ 中使用消息延迟插件,这个插件可以让你在消息发送时设置一个延迟时间,超过这个时间后消息才会被消费者接收到…

Vyper重入漏洞解析

什么是重入攻击 Reentrancy攻击是以太坊智能合约中最具破坏性的攻击之一。当一个函数对另一个不可信合约进行外部调用时,就会发生重入攻击。然后,不可信合约会递归调用原始函数,试图耗尽资金。 当合约在发送资金之前未能更新其状态时&#…

Dubbo 3.x源码(20)—Dubbo服务引用源码(3)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法,根据服务引用参数map创建服务接口代理引用对象的整体流程,我们知道会调用createInvokerForRemote方法创建远程引用Invoker,这是Dubbo …

总结七大排序算法

插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。实际中我们玩扑克牌时,就用了…

Python Mistune库:Markdown解析和处理

更多Python学习内容:ipengtao.com Mistune是一个用于Python的快速且功能强大的Markdown解析库。它以其高性能和灵活性著称,能够轻松扩展和定制。Mistune支持标准的Markdown语法,并且可以通过插件扩展支持更多功能,例如数学公式、高…

数据结构严蔚敏版精简版-栈和队列以及c语言代码实现

1栈的定义和特权 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。 注:虽然说栈的实现就是一端插入和删除,但不一定是在“表尾”,这个“表尾”是广义的。 头插法实现链栈 尾插法实现链栈 因此,对栈来说,表尾…

算法——Floyd判圈算法

介绍 Floyd判圈算法用于判断一个链表中是否有环。 思想 使用快慢指针fast, slow,快指针每次走两步fast fast.next.next,慢指针每次走一步slow slow.next。当出现fast null || fast.next null时,说明链表不存在环,如果存在环…

1.2-自然语言的分布式表示-基于计数的方法

本篇笔记对应的视频链接为: 3-基于计数的方法表示单词-将文字转换成编号的预处理工作_哔哩哔哩_bilibili;4-基于计数的方法表示单词-使用共现矩阵进行单词的分布式表示_哔哩哔哩_bilibili;5-基于计数的方法表示单词-单词之间相似度计算_哔哩哔…

计算机网络 —— 网络层(CIDR)

计算机网络 —— 网络层(CIDR) CIDR的提出背景什么是CIDR基本概念划分示例应用优势 举个例子路由聚合常用数字 我们今天来看IPv4地址划分的另一种方法 —— CIDR。 CIDR的提出背景 CIDR(无类域间路由,Classless Inter-Domain Ro…

大众汽车裁员加速,38万元遣散费起步

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 几周前,大众汽车宣布了一项新的裁员计划。 一、裁员行动与额外福利并行 大众汽车近期在裁员行动上取得了显著进展,其遣散…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中,一个新的领域——提示词工程(prompt engineering)——开始显露头角。 这个领域的核心在于精心设计输入,以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展,特别…

无头+单向+非循环链表的实现

这里写目录标题 1. 链表1.1 链表的概念及结构1.2 链表的分类 2. 接口实现3. 链表的实现3.1 打印链表3.2 头插3.3 尾插3.4 头删3.5 尾删3.6 单链表查找3.7 在pos之前插入3.8 在pos之后插入3.9 删除pos位置的值3.10 删除pos位置之后的值3.11 链表的释放3.12 动态申请一个节点 4. …

《精通ChatGPT:从入门到大师的Prompt指南》第11章:Prompt与AI的未来

第11章:Prompt与AI的未来 11.1 技术发展的新方向 在迅速发展的人工智能领域,Prompt工程作为与AI模型交互的核心方式,正处于技术创新的前沿。未来几年,Prompt工程将沿着多个新方向发展,这些方向不仅会改变我们与AI互动…

Transformer学习之SwinTransformer

1.算法简介 本文主要参考自以下链接,整理成线上的形式用于备忘,排版太麻烦了直接贴图,参考的朋友慎重,不如直接看参考链接,后期有了新的理解继续更正。 参考链接1:Swin-Transformer网络结构详解_swin tran…