学生成绩查询 Agent 从 0 到 1(MySQL + ChatFlow 整合版)
2026/4/20 20:52:06 网站建设 项目流程

本文将01-Mysql数据库操作.md02-学生成绩查询ChatFlow.md合并为一篇完整实操文档,覆盖:

  • MySQL 数据库与student_grades表准备
  • Dify ChatFlow 节点编排(NLP2SQL + 数据分析 + ECharts)
  • 查询结果文本与图表联合输出

1. 项目目标与整体思路

目标是实现一个“学生成绩查询 Agent”:

  1. 用户用自然语言提问(例如“查询全校各科平均分”)
  2. 大模型将问题转换为 SQL
  3. 执行 SQL 获取结果
  4. 大模型对结果做总结并按需生成 ECharts 数据
  5. 工作流输出文本结论,并可附带折线图/柱状图/饼图

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_test



3. MySQL 数据准备(核心基础)

3.1 登录 MySQL

本地: mysql -u root -p 远程: mysql -u root -h 192.168.1.100 -p

3.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 *,并尽量按semestergradeclass_namesubject等维度聚合。

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

职责:从当前迭代对象提取titlesql字段,传给 SQL 执行节点。

4.8 循环体-SQL 执行

输入:

循环体代码执行{x}sql

4.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 返回结果,补齐缺省字段,统一输出:

  • results
  • ECHarts
  • charType/charTitle/charData/charXAxis(按你的节点命名保持一致)

4.13 直接回复:返回文本结果

回复内容示例:

代码执行生成ECHART/{x}results

4.14 条件分支:是否绘图


职责:根据ECHartschartType走不同图表分支(折线/柱状/饼图)。

4.15 ECharts 图表节点


通用输入参数:

  1. 标题:charTitle
  2. 数据:charData
  3. X 轴(或分类):charXAxis

4.16 结果输出节点

最终向用户输出文本结果,并在满足条件时附带图表。


5. 运行效果



6. 常见问题与优化建议

  1. SQL 解析失败
    重点检查 LLM 输出是否严格包裹在 ```json 代码块中。

  2. SQL 执行报错
    检查数据库连接、表名字段名是否一致(student_grades),以及 SQL 语法是否符合 MySQL。

  3. 图表不显示
    检查ECHarts是否为"1",并确认chartType/chartData/chartXAxis是否完整。

  4. 结果不够准确
    强化 SQL 生成提示词,增加 few-shot 示例,限制查询范围与维度。

  5. 性能优化
    高频查询字段(如semestergradeclass_namesubject)可考虑建立索引;避免无条件全表扫描。


7. 一句话总结

你现在可以通过“自然语言提问 -> 自动 SQL 查询 -> 智能总结 -> 图表展示”的完整链路,快速搭建一个可用的学生成绩查询 Agent,并可按业务继续扩展到班级分析、年级对比、成绩预警等场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询