news 2026/2/5 2:12:13

基于Dify+数据库+Echarts搭建的数据可视化助手(含自然语言转SQL)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Dify+数据库+Echarts搭建的数据可视化助手(含自然语言转SQL)

参考

https://blog.csdn.net/youmaob/article/details/148766806

https://www.cnblogs.com/xiao987334176/p/18912784

你是一名专业的数据需求提炼师。 请仔细阅读用户的自然语言问题{{#context#}},只保留与数据查询直接相关的核心需求。自动忽略与数据查询无关的内容(如生成图表、导出Excel、制作报表等)。 请判断用户是否需要用图表展示结果。如果需要,请根据问题内容推荐最合适的Echarts图表类型(如area、bar、column、dual-axes、fishbone-diagram、flow-diagram、histogram、line、mind-map、network-graph、pie、radar、scatter、treemap、word-cloud等);如果不需要图表,请填写“无”。 请严格按照如下格式输出,不要有任何解释或多余内容: sql_requirement: [精炼后的数据查询需求] need_chart: [是/否] chart_type: [推荐的Echarts图表类型或“无”]

表名:sys_dept

字段说明:

dept_id:部门 id,自增序号,bigint

parent_id:父部门 id,bigint

ancestors:祖级列表,varchar (50)

dept_name:部门名称,varchar (30)

order_num:显示顺序,int

leader:负责人,varchar (20)

phone:联系电话,varchar (11)

email:邮箱,varchar (50)

status:部门状态(0 正常 1 停用),char (1)

del_flag:删除标志(0 代表存在 2 代表删除),char (1)

create_by:创建者,varchar (64)

create_time:创建时间,datetime

update_by:更新者,varchar (64)

update_time:更新时间,datetime

表描述:这是部门信息表

请根据用户问题和查询结果,用简洁的中文自然语言回答,并给出分析意见。

用户问题:

查询结果:

当前时间:

SYSTEM 你是一个数据格式化专家。你的核心任务是根据已执行的SQL查询结果和用户指定的图表类型,将数据转换为特定图表工具所需的输入格式。 ## 上下文变量说明: *`target_chart_type`: (String) 用户期望生成的图表类型,值为 "bar"、"pie" 或 "line"。此信息来源{{#llm.text#}} *`sql_execution_result`: (JSON Array) SQL查询的执行结果,来源于{{#context#}}例如 `[{"category": "A", "value": 10}, {"category": "B", "value": 20}]`。 *`user_original_query`: (String) 用户最原始的自然语言查询,可用于辅助生成图表标题,,来源于{{#sys.query#}}。 ## 图表工具输入规范: 1.**柱状图 (bar):** * 标题 (String) * 数据 (String): 数字用 ";" 分隔 (例如:"150;280;200") * x轴 (String): 文本用 ";" 分隔 (例如:"一月;二月;三月") 2.**饼图 (pie):** * 标题 (String) * 数据 (String): 数字用 ";" 分隔 (例如:"30;50;20") * 分类 (String): 文本用 ";" 分隔 (例如:"类型A;类型B;类型C") 3.**线性图表 (line):** * 标题 (String) * 数据 (String): 数字用 ";" 分隔 (例如:"10;15;13;18") * x轴 (String): 文本用 ";" 分隔 (例如:"周一;周二;周三;周四") ## 任务指令: 1.**解析核心数据**: * 将输入的 `sql_json_string_result` (它是一个字符串) **作为 JSON 进行解析**。解析后的结果可能是单个 JSON 对象(如果SQL只返回一行)或一个 JSON 对象数组(如果SQL返回多行)。我们将其称为 `core_sql_data`。 * 例如,如果 `sql_json_string_result` 是字符串 `"[{\"colA\": \"val1\", \"colB\": 10}]"`,那么 `core_sql_data` 就是实际的数组 `[{"colA": "val1", "colB": 10}]`。 * 如果 `sql_json_string_result` 是字符串 `"{\"colA\": \"val1\", \"colB\": 10}"`,那么 `core_sql_data` 就是实际的对象 `{"colA": "val1", "colB": 10}`。为了统一处理,如果它是单个对象,请将其视为只包含一个元素的数组。 2.**生成图表标题**: 参考 `user_original_query`,生成一个简洁明了的 `chart_tool_title`。 3.**数据提取与格式化 (基于 `core_sql_data`)**: * 分析 `core_sql_data`。数组中的每个对象代表一个数据点。你需要从中识别出用作标签/类别/x轴的字段(通常是文本或日期类型)和用作数值/数据的字段(通常是数字类型)。 ***根据 `target_chart_type` 指示的类型进行处理:** ***若为 "bar"**: * 从 `core_sql_data` 中提取所有对象的数值字段值,用 ";" 连接成 `chart_tool_data_string`。 * 提取所有对象的标签字段值,用 ";" 连接成 `chart_tool_label_string` (对应x轴)。 ***若为 "pie"**: * 从 `core_sql_data` 中提取所有对象的数值字段值,用 ";" 连接成 `chart_tool_data_string`。 * 提取所有对象的标签字段值,用 ";" 连接成 `chart_tool_label_string` (对应分类)。 ***若为 "line"**: * 从 `core_sql_data` 中提取所有对象的数值字段值,用 ";" 连接成 `chart_tool_data_string`。 * 提取所有对象的标签字段值,用 ";" 连接成 `chart_tool_label_string` (对应x轴). * 确保 `core_sql_data` 中至少有一个标签/类别字段和一个数值字段可供提取。如果字段不明确(例如,多个数字列),优先选择第一个文本/日期字段作为标签,第一个数字字段作为数据,或根据 `user_original_query` 中的暗示选择。 4.**构建输出**: * 以严格的JSON对象格式输出以下字段: *`chart_tool_title` (String) *`chart_tool_data_string` (String) *`chart_tool_label_string` (String) *`chart_type_final` (String, 其值应等于输入的 `target_chart_type`) ## 示例(假设变量已按上述说明传入): * 若 `target_chart_type` = "bar" * 若 `sql_json_string_result` (字符串) = `"[{\"product_name\": \"产品A\", \"total_sales\": 5500}, {\"product_name\": \"产品B\", \"total_sales\": 7200}]"` * 若 `user_original_query` = "查询产品销售额柱状图" 期望的输出JSON: ```json { "chart_tool_title": "产品销售额柱状图", "chart_tool_data_string": "5500;7200", "chart_tool_label_string": "产品A;产品B", "chart_type_final": "bar" }

import json import re # 导入正则表达式模块 def main(llm_data_input): llm_data_str = llm_data_input # 1. 清理 Markdown 代码块标记 (保持你现有的健壮清理逻辑) llm_data_str = llm_data_str.strip() if llm_data_str.startswith("```json"): llm_data_str = llm_data_str[len("```json"):] elif llm_data_str.startswith("```"): llm_data_str = llm_data_str[len("```"):] if llm_data_str.endswith("```"): llm_data_str = llm_data_str[:-len("```")] llm_data_str = llm_data_str.strip() data = {} try: data = json.loads(llm_data_str) except json.JSONDecodeError as e: return { "unpacked_title": f"Error: Invalid JSON - {e}", "unpacked_data": "", "unpacked_labels": "", "chart_type": "error_invalid_json" } title = data.get("chart_tool_title", "无标题") original_data_string = data.get("chart_tool_data_string", "") # 获取原始数据字符串 label_string = data.get("chart_tool_label_string", "") chart_type = data.get("chart_type_final") if chart_type is None: # 关键修复:is和None之间添加空格 chart_type = "unknown_type_from_llm" # 2. 清理和验证 data_string (这是关键的修改部分) cleaned_data_parts = [] if original_data_string: # 只有当原始数据字符串非空时才处理 parts = original_data_string.split(';') for part in parts: part = part.strip() # 移除每个部分前后的空格 if part: #确保部分不是空字符串 try: # 尝试转换为 float 来验证它是否是有效数字 # 我们仍然以字符串形式保存,因为插件期望分号分隔的字符串 float(part) # 如果这里失败,会抛出 ValueError cleaned_data_parts.append(part) except ValueError: cleaned_data_parts.append("0") # 方案 b: 替换为 "0" # print(f"Warning: Invalid data part '{part}' replaced with '0'.") else: # 如果部分是空字符串 (例如来自 ";;"),也替换为 "0" 或跳过 cleaned_data_parts.append("0") # 方案 b: 替换为 "0" # print(f"Warning: Empty data part replaced with '0'.") unpacked_data = ";".join(cleaned_data_parts) return { "unpacked_title": title, "unpacked_data": unpacked_data, # 使用清理过的数据字符串 "unpacked_labels": label_string, # 标签字符串通常不需要转为数字,所以保持原样 "chart_type": chart_type }

数据库表信息

效果预览

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/4 7:19:34

深度学习毕设项目推荐-基于python-CNN的常见鱼类分类识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/1/30 1:11:29

SQL常用语句大全

SQL 常用语句大全(通用版,适用于 MySQL、PostgreSQL、SQL Server、Oracle 等) SQL(Structured Query Language)分为几大类:DDL(数据定义)、DML(数据操作)、D…

作者头像 李华
网站建设 2026/1/30 20:34:20

微软发布 GitHub Copilot 的 C++ 代码编辑工具

微软正通过 Visual Studio 2026 Insiders 渠道提供 GitHub Copilot 的 C 代码编辑工具早期访问版本。据微软介绍,这些 C 工具能够让 GitHub Copilot 超越文件搜索功能,实现更强的上下文感知重构能力,支持跨多个文件和代码段的修改。公开版本已…

作者头像 李华
网站建设 2026/2/3 18:26:43

深度测评10个AI论文写作软件,继续教育学生轻松搞定论文!

深度测评10个AI论文写作软件,继续教育学生轻松搞定论文! AI 工具如何让论文写作更高效 在当前的学术环境中,继续教育学生面临着越来越高的论文写作要求。无论是本科、硕士还是博士阶段,撰写高质量的论文已成为一项不可或缺的任务。…

作者头像 李华
网站建设 2026/2/4 7:15:43

【windows】常见的系统环境变量,如%appdata%表示什么意思

Windows 常见系统环境变量详解 Windows 中的环境变量(Environment Variables)是用 %变量名% 包围的形式表示的路径或值,用于快速引用系统目录、配置等。它们分为用户变量(仅当前用户)和系统变量(所有用户&…

作者头像 李华