要实现自然语言生成图表,需在dify中配置知识检索(含带注释的ddl)、数据库连接(测试通过)、text2sql链路(插件或手动编排+参数提取)、数据转echarts格式(mcp服务或模板转换),并用条件分支区分有图/无图场景。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你想让数据库听懂人话,输入一句“近三个月销售额最高的五个城市”,立刻返回柱状图——这需要Dify工作流把自然语言转成SQL、查出数据、再喂给图表工具生成可视化结果。整个链路不能断,任何一个节点输出格式错位,图表就出不来。
配置数据库连接与元数据注入
第一步不是写SQL,而是让大模型“认识”你的表。在Dify工作流开头添加【知识检索】节点,上传或粘贴数据库DDL语句,必须包含字段名、类型、注释(例如:score FLOAT COMMENT '电影评分')。【缺少注释会导致LLM误判字段含义,生成SELECT * 或错误WHERE条件】
接着添加【数据库】节点,选择MySQL类型,填入连接串:mysql+pymysql://用户名:密码@IP:端口/库名。端口不填默认3306,但如果你用的是Docker部署的SQL Server,端口必须显式填1433。
这一步做完后,别急着连LLM——先点“测试连接”,看到绿色对勾再继续。连接失败时Dify不会报具体错误,只会卡在执行环节,浪费半小时排查不如多点一次测试。
搭建Text2SQL核心链路
方法一:用内置插件快速启动
在工作流中拖入【Text to SQL】插件节点,它会自动调用你已授权的大模型(如Qwen3或DeepSeek V3),并内置表结构上下文。点击节点→“配置”→勾选“启用SQL语法校验”,这个开关能拦截90%的非法语句(比如SELECT没加FROM、WHERE里用中文引号)。
方法二:手动编排LLM+参数提取
① 添加LLM节点,模型选qwen-coder-turbo-latest,提示词严格按以下结构写:
你是一个数据分析师,擅长使用SQL查询数据库。数据库表结构如下:[知识检索节点输出]。用户需求是:[开始节点输入]。请只输出可直接执行的SQL语句,不要任何解释、换行、markdown符号。
② 接着加【参数提取器】节点,正则表达式填```sql([\s\S]*?)```——因为LLM常把SQL包在代码块里,不提取就直接传给数据库节点会报错。
③ 最后接【SQL Execute】节点,输入参数绑定为上一步提取出的SQL字符串。注意:这个节点返回的是JSON数组,不是纯文本,后续图表节点必须能解析数组结构。
将原始数据转为Echarts可用格式
传统做法要写Python脚本转换字段名、计算聚合值、拼装series数据,现在用两种轻量方案:
方案A:接入mcp-server-chart MCP服务
在Dify插件市场搜索并安装mcp-server-chart,添加服务器时地址填http://你的IP:8000/mcp。然后拖入该插件节点,输入参数设为“原始数据”→绑定SQL Execute节点输出,“图表类型”留空让AI自动判断。它会直接返回图片URL,不用处理坐标轴或颜色配置。
方案B:用模板转换节点硬编码适配
如果数据结构固定(比如永远查city, sales_amount),就用【模板转换】节点,内容写:
{"title": {"text": "销售额TOP5城市"}, "xAxis": {"data": {{data|map(attribute='city')|join(',')}}}, "series": [{"data": {{data|map(attribute='sales_amount')|list}}, "type": "bar"}]}
注意:这里用了Jinja2语法,【data必须是列表,且每个元素是字典,键名要和SQL SELECT字段完全一致】。字段名大小写错一个,整个series就是空数组。
分支处理有图/无图场景
用户问“北京票房是多少”不需要图表,而“各城市销量对比”必须出图。加【条件分支】节点,判断逻辑写:"图表" in input or "对比" in input or "排名" in input。
分支1(需图表):走mcp-server-chart → 回复节点,输出。
分支2(纯数据):接另一个LLM节点,提示词:“请用简洁中文总结以下数据:{{data}}。不要表格,不要代码块,直接说结论。”
这一步必须做,否则用户问“上海销量”,系统强行返回一张空柱状图,体验直接崩坏。










