一、前言:

在数据驱动的电商时代,企业决策正面临一场效率革命。当海量交易数据如潮水般涌来,传统SQL依赖技术团队"逐行解码"的模式,已难以匹配瞬息万变的商业节奏。华为云Flexus服务器与Dify平台的珠联璧合,正在重塑数据分析的边界——前者以澎湃算力构建数字地基,后者用自然语言交互架设智能桥梁。

在这里插入图片描述

  • ①. 当数据开口说人话:
    “我想看华东区女性用户复购率的变化趋势”,系统已自动生成可视化图表。没有等待技术团队排期,没有晦涩的代码沟通,这正是Dify平台带来的魔法时刻:将业务语言直接转化为精准的SQL指令,让每个部门都拥有"数据透视"的超能力。

  • ②. 隐藏在流畅体验背后的技术交响:
    华为云Flexus服务器如同永不疲倦的数字交响乐团,当千万级查询请求同时涌入时,其弹性扩展的算力确保每个自然语言问题都能获得秒级响应。

  • ③. 从数据沼泽到决策绿洲:
    某母婴电商的运营人员曾需要3天才能获得竞品价格分析报告,现在只需输入"对比A品牌近30天折扣商品销量",系统即刻调取跨平台数据生成动态看板。


二、华为云Flexus服务器一键部署Dify平台:

华为云Flexus服务器,作为新一代高性能云计算平台的佼佼者,凭借其‌卓越的弹性扩展能力和强大的算力支撑‌,在模型推理、数据处理及平台集成等场景中展现出了非凡的实力。

在部署Dify平台时,用户只需轻松登录华为云控制台,即可利用Flexus提供的‌便捷一键部署模板‌。这一创新功能极大地简化了操作流程,用户只需完成参数配置、资源栈设置,并进行部署确认,便能迅速将平台上线,‌彻底告别繁琐的环境搭建过程‌。

Flexus服务器支持高并发访问和长时间运行任务,极大保障了平台运行的稳定性与处理效率,为后续模型加载与SQL执行打下了坚实基础。

在这里插入图片描述

2.1 初始化账号并登录Dify平台首页:

上个文章里面,有详细讲解如何基于华为云Flexus服务器一键部署Dify平台部署完成后,在输出的资源信息中点击Dify平台的IP相关的访问地址,在第一次访问需设置管理员账户信息,管理员拥有最大的权限,可用于创建应用和管理应用,接下来通过设置的邮箱账号登录Dify平台即可。

在这里插入图片描述

登录后,即可进入Dify的工作平台界面,Dify的一个“应用”指基于LLM构建的实际场景应用,通过创建应用,可将智能 AI 技术应用于特定的需求,它既包含了开发 AI 应用的工程范式,也包含了具体的交付物,一个应用为开发者交付:

  • ①. 封装友好的 API,可由后端或前端应用直接调用,通过 Token 鉴权。
  • ②. 开箱即用、美观且托管的 WebApp,你可以 WebApp 的模版进行二次开发。
  • ③. 一套包含提示词工程、上下文管理、日志分析和标注的易用界面。

在这里插入图片描述


2.2 Chatflow工作流:

在Dify首页的平台页面,选择创建“空白应用”,在应用类型这里可以选择并选择“Chatflow”类型的工作流创建模式。

在这里插入图片描述

“Chatflow”可以支持记忆的复杂多轮对话工作流,该类型支持多节点的对话式流程配置,适合处理自然语言理解、代码执行、数据分析等复杂任务。

在这里插入图片描述

这里为了很好的方便用户的使用,可以在开始的步骤这里增加2个引导对话的开场白,这里我们配置三个问题:

  • ①. 查询所有的订单商品。
  • ②. 查询所有的商品类型。
  • ③. 查询所有的订单总价格。

在这里插入图片描述


2.3 工具使用 - 获取当前系统时间:

在“开始”节点后面,可以新增一个工具“获取时间戳”,可以方便后面查询使用,可以很好的获取当前的时间戳是多少,好基于一个某个时间段来进行查询。

在这里插入图片描述

添加完工具“获取当前时间”后,点击详情中,可以在时区这里修改选择到“亚洲/上海”这个时区,但是这里好像没有北京的时区。

在这里插入图片描述


2.4 添加LLM模型:

在“获取当前时间”节点之后,我们可以增加一个“LLM节点”,这里可以看到没有设置模型,我们可以开通“ModelArts Studio_MaaS_大模型即服务_华为云”之前开通DeepSeek-V3/R1商用服务。

在这里插入图片描述

在右上角点击“设置”后,可以在左侧的“工作空间”中,看到“模型供应商”,这里可以我们找到“OpenAI-API-compatible”这个模型供应商是可以兼容OpenAI API的模型供应商的,我们点击“安装”即可。

在这里插入图片描述

在安装成功后,可以看到在模型列表中的“待配置”中,会显示“OpenAI-API-compatible”这个模型供应商,点击“添加模型”时,可以增加“ModelArts Studio_MaaS_大模型即服务_华为云”之前开通DeepSeek-V3/R1商用服务模型。

在这里插入图片描述

在添加“OpenAI-API-compatible”弹框中,这里有一些选项,我们可以看到有模型类型、模型名称、模型显示名称、API Key、API endpoint URL、API endpoint中的模型名称等信息。

在这里插入图片描述

在“ModelArts Studio_MaaS_大模型即服务”的控制台中,在“模型推理” -> “在线推理”中找到我们需要添加的模型,点击“调用说明”按钮。

在这里插入图片描述

在“调用说明”弹框中,这里表示可以通过其它的方式来进行调用,这里有2项:

  • ①. Rest API:REST(Representational State Transfer)是一种基于 Web 标准的软件架构风格,通过 HTTP 协议操作资源(如数据实体),使用统一接口设计实现客户端与服务器的通信。
  • ②. OpenAI SDK:OpenAI SDK 是一套由 OpenAI 官方提供的软件开发工具包,本质是让开发者能快速调用各类 AI 能力的「工具箱」。它不是单个工具,而是集成文本生成、图像创作、语音识别等功能的统一接口,开发者只需几行代码就能嵌入 AI 功能到自己的应用中。

在这里插入图片描述

打开“OpenAI SDK”的选项页面,我们可以看到模型名称(一定要填写对,刚开始没填写对,弄了好久才好)、模型API地址,那么我们可以来添加API Key,点击“API Key管理”跳转到API Key管理页面。

在这里插入图片描述

创建好API Key后,这里需要注意一下,API Key创建后只能显示一次,后面就不会再显示了,需要保存好,如果是企业这种账号的话,更应该注意安全的保护。

在这里插入图片描述

接下来就是把模型类型、模型名称、模型显示名称、API Key、API endpoint URL、API endpoint中的模型名称添加进来即可,可以看到右下角就把DeepSeek-v3这个模型添加成功,就可以在后面进行使用了。


2.5 定义LLM提示词:

在添加的LLM节点后,我们可以看到有System选项中,可以添加一些提示词,表示添加一个订单data_orders订单信息表,里面有一些字段,那么,我们可以使用LLM大模型帮我根据这个订单表的信息,生成10条不同的SQL查询语句。

在这里插入图片描述

### 角色
你是一个专业的SQL生成工具,需要根据用户生成标准的mysql库的SQL。    
### 任务
请根据以下问题生成 JSON 格式的 SQL 查询数组:
表名:data_orders(订单信息表)
字段说明:
- id: 主键
- order_id: 订单号
- goods_name: 商品名称
- cate_name: 高品分类
- price: 价格
- num: 数量
- status: 订单状态
- created_at: 订单创建时间
- updated_at: 订单更新时间
### 系统参数
当前时间:{{#1750579193762.text#}}

### 要求:
1. 根据用户提出的问题,生成 JSON 格式的 SQL 查询数组。
2. 每条 SQL 查询必须与问题直接相关,并从不同维度分析数据。
3. 生成的SQL最多10个。
4. 将所有生成的 SQL 查询封装到一个 JSON 数组中。
5. 确保 SQL 查询语法正确,并考虑性能优化。
6. 输出必须以 ```json 开始。
7. 如果问题涉及多个统计维度,请分别生成对应的子查询。
8. 涉及全量的应查询SQL以订单聚合。

2.6 代码执行节点探索:

Dify的代码执行功能主要通过工作流中的‌代码执行节点‌实现,开发者可在沙箱环境中运行自定义Python逻辑,同时严格限制文件系统访问和网络请求等敏感操作。

在这里插入图片描述

必须定义main函数作为入口,输入参数对应工作流中的变量名,返回值需为字典且键名匹配输出变量声明。例如处理JSON数据时,函数内部需导入pandas等模块并返回结构化结果。

import re
import json

def main(arg1: str) -> dict:
    try:
        # 使用正则表达式提取被 ```json 和 ```包裹的内容
        match = re.search(r'```json\s*([\s\S]*?)\s*```', arg1)
        if not match:
            return {
                "result": [{},{}]
            }
        
        # 提取 JSON 字符串
        json_str = match.group(1).strip()
        
        # 将 JSON 字符串解析为 Python 字典
        result_dict = json.loads(json_str)
        return {
            "result" : result_dict 
        }
    except Exception as e:
        # 如果解析失败,打印错误信息并返回默认输出
        return {
            "result": []
        }

在这里插入图片描述

这里有一个坑的地方,就是使用dify调试工具不成功,但是使用自己的python代码是成功的,以下是上一个LLM根据数据库分析的结果来进行匹配:

{
  "text": "```json\n[\n    {\n        \"query\": \"SELECT COUNT(*) AS total_orders FROM data_orders;\",\n        \"description\": \"查询总订单数量\"\n    },\n    {\n        \"query\": \"SELECT SUM(price * num) AS total_revenue FROM data_orders;\",\n        \"description\": \"计算总销售额\"\n    },\n    {\n        \"query\": \"SELECT cate_name, COUNT(*) AS order_count FROM data_orders GROUP BY cate_name ORDER BY order_count DESC;\",\n        \"description\": \"按商品分类统计订单数量\"\n    },\n    {\n        \"query\": \"SELECT status, COUNT(*) AS status_count FROM data_orders GROUP BY status ORDER BY status_count DESC;\",\n        \"description\": \"按订单状态统计订单数量\"\n    },\n    {\n        \"query\": \"SELECT goods_name, SUM(num) AS total_quantity FROM data_orders GROUP BY goods_name ORDER BY total_quantity DESC LIMIT 10;\",\n        \"description\": \"查询销量前十的商品\"\n    },\n    {\n        \"query\": \"SELECT DATE(created_at) AS order_date, COUNT(*) AS daily_orders FROM data_orders GROUP BY order_date ORDER BY order_date DESC LIMIT 7;\",\n        \"description\": \"查询最近7天的每日订单数量\"\n    },\n    {\n        \"query\": \"SELECT HOUR(created_at) AS hour_of_day, COUNT(*) AS hourly_orders FROM data_orders GROUP BY hour_of_day ORDER BY hour_of_day;\",\n        \"description\": \"按小时统计订单数量\"\n    },\n    {\n        \"query\": \"SELECT cate_name, SUM(price * num) AS category_revenue FROM data_orders GROUP BY cate_name ORDER BY category_revenue DESC;\",\n        \"description\": \"按商品分类统计销售额\"\n    },\n    {\n        \"query\": \"SELECT AVG(price) AS avg_price, AVG(num) AS avg_quantity FROM data_orders;\",\n        \"description\": \"计算平均商品价格和平均购买数量\"\n    },\n    {\n        \"query\": \"SELECT COUNT(DISTINCT order_id) AS unique_orders FROM data_orders;\",\n        \"description\": \"查询唯一订单数量\"\n    }\n]\n```",
  "usage": {
    "prompt_tokens": 273,
    "prompt_unit_price": "0",
    "prompt_price_unit": "0",
    "prompt_price": "0",
    "completion_tokens": 462,
    "completion_unit_price": "0",
    "completion_price_unit": "0",
    "completion_price": "0",
    "total_tokens": 735,
    "total_price": "0",
    "currency": "USD",
    "latency": 12.396073523996165
  },
  "finish_reason": "stop"
}

这里可以使用dify自带的调试工具来进行调试,在进行“预览”的环节,可以拿到LLM上个模型产出的返回值(如上面),但是拿到“代码执行”节点进行调试时,发现输入的参数没有效果,并没有把result结果解析出来。

在这里插入图片描述

可以看到我们将上面相同的代码,放到IDE中是完全可以匹配结果的,这里我排错了很久,希望大家也可以多注意一下,可以看到这里是没有结果的,但是代码确实没问题,我用IDE尝试过了,而且在预览环节也没问题。

在这里插入图片描述

所以在这个“代码执行”节点执行返回结果是这个样子:

{
  "result": [
    {
      "query": "SELECT COUNT(*) AS total_orders FROM data_orders;",
      "description": "查询总订单数量"
    },
    {
      "query": "SELECT SUM(price * num) AS total_revenue FROM data_orders;",
      "description": "计算总销售额"
    },
    {
      "query": "SELECT cate_name, COUNT(*) AS order_count FROM data_orders GROUP BY cate_name ORDER BY order_count DESC;",
      "description": "按商品分类统计订单数量"
    },
    {
      "query": "SELECT status, COUNT(*) AS status_count FROM data_orders GROUP BY status ORDER BY status_count DESC;",
      "description": "按订单状态统计订单数量"
    },
    {
      "query": "SELECT goods_name, SUM(num) AS total_quantity FROM data_orders GROUP BY goods_name ORDER BY total_quantity DESC LIMIT 10;",
      "description": "查询销量前十的商品"
    },
    {
      "query": "SELECT DATE(created_at) AS order_date, COUNT(*) AS daily_orders FROM data_orders GROUP BY order_date ORDER BY order_date DESC LIMIT 7;",
      "description": "查询最近7天的每日订单数量"
    },
    {
      "query": "SELECT HOUR(created_at) AS hour_of_day, COUNT(*) AS hourly_orders FROM data_orders GROUP BY hour_of_day ORDER BY hour_of_day;",
      "description": "按小时统计订单数量"
    },
    {
      "query": "SELECT cate_name, SUM(price * num) AS category_revenue FROM data_orders GROUP BY cate_name ORDER BY category_revenue DESC;",
      "description": "按商品分类统计销售额"
    },
    {
      "query": "SELECT AVG(price) AS avg_price, AVG(num) AS avg_quantity FROM data_orders;",
      "description": "计算平均商品价格和平均购买数量"
    },
    {
      "query": "SELECT COUNT(DISTINCT order_id) AS unique_orders FROM data_orders;",
      "description": "查询唯一订单数量"
    }
  ]
}

2.7 迭代节点:

上面我们是通过LLM生成的10条SQL语句,再通过代码执行,可以得到10条数组结构的一个数据结构,那我们想通过SQL查询器,将每一条SQL去执行,再返回相关的结果,此时,可以使用到迭代节点。

在这里插入图片描述

在 Dify 中,‌迭代节点‌专指工作流中对一组数据执行循环处理的逻辑单元,其核心价值在于‌避免重复配置相同操作节点,实现对批量数据的自动化遍历与处理‌。


2.8 循环处理机制:

迭代节点会自动识别输入数据(如列表、数组),逐项执行子工作流中的节点逻辑。例如批量处理 10 个 URL 链接时,只需在迭代节点内配置单次链接分析逻辑(如调用 LLM 生成摘要),系统即可自动循环处理所有链接并输出聚合结果,这种设计大幅减少了重复节点的拖拽操作,尤其适用于数据清洗、多源信息提取等场景。

在这里插入图片描述

‌批量生成上传 10 份SQL至工作流,通过迭代节点触发 LLM 对每个SQL的查询,最终返回结构化数据。


‌本质上,迭代节点是复杂工作流的“压缩机”‌——它将重复性任务折叠进循环结构,既降低流程图的视觉复杂度,又通过自动化遍历提升数据处理效率:

  • ①. 上下文继承‌:每次循环继承上游节点的变量(如用户 ID、操作权限),确保子流程在统一上下文中运行。
    ‌- ②. 结果聚合优化‌:输出结果自动合并为数组格式,下游节点可直接调用(如将迭代生成的多个摘要传入变量聚合器节点)。
  • ③. ‌循环中断控制‌:支持设置最大迭代次数或条件判断(如遇失败条目自动停止),避免资源浪费。

接下来,我们重点来关注一下Mysql是如何操作的。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐