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

本文涉及的产品
多模态交互后付费免费试用,全链路、全Agent
简介: 本文介绍如何使用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    |       |
+-----------+---------+------+-----+---------+-------+

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. 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)

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)"
        }
      }
    }
  ]
}

数据处理原则

  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]}]
}

结果示例

示例 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

目录
相关文章
|
8天前
|
人工智能 Ubuntu 前端开发
Dify部署全栈指南:AI从Ubuntu配置到HTTPS自动化的10倍秘籍
本文档介绍如何部署Dify后端服务及前端界面,涵盖系统环境要求、依赖安装、代码拉取、环境变量配置、服务启动、数据库管理及常见问题解决方案,适用于开发与生产环境部署。
159 1
|
8天前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
3天前
|
Web App开发 前端开发 JavaScript
Playwright极速UI自动化实战指南
Playwright告别Selenium痛点,以智能等待、强大选择器、网络拦截与多设备模拟四大利器,提升自动化效率与稳定性。本文通过实战代码详解其加速秘籍,助你构建高效、可靠的UI测试方案。
|
1月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
2月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
358 0
|
29天前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
14天前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
198 11
|
1月前
|
传感器 人工智能 JavaScript
Playwright实战:写UI自动化脚本,速度直接起飞
简介: 测试工程师老王因UI自动化问题深夜奋战,反映出传统测试工具的局限性。微软开源的Playwright凭借智能等待、跨域操作、移动端模拟与网络拦截等强大功能,正迅速取代Selenium,成为新一代自动化测试标准。其稳定高效的设计显著降低维护成本,助力企业构建高质量测试流程。
|
2月前
|
供应链 搜索推荐 安全
淘宝/京东/亚马逊API实战:中小商家的自动化生存指南
电商API是连接电商平台、商家、支付与物流系统的技术桥梁,具备商品管理、订单处理、用户服务、营销支持等功能,助力业务自动化与数据驱动决策,成为电商生态中提升效率与创新的关键基础设施。
|
2月前
|
人工智能 JavaScript 前端开发
Playwright自动化测试系列课(5) | ​​调试神器实战:Trace Viewer 录屏分析 + AI 辅助定位修复​
Playwright 的 Trace Viewer 提供录屏级追踪,还原测试全过程,帮助定位偶发故障。结合 AI 实现自动修复,大幅提升调试效率,成为自动化测试利器。