基于 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

目录
相关文章
|
2月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
327 0
|
1月前
|
传感器 人工智能 JavaScript
Playwright实战:写UI自动化脚本,速度直接起飞
简介: 测试工程师老王因UI自动化问题深夜奋战,反映出传统测试工具的局限性。微软开源的Playwright凭借智能等待、跨域操作、移动端模拟与网络拦截等强大功能,正迅速取代Selenium,成为新一代自动化测试标准。其稳定高效的设计显著降低维护成本,助力企业构建高质量测试流程。
|
2月前
|
供应链 搜索推荐 安全
淘宝/京东/亚马逊API实战:中小商家的自动化生存指南
电商API是连接电商平台、商家、支付与物流系统的技术桥梁,具备商品管理、订单处理、用户服务、营销支持等功能,助力业务自动化与数据驱动决策,成为电商生态中提升效率与创新的关键基础设施。
|
2月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
235 0
|
2月前
|
人工智能 自然语言处理 监控
生成式AI客服实战:智能客服机器人5大自动化能力处理80%高频咨询,释放60%客服人力
生成式AI驱动的智能客服机器人通过五大核心能力自动化处理80%高频咨询,释放60%客服人力。以合力亿捷方案为例,融合大模型与业务知识图谱,实现服务精准化、决策智能化,推动企业服务成本下降超40%。
289 0
|
10月前
|
数据采集 测试技术 Python
自动化淘宝秒杀:使用Selenium WebDriver的实战指南
本文详细介绍了如何利用Selenium WebDriver自动化淘宝秒杀操作,包括环境配置、代码实现及注意事项,旨在帮助读者提升秒杀成功率,同时提醒合理使用以遵守平台规则。
478 8
|
3月前
|
人工智能 算法 程序员
AiPy自动化数学题生成实战,修复表弟暑假“太闲.bug”
这段内容介绍了一款名为AiPy的开源工具如何解决“熊孩子”假期无事可做的问题。通过融合LLM与Python生态,AiPy生成大量不重复、难度适中的数学题,并支持整除保障和智能去重。项目实现从题目生成到Word文档输出的一站式功能,界面简洁且高效。核心技术包括利用AiPy编排任务流程、py-docx生成格式化文档以及算法确保题目质量。
136 0
|
5月前
|
JSON API 开发者
python实战 | 如何利用海外代理IP,实现Facebook内容营销自动化
本文探讨了Facebook营销自动化中的挑战与解决方案。首先分析了账号风控、IP受限及手动操作效率低等问题,随后介绍了通过Python编程结合高质量海外代理IP(如青果网络)实现自动化的技术路径。内容涵盖环境配置、代理IP使用、Facebook开发者账号注册及两种自动化方法:Graph API动态发布与Selenium模拟用户操作。最后总结指出,该方案可扩展至其他平台,助力全球矩阵营销。
python实战 | 如何利用海外代理IP,实现Facebook内容营销自动化
|
6月前
|
缓存 监控 API
微店商品详情API接口实战指南:从零实现商品数据自动化获取
本文介绍了微店商品详情API接口的应用,涵盖申请与鉴权、签名加密、数据解析等内容。通过Python实战演示了5步获取商品数据的流程,并提供了多平台同步、价格监控等典型应用场景。开发者可利用此接口实现自动化操作,提升电商运营效率,降低人工成本。文中还总结了频率限制、数据缓存等避坑指南,助力开发者高效使用API。
|
6月前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。