# ChatBi **Repository Path**: liu_qinglong/chatbi ## Basic Information - **Project Name**: ChatBi - **Description**: 区别于传统的数据分析平台,用户只需要导入最原始的数据集,输入想要进行分析的目标,就能利用 AI 自动生成符合要求的图表以及分析结论。此外,还会有图表管理功能、以及一些系统优化。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-07-21 - **Last Updated**: 2023-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # chatbi #### 介绍 区别于传统的数据分析平台,用户只需要导入最原始的数据集,输入想要进行分析的目标,就能利用 AI 自动生成符合要求的图表以及分析结论。此外,还会有图表管理功能、以及一些系统优化。 #### 项目架构图 ![输入图片说明](chatbi-backend/doc/image.png) 业务流程 1.用户输入 a. 分析目标 b.上传原始数据 (excel) c.更精细话地控制图表:比如图表类型、图表名称等 2.后端校验 a.校验用户的输入是否合法 (比如长度) b.成本控制 (次数统计和校验、鉴权等) 3.把处理后的数据输入给 AI 模型 (调用 AI 接口,星球内部同学可以免费使用 AI 接口),让 AI 模型给我们提供图表信息、结论文本 4.图表信息 (是一段 json 配置,是一段代码)、结论文本在前端进行展示 #### 技术选型 前端 - React 18 - Ant Design Pro 5.x 脚手架 - Umi 4 前端框架 - Ant Design 组件库 - Echarts 可视化库 - OpenAPI 前端代码生成 后端 - Java Spring Boot - MySQL 数据库 - MyBatis-Plus 及 MyBatis X 自动生成 - Redis + Redisson 限流 - RabbitMQ 消息队列 - AI SDK (AI 能力) - JDK 线程池及异步化 - Easy Excel 表格数据处理 - Swagger + Knife4j 接口文档生成 - Hutool、Apache Common Utils 等工具库 #### RabbitMQ消息队列 ![输入图片说明](chatbi-backend/doc/rabbitMQ.png) bi生成任务和ai问答任务,通过direct交换机指定routingKey来进入对应的队列,由消费者消费,消费着处理不了的任务(bi生成失败,ai问答生成出错)会将任务发送到对应的队列,使用死信队列,将AI生成失败的消息加入到死信队列,再将次数补偿给用户,bi任务同理。针对订单未支付时,增加延迟队列,充值后10分钟不进行支付,订单则标记为超时订单。 #### RedisLimiter 限流服务 ``` /** * 限流操作 * * @param key 区分不同的限流器,比如不同的用户 id 应该分别统计 */ public boolean doRateLimit(String key) { // 创建一个限流器 RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); // 每秒最多访问 2 次 // 参数1 type:限流类型,可以是自定义的任何类型,用于区分不同的限流策略。 // 参数2 rate:限流速率,即单位时间内允许通过的请求数量。 // 参数3 rateInterval:限流时间间隔,即限流速率的计算周期长度。 // 参数4 unit:限流时间间隔单位,可以是秒、毫秒等。 boolean trySetRate = rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS); if (trySetRate) { log.info("init rate = {}, interval = {}", rateLimiter.getConfig().getRate(), rateLimiter.getConfig().getRateInterval()); } // 每当一个操作来了后,请求一个令牌 boolean canOp = rateLimiter.tryAcquire(1); return canOp; } ``` #### 异步化业务流程 ![输入图片说明](chatbi-backend/doc/diagram.jpg) 1.给 chart 表新增任务状态字段 (比如排队中、执行中、已完成、失败),任务执行信息字段 (用于记录任务执行中、或者失败的一些信息) 2.用户点击智能分析页的提交按钮时,先把图表立刻保存到数据库中,然后提交任务 3.先修改图表任务状态为“执行中”。等执行成功后,修改为“已完成”、保存执行结果;执行失败后,状态修改为“失败”,记录任务失败信息 4.用户可以在图表管理页面查看所有图表 (已生成的、生成中的、生成失败)的信息和状态 自定义线程池: ``` public ThreadPoolExecutor threadPoolExecutor() { ThreadFactory threadFactory = new ThreadFactory() { private int count = 1; @Override public Thread newThread(@NotNull Runnable r) { Thread thread = new Thread(r); thread.setName("线程:" + count); count++; return thread; } }; ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), threadFactory); return threadPoolExecutor; } ```