网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

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

python 复制代码
sudo mysql -u root

检查 MySQL 用户认证方式

登录 MySQL 后,执行:

python 复制代码
SELECT user, host, plugin FROM mysql.user WHERE user='root';

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

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

python 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '12345678';
FLUSH PRIVILEGES;

创建数据库和表

python 复制代码
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模型

python 复制代码
pip install transformers torch sentencepiece

text2sql.py

python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer

model_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

测试代码:

python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer

model_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 sql

if __name__ == "__main__":
    query = "查询所有价格大于100的产品"
    sql = generate_sql_from_nl(query)
    print("问题:", query)
    print("SQL:", sql)

3. 使用Flask部署API

python 复制代码
pip install flask flask-cors

创建 app.py:

python 复制代码
from flask import Flask, request, jsonify
from flask_cors import CORS
import pymysql
from qwen_model import generate_sql_from_nl  # 假设上面的Qwen代码保存在qwen_model.py

app = 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.json
    user_query = data.get('query')
    
    if not user_query:
        return jsonify({'error': 'No query provided'}), 400
    
    try:
        # 生成SQL
        sql = generate_sql_from_nl(user_query)
        
        # 执行SQL
        connection = 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)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

启动Flask服务:

复制代码
python app.py
python 复制代码
from flask import Flask, request, jsonify
from flask_cors import CORS
import pymysql
from qwen_model import generate_sql_from_nl  # 假设上面的Qwen代码保存在qwen_model.py

app = 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.json
    user_query = data.get('query')
    
    if not user_query:
        return jsonify({'error': 'No query provided'}), 400
    
    try:
        # 生成SQL
        sql = generate_sql_from_nl(user_query)
        
        # 执行SQL
        connection = 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)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

test_api.py

python 复制代码
import requests

url = "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

节点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: 输出结果

  • 类型:输出节点

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

相关推荐
小白男神21 小时前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶21 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G21 小时前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备21 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客1 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安1 天前
MySQL-触发器
数据库·mysql