以下是关于数据生成图表的相关内容:
使用 Coze 做一个智能报表助手的实现过程:
ChatGPT 助力数据分析的问题与技巧:
ChatGPT 助力数据分析的流程:
用户上传excel后,在工作流中可以拿到excel连接,然后写一个插件通过url下载当前excel,再读取excel里的数据。开始我打算把解析出来的excel数据以单元格的形式存到bot数据库,然后使用大模型根据单元格数据和用户提问生成答案,但是经过多次实验,发现大模型的计算能力特别差,经常出现计算错的情况。比如一张学生成绩表,用户想求某个学科的平均数,大模型可以把当前学科所有分数精准的提取出来,最后一步计算的时候,经常会出现错误。然后就试了一下另外一套方案,把excel转换为数据表,然后使用大模型把用户问题转换为sql,发现这样做生成的sql准确率非常高,基本都能得到想要的结果。coze里不能动态创建表,所以我自己写了一个服务,在动作流里调用这个服务,根据excel的url动态创建表,同时把excel数据插入到表中,最后把服务返回的动态表名存到coze数据库中,这一步是为了后续用户提问问题时,根据表名动态执行sql,拿到数据。最后再根据数据库表字段信息,使用大模型为用户生成3个推荐报表,报表信息中包含标题、描述、查询sql。这里防止一次查询出来的数据过多,传给大模型时候崩溃,所以限制数据100条。拿到sql后,使用插件动态执行sql查询数据,再根据标题和数据使用大模型转换为绘制echarts图表的参数。绘制图表,官方有一个插件,但是这个插件生成的图表图表有点模糊,我自己就写了一个插件,生成的图表图片就清晰度比较高,echarts绘制图表时可以设置缩放,我给图片放大了三倍,清晰度就变高了很多。
对上面的流程,记录开发时一些问题和技巧,部分我采用一问一答形式说明。[heading3]公用逻辑[content]1、为什么在user prompt限定SQL和数据分析及其返回格式,而不用system prompt?有两个方面,一是因为system prompt已经承载了表结构信息;二是user prompt遵循力度更高。尝试多次,还是让user prompt承载具体返回格式更为精确,这一操作在后端进行,防止用户通过开发者工具查看参数。2、为什么分开定义单维度数据和多维度数据的prompt,而不直接丢给让GPT判断?最好不要给让GPT存在两种返回格式的prompt。例如:“如果数据是单维度,你就返回{xxx},如果数据是多维度,你就返回{xxx}”。这类存在两种结果导向的prompt,我尝试了多次,大约有50%的几率GPT会犯傻(明明是单维度,却返回多维度格式,反之多维度却返回单维度格式)所以最好的解决方式是在发送请求前用条件运算符区分这两个格式的prompt,代码判断一下是单维度还是多维度数据,再决定用哪个prompt,再传给ChatGPT,尽量让这个prompt只存在一种结果导向。3、前端如何渲染图表?SQL分析的接口或个性化分析解析的数据文件所获得的tableData,其格式与渲染表格的格式一样:对象数组。让GPT判断出对象的key值映射:keyMap,得知维度、数据项、数据值的key,就可以拿到并处理成图表所需的series、xAxis。
1.第一个user prompt:限定SELECT SQL,这里告诉它:不要用SELECT*来查询全部列,且仅回复一条SELECT SQL语句。至少查询两列:数据项、数据值,且不能直接查询如mediumtext/longtext这样的长类型字段,可以用count/substring等函数查询这些长类型列。2.system prompt是表结构信息,如有难以理解的字段可以告诉GPT字段的意义,有多个表可分开描述。3.需校验GPT生成的SQL,不通过直接返回提示:抱歉,不支持此类请求。通过再执行SQL查询数据。4.数据分析的user prompt:提示数据分析,限定返回的JSON格式:conclusion、keyMap、title。keyMap的作用:数据key的映射,获取结果数据对应的维度、数据项、数据值的key值,用于映射数据渲染图表。由于支持多维数据,单维度数据的keyMap没有维度项,就存在让GPT返回两种结构的情况。这里我采取分开定义单维度数据和多维度数据的prompt,根据结果数据tableData的维度,用条件运算符选择对应的prompt,再传递给GPT。5.结果数据tableData是跟随接口一起返回到前端,已经通过SQL查询的数据,不能让GPT又生成一次,否则非常耗时。