华为云Flexus+DeepSeek征文|基于华为云一键部署快速搭建Dify-LLM应用开发平台实战 - 电商类数据智能分析师(二)
华为云Flexus服务器与Dify平台的结合,为电商企业提供了高效的数据分析解决方案。Flexus服务器提供强劲算力,Dify平台则通过自然语言交互简化SQL查询流程,实现"业务语言直接转SQL"的智能体验。部署过程便捷,用户只需在华为云控制台一键配置即可快速上线。Dify平台支持复杂工作流设计,包括时间获取、LLM模型集成(如华为云DeepSeek-v3)和智能SQL生成等功
一、前言:
在数据驱动的电商时代,企业决策正面临一场效率革命。当海量交易数据如潮水般涌来,传统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是如何操作的。
更多推荐
所有评论(0)