本文将01-Mysql数据库操作.md与02-学生成绩查询ChatFlow.md合并为一篇完整实操文档,覆盖:
- MySQL 数据库与
student_grades表准备 - Dify ChatFlow 节点编排(NLP2SQL + 数据分析 + ECharts)
- 查询结果文本与图表联合输出
1. 项目目标与整体思路
目标是实现一个“学生成绩查询 Agent”:
- 用户用自然语言提问(例如“查询全校各科平均分”)
- 大模型将问题转换为 SQL
- 执行 SQL 获取结果
- 大模型对结果做总结并按需生成 ECharts 数据
- 工作流输出文本结论,并可附带折线图/柱状图/饼图
2. 环境与工具准备
本方案主要依赖以下能力:
- Database 工具(连接 MySQL)
- 代码执行节点(Python 解析/转换数据)
- 大模型节点(SQL 生成与结果总结)
- ECharts 图表节点(图表渲染)
- (可选)时间工具
Database 插件安装后需要配置 API Key,并设置数据库连接 URI:
mysql+pymysql://root:你的密码@host.docker.internal:3306/你的数据库名示例:
mysql+pymysql://root:123456@host.docker.internal:3306/dify_test3. MySQL 数据准备(核心基础)
3.1 登录 MySQL
本地: mysql -u root -p 远程: mysql -u root -h 192.168.1.100 -p3.2 创建数据库并切换
CREATEDATABASEdify_test;USEdify_test;3.3 创建成绩表
CREATETABLEstudent_grades(idINTAUTO_INCREMENTPRIMARYKEY,student_idVARCHAR(20)NOTNULL,student_nameVARCHAR(50)NOTNULL,class_nameVARCHAR(50)NOTNULL,subjectVARCHAR(50)NOTNULL,scoreDECIMAL(5,2)NOTNULL,exam_dateDATENOTNULL,semesterVARCHAR(50)NOTNULL,gradeVARCHAR(50)NOTNULL,created_atDATETIMENOTNULL,updated_atDATETIMENOTNULL);3.4 导入测试数据
将原文中的批量INSERT INTO student_grades ... VALUES (...)语句一次性执行即可(数据量约 100+ 条)。
3.5 验证数据
SELECTCOUNT(*)FROMstudent_grades;SELECT*FROMstudent_gradesLIMIT10;4. ChatFlow 工作流搭建(逐节点)
4.1 开始节点
接收用户输入问题,无需特别修改。
4.2 大模型节点:生成 SQL
职责:根据用户问题,输出可执行 SQL(JSON 数组格式)。
关键配置:
- 模型:
qwen3-max - System Prompt:约束表名为
student_grades、字段定义、SQL 质量要求、JSON 输出规范 - User Prompt 示例:
查询全校各科目平均分情况
建议:要求模型避免
SELECT *,并尽量按semester、grade、class_name、subject等维度聚合。
4.3 直接回复:SQL 生成中
用于改善交互体验,可选。
### SQL 正在生成中4.4 代码执行:解析 LLM 输出 JSON
职责:从json ...代码块中提取并解析 SQL 数组。
输入建议:
input_string: LLM/{x}text输出建议:
result --> Array[Object]4.5 直接回复:SQL 生成完毕
### SQL 生成完毕!4.6 循环迭代:逐条 SQL 执行
职责:遍历 SQL 数组,逐条查询并汇总结果。
关键配置:
- 输入:
代码执行/{x}result - 输出:
SQL Execute/{x}json - 错误处理:可选择移除错误输出,避免单条 SQL 失败导致全流程中断
4.7 循环体-代码执行:提取title/sql
职责:从当前迭代对象提取title与sql字段,传给 SQL 执行节点。
4.8 循环体-SQL 执行
输入:
循环体代码执行{x}sql4.9 代码执行:循环结果转字符串
职责:将迭代后的查询结果拼接,便于后续 LLM 做统一总结。
4.10 直接回复:模型汇总中
### SQL 计算完毕,模型正在汇总中...4.11 大模型节点:结果总结 + 图表决策
职责:
- 优先回答用户问题(Markdown 文本)
- 判断是否需要图表(
ECHarts="1"或"0") - 若需要图表,返回图表类型、标题、数据与 X 轴
建议输出 JSON 结构:
{"results":"Markdown总结","ECHarts":"1","chartType":"线性图/柱状图/饼状图","chartTitle":"图表标题","chartData":"10;20;30","chartXAxis":"高一;高二;高三"}4.12 代码执行:解析总结 JSON
职责:容错解析 LLM 返回结果,补齐缺省字段,统一输出:
resultsECHartscharType/charTitle/charData/charXAxis(按你的节点命名保持一致)
4.13 直接回复:返回文本结果
回复内容示例:
代码执行生成ECHART/{x}results4.14 条件分支:是否绘图
职责:根据ECHarts与chartType走不同图表分支(折线/柱状/饼图)。
4.15 ECharts 图表节点
通用输入参数:
- 标题:
charTitle - 数据:
charData - X 轴(或分类):
charXAxis
4.16 结果输出节点
最终向用户输出文本结果,并在满足条件时附带图表。
5. 运行效果
6. 常见问题与优化建议
SQL 解析失败
重点检查 LLM 输出是否严格包裹在 ```json 代码块中。SQL 执行报错
检查数据库连接、表名字段名是否一致(student_grades),以及 SQL 语法是否符合 MySQL。图表不显示
检查ECHarts是否为"1",并确认chartType/chartData/chartXAxis是否完整。结果不够准确
强化 SQL 生成提示词,增加 few-shot 示例,限制查询范围与维度。性能优化
高频查询字段(如semester、grade、class_name、subject)可考虑建立索引;避免无条件全表扫描。
7. 一句话总结
你现在可以通过“自然语言提问 -> 自动 SQL 查询 -> 智能总结 -> 图表展示”的完整链路,快速搭建一个可用的学生成绩查询 Agent,并可按业务继续扩展到班级分析、年级对比、成绩预警等场景。