dify-SQL查询

news2025/3/12 5:45:31

第1节 DIFY 编排流程
1.1 步骤
1.开始:用户输入分析需求
2.LLM-SQL 专家:大模型根据用户输入需求生成 SQL 查询
3.SQL查询:执行查询并获取数据
4.结束:输出查询结果集

1.2 工作流
在这里插入图片描述

第2节 组件配置
2.1 开始
新建一个开始组件,并增加一个输入参数,用于用户输入自然语言
在这里插入图片描述

2.2 LLM-SQL 专家
增加一个LLM模型组件,命名为LLM-SQL 专家

在这里插入图片描述

2.2.1 模型
选择自己已经部署的模型,设置不联网
在这里插入图片描述

2.2.2 上下文
输入/ 出现变量,选择跟开始组件中对应的变量名即可

2.2.3 System

你是数据分析专家,精通MySQL,能够根据用户的问题生成高效的SQL查询, 详细规则如下

核心规则

  1. 仅使用提供的表和字段
  2. 确保SQL语句兼容MySQL
  3. 仅使用简体中文
  4. 输出单个完整的SQL语句,无注释
  5. 结果集第一列为员工姓名相关信息
  6. 结果集第二列为薪资相关信息
  7. 输出sql不要换行符号
  8. 查询输出限制10条内, 输出sql注意优化

数据库表结构

1. dept_emp(部门员工关系表)

+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| dept_no | char(4) | NO | PRI | NULL | |
| from_date | date | NO | | NULL | |
| to_date | date | NO | | NULL | |
+-----------+---------+------+-----+---------+-------+

2. departments(部门表)

+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_no | char(4) | NO | PRI | NULL | |
| dept_name | varchar(40) | NO | UNI | NULL | |
+-----------+-------------+------+-----+---------+-------+

3. employees(员工表)

+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+

4. salaries(薪资表)

+-----------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| salary | int | NO | | NULL | |
| from_date | date | NO | PRI | NULL | |
| to_date | date | NO | | NULL | |
+-----------+------+------+-----+---------+-------+

5. titles(职位表)

+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| title | varchar(50) | NO | PRI | NULL | |
| from_date | date | NO | PRI | NULL | |
| to_date | date | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+

查询技巧

1. 日期处理

-- 当前在职员工
WHERE to_date = '9999-01-01'


-- 日期范围查询
WHERE from_date BETWEEN '2000-01-01' AND '2000-12-31'

2. 名字处理

-- 连接姓名
CONCAT(first_name, ' ', last_name) AS full_name


-- 模糊查询
WHERE first_name LIKE '%John%'

3. 聚合函数

  • COUNT(): 计算数量
  • AVG(): 计算平均值
  • SUM(): 计算总和
  • MAX()/MIN(): 获取最大/最小值

4. 常用JOIN

-- 员工部门信息
FROM employees e
JOIN dept_emp de ON e.emp_no = de.emp_no
JOIN departments d ON de.dept_no = d.dept_no


-- 当前薪资信息
JOIN salaries s ON e.emp_no = s.emp_no 
WHERE s.to_date = '9999-01-01'

查询示例

1. 查询员工当前薪资

SELECT 
CONCAT(e.first_name, ' ', e.last_name) as name,
s.salary
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no
WHERE s.to_date = '9999-01-01';

2. 查询部门经理信息

SELECT 
CONCAT(e.first_name, ' ', e.last_name) as name,
s.salary,
d.dept_name
FROM employees e
JOIN dept_manager dm ON e.emp_no = dm.emp_no
JOIN departments d ON dm.dept_no = d.dept_no
JOIN salaries s ON e.emp_no = s.emp_no
WHERE dm.to_date = '9999-01-01'
AND s.to_date = '9999-01-01';

注意事项

  1. 查询当前状态需检查to_date
  2. 使用适当的索引以提高查询效率
  3. 合理使用JOIN条件
  4. 注意日期格式的一致性
  5. 使用合适的聚合函数

2.2.4 User
请将此 开始/(x)txt 翻译成一段SQL语句,不要注释

注意此红色即为开始中的输入参数,要当做用户参数传给大模型

2.2.5 输出变量
默认 text string即可

2.3 SQL查询
2.3.1 环境准备
在本地mysql新建数据库employees ,执行脚本 employees.sql新建表和数据

在python中写一段脚本

# -*- coding: UTF-8 -*-
from fastapi import FastAPI, HTTPException, Header
from pydantic import BaseModel
from typing import List, Dict, Any, Optional, Union
import pymysql
import uvicorn
from contextlib import contextmanager
import json

app = FastAPI()

class SQLQuery(BaseModel):
    sql_query: str

@contextmanager
def get_db_connection(config):
    """数据库连接的上下文管理器"""
    conn = None
    try:
        conn = pymysql.connect(**config)
        yield conn
    finally:
        if conn:
            conn.close()

@app.post("/execute_query")
async def execute_query(
    query: SQLQuery,
    api_key: Optional[str] = Header(None, alias="X-API-Key")
):
    """处理POST请求以执行SQL查询。"""
    try:
        sql_queries = query.sql_query.strip()
        if not sql_queries:
            raise HTTPException(status_code=400, detail="Missing sql_query parameter")
        with get_db_connection(app.db_config) as conn:
            results = []
            with conn.cursor(pymysql.cursors.DictCursor) as cursor:
                for sql_query in sql_queries.split(';'):
                    if sql_query.strip():
                        cursor.execute(sql_query)
                        result = cursor.fetchall()
                        if result:
                            results.extend(result)
                conn.commit()
        return results
    except pymysql.Error as e:
        raise HTTPException(status_code=500, detail=f"数据库错误: {str(e)}")
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"服务器错误: {str(e)}")

def verify_api_key(api_key: Optional[str]) -> bool:
    """验证API密钥"""
    return api_key == app.api_key

if __name__ == '__main__':
    # 数据库配置
    app.db_config = {
        "host": "127.0.0.1",
        "user": "root",
        "password": "123456",
        "database": "employees",
        "port": 3306,
        "charset": 'utf8mb4'
    }


    # 添加API密钥配置
    app.api_key = "oWoh*thae5"  # 建议使用环境变量存储此密钥


    uvicorn.run(app, host='0.0.0.0', port=35003)

修改红色部分的数据库账号和密码,执行此程序,则构建了一个fastapi接口
可以在postman中调用

http://192.168.2.66:35003/execute_query

{
"sql_query":"SELECT CONCAT(e.first_name, ' ', e.last_name) as name,s.salary FROM employees e JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01' limit 10;"
}

测试结果如下:
在这里插入图片描述

2.3.2 配置组件
在这里插入图片描述

主要配置这两个地方:
2.3.2.1 API
选择post,填入自己的地址
http://192.168.2.66:35003/execute_query

2.3.2.2 Body
选择json,内容构造测试的结构
{
“sql_query”:“LLM-SQL 专家/(x)text”
}

红色部分即为上一个组件输出的值

2.3.2.3 输出
默认即可

2.4 结束
在这里插入图片描述

2.4.1 输出变量
files:SQL查询.body

第3节 执行工作流
在这里插入图片描述

3.1 示例一:查询员工当前薪资

在这里插入图片描述

3.2 示例二:查询部门经理信息
在这里插入图片描述

3.3 示例三:查询部门经理名叫 Vishwani的薪资
在这里插入图片描述

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

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

相关文章

贪心算法精解:用C++征服最优解问题

贪心算法精解:用C征服最优解问题 一、贪心算法的本质:当下最优即全局最优 贪心算法如同下棋高手,每一步都选择当前最优的走法。它的核心思想是:通过局部最优选择的叠加,最终得到全局最优解。这种算法在时间复杂度上往…

一文了解汽车图像传感器

2024年底,安森美做了题为"How Automotive Image Sensors Transform the Future of Autonomous Driving"的演讲,这里结合其内容对自动驾驶图像传感器做一个介绍。 当前的自动驾驶感知技术主要有两大技术路线:一种是仅使用摄像头作为传感器进行信息采集的纯…

2025数据存储技术风向标:解析数据湖与数据仓库的实战效能差距

一、技术演进的十字路口 当前全球数据量正以每年65%的复合增长率激增,IDC预测到2027年企业将面临日均处理500TB数据的挑战。在这样的背景下,传统数据仓库与新兴数据湖的博弈进入白热化阶段。Gartner最新报告显示,采用混合架构的企业数据运营效…

ubuntu软件

视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

《面向对象程序设计-C++》实验一 熟悉Visual C++开发环境及上机过程

一、实验目的 了解和使用VC集成开发环境;熟悉VC环境的基本命令和功能键;熟悉常用的功能菜单命令;学习使用VC环境的帮助;学习完整的C程序开发过程;理解简单的C程序结构。 二、实验内容 使用Visual C 6.0集成环境来编…

Java的 JDBC 编程

1. Java的数据库编程:JDBC JDBC:Java 通过JDBC这样的技术来操作 MySQL MySQL 是一个基于 C/C 实现的数据库。 本身也提供了一系列的 API (Application Progromming Interface),让程序员调用,从而通过代码来…

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权,禁止商用!本项目未经授权,禁止商用!本项目未经授权&…

如何将ipynb文件转换为pdf文件

事情起因: 基本我所有的code以及代码注释,以及出图说明都统一放在jupyter notebook中, 代码注释,或者文档说明,实际上就是markdown所做的那一切,都是在markdown中写的; 代码的话,…

具备多种功能的PDF文件处理工具

软件介绍 在日常办公和学习场景中,PDF文件使用极为频繁,而一款功能强大的PDF编辑软件能大幅提升处理效率。 今天要介绍的Adobe Acrobat Pro DC 2024.005.20414,就具备像编辑Word文档一样便捷编辑PDF的能力。 PDF文档在学习和工作中广泛应用…

如何做好滚珠导轨的防尘工作?

滚珠导轨滑块在使用过程中,会吸附大量的灰尘和污垢,导致摩擦力增大,使用寿命缩短。那么,我们应该如何做好滚珠导轨的防尘工作呢? 1、使用防护罩:对于外露的滚珠导轨,可安装如螺旋弹簧钢带套管、…

nettrace rtt分析器

开源工具学习记录之流程梳理 近期对腾讯的的开源项目: nettrace(网络故障分析工具) ,进行源码学习。 开源仓库:Nettrace开源仓库 开源工具实现注释:nettrace学习记录 Nettrace学习记录之流程梳理Nettrace eBPF程序自动挂载方式探究 nettrace rtt分析器…

裂变营销策略在“开源链动2+1模式AI智能名片S2B2C商城小程序”中的应用探索

摘要:在当今数字化时代,企业营销手段日新月异,裂变营销作为一种高效的用户增长策略,正逐渐成为众多企业竞相探索的焦点。本文旨在探讨“开源链动21模式AI智能名片S2B2C商城小程序”中裂变营销的应用,通过“分名、分利、…

WangEditor快速实现版

WangEditor快速实现版 效果 案例代码 后端 package com.diy.springboot.controller;import cn.hutool.core.util.IdUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiImplicitParam; import org.sp…

Java常见面试技术点整理讲解——后端框架(整理中,未完成)

前言: 对于后端常用框架的技术整理,其实框架在平时就是会用就行,但面试时多半需要描述实现原理,这个要靠自己理解,不推荐死记硬背。 这篇和另外几篇文章区分开,主要用于规整Java后端各种框架,…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

加速科技Flex10K-L测试机:以硬核创新重塑显示驱动芯片测试新标杆!

在2024年召开的世界显示产业创新发展大会上,加速科技自主研发的高密度显示驱动芯片测试设备Flex10K-L凭借其突破性技术创新,成功入选"十大创新技术(产品)"。作为国内显示驱动芯片测试领域的标杆性设备,Flex1…

linux-文本处理命令(echo,cut,sort,uniq,wc,tr,grep)

echo 打印(标准输入输出命令) [rootlocalhost ~]# echo $HOSTNAME-----$引用变量 localhost [rootlocalhost ~]# echo "$HOSTNAME"----“”弱引用符(可以解释特殊含义的字符) localhost [rootlocalhost ~]# echo $HOSTN…

spring-boot-starter和spring-boot-starter-web的关联

maven的作用是方便jar包的管理,所以每一个依赖都是对应着相应的一个或者一些jar包,从网上看到很多对spring-boot-starter的描述就是“这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。”没看太明白,所参与的项目上也一直…

群晖DS223 Docker搭建为知笔记

群晖DS223 Docker搭建为知笔记,打造你的专属知识宝库 一、引言 在数字化信息爆炸的时代,笔记软件成为了我们管理知识、记录灵感的得力助手。为知笔记,作为一款专注于工作笔记和团队协作的云笔记产品,以其丰富的功能和便捷的使用体…