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

server/2025/2/27 12:44:20/

背景

前面的文章通过 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

LLMSQL_36">添加LLM-生成SQL节点

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

2025-02-23-4-<a class=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 contextmanagerapp = FastAPI()class SQLQuery(BaseModel):sql_query: str@contextmanager
def get_db_connection(config):# 数据库连接的上下文管理器conn = Nonetry:conn = pymysql.connect(**config)yield connfinally: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 resultsexcept 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.txtpip install pipreqs
pipreqs ./ --encoding=utf8 --force2. 安装依赖pip install -r requirements.txt3. 构建镜像docker build -t poetry-image .4. 运行容器docker run -p 35005:35005 -d --name poetry poetry-image5. 验证接口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_264">添加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!


http://www.ppmy.cn/server/171035.html

相关文章

轮式机器人在复杂地形中如何选择合适的全局路径规划算法

已思考完成 收起 好的&#xff0c;我现在需要回答用户关于轮式机器人局部路径规划算法的问题。用户之前已经提过这个问题&#xff0c;现在提供了更多的参考内容&#xff0c;我需要仔细分析这些内容&#xff0c;整理出合适的答案。 首先&#xff0c;我需要回顾用户提供的参考内容…

C++ Qt常见面试题(1):Qt信号槽的理解

C++ 中的 Qt 信号槽机制 是 Qt 框架中用于实现组件间通信的核心机制之一。它是一种 观察者模式 的实现,提供了一种安全、灵活且松耦合的方式来连接对象和处理事件。下面从10个方面来介绍C++ Qt信号槽的原理及使用技巧。 一. Qt信号槽机制的基本概念 信号(Signal):对象中定义…

云端运维:专栏概要与内容目录

文章目录 云端运维技术专栏&#x1f4da; 核心内容模块服务器远程访问与网络配置远程访问内网穿透与网络优化网络连接问题 开发环境管理Jupyter管理Anaconda环境管理 容器与服务管理Docker使用服务器后台管理 系统问题诊断与解决开发工具版本控制 其他实用技巧 云端运维技术专栏…

基于阿里云PAI平台快速部署DeepSeek大模型实战指南

一、DeepSeek大模型&#xff1a;企业级AI应用的新标杆 1.1 为什么选择DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型凭借其接近GPT-4的性能和开源策略&#xff0c;成为全球开发者关注的焦点。在多项国际评测中&#xff0c;DeepSeek-R1模型在推理能力、多语言支持和…

计算机毕业设计SpringBoot+Vue.js中小企业设备管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

机试刷题_1614. 括号的最大嵌套深度【python】

1614. 括号的最大嵌套深度 class Solution:def maxDepth(self, s: str) -> int:maxD 0if not s:return maxDstack []for char in s:if char(:stack.append(char)maxD max(maxD,len(stack))elif char) :stack.pop()return maxD

rust学习笔记5-所有权机制

rust核心就是所有权机制&#xff0c;是其内存管理的核心特性&#xff0c;旨在消除内存安全问题&#xff08;如空指针、悬垂指针、内存泄漏等&#xff09;而无需依赖垃圾回收&#xff08;GC&#xff09; 1.首先看一下语义模型 当声明一个变量 let a "32";它的语义模…

学习记录:初次学习使用transformers进行大模型微调

初次使用transformers进行大模型微调 环境&#xff1a; 电脑配置&#xff1a; 笔记本电脑&#xff1a;I5&#xff08;6核12线程&#xff09; 16G RTX3070&#xff08;8G显存&#xff09; 需要自行解决科学上网 Python环境&#xff1a; python版本:3.8.8 大模型&#xff1a…