LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

背景

前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型,然后使用 Docker Compose 一键部署了 Dify 社区版平台。

  1. LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库:在 Dify 平台上,通过普通编排的方式,创建了基于 Qwen2.5 模型的聊天助手,并添加了个人知识库作为上下文,实现了真正的个人助手功能。

  2. LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI搜索引擎:介绍了使用 Dify 提供的工作流编排以及 Dify 自带的 Tavily Search 搜索工具、 LLM 模型 Qwen2.5 (7B) 模型实现自己专属的AI搜索引擎

  3. LLM大语言模型私有化部署-使用Dify的Agent与Flux.1打造专属文生图智能体:使用 Dify 提供的Agent智能体功能,结合 LLM 模型 Qwen2.5 (7B) ,同时利用外部工具 Flux.1 (文生图的“新王”)实现自己专属的文生图智能体

今天我们使用 Dify 提供的工作流编排以及 Dify 自带的 代码执行 或者 HTTP请求 模块,依托阿里百炼的 LLM 模型 qwen2.5-14b-instruct / qwen2.5-72b-instruct / qwen-plus-latest 模型(低于14B的模型效果一般。。)实现对 MySQL 中的诗词数据库进行分析,实现自己的AI数据分析师

Note:阿里百炼平台对新用户每个模型免费调用1000000次,测试够用了。。

先上效果图

2025-02-23-1-SongTop10.gif

对应生成的 SQL 如下,是个单表聚合查询语句,可以看出大模型可以完全遵循自然语言指令生成 SQL 语句,并绘制合适的ECharts图表,Nice~

-- 看下宋词相同词牌名的Top10,从多到少排序
SELECT title, COUNT(*) AS COUNT
FROM poems
GROUP BY title
ORDER BY COUNT DESC
LIMIT 10

打造专属AI数据分析师

新建工作流编排聊天助手

新建一个“聊天助手”类型的应用,编排方法选择“工作流编排”。

2025-02-23-2-NewApp.jpg

添加LLM-生成SQL节点

先选择一个合适的模型,这里经过测试,阿里百炼的 LLM 模型 qwen2.5-14b-instruct / qwen2.5-72b-instruct / qwen-plus-latest 模型(低于14B的模型效果一般。。也可以试试 DeepSeek ~~)均可实现稳定的输出。

2025-02-23-4-LLMModel.jpg

具体内容看以下提示词内容,需要说明的是,这里的表结构我是直接通过 MySQLdesc 直接得到的。

2025-02-23-3-TableDesc.jpg

  • SYSTEM提示词

2025-02-23-5-PromptSystem.jpg

# 你是数据分析专家,精通MySQL,能够根据用户的问题生成高效的SQL查询。

## 数据库表结构

### 1. poetry(唐诗宋诗表);

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| author_id  | int(11)      | YES  |     | 0       |                |
| title      | varchar(255) | NO   |     | NULL    |                |
| content    | text         | NO   |     | NULL    |                |
| yunlv_rule | text         | YES  |     | NULL    |                |
| author     | varchar(255) | NO   |     | NULL    |                |
| dynasty    | char(1)      | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

### 2. poetry_author(唐诗宋诗作者表);

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | NO   |     | NULL    |                |
| intro   | text         | YES  |     | NULL    |                |
| dynasty | char(1)      | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

### 3. poems(宋词表);

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| author_id | int(11)      | YES  |     | 0       |                |
| title     | varchar(255) | NO   |     | NULL    |                |
| content   | text         | NO   |     | NULL    |                |
| author    | varchar(255) | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

### 4. poems_author(宋词作者表);

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | NO   |     | NULL    |                |
| intro_l | text         | YES  |     | NULL    |                |
| intro_s | text         | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

注意:dynasty字段存储的是缩写:S代表宋,T代表唐
  • USER提示词

2025-02-23-6-PromptUser.jpg

问题:{{#sys.query#}}
请严格按照以下要求回答:
1. 仅使用提供的表和字段
2. 输出内容直接给完整SQL,不要任何Markdown格式,不要有注释,不要有换行

添加HTTP请求执行SQL查询节点

Dify 中执行 SQL 查询可以有两种方式:

  1. 通过代码执行节点的方式,直接完成从数据库中查询工作(由于Docker部署方式的Dify里的Sandbox沙箱安全机制,导致无法连接外部的MySQL数据库,这种方式没有成功,下一篇专门来介绍下如何在Sandbox沙箱中安装Python依赖以及如何配置Sandbox沙箱网络);
  2. 通过HTTP请求的方式,请求一个部署好的API服务,本文采用这种方式。
执行SQL查询的API

先介绍下这个执行 SQL 查询的 API 服务,代码格式如下,核心是 execute_query.py 文件,并将其构建为一个 Docker 镜像进行容器化部署。

└── fastapi/
    ├── execute_query.py
    ├── requirements.txt
    ├── Dockerfile
    └── README.md
  • execute_query.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import pymysql
import uvicorn
from contextlib import contextmanager

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
):
    # 处理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)}")

if __name__ == '__main__':
    # 数据库配置
    app.db_config = {
        "host": "192.168.44.171",
        "user": "root",
        "password": "root",
        "database": "poetry",
        "port": 3306,
        "charset": 'utf8mb4'
    }
    uvicorn.run(app, host='0.0.0.0', port=35005)
  • requirements.txt
fastapi==0.115.8
pydantic==2.10.6
pymysql==1.1.1
uvicorn==0.34.0
  • Dockerfile
# 使用官方的 Python 基础镜像
FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 复制 requirements.txt 文件并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用程序代码
COPY . .

# 暴露应用程序的端口(如果需要)
EXPOSE 35005

# 定义启动命令
CMD ["python", "execute_query.py"]
  • README.md
1. 使用pipreqs第三方库生成requirements.txt

pip install pipreqs
pipreqs ./ --encoding=utf8 --force

2. 安装依赖

pip install -r requirements.txt

3. 构建镜像

docker build -t poetry-image .

4. 运行容器

docker run -p 35005:35005 -d --name poetry poetry-image

5. 验证接口

curl -X POST http://192.168.44.171:35005/execute_query      -H "Content-Type: application/json"      -d '{"sql_query":"select * from poetry limit 1;"}'
配置HTTP请求节点-执行SQL查询

配置 POST 接口的API地址、Headers信息与参数信息。

Note:参数可以通过输入 / 进行快捷选择。

2025-02-23-7-HTTPAPI.jpg

添加LLM-数据分析节点

LLM-数据分析节点,编辑SYSTEM系统提示词如下 :

# 数据分析专家工作指南

## 角色定位

专业的SQL数据分析专家,负责解读MySQL poetry数据库的查询结果:{{#1740285905752.body#}}

## 核心规则

1. 直接分析已提供数据,默认数据已满足查询条件

2. 接受数据原貌,不质疑数据有效性

3. 无需二次筛选或验证数据范围

4. 空数据集统一回复"没有查询到相关数据"

5. 避免使用提示性语言

6. 分析结果以markdown格式输出

7. 整理sql查询结果,以markdown表格格式输出放置输出开头

8. 整理sql查询结果, 以echarts图表格式输出放最后,图表配置需要尽量简洁,不要有太多冗余的配置项输出格式如下:

``echarts
{
  "title": {
    "text": "示例图表",
    "subtext": "ECharts 示例"
  },
  "tooltip": {
    "trigger": "item",
    "formatter": "{a} <br/>{b}: {c} ({d}%)"
  },
  "legend": {
    "orient": "vertical",
    "left": "left",
    "data": ["A", "B", "C", "D"]
  },
  "series": [
    {
      "name": "示例数据",
      "type": "pie",
      "radius": "50%",
      "data": [
        { "value": 335, "name": "A" },
        { "value": 310, "name": "B" },
        { "value": 234, "name": "C" },
        { "value": 135, "name": "D" }
      ],
      "emphasis": {
        "itemStyle": {
          "shadowBlur": 10,
          "shadowOffsetX": 0,
          "shadowColor": "rgba(0, 0, 0, 0.5)"
        }
      }
    }
  ]
}
``

9. 注意:如果sql查询结果为标量或者仅有一个结果,就取消Echarts图表。另外,根据结果自行决定使用不同的ECharts类型,eg: 柱状图、饼图、折线图、雷达图等。

## 分析报告规范

### 数据处理原则

1. 严格基于JSON数据集

2. 数据已预筛选,直接进行统计分析

3. 不进行数据条件的二次确认

### 报告结构要求

1. 数据概览

2. 详细分析

3. 结论部分

Note: 上述 ECharts 格式的代码应该用三个反引号,我这里是因为跟文章里的代码片段格式冲突改成了两个反引号。。

2025-02-23-8-PromptAnalysis.jpg

测试预览试一下

2025-02-23-9-Test.jpg

数据分析结果

随便运行几个分析查询试下:

  1. 单表聚合查询
-- 统计创作唐诗最多的作者的Top10,仅列出超过500首的作者,从多到少排序
SELECT p.author, COUNT(*) AS poem_count
FROM poetry p
WHERE p.dynasty = 'T'
GROUP BY p.author
HAVING poem_count > 500
ORDER BY poem_count DESC
LIMIT 10

2025-02-23-10-Test1.gif

  1. 单表条件查询
-- 统计分别包含风、花、雪、月、山、水的唐诗数量
SELECT SUM(CASE WHEN content LIKE '%风%' THEN 1 ELSE 0 END) AS wind_count, SUM(CASE WHEN content LIKE '%花%' THEN 1 ELSE 0 END) AS flower_count, SUM(CASE WHEN content LIKE '%雪%' THEN 1 ELSE 0 END) AS snow_count, SUM(CASE WHEN content LIKE '%月%' THEN 1 ELSE 0 END) AS moon_count, SUM(CASE WHEN content LIKE '%山%' THEN 1 ELSE 0 END) AS mountain_count, SUM(CASE WHEN content LIKE '%水%' THEN 1 ELSE 0 END) AS water_count
FROM poetry
WHERE dynasty = 'T'

2025-02-23-10-Test2.gif

  1. 多表联合查询
-- 谁写的唐诗最多,给出作者详细信息
SELECT pa.name, pa.intro, COUNT(p.id) AS poem_count
FROM poetry p
JOIN poetry_author pa ON p.author_id = pa.id
WHERE p.dynasty = 'T'
GROUP BY p.author_id
ORDER BY poem_count DESC
LIMIT 1

2025-02-23-10-Test3.gif

小总结

本文通过使用 Dify 平台的工作流编排功能,结合阿里百炼的大型语言模型(如 qwen2.5-14b-instruct 等),成功打造了一个专属的AI数据分析师。能够根据用户提供的自然语言问题生成对应的 SQL 查询语句,并通过部署好的 API 服务执行这些查询,最终由另一个 LLM 节点对查询结果进行专业的数据分析和可视化展示。

整个过程不仅展示了大模型在理解和生成 SQL 方面的能力,还体现了通过集成不同工具和服务来构建复杂应用的可能性。例如,可以统计创作唐诗最多的作者、分析唐诗中特定元素的出现频率,以及联合查询作者信息与作品数量等,今后面对领导的取数需求,你可以直接替换数据源,轻松实现各种数据分析和可视化需求。

Reference

  • http://difyai.com/
  • https://github.com/langgenius/dify
  • https://docs.dify.ai/zh-hans
  • https://docs.dify.ai/v/zh-hans/guides/workflow/node/http-request

If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux虚拟机快照

快照管理 如果在使用虚拟机系统的时候(比如linux)&#xff0c;想回到原先的某一个状态&#xff0c;也就是说担心可能有些误操作造成系统异常&#xff0c;需要回到原先某个正常运行的状态 示例&#xff1a; 状态A和状态B处各保存了快照&#xff0c;运行到状态C时发生异常&…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题&#xff1a; 这个是在新版的pycharm中出现的&#xff0c;出现的问题&#xff0c;点击view后不全部显示&#xff0c;而是以...折叠显示 在setting中这么设置一下就好了&#xff1a; 解决办法&#xff1a; https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

快速入门Springboot+vue——MybatisPlus多表查询及分页查询

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;7.MybatisPlus多表查询及分页查询_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 多表查询 多表查询[Mybatis中的]&#xff1a;实现复杂关系映射&#xff0c;可以使…

vscode 配置 Copilot 提示GHE.com连接失败

步骤一&#xff1a;打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接&#xff0c;这会打开 settings.json 文件。 步骤二&#…

基于拼接的宏基因组全流程

下面是基于组装的宏基因组数据分析流程 目录 基本流程介绍 megahit组装 什么是N50? 基于拼接结果的基因预测 cdhit去冗余 功能注释 宏基因组的分箱操作 分箱的目的&#xff1a; 分箱的原理&#xff1a; 基本流程介绍 单独对每个样本进行基因集组装&#xff0c;得到genome1,2,3…

基于javaweb的SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

Grok 3.0 Beta 版大语言模型评测

2025年2月17日至18日&#xff0c;全球首富埃隆马斯克&#xff08;Elon Musk&#xff09;携手其人工智能公司xAI&#xff0c;在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI&#xff0c;不仅集成了先进的“DeepSearch”搜索功能&#xff0…

【R语言】绘图

一、散点图 散点图也叫X-Y图&#xff0c;它将所有的数据以点的形式展现在坐标系上&#xff0c;用来显示变量之间的相互影响程度。 ggplot2包中用来绘制散点图的函数是geom_point()&#xff0c;但在绘制前需要先用ggplot()函数指定数据集和变量。 下面用mtcars数据集做演示&a…

php session数据存储位置选择

PHP session 数据的存储位置可以通过配置文件或者代码来进行设置。默认情况下&#xff0c;session 数据是存储在服务器的文件系统中的。你可以将 session 数据存储在其他地方&#xff0c;例如数据库、缓存等。 基础概念 PHP session默认情况下将数据存储在服务器端的临时文件中…

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek

要在Postman中访问Ollama API并调用DeepSeek模型&#xff0c;你需要遵循以下步骤。首先&#xff0c;确保你有一个有效的Ollama服务器实例运行中&#xff0c;并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级&#xff01;使用Ollama本地部署DeepSeek-R1大模型 并java…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识&#xff0c;华夏&#xff0c;芊熠这三种车牌识别相机解密我都试过了&#xff0c;可以正常解密成功&#xff0c;其它品牌我暂时没有测试。超级简单&#xff0c;免费的&#xff0c;白嫖无敌&#xff01; 流程&#xff1a; ①&#xff1a;先导出配置文件&#xff0c;例如我以…

RK Android11 WiFi模组 AIC8800 驱动移植流程

RK Android WiFi模组 AIC8800 驱动移植流程 作者&#xff1a;Witheart更新时间&#xff1a;20250220 概要&#xff1a;本文介绍了基于 AIC8800D40 芯片的 WiFi6 模组 BL-M8800DS2-40 在 RK3568 平台上的驱动移植流程。主要涉及环境搭建、驱动代码分析、设备树修改、驱动编译配…

Unity Shader Graph 2D - Procedural程序化图形循环加载进度效果

前言 在游戏中进度加载的效果是一种常见的效果,可以告诉玩家当前游戏处于一个资源加载的状态,这样玩家就能理解游戏不是卡住了或者是出现Bug了,而是正在进行一些数据的处理准备进入下一个场景。 创建一个LineLoading的Shader Graph文件,对应创建一个材质球,然后在…

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

Java网络编程封装

系列文章目录 Java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、封装的目标&#x1f449;二、套接字层封装&#x1f449;壁纸分享&#x1f449;总结 &#x1f449;前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来&#xff0c;提供简洁…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

边缘安全加速(Edge Security Acceleration)

边缘安全加速&#xff08;Edge Security Acceleration&#xff0c;简称ESA&#xff09;是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方&#xff0c;通常是在网络的边缘&#xff0c;而不是将所有流…

SpringBoot+Mybatis-Plus实现动态数据源

目录 一、前言二、代码实现1&#xff09;工程结构2&#xff09;相关依赖3&#xff09;数据源拦截切面4&#xff09;动态数据源切换5&#xff09;核心配置类6&#xff09;使用 三、原理分析1&#xff09;mapper接口注入流程2&#xff09;动态数据源切换执行流程 四、声明式事务导…

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块&#xff08;PCB&#xff09; 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序&#xff0c;而程序是存放在磁盘的&#xff0c;cpu要想执行程序的指…