结合AIGC 结合AIGC技术的数据分析平台的设计与实现
[TOC]
摘要:由于数据规模和复杂度的增加,传统的数据分析手段已满足不了人们的需求,出现了 Google Analytics 等数据分析平台,这些数据分析平台专业性强,操作复杂,不易使用。随着 OpenAI 发布 ChatGTP,人工智能发展正式步入 AIGC 普及化的新阶段,能进行数据分析,实现更加人性化的服务。故结合 AIGC 技术,设计了智能化的数据分析平台。系统前端采用 React + Ant Desigin Pro 技术实现数据的可视化,后端采用 Spring Boot + MySQL + MyBatis Plus 实现各模块的功能。通过该平台用户只需要提供原始数据和分析目标,业务后端通过 AI 服务对用户的需求进行理解和分析,从而获得分析结果和可视化图表,减轻了数据分析工作,提高了数据分析的效率,降低了数据分析门槛。
关键词:AIGC 数据分析 人工智能
引言
随着 OpenAI 发布大语言模型 ChatGPT 的爆火,标志着大模型、生成式人工智能 (Artificial Intelligence Generated Content,AIGC)正式步入普及化新阶段,带来巨大的技术和范式改变^[1]^。借助快速积累的数据和强大的算力性能,人工智能能够模仿人类思维方式生成内容并与人交互^[2]^。以 ChatGTP 为代表的人工智能生成内容技术是人机交互发展中的重大突破,其颠覆了内容的生产、表达和互动形式,得到广泛应用,产生深远影响,预测到 2026 年超过 80%的企业将使用生成式 AI 的 API 或模型,或在生产环境中部署支持生成式 AI 的应用[3]。因此,在各行各业里,AIGC 将成为重要的支柱之一。
数据分析是任何现实情况下的处理问题前的必要任务,以提取模糊数据背后的信息并总结研究情况中的规律。 这有助于管理者做出决策,以便他们能够实施适当的策略和行动。但随着数据规模的增加与数据多样性的变化带来的复杂度的急剧增加,传统的数据分析处理复杂、工作量大、可视化不足、缺乏预测性等问题越发显著,降低了工作效率。同时,已知的数据分析平台专业性强、操作复杂,不能立即上手操作,不适合多数人满足数据分析的需求。
随着人工智能的快速发展,利用 AIGC 技术对海量语言和文本数据进行信息挖掘和内容理解成为可能。在当今信息复杂的环境中,数据质量参差不齐,任务种类繁多,导致了数据孤岛和模型孤岛的存在,AIGC 技术能够很好地解决传统语言处理技术的不足^[4]^。
数据分析平台前端负责与用户交互,后端负责控制和处理数据。基于普通用户需求,研究并设计结合 AIGC 技术的数据分析平台,在前端用户只需要提供原始数据和分析目标,在后端利用 AI 对用户的需求进行理解和分析,从而获得分析结果和可视化图表。前端为一个可视化 BI 界面,含有用户登录注册,图表分析,图表管理三大功能;后端安排数据库对数据进行管理,开发文件上传接口,AI 对接,以及异步化的实现。减轻了数据分析的工作,显著地提高了数据分析的效率,降低了数据分析门槛,更加人性化^[5]^。
1 相关理论与技术介绍
1.1 开发环境
本项目的开发过程中同时使用了 WebStorm 和 IntelliJ IDEA,二者都是 JetBrains IDE 系列的一部分。WebStorm 是一款由 JetBrains 公司开发的集成开发环境,其专门用于前端模块开发。拥有丰富的功能和工具,无需安装和配置大量插件,WebStorm 从一开始就包含了 JavaScript 和 TypeScript 开发所需的一切。帮助开发者更高效地编写、调试和测试 Web 应用程序。IntelliJ IDEA 同样是由 JetBrains 公司开发的一款集成开发环境。IntelliJ IDEA 具有智能代码完成、语法高亮、自动导入包等功能,支持 Java、Kotlin、Groovy 等多种编程语言。尤其对于 Java 和 Kotlin 有着无与伦比的兼容性。和 WebStorm 一样,IntelliJ IDEA 的生态提供了大量的插件,可以扩展 IDE 的功能。
1.2 前端使用技术
前端的使用了 React+ Umi+ Ant Design Pro 创建前端用户界面,技术架构示意图,如图 1-1 所示。
- React :React 是一个用于创建用户界面的库。React 不仅仅是一个库、一种架构,甚至不只是一个生态系统,它的应用甚至不局限于 Web 开发,它可以与其他库一起使用以渲染到特定环境^[6]^。
- Umi :Umi 是可扩展的企业级 react 前端应用框架,配以生命周期完善的插件体系,覆盖从源码到构建产物的每个生命周期,支持各种功能扩展和业务需求^[7]^。
- Ant Design Pro :Ant Design Pro 是一款前端脚手架,用户可以在已搭建好的基础框架上继续向上构建自己的设计和方案。

关于本平台后端的解决方案,在使用的技术,最底层为 Java 与 MySQL,使用RabbitMQ 作为中间件实现消息传递,在其上依次架构 EasyExcel、Hutool工具库、Swagger+Knife4j 项目接口文档等内容,最后服务层交由 AIGC 技术。后端的技术架构示意图,如图 1-2 所示。
- SpringBoot :SpringBoot 是一个基于 Spring 的开源 Java 框架,使用 SpringBoot有效简化了 Spring 应用的配置和开发过程,是 Java 开发者最常使用的架构之一。
- MySQL 数据库:MySQL 数据库是一种典型的关系型数据库,用于存储数据,具有体积小、占用空间小等特点^[8]^。
- RabbitMQ:消息队列 RabbitMQ 是一款由 Rabbit Technologies 公司开发的,使用 Erlang 语言实现的,旨在实现 AMQP(Advanced Message Queuing Protocol 即高级消息队列协议)的开源消息中间件,具有可靠性、灵活性、高可拓展性。
- AI 能力
- EasyExcel :EasyExcel 用于实现 Excel 的上传和数据的解析,可以实现在 Excel中完成读取、写入等任务。
- Swagger + Knife4j 项目接口文档:Swagger 接口文档为前端调用后端代码的文件。根据后端的 Swagger 接口文档生成对应的前端请求 service 目录存储后端指定接口的方法代码。
- Hutool 工具库:Hutool 工具库是一个存储了许多实用工具类的的 Java 工具库,能够减少开发者的工作量,更加快速的完成开发任务。

从狭义角度,AIGC 技术是区别于专业生产内容、用户生产内容等传统内容创作模式的一种新型内容创作方式,其利用 AI 技术实现自动生成内容。从广义角度,AIGC 技术泛指内容自动化生成的技术集合。AIGC 既是从内容生产者视角进行分类,又是一种内容生产方式,还是用于内容自动化生成的一类技术集合^[5]^。AIGC 根据面向对象、实现功能的不同可分为:智能数字内容孪生、智能数字内容编辑、智能数字内容创作。AIGC+其他,推进数实融合,加快产业升级,提升产业效率和价值。
1.5 分库分表
当设计一个网站时,一般会将各种表都存储在同一个数据库中,每个表中都包含着 大量的信息。当使用该网站的用户人数比较少,访问量也比较少的时候,单库单表不会出现问题。但当网站的用户数量大量增加,网站功能和业务不断复杂,一张表会拥有很多字段,单个字段拥有许多内容,且整张表存储大量数据,这样会导致不仅一张表的查询压力比较大,如果还关联查询,时间等各方面的压力都在增大。在数据库中使用分库分表对数据库进行拆分可以有效得解决大数据量和高并发的问题。
-
垂直分表:
- 当表中字段很多的时候,按照字段进行垂直切分,将表中字段分成两组。一般会将不常用的、数据较大的、长度较长的拆分为“扩展表”。
-
水平分表
- 当表中数据量很大的时候,将表中数据按照某种规则切分到不同的表中,以达到分担单张表的数据量和访问量的目的。有效得降低了单张表的数据量,提高了查询效率,而且可以通过增加节点,提高系统的扩展性和容错性。但事务并发处理复杂度增加,需要增加分布式事务的管理,性能和复杂度都有所牺牲,而且跨节点查询困难,需要设计跨节点的查询模块。因为这些表还是在同一个数据库中,并且表的数据是一 直在增加的,随着数据量增加,表的不断增多,数据库的压力也会增加。
-
垂直分库
- 当数据库中的表太多的时候,会根据业务逻辑对数据库进行垂直切割,分为不同的业务模块,将不同业务模块字段或表存储在不同的数据库中。垂直分库基于数据库内核支持,对应用透明,无需额外的开发代码,易于维护。同时不同的数据库可以储 存在不同的服务器上,可以有效解决磁盘空间、内存等空间不足问题。有效的降低了单个数据库的数据量。
-
水平分库
- 水平分库指在多个服务器上分别存储一张表里切分出来的不同数据,每个服务器有相应的库和表,仅是表中数据集合不同。
1.6 限流
限流也称流量控制,在系统面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性,常见的限流算法如下:
固定窗口限流
以单位时间段作为一个窗口,维护一个计数器,计数器记录这个窗口接收请求的次数。当请求次数少于限流阈值,就允许访问;当请求次数大于限流阈值,就拒绝访问;当当前的时间窗口结束^[9]^,计数器清零。在旧一个时段的结束和新的时段的开始各并发 不超过限流阈值的访问请求,虽然在一个单位时间段里 0-1s 和 1-2s 都没有超过限流阈值,但若将结束和开始划为一个单位时间段就已经超过了限流阈值,如图 1-3 所示。

滑动窗口限流解决了固定窗口限流的临界问题。以单位时间作为一个滑动窗口,通过将时间窗口划分为更小的时间单位,每个子窗口都有计数限制。随着时间推移,会用新的子窗口替代过期的子窗口,形成一种“滑动”效果。当滑动窗口的划分的子窗口越多,滑动窗口的滚动就越平滑,限流统计就越精确。但一旦达到限流阈值后,访问请求都会被直接拒绝,会损失一部分访问请求。
漏桶限流
以固定的速率处理任意速率过来的访问请求,当请求数量达到限流阈值后就会拒绝访问请求。在一定程度上能应对流量突刺,能够固定速率处理请求,保证服务器的安全。但没办法迅速处理一批请求,只能以固定速率按顺序一个一个处理。
令牌桶限流
令牌桶限流可以应对突发流量的情况,以固定速率往令牌桶中添加令牌,当令牌数量达到限流阈值,就会被丢弃。访问请求需要获取到令牌后才能被系统接受并处理这个请求的业务逻辑,如果没有获得令牌请求访问会被拒绝,如图 1-4 所示。该策略提高了机器的利用率。

线程池一般用于执行多个不相关联的耗时任务。没有多线程的情况下,任务顺序执行,使用了线程池的话可让多个不相关联的任务同时执行^[10]^。当用户提交了任务,但任务需要很长时间的时候,用户不需要在电脑前等待,而是会保存在数据库。若要添加新的任务会进行判断,若任务提交成功了,存在空闲的线程就立即执行,不存在就放入任务队列中等待被处理。若任务提交失败了,会拒绝任务不执行或者在程序空闲时将提交 失败的任务取出执行。线程池执行流程如图 1-5 所示。

本系统在参考传统数据处理平台设计的基础上进行了改进,将 AIGC 技术与其结合,打造了一款高效的数据处理平台。客户端在输入数据和需求后,请求发送至业务后端。 在需求繁忙时,系统会进行限流,将任务排队放置于消息队列中。一旦某个功能处理完毕并处于空闲状态,系统将通知任务处理模块,并将新任务分配给空闲功能。任务处理 模块调用 AI 服务和数据库,AI 服务异步生成图表和分析结果,并将反馈发送给任务处理模块,而数据库则负责保存处理任务数据。
前端采用 React +Ant Design Pro 以及可视化开发库 Echarts;后端使用 Spring Boot框架,MySQL 数据库存储数据,利用 MyBatis Plus 数据访问框架建立联系,并实现消息队列的异步化处理和 AI 接入。
2.1 系统需求分析
在科技进步和生活方式改变的背景下,数据记录已由传统的纸质手记转向更高效的计算机记录和备份。然而,在如今的大数据时代,传统的数据分析已无法满足人们挖掘数据中所需信息的需求。
- 传统数据分析处理复杂、工作量大。利用数据挖掘和深度学习算法,提供有效的数据处理和数据简化能力
- 传统数据分析时效性差。引用异步化,降低处理时间。
- 传统数据分析可视化能力不足。通过 BI 平台,将结果以图表形式展现。
- 传统数据分析缺乏预测性。利用人工智能和大数据技术,对历史数据进行分析预测^[11]^。
- 现有数据分析平台专业性强,操作复杂。利用 AIGC 技术,对用户需求进行理解,帮助其生成需要内容,更加人性化。
2.2 总体设计
在传统的数据分析平台中,如果用户想要分析数据的变化趋势,需要用户自己手动导入初始数据,并根据平台提供的选择来选择自己需要的图表和字段,因为是平台提供的选项用户可能找不到符合自己预期的目标,最后再交给专业的数据分析师完成分析,并获得分析结论。但普通用户并不需要专业的数据分析师,需求很小,只是需要分析原始数据获得一张想要的分析图表。故设计一个系统,用户即使不会图表设计和数据分析,只要将原始数据导入平台,业务后端的 AI 模型会对用户的需求进行分析,并生成可视化图表和分析结论。平台大体设计如图 2-1 所示。
- 智能分析:用户输入目标和原始数据,可以自动生成图表和分析结论
- 图表管理:用户可以对历史图表进行删除、修改和搜索查看
- 图表生成的异步化
- 对接 AI 能力
同时,考虑到随着该平台的使用人数增多,考虑到平台的安全、平台的成本开销等
问题,做了以下优化设计:
- 安全性:对文件类型、文件大小进行检验
- 数据存储:利用分库分表理论,解决存储压力
- 限流:利用令牌桶限流思路,限制用户访问请求

面临服务处理能力有限,或者接口处理(或返回)时长较长时,采用了异步化。
- 因为 AI 生成结果时间过长,用户需要等待时间过长
- 业务服务器可能面临大量请求,导致系统资源紧张,严重时甚至可能导致服务器宕机或无法处理新的请求。
- 调用第三方服务(AI 能力)的处理能力有限。比如每 3 秒只处理 1 个请求, 就会导致 AI 处理不过来;严重时,AI 可能会对我们的后台系统拒绝服务。
故当大量用户都有需求,每个人都需要等待 AI 提供结果,将会导致 AI 工作压力太大,可以采用消息队列技术。通过消息队列,用户可以提交生成图表的请求,这些请求会进入队列,AI 服务会依次处理队列中的请求,从而避免了同时处理大量请求造成的压力,同时也能更好地控制资源的使用。
- 同步:一件事做完,再做另外一件事情
- 异步:在处理一件事的同时,可以处理另一件事情。当第一件事完成时,会收到一个通知告知你这件事已经完成,这样就可以进行后续的处理。通常,如果想将同步变为异步,必须知道何时任务已经完成[12]。因此,需要一个通知机制。
在用户需要进行长时间的操作时,点击提交后不需要在界面空等。而是先保存至数据库。然后,将用户的操作或任务添加到任务队列中,让程序或线程执行。由于程序的处理能力或线程数有限,可以先把待处理任务放入队列中等待。等空闲时,再按顺序执行,而不是直接拒绝,处理流程如图 2-2 所示。

用户需要使用平台的智能分析服务要先在登录页面进行登录。如果还没有注册过用户信息在登录过程中会报错,在登录页系统会对数据库已存储用户信息进行匹配,匹配成功即用户完成登录,否则返回错误信息。用户登录注册模块的具体流程如图 2-3 所示。

AI 服务接口需要接收系统用户前端输入的分析目标和原始数据,以及可选择填写的图表类型和图表类型信息,但在 AI 接收系统用户提交的信息之前,后端需要对提交信息合法性进行校验,防止恶意攻击,保证系统的安全性。同时还要对系统使用次数进行统计和校验,以控制系统成本。最后,调用 AI 接口,将处理成 csv 格式的数据输入给AI 模型,AI 模型接受系统用户描述的需求进行分析,理解出用户想要什么,然后对 csv格式的数据进行分析处理,会按照系统用户描述的需求给出分析结论,如果系统用户提供了图表类型要求会按照系统用户要求生成图表代码,如果系统用户没有提供图表类型,AI 模型会提供一个 json 配置的图表代码,会先将 AI 模型生成的结果上传到数据库,然后前端获得数据库中的数据生成可视化图表界面。智能分析模块的具体处理流程如图 2-4 所示。

2.6.1 库表设计
数据分析平台的数据库中包含 2 个表:用户信息表 user、图表信息表 chart。用户信息表 user 主要用于存储用户登录和注册信息;图表信息表 chart 存储两次,一次用于存储用户提交的分析目标和原始数据,一次用于存储 AI 模型分析出的图表数据和分析结论。用户实体 E-R 图如图 2-5 所示,需求图表实体 E-R 图如图 2-6 所示,结果图表实体E-R 图如图 2-7 所示。




用户信息表 user 主要存放用户信息,其中 uid 是主键,如表 2-1 所示。
需求图表信息表 chart1
需求图表信息表 chart1 主要存放了系统用户的分析需求,其中 xid 是主键,uid 是外键如表 2-2 所示。
结果图表信息表 chart2
结果图表信息表 chart2 主要存放了系统 AI 模型生成的分析结果,其中jid是主键,xid 是外键,如表 2-3 所示
2.6.2 接口设计
数据分析平台的接口目录有 3 个,分别为用户接口 UserController、图表接口 ChartController、文件接口 FileController。用户接口 UserController 主要用于系统用户的登录与注册,以及用户信息查询,用户接口信息如表 2-4 所示。
图表接口 ChartController 主要用户智能分析 AI 接口的实现和系统用户对历史图表的管理,图表接口信息如表 2-5 所示
文件接口 FileController 主要用于系统用户数据文件的上传,以及安全性校验,文件接口信息如表 2-6 所示
3 系统实现
3.1 系统登录注册模块实现
用户没有登陆时平台时不能显示功能的,当用户填写了用户名和密码,经后端校验正确后才能够使用该平台的功能,否则会提示用户名或密码错误,要求再次填写。而没有注册的用户需要先注册一下信息,将数据信息存入后端数据库才可以使用平台。
在前端创建登录页和注册页用于给用户进入平台和填写账号密码。前端设计如图 3-1 所示。后端会对信息进行审核,没有问题后数据才会录进数据库中,后端显示结果如图 3-2 所示。


//修改前端的全局请求,添加 cookie
withCredentials: true
3.2 智能分析模块实现
根据需求设计,页面分为三个板块:智能分析板块、分析结论板块和可视化图表板块。其中,智能分析板块需要添加文本框、下拉按钮、文件上传按钮、提交按钮、重置按钮,都需要和后端数据库连接,获取数据。界面设计如图 3-3 所示。

const res = await genChartByAiUsingPost(params, {}, values.file.file.originFileObj)
最后,用户提供分析目标和原始数据(必填项)后点击开始分析,待后端处理完成后,会显示数据分析结论和可视化图表。用户也可以自己选择图表类型,为了方便图表管理,用户可以为当前操作结果提供图表名称。操作示例如图 3-4 所示。

AI 服务接口的实现主要在传入信息时对其进行要先进行处理,主要为提示语和数据压缩两个方面。
AI 提问
为了能让 AI 模型对系统用户描述的需求能够分析并理解成我们需要的样子,然后对输入的数据进行处理,输出我们想要的结果,需要对 AI 模型不断调整提问词,可以在以下三个方面实现:
① 使用系统预设和控制输入格式,便于 AI 精确地理解我们的需求
② 输出格式,便于 AI 返回的内容能够更加方便地为我们所用
③ 指定一个示例问答,one-shot 或者 few-shot
下面是本系统设定的提示语 prompt:
你是一位数据分析师,也是一位前端开发的程序员,我会以一定格式给你输入一段csv 格式的数据,具体格式下:
分析需求:
(数据分析的需求或者目标)
原始数据:
(csv 格式的原始数据,用,作为分隔符)
请根据以上内容,帮我按照指定格式生成内容,如:
-----
{前端 Echarts V5 的 option 配置对象 js 代码,合理地将数据进行可视化}
-----
{图表的描述,以及明确的数据分析结论,越详细越好}
数据压缩
首先,在 ChartController.java 文件的 genChartByAi 接口方法中获取用户的输入和excel 文件。因为用户上传的原始数据的文件不适合直接上传,并且 AI 接口普遍有字数限制,需要对其进行压缩能够多传数据,以及 AI 模型输入的是数据而不是文件,需要将 excel 文件转为 csv。故在 ExcelUtils.java 文件中创建一个工具类 excelToCsv,使用 csv 对 excel 文件的数据进行提取和压缩。为防止数据不干净,还需要对其进行过滤。最后,在 genChartByAi 接口方法中调用工具类 excelToCsv 将压缩好的数据字符串。关键代码如下所示:
//读取出数据
List<Map<Integer, String>> list = null;
try{
list = EasyExcel.read(multipartFile.getInputStream())
.excelType(ExcelTypeEnum.XLSX)
.sheet()
.headRowNumber(0)
.doReadSync();
}
catch (IOException e){
log.error("表格处理错误",e);
}
if(CollUtil.isEmpty(list)){
return "";
}
//转为 csv
StringBuilder stringBuilder = new StringBuilder();
//读取表头
LinkedHashMap<Integer,String> headerMap = (LinkedHashMap<Integer, String>) list.get(0);
List<String> headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty).
collect(Collectors.toList());//过滤 null
stringBuilder.append(StringUtils.join(headerList, ",")).append("\n");
//读取数据
for(int i = 1; i < list.size(); i++){
LinkedHashMap<Integer,String> dataMap = (LinkedHashMap<Integer, String>)
list.get(i);
List<String> dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
//过滤 null
stringBuilder.append(StringUtils.join(dataList, ",")).append("\n");
}
return stringBuilder.toString();
智能分析
通过设定一个提示语的方式输入用户信息,然后将 AI 返回的结果进行拆分:切割后的空白部分、中间代码部分、文字部分,最后再拼接起来。最后,将 AI 的生成结果保存到数据库,并返回给前端。数据库成功添加数据如图 3-5 所示。

前端开发一个列表页,支持按照图表名称搜索历史图表。后端创建路由和页面,在页面 MyChart 目录下 index.tsx 文件中编写获取需要的原始数据,并定义 state 变量来存储数据用于给页面展示。无美化下前端展示数据如图 3-6 所示。

AI 有时会生成不符合要求的脏数据,需要判断数据是否合法。这里选择检查三个地方:(1)检查开头是否有中文;(2)检查前后是否有回车和空行;(3)检查 xAxis、yAxis、series、type、data 等是否为被双引号包裹的非 JSON 格式代码。



3.5.1 安全性
当用户上传原始数据文件时,可能存在恶意攻击的可能。例如用户使用自己家庭网络上传一个非常巨大的文件的低成本攻击手段,来占用服务器的带宽和存储资源,导致服务器的负载和网络流量利用率大幅提高,要支付高昂的服务器使用费用。可以采取对文件大小、文件后缀、文件的内容以及利用第三方的审核功能对文件的合规性进行校验。这里采用了较为简单的前两个。在 ChartController.java 下的 genChartByAi 接口下编写校验文件代码。
//校验文件大小
final long ONE_MB = 1*1024*1024L;
ThrowUtils.throwIf(size > ONE_MB, ErrorCode.PARAMS_ERROR, "文件超过 1M");
//校验文件后缀
String suffix = FileUtil.getSuffix(originalFilename);
final List<String> validFileSuffix = Arrays.asList("png", "jpg", "svg", "webp","jpeg","xl sx");
ThrowUtils.throwIf(!validFileSuffix.contains(suffix), ErrorCode.PARAMS_ERROR, " 文件后缀非法");
3.5.2 数据存储
一般情况下是将每个图表的原始数据全部存放在同一个数据表(chart 表)的chartData 字段里方便数据的获取和管理,但 chartData 字段中的原始数据会存在数据量非常大的情况,随着图表数的增多,会导致查询 chart 表的速度变慢。而且用户是有查看原始数据和对原始数据进行简单查询的需求,如果把所有数据存放在一个字段(列) 中,在查询时只能获取这个列的所有内容。所以需要将原始数据从 chartData 字段的一个小方格中提取出来,将原始数据以表格的形式存储在一个独立的数据表中。这样的话,系统用户在查询数据的时候,不需要在 chart 表上一条条的查询,非常的耗时间,可以通过 id 号,到对应的数据表,在该独立数据表里进行数据查询,灵活且查询的快速;而且将原始数据从 chart 表里提取出来存储在另一个表里,就避免了恶性攻击获得所有的数据,增加了安全性。实现步骤如下:
在 ChartMapper.xml 中定义 SQL 查询语句
<select id="queryChartData" parameterType="string" resultType="map">
${querySql}
</select>
虽然 select * from chart_#{chartId}不够灵活,${querySql}
灵活但其将 SQL 语句完 全交给程序去传递,使用$
符号会有 SQL 注入的风险。
在 ChartMapper.java 中定义结果返回语句
List<Map<String, Object>> queryChartData(String querySql);
该方法返回类型为 List<Map<String, Object>>表示返回的是一个由多个 map 组成的集合,每个 map 代表了一行查询结果,并将其封装成了一组键值对的形式的对象。其中,String 类型代表了键的类型为字符串,Object 类型代表了值得类型为任意对象,似得该方法可以适应不同类型的数据查询。
创建测试类 ChartMapperTest.java
将临时创建的测试表 chart_ 1777315720878694401 的原始数据所属 id 作为查询的 chartId,打印出返回结果。如图 3-10 和图 3-11 所示。
图 3-10 运行结果
图 3-11 Debug 结果
3.5.3 限流
为了防止用户过度使用系统的 AI 模型,因为每次 AI 模型的调用都需要成本的,用户的恶意使用会导致成本的升高甚至会导致成本过高而破产,因此需要控制用户对 AI模型的调用次数来避免用户的恶意使用超支。但限制用户请求访问的次数仍然存在一定风险,用户仍可以通过疯狂调用来刷量,从而导致系统成本过度消耗。故需要限制单个用户在每秒只能使用一次,在前端随机放行一部分用户,而对其他用户进行限制,以确保系统不会被恶意用户占满。根据不同的对象,可以分为针对某个方法限流,针对某个用户限流和针对某个用户的某方法限流。根据服务器的数量,可以分为本地限流和分布式限流。本地限流是指每在本地设置一个服务器就要对该服务器单独设置限流的阈值,但是这样不好追踪访问请求是在哪个服务器上,是否可能多个服务器同时访问,因此比较适合只拥有一台服务器额情况。当服务器超过一个时,对每台服务器设置限制用户每秒请求访问次数,每个服务器都可以独立地控制用户的请求频率但并不能得知用户的访问请求在哪台服务器上,会存在风险。可以使用分布式限流把用户的使用频率等数据放到一个集中的存储进行统 计,例如 Redis,然后在网关集中进行限流和统计。实现步骤如下:
-
创建 RedisssonConfig 配置类,用于初始化 RedissonClient 对象单例。
-
在 application.yml 中编写 redis 配置。
-
创建好redis客户端后,在manager目录下创建一个管理类RedisLimiterManager。
-
编写 RedisLimiterManager.java 专门提供 RedisLimiter 限流基础服务。Manager提供了通用能力,可以放在任何一个项目里使用。
-
创建测试类 RedisLimiterManagerTest.java,根据 RedisLimiterManager 中设置每秒最多访问 2 次,超过则会抛出异常“请求过于频繁”。结果如图 3-12 所示。
图 3-12 测试结果 -
在 genChartByAi 接口中设置一个限流判断,从而实现给每个用户分配一个限流器。当进行访问请求时,请求到达却没有获取到令牌时,则限流操作会抛出异常并终止请求;当请求到达并成功获取到令牌,则请求可以正常继续执行。
4 总结
本文详细描述了结合 AIGC 结合AIGC技术的数据分析平台的设计与实现。想法产生于 AIGC技术在图书馆服务的应用与创新,利用 AI 对用户需求的解读,更加人性化、个性化方式提供用户所需的资源和服务,提高图书馆管理和服务效率,优化用户体验。故可以应用 AIGC 技术设计一个普通人也能简单操作就可以实现数据分析的平台。在数据分析平台开发方面,使用了 React + Ant Design Pro 作为了前端页面设计基础,使用了 MySQL数据库对上传数据和生成结果进行保存,使用了 Spring Boot 作为后端框架,并利用MyBatis Plus、Echarts、RabbitMQ 等实现平台功能。系统用户根据自己的想法,对自己的需求进行描述,并将自己电脑上的数据上传到平台上,可以是未经处理的,然后通过AI 模型对系统用户所描述的需求的理解,对用户的原始数据进行处理,最后为系统用户提供分析结论和图表。
期待国内 AI 技术的发展,降低 AI 服务的成本。平台也需思考更好的 prompt 使 AI模型能够更精确理解并给出更符合预期的回答。在成本无法降低的时期,对成本的控制方案进行优化。
参考文献
[1] 董添.AIGC 将对各行各业产生深刻影响[N].中国证券报.2024 (A02).
[2] 中国信息通信研究院,京东探索研究院.人工智能生成内容(AIGC)白皮书[R].2022.
[3] GARTNER.2024 年重要战略技术趋势[R].2024.
[4] 郭亚军,刘振阳,郭一若等.AIGC 大学生用户信息需求研究——以 ChatGPT为例[J].情报科学,2024:1-25.
[5] 李晨阳.基于大数据处理技术的 BI 平台设计与开发[D].北京:北京交通大学,2019:5-6.
[6] 车晓彤.AIGC 赋能档案数据资源开发的路径探析[J].兰台世界,2024,(02):104-107.
[7] 王永刚.大数据时代人工智能在计算机网络技术中的应用研究[J].信息记录材料,2023 (01):107-109.
[8] 赵停停.基于 MySQL 数据库技术的 Web 动态网页设计研究[J].信息与电脑(理论版),2023,35(17):174-176.
[9] 张洋,黄楠,余厚强.AIGC 时代信息资源管理领域发展趋势[J].图书馆论坛,2024:1-8.20[10] 程帅.服务网格下流量控制系统的设计与实现[D].北京:北京邮电大学,2020:104-107.
[11] 张颖岚,卢絮,董洁等.生成式人工智能(AIGC)在科技情报研究工作中的应用[J].科技和产业,2023,23(24):159-164.
[12] 李白杨,白云,詹希旎等.人工智能生成内容(AIGC)的技术特征与形态演进[J].图书情报知识,2023,40(01):66-74.