← 返回文章列表

Dify 搭建私有数据可视化智能体,效果直逼 ChatGPT

Dify 搭建私有数据可视化智能体,效果直逼 ChatGPT 副本 大家好,我是九歌AI。 前几天写的文章《Trae + Dify 10分钟构建 Data McpServer 与 Agent ,和 E

AI智能体编程互联网
Dify 搭建私有数据可视化智能体,效果直逼 ChatGPT

Dify 搭建私有数据可视化智能体,效果直逼 ChatGPT 副本

大家好,我是九歌AI。

前几天写的文章《Trae + Dify 10分钟构建 Data McpServer 与 Agent ,和 Excel 说再见!》,跟大家一起实现了简单的大模型数据处理,返回的最后结果只是json格式的数据。今天我们做一个完整的聊天应用,可以在聊天结果中实现数据可视化分析。

标题说效果直逼ChatGPT,还是有点差距的,这差距多大呢,差不多一光年吧!毕竟我们今天做的还只是玩具。

我们先一起来看一下ChatGPT如何实现数据可视化结果的呈现。

图片展示的是ChatGPT的对话界面。上方显示“有什么可以帮忙的?”,下方对话框中,用户上传了一个名为“kefu.xlsx”的电子表格,并询问该表格中有哪些行业,请使用饼图显示。界面右下角有一个向上箭头。该图片与上下文紧密相关,上下文在介绍ChatGPT实现数据可视化结果呈现的思路,即先将用户提问转为Python代码,后台运行后在前台显示,此图直观呈现了用户向ChatGPT提出数据可视化需求的场景。

很显然,ChatGPT的思路和我们一样,现将用户的提问转为Python代码,后台运行后,在前台显示。不过最后做的饼图对中文不太友好呀!

按照这个思路,我们其实再把前几天的Pandas代码生成的提示词修改成直接写生成Pyecharts的代码,后台沙箱运行后,获取最后生成的图片或者Html文件,这是个比较容易的方案。

但是我不太想讲太多代码,而是想让大家多了解一下Dify这种低代码智能体设计平台是如何实现简单的可视化的。这就需要我们继续编排之前的工作流。

图片展示的是一个工作流示例,包含“开始”“PROCESS_EXCEL_PROCESS_”“结束”三个节点。开始节点接收“excel_file”和“usr_prompt”两个必填参数。PROCESS_EXCEL_PROCESS_节点为流程核心,其名称被红色框突出显示。结束节点输出“process_excel”和“text”两个参数,其中“text”参数为String类型。该图片与上下文紧密相关,直观呈现了工作流的结构及关键节点信息,为后续对工作流进行修改和代码执行节点添加提供参考。

下面就是我们要用到的Dify内置的图表生成工具,我们可以很知道这三种图表传入的参数要求,都是字符串且格式一样。

图片展示了Dify平台中“图表生成”工具的相关信息。左侧为Dify平台界面,显示“图表生成”工具由Dify作者,可生成饼图、柱状图、线性图表等各类图表,标签为设计、生产力、工具。右侧是“图表生成”工具的详细说明,介绍其为生成可视化图表的工具,可生成柱状图、折线图、饼图等各类图表,包含3个工具。该图片与上下文紧密相关,上下文提到Dify内置图表生成工具,此图直观呈现了该工具的名称、作者、功能及包含工具等关键信息。

下面这个Json数据,是我们上一个教程,工作流输出的最后结果格式,不能直接将其传入到上面的dify图表格式中。所以我们需要修改之前的工作流,对输出结果进行处理。

这里面直接选用了最省事的Python代码格式转化,也就是需要增加这个代码执行的节点。在里面填写需要执行的Python代码。

图片展示了Dify工作流中“代码执行”节点的设置界面。左侧工作流中,“代码执行”节点位于“PROCESS_EXCEL_PROCESS”之后。右侧界面显示输入变量为“data”,输出变量为“exl_key”和“exl_value”,并有Python代码框,代码内容为将JSON数据转换为字符串格式,提取键值对。该图片与上下文紧密相关,说明了在Dify图表生成工具中,需将工作流输出的JSON数据格式转换为特定字符串格式,以满足图表参数要求。

这个Python代码我们直接问大模型就可以,Dify自带代码生成器,我们只需要描述清楚需求就可以了。下面是我输入的代码生成提示词。

{“status”: “success”, “data_result”: {“学校”: 2, “互联网”: 1, “物流”: 1, “硬件”: 1, “教育机构”: 1, “传统零售”: 1, “传统媒体”: 1, “制造业”: 1}} 边写一段Pytho函数代码,,接受json输入,将data_result的所有key值拼接为一个字符串,每个key之间用 “;” 分隔,赋值到变量exl_ key,将data_result的所有value值拼接为一个字符串,每个value之间用 “;” 分隔,赋值到变量exl_value,将exl_key exl_value返回

图片展示的是Dify平台中代码执行界面。左侧流程图中“Pandas”节点被红色框突出显示。右侧代码执行区域,输入变量“data”被赋值为“{v}process_excel_process_.../ISL...”,代码为Python3代码,用于将data_result的key和value拼接为字符串并返回。输出变量“exl_key”和“exl_value”均为String类型。该图片与上文提到的将data_result拼接为字符串并返回的代码执行操作相关,直观呈现了代码执行的界面及关键操作步骤。

直接生成的代码还是有点小问题的,返回的变量只有一个,而Dify的饼图工具需要两个变量,所以我们修改了return语句,返回结果必须是dict。

import json
def main(data: dict) -> dict:
    data = json.loads(data)
    exl_key = ";".join(data["data_result"].keys())
    exl_value = ";".join(map(str, data["data_result"].values()))
    return {'exl_key': exl_key, 'exl_value': exl_value}

上面的代码其实有个大坑,如果大模型生成的数据格式不是{key:value,key,value}这种格式,这种代码会报错,这个我们下次再解决,这次先实现。

这里还有一个易错点是代码执行起接受的输入变量格式的问题,默认传入的是字符串,需要使用json库强制转化一下。不然会报下面的错误。

图片展示的是Dify平台中代码执行界面及相关测试运行结果。左侧代码执行区域显示Python代码,用于处理数据格式。右侧Test Run #17中,输入变量为“data”,输出为JSON格式数据。下方红框内突出显示了代码执行时的错误信息,指出“list indices must be integers or slices, not str”,原因是代码中对列表索引操作不当。该图片与上下文紧密相关,直观呈现了代码执行时出现的错误情况,帮助理解代码执行过程中的问题所在。

OK ,现在我们可以整体跑一遍工作流看一下结果了。

图片展示了Dify平台中一个工作流的界面。左侧是工作流的流程图,从“Jira”开始,依次经过“PROCESS_EXCEL_PROCESS”“处理数据”“绘图”“写入”等步骤,最后到“结束”。右侧是Test Run #18的输入界面,显示了“excel file”和“usr prompt”两个输入项,分别有文件链接和“表格中每个行业有多少个”的文本框。该图片与上下文紧密相关,直观呈现了工作流的运行环境及输入设置,为后续改进工作流以实现不同图表类型生成做准备。

**大功告成,**这样工作流就可以根据用户的分析需求,生成饼图的结果了。

但是,如果用户想看条形图、折线图该怎么实现呢。这里需要对工作流进行改进了。

第一是增加一个节点——参数提取,让大模型从用户的提示词中查找可视化图表的需求,是做成饼图和柱状图。

第二是增加在数据处理和可视化饼图之间增加条件分支节点,根据参数的提取结果,选择不同的分支。最后工作流的效果如下。

图片展示了Dify搭建私有数据可视化智能体的流程图。左侧从数据获取开始,经参数提取器、条件分支,分别生成柱状图和饼状图,最后结束。右侧是Test Run #24的测试结果,显示了柱状图。该图与上下文紧密相关,直观呈现了参数提取器设置后,大模型根据提示词生成图表的流程,是上下文介绍参数提取器设置及大模型决定条件分支节点内容的可视化呈现。

我们下面先来看参数提取器怎么设置。其实从下面的设置我们可以看到,有三个地方。

1.输入变量是指大模型会从用户的提示词这段文本中提取出需要的参数。

2.**提取啥参数,**就是用户的提示词中有没有提到想要什么样的图表结果,如果能提取到,赋值到新的变量exl_type。

3.指令就是参数提取器给大模型的提示词,这对大模型来说小菜一碟。

图片展示了Dify搭建私有数据可视化智能体流程中的关键节点。左侧为“参数提取器”,模型为“qwen - max - latest”,输入变量为“开始:usr_prompt String”。右侧是“条件分支”,包含两个分支,分别为“exl_type是折线图”和“exl_type包含柱状图”。分支指令为“请根据用户的提示词,判断其想要输出的图表类型,输出结果为“折线图”“柱状图”,如果用户没有需求,默认输出“柱状图””。该图片与上下文紧密相关,直观呈现了参数提取及条件分支的设置情况,是智能体生成图表流程中的重要环节。

这样下一个条件分支的节点就由大模型来决定了。条件分支这个地方,看着复杂,其实很简单,就是判断大模型给出的图形类型,也就是上一步新增的变量exl_type的值是啥,然后生成对应的图表即可。

图片展示了Dify搭建私有数据可视化智能体的工作流程中条件分支的设置界面。左侧是条件分支的流程图,包含IF、ELIF、ELSE三种判断方式,分别对应折线图、柱状图、饼图。右侧是条件分支的设置区域,IF分支判断变量exl_type是否为折线图,ELIF分支判断是否为柱状图,ELSE分支为饼图。该图片与上下文紧密相关,直观呈现了上文提到的条件分支节点由大模型决定,通过判断exl_type值生成对应图表的工作流程。

下面我们再看一下整体工作流的运行效果。

图片展示了Dify搭建私有数据可视化智能体的工作流运行效果。左侧是工作流界面,包含“条件分支”节点,其下有“IF”和“ELSE”分支,分别对应折线图和柱状图。右侧是Test Run界面,输入了“http://172.25.16.1:5500/kefu.xlsx”和“表格中每个行业有多少个 柱状图”等信息,下方有“开始运行”按钮。该图片与上下文紧密相关,直观呈现了工作流的运行情况,验证了其效果。

效果还是非常不错的,我们要把这个工作流用在聊天里面!

我们可以先将这个工作流发布为dify的内置工具。点击工作流右上方的发布,点击最下方发布为工具。

图片展示了Dify平台中发布工作流为工具的设置界面。名称为“Excel 智能助手”,工具调用名称为“excel_mcp”,工具描述为“excel_mcp”。关键部分是工具入参区域,包含“excel_file”和“usr_prompt”两个参数,其中“excel_file”方式为LLM填入,描述为“参数意义的描述”,“usr_prompt”方式也为LLM填入,同样有描述。该图片与上下文紧密相关,直观呈现了发布为工具时需调整工作流输入变量为文本text - input的设置要求。

注意这里是重点,敲黑板了 !这是我当小白的时候,踩过的最大的坑,完全是自己试出来的。发布为工具的工作流,参数格式必须是文本text-input,Dify Agent应用中,大模型才能Function Call调用,不然大模型是忽略这个工具的!

所以你的工作流中的输入变量要调整成下面这样!再发布为工具!

图片展示了Dify平台中发布为工具的设置界面。界面中“名称”为“Excel智能助手”,“工具调用名称”为“data_analysis”,“工具描述”为“在线表格数据分析”。关键部分是“工具入参”区域,其中“excel_url”和“usr_prompt”均为“text - input”,且有红色框突出显示,表明这两个参数是必须的。该图片与上下文紧密相关,上下文提到发布为工具的工作流参数格式需为text - input,Dify Agent应用中大模型才能Function Call调用,此图直观呈现了参数设置要求。

OK ,接下来我们就要把数据分析这个工作流当做Function Call了。再dify中创建Agent应用,不懂没关系,照着做,后面见多了就明白了。我后面也会写文仔细对比这几个类型的区别。

图片展示了Dify平台创建空白应用的界面。左侧为应用类型选择区域,有聊天助手、Agent、文本生成应用、Chatflow、工作流等类型,其中Agent类型被选中。右侧是Agent应用的介绍,称其为具备代码生成能力、自主工具调用、高完成度任务目标的智能助手。下方有应用名称及图标设置区域,应用名称为“Excel Agent”,并有“试玩”按钮。该图片与上下文介绍的在Dify中创建Agent应用的内容相契合,直观呈现了操作界面。

然后不需要做什么,把工具添加上就行了。

图片展示的是Dify平台中添加工具的操作界面。在“添加工具”区域,有“+ 创建自定义工具”选项,下方有“内容”“自定义”“工作流”等分类。右侧搜索框内输入“Excel”,搜索结果中“Excel 智能助手”被红色框突出显示。该图片与上下文紧密相关,上下文提到在Dify中创建Agent应用后,不需要做什么,只需把工具添加上,此图直观呈现了添加工具的操作步骤和选择工具的界面。

这样就大功告成了!直接预览调试,我们直接看结果吧!

图片展示的是Dify搭建私有数据可视化智能体的调试与预览界面。左侧为“编辑”区域,有提示词、变量、上下文等设置项,提示词处有“生成”按钮。右侧是“调试与预览”区域,显示“和机器人聊天”按钮,上方有“Agent设置”“gwen max latest”“发布”等选项。该图片与上下文紧密相关,直观呈现了在Dify中创建Agent应用并添加工具后的预览调试状态,是操作步骤的呈现结果。

最新的代码和Dify工作流配置文件,请后台回复"datamcp"免费获取。