1. 安装MySQL和PyMySQL

安装MySQL

# 在Ubuntu/Debian上安装
sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation# 启动MySQL服务
sudo systemctl start mysql
sudo systemctl enable mysql

安装PyMySQL

pip install pymysql

使用 apt 安装 MySQL 后,默认情况下 root 用户没有密码,但需要通过 sudo 权限访问。

如果希望设置密码(推荐)

使用 mysql_secure_installation

运行以下命令交互式设置密码:

sudo mysql_secure_installation

按照提示:

  1. 选择密码强度验证策略(通常选 0 跳过)

  2. 输入新密码并确认

  3. 后续选项建议全部选 Y(移除匿名用户、禁止远程 root 登录等)

用 sudo 登录 MySQL

sudo mysql -u root

检查 MySQL 用户认证方式

登录 MySQL 后,执行:

SELECT user, host, plugin FROM mysql.user WHERE user='root';

修改 root 用户认证方式为密码 

假设你已经用 sudo mysql 进入了 MySQL,执行:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '12345678';
FLUSH PRIVILEGES;

创建数据库和表 

import pymysql# 替换为你的MySQL root密码
MYSQL_PASSWORD = 'your_root_password'connection = pymysql.connect(host='localhost',user='root',password='12345678'
)try:with connection.cursor() as cursor:# 创建数据库cursor.execute("CREATE DATABASE IF NOT EXISTS qwen_demo")cursor.execute("USE qwen_demo")# 创建产品表cursor.execute("""CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),category VARCHAR(50),price DECIMAL(10,2),stock INT)""")# 插入示例数据cursor.execute("""INSERT INTO products (name, category, price, stock)VALUES ('笔记本电脑', '电子产品', 5999.00, 50),('智能手机', '电子产品', 3999.00, 100),('平板电脑', '电子产品', 2999.00, 30),('办公椅', '家具', 899.00, 20),('书桌', '家具', 1299.00, 15)""")connection.commit()print("数据库和表创建成功,示例数据已插入!")
finally:connection.close()

2. 部署Qwen3-0.5B模型 

pip install transformers torch sentencepiece

text2sql.py 

from transformers import AutoModelForCausalLM, AutoTokenizermodel_path = "Qwen/Qwen1.5-0.5B"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")def generate_sql_from_nl(query):prompt = f"""将以下中文问题转换为SQL查询语句。只返回SQL语句,不要有其他解释或说明。数据库表结构:
表名:products
字段:id, name, category, price, stock问题:{query}
SQL:"""inputs = tokenizer(prompt, return_tensors="pt").to(model.device)outputs = model.generate(**inputs, max_new_tokens=200)sql = tokenizer.decode(outputs[0], skip_special_tokens=True)# 提取SQL部分sql = sql.split("SQL:")[-1].strip()return sql

测试代码:

from transformers import AutoModelForCausalLM, AutoTokenizermodel_path = "/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-1.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")def generate_sql_from_nl(query):prompt = f"""将以下中文问题转换为SQL查询语句。只返回SQL语句,不要有其他解释或说明。数据库表结构:
表名:products
字段:id, name, category, price, stock问题:{query}
SQL:"""inputs = tokenizer(prompt, return_tensors="pt").to(model.device)outputs = model.generate(**inputs, max_new_tokens=300)sql = tokenizer.decode(outputs[0], skip_special_tokens=True)# 提取SQL部分sql = sql.split("SQL:")[-1].strip()return sqlif __name__ == "__main__":query = "查询所有价格大于100的产品"sql = generate_sql_from_nl(query)print("问题:", query)print("SQL:", sql)

3. 使用Flask部署API

pip install flask flask-cors

创建 app.py:

from flask import Flask, request, jsonify
from flask_cors import CORS
import pymysql
from qwen_model import generate_sql_from_nl  # 假设上面的Qwen代码保存在qwen_model.pyapp = Flask(__name__)
CORS(app)# MySQL配置
db_config = {'host': 'localhost','user': 'root','password': 'your_password','database': 'qwen_demo','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}@app.route('/api/query', methods=['POST'])
def handle_query():data = request.jsonuser_query = data.get('query')if not user_query:return jsonify({'error': 'No query provided'}), 400try:# 生成SQLsql = generate_sql_from_nl(user_query)# 执行SQLconnection = pymysql.connect(**db_config)with connection.cursor() as cursor:cursor.execute(sql)result = cursor.fetchall()return jsonify({'sql': sql,'result': result})except Exception as e:return jsonify({'error': str(e)}), 500if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

启动Flask服务:

python app.py
from flask import Flask, request, jsonify
from flask_cors import CORS
import pymysql
from qwen_model import generate_sql_from_nl  # 假设上面的Qwen代码保存在qwen_model.pyapp = Flask(__name__)
CORS(app)# MySQL配置
db_config = {'host': 'localhost','user': 'root','password': '12345678','database': 'qwen_demo','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}@app.route('/api/query', methods=['POST'])
def handle_query():data = request.jsonuser_query = data.get('query')if not user_query:return jsonify({'error': 'No query provided'}), 400try:# 生成SQLsql = generate_sql_from_nl(user_query)# 执行SQLconnection = pymysql.connect(**db_config)with connection.cursor() as cursor:cursor.execute(sql)result = cursor.fetchall()return jsonify({'sql': sql,'result': result})except Exception as e:return jsonify({'error': str(e)}), 500if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

test_api.py 

import requestsurl = "http://127.0.0.1:5000/api/query"
data = {"query": "价格大于3000的产品"  # 这里可以换成你想测试的自然语言问题
}response = requests.post(url, json=data)
print("Status Code:", response.status_code)
print("Response:", response.json())

4. 在Dify中创建工作流

  1. 登录Dify平台

  2. 创建一个新的工作流

  3. 添加以下节点:

节点1: 用户输入

  • 类型:输入节点

  • 配置:接收用户的中文查询

节点2: 调用Flask API

  • 类型:HTTP请求节点

  • 配置:

    • URL: http://your-flask-server:5000/api/query

    • 方法: POST

    • Headers:

      • Content-Type: application/json

    • Body:

      {"query": "{{input.query}}"
      }

节点3: 结果格式化

  • 类型:JavaScript处理节点

  • 代码:

function formatResult(data) {const result = data.result;if (result.length === 0) return "没有找到匹配的结果";let output = "查询结果:\\n";result.forEach(item => {output += `名称: ${item.name}, 类别: ${item.category}, 价格: ${item.price}, 库存: ${item.stock}\\n`;});return {sql: data.sql,result: output};
}return formatResult(input);

节点4: 输出结果

  • 类型:输出节点

  • 配置:显示格式化后的结果

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

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

相关文章

Transformer数学推导——Q55 证明跨层残差跳跃(Cross-Layer Skip Connections)的信息融合效率

该问题归类到Transformer架构问题集——残差与归一化——残差连接。请参考LLM数学推导——Transformer架构问题集。 1. 引言 在深度学习的发展历程中,网络结构的不断创新推动着模型性能的持续提升。跨层残差跳跃(Cross-Layer Skip Connections&#xf…

41.寻找缺失的第一个正数:原地哈希算法详解

文章目录 引言问题描述方法思路:原地哈希算法算法步骤 完整代码实现关键代码解析复杂度分析示例说明总结 引言 在算法面试和数据处理中,寻找缺失的第一个正数是一个经典问题。题目要求给定一个未排序的整数数组,找到其中缺失的最小正整数&am…

matlab 中function的用法

matlab 中function的用法 前言介绍1. 基本语法示例(1)可以直接输出(2)调用函数 2.输入参数和输出参数示例多输入参数和输出参数定义一个函数,计算两个数的和与差:调用该函数: 3. 默认参数示例 4…

HarmonyOS开发之基于子窗口实现应用内悬浮窗

鸿蒙开发:基于子窗口实现应用内悬浮窗(含完整代码示例) 在现代移动应用中,悬浮窗/悬浮球是一种非常实用的交互方式,常用于展示快捷入口、实时通知、视频播放等场景。例如: 聊天应用中的小助手按钮视频应用的画中画功能游戏或工具类…

可以下载blender/fbx格式模型网站

glbxz.com glbxz.com可以下载blender/fbx格式模型。当然里面有免费的

250505_HTML

HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.4 title1.3.5 meta 1.4 html骨架1.4.1 DTD1.4.2 html标签1.4.3 head与body标签 1.5 div标签详解1.5.1 常见class类名 1.6 列…

数据封装的过程

数据的封装过程 传输层 UDP 直接将数据封装为UDP数据报​,添加UDP头部(8B)。 要点: UDP首部简单,无连接不可靠、无重传、无拥塞控制,适用于实时性要求较高的通讯;不需要源端口或不想计算检…

面向AGI的语言认知操作系统形式化模型

邹晓辉融智学语言数据库体系的数学表达 ——面向AGI的语言认知操作系统形式化模型 1. 基础定义与符号系统 设语言宇宙 L 为所有语言要素的集合,其结构可分解为: LY(言)U(语)A(用) 其中: YPGS (音/形/义三元组) U⋃…

基于 Spring Boot 瑞吉外卖系统开发(十)

基于 Spring Boot 瑞吉外卖系统开发(十) 修改菜品 修改菜品是在原有的菜品信息的上对菜品信息进行更新,对此修改菜品信息之前需要将原有的菜品信息在修改界面进行展示,然后再对菜品信息进行修改。 修改菜品分为回显菜品信息和更…

Three.js和WebGL区别、应用建议

Three.js 和 WebGL 是用于在浏览器中创建 3D 图形的两种技术,它们之间有明显的区别和适用场景。 对于一般数据展示和模型展示而言,应用更多的是three.js,毕竟相对学习成本来说webGL跟高,需要投入更多的精力和基础功能的开发和验证上。而three.js封装了webGL的功能,开发相对…

【Vue】移动端开发(Uni-app、Taro)

个人主页:Guiat 归属专栏:Vue 文章目录 1. Uni-app 与 Taro 简介1.1 什么是 Uni-app?1.2 什么是 Taro?1.3 Uni-app vs Taro(对比图) 2. 项目初始化与目录结构2.1 初始化 Uni-app 项目2.2 初始化 Taro 项目&…

自定义SpringBoot Starter-笔记

SpringBoot Starter的介绍参考: Spring Boot Starter简介-笔记-CSDN博客。这里介绍如何自定义一个springBoot Starter。 1. 项目结构 创建一个 Maven 项目,结构如下: custom-spring-boot-starter-demo/ ├── custom-hello-jdk/ # jdk模…

linux >!

Linux 中 >! 符号的含义与用法 ‌基本定义‌在 Linux Shell 中,>! 是由 > 和 ! 组合的特殊符号,主要用于 ‌强制覆盖文件‌。其行为与常规的 > 类似,但额外添加了忽略潜在限制的功能。 ‌典型场景‌绕过 noclobber 限制‌: 若 Shell 启用了 noclobber 选项(默…

共铸价值:RWA 联合曲线价值模型,撬动现实资产生态

摘要 本文提出了一种针对真实资产(RWA)产业的联合曲线激励模型,将劳动与数据贡献映射为曲线价值,并基于固定档位与指数衰减奖励发放总计 2.1亿积分。该模型结合了去中心化定价与平滑递减机制,不仅为早期贡献者提供更高…

java安全入门

文章目录 java基础知识this变量方法可变参数构造方法继承的关键字protected super阻止继承方法重载向上转型和向下转型多态抽象接口static静态字段default方法 包final内部类 java序列化与反序列化反射urldns链动态代理类加载器(ClassLoader)双亲委派模型…

前端基础之《Vue(14)—组件通信(1)》

一、什么是组件通信 1、通信是组件或模块之间的数据交互。 2、组件多重通信就形成了数据流,数据流管理的优劣决定了产品能否上线,返工是否频繁的问题。 3、Vue中有哪些常见的通信方案? 组件树的概念: 在Vue中,组件…

el-row el-col

参考layout布局 Element - The worlds most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.cn/#/zh-CN/component/layout#row-attributes 一行可以看做24个 Element UI 中的 el-row 是…

Socket-TCP

在TCP/ip协议中,用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信! 端口号范围划分 0 - 1023: 知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。…

大数据Spark(五十八):Spark Pi介绍

文章目录 Spark Pi介绍 Spark Pi介绍 Spark Pi是Apache Spark官方提供的一个示例程序,该案例使用 Spark 进行分布式计算,通过蒙特卡罗方法估算圆周率(π)的值,其估算π原理如下: 上图中,正方形…

Doris索引机制全解析,如何用高效索引加速数据分析

在当今大数据时代,企业对于实时数据分析的需求呈现爆发式增长。面对动辄PB级的数据量和秒级响应的业务诉求,传统数据库系统往往力不从心。Apache Doris作为新一代MPP分析型数据库,凭借其独特的索引机制,在京东、美团等企业的实时数…