基于 DIFY 的自动化数据分析实战

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
视觉智能开放平台,图像通用资源包5000点
简介: 本文介绍如何使用DIFY搭建数据分析自动化流程,实现从输入需求到查询数据库、LLM分析再到可视化输出的全流程。基于经典的employees数据集和DIFY云端环境,通过LLM-SQL解析、SQL执行、LLM数据分析及ECharts可视化等模块,高效完成数据分析任务。此方案适用于人力资源分析、薪酬管理等数据密集型业务,显著提升效率并降低成本。

在数据分析领域,如何高效地从需求出发,查询数据库并进行分析,最终生成可视化报告,是一个核心问题。本文将介绍如何使用 DIFY 搭建一套完整的数据分析自动化流程,实现 输入需求 -> 查询数据库 -> LLM 分析 -> 可视化输出

数据集介绍

本次分析使用 employees 数据集,这是一个经典的员工管理数据库,包含多个核心表,如员工基本信息、薪资记录、部门关系等。该数据集可从 GitHub 仓库 datacharmer/test_db 下载。

DIFY 环境

本次实验基于 DIFY 官方提供的云端环境:DIFY Cloud
相比于私有化部署,云端环境的节点超时时间较短,因此不适合执行过于复杂的 SQL 查询。

编排流程概览

image.png

DIFY 编排实现的数据分析流程如下:

  1. 输入需求:用户输入分析需求
  2. LLM-SQL 解析:大模型根据输入需求生成 SQL 查询
  3. SQL 执行:执行查询并获取数据
  4. LLM-数据分析:基于查询结果进行分析
  5. 输出分析报告:文本分析 + 表格 + 图表

详细实现

1. LLM-SQL 解析模块

在 DIFY 中,我们创建了一个 LLM 角色 SQL 专家,负责将用户输入的自然语言需求转换为高效的 MySQL 查询, Prompt参考如下:

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

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

## 数据库表结构

### 1. dept_emp(部门员工关系表)
```sql
+-----------+---------+------+-----+---------+-------+
| 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    |       |
+-----------+---------+------+-----+---------+-------+
AI 代码解读

2. departments(部门表)

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

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    |       |
+------------+---------------+------+-----+---------+-------+
AI 代码解读

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    |       |
+-----------+------+------+-----+---------+-------+
AI 代码解读

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    |       |
+-----------+-------------+------+-----+---------+-------+
AI 代码解读

查询技巧

1. 日期处理

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

-- 日期范围查询
WHERE from_date BETWEEN '2000-01-01' AND '2000-12-31'
AI 代码解读

2. 名字处理

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

-- 模糊查询
WHERE first_name LIKE '%John%'
AI 代码解读

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'
AI 代码解读

查询示例

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';
AI 代码解读

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';
AI 代码解读

注意事项

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

2. SQL 执行模块

SQL 查询的执行基于 FastAPI 部署的后端服务。

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

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": "demo",
        "password": "Ohnu5aeX",
        "database": "employees",
        "port": 3306,
        "charset": 'utf8mb4'
    }

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

    uvicorn.run(app, host='0.0.0.0', port=35003)
AI 代码解读

3. LLM-数据分析模块

在 LLM 数据分析环节,我们对 SQL 查询结果进行智能解析,并生成 Markdown 格式的分析报告。prompt

# 数据分析专家工作指南

## 角色定位
专业的SQL数据分析专家,负责解读MySQL employees数据库的查询结果{
   {
   #1739677927593.body#}}

## 核心规则
1. 直接分析已提供数据,默认数据已满足查询条件
2. 接受数据原貌,不质疑数据有效性
3. 无需二次筛选或验证数据范围
4. 空数据集统一回复"没有查询到相关数据"
5. 避免使用提示性语言
6. 分析结果以markdown格式输出
7. 整理sql查询结果,以markdown表格格式输出放置输出开头
8. 整理sql查询结果, 以echart图表配置项格式输出放最后输出,图标配置需要尽量简洁,不要有太多冗余的配置项输出格式如下
```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)"
        }
      }
    }
  ]
}
AI 代码解读

数据处理原则

  1. 严格基于JSON数据集{ {#result#}}
  2. 数据已预筛选,直接进行统计分析
  3. 不进行数据条件的二次确认

报告结构要求

  1. 数据概览
  2. 详细分析
  3. 结论部分

背景说明

这是一个经典的员工数据库,包含以下核心表:

  • employees: 员工基本信息
  • departments: 部门信息
  • dept_emp: 部门员工关系
  • salaries: 薪资记录
  • titles: 职位信息
  • dept_manager: 部门管理层信息

数据处理流程

  1. 接收JSON格式查询结果
  2. 验证数据完整性
  3. 进行统计分析
  4. 生成分析报告

报告输出要求

  1. 使用准确的数据描述
  2. 提供详细的统计分析
  3. 标注重要发现
  4. 保持客观性

特殊情况处理

  • 空数据集:直接返回"没有查询到相关数据"
  • 异常值:如实报告,不作主观判断
  • 数据缺失:说明缺失情况,不补充假设数据

常见分析维度

  1. 薪资分析

    • 平均薪资
    • 薪资分布
    • 薪资趋势
  2. 人员结构

    • 性别比例
    • 年龄分布
    • 职级分布
  3. 部门情况

    • 部门规模
    • 部门薪资水平
    • 部门人员流动
  4. 职业发展

    • 晋升情况
    • 在职时长
    • 职位变动并输出分析报告

### 4. 可视化输出

DIFY 支持 **ECharts** 渲染,因此我们可以直接基于查询结果生成图表。例如:

```json
{
  "title": {"text": "部门薪资分布"},
  "tooltip": {},
  "xAxis": {"data": ["研发", "市场", "销售", "HR"]},
  "yAxis": {},
  "series": [{"name": "薪资", "type": "bar", "data": [12000, 15000, 13000, 11000]}]
}
AI 代码解读

结果示例

示例 1:询问职位的平均薪资计算
image.png

示例 1:请求按部门统计员工数量
image.png

关键优化点

  1. 查询优化:使用索引提高查询性能,避免不必要的 JOIN。
  2. echarts渲染:dify前端支持了echarts配置项渲染, 所以可以通过LLM直接生成图表。
  3. 分析自动化:LLM 直接解析数据并生成 Markdown 格式报告。

结论

通过 DIFY + MySQL + LLM,我们可以高效地实现 输入需求 -> SQL 查询 -> 数据分析 -> 可视化 的全流程自动化。这样的方式不仅降低了人工分析的成本,同时也能大幅提升数据分析的效率。对于数据密集型业务,如人力资源分析、薪酬管理等,该方案具有极高的实用价值。

DEMO文件:
链接:https://bj17857.apps.aliyunfile.com/disk/s/iPJf7EAtBnH?pwd=643285
密码:643285

Evan_A
+关注
目录
打赏
0
16
10
1
14
分享
相关文章
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
236 64
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
191 5
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
基于阿里云大数据平台的实时数据湖构建与数据分析实战
在大数据时代,数据湖作为集中存储和处理海量数据的架构,成为企业数据管理的核心。阿里云提供包括MaxCompute、DataWorks、E-MapReduce等在内的完整大数据平台,支持从数据采集、存储、处理到分析的全流程。本文通过电商平台案例,展示如何基于阿里云构建实时数据湖,实现数据价值挖掘。平台优势包括全托管服务、高扩展性、丰富的生态集成和强大的数据分析工具。
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
331 0
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
204 64
自动化运维的利器:Ansible实战应用
【10月更文挑战第41天】在现代IT运维领域,自动化已成为提高效率、减少错误的关键。Ansible作为一种简单而强大的自动化工具,正被越来越多的企业采纳。本文将通过实际案例,展示如何使用Ansible简化日常运维任务,包括配置管理和批量部署等,旨在为读者提供一种清晰、易懂的自动化解决方案。
74 1
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
126 4
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
167 2
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
103 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等