智能BI(后端) -- 智能分析业务

文章目录

  • 业务流程
  • 开发接口
    • easyExcel从excel读取数据,数据过滤并进行数据压缩
    • 分析接口
    • 利用AI生成结论和图表
    • AI提问技巧
    • 调用AI
      • 直接调用AI大模型官网的接口
      • 使用云服务商提供的,封装后的AI接口
      • 利用鱼聪明AI提供的开放SDK
    • 智能接口实现

业务流程

  1. 用户输入

a. 分析目标
b. 上传原始数据
c. 更精细话地控制图表,比如图表类型,图表名称等

  1. 后端校验

    a. 校验用户的输入是否合法
    b. 成本控制(次数统计和校验,鉴权等)

  2. 把处理后的数据输入给AI模型(调用AI接口),让AI模型给我们提供图表信息,结论文本

  3. 图表信息(是一段json配置,是一段代码),结论文本在前端进行展示

开发接口

easyExcel从excel读取数据,数据过滤并进行数据压缩

不要想复杂啦,读取数据很正常,数据过滤就是过滤掉null的数据,数据压缩转化为csv,其实就是转换格式,用英文逗号分割,节省空间,给个预设语句,可以使得AI回答地更准确

package com.yupi.springbootinit.utils;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** excel相关工具类*/
@Slf4j
public class ExcelUtils {/*** 数据压缩为csv,返回字符串*/public static String excelToCsv(MultipartFile multipartFile){//读取数据List<Map<Integer, String>> list = null;try {list = EasyExcel.read(multipartFile.getInputStream()).excelType(ExcelTypeEnum.XLSX).sheet().headRowNumber(0).doReadSync();} catch (IOException e) {log.error("表格处理错误");}System.out.println(list);//如果数据为空if(CollUtil.isEmpty(list)){return "";}//转换为csv (数据压缩)StrBuilder strBuilder = new StrBuilder();//过滤表头数据//todo 问为什么要用LinkedHashMap呢?LinkedHashMap<Integer, String> headMap = (LinkedHashMap<Integer, String>) list.get(0);List<String> headValueList = headMap.values().stream().filter(item -> ObjectUtil.isNotEmpty(item)).collect(Collectors.toList());String head = StringUtils.join(headValueList, ",");System.out.println(head);strBuilder.append(head).append("\n");//过滤表数据for (int i = 1; i < list.size(); i ++){LinkedHashMap<Integer, String> dataListMap = (LinkedHashMap)list.get(i);List<String> dataList = dataListMap.values().stream().filter(item -> ObjectUtil.isNotEmpty(item)).collect(Collectors.toList());String data = StringUtils.join(dataList, ",");System.out.println(data);strBuilder.append(data).append("\n");}return strBuilder.toString();}/*** test* @param args*/public static void main(String[] args) {excelToCsv(null);}
}

分析接口

    /*** 上传文件,返回数据** @param multipartFile* @param genChartByAiRequest* @param request* @return*/@PostMapping("/gen")public BaseResponse<String> genChartByAi(@RequestPart("file") MultipartFile multipartFile,GenChartByAiRequest genChartByAiRequest, HttpServletRequest request) {String name = genChartByAiRequest.getName();String goal = genChartByAiRequest.getGoal();String chartType = genChartByAiRequest.getChartType();//分析目标为空抛出异常ThrowUtils.throwIf(StringUtils.isBlank(goal),ErrorCode.PARAMS_ERROR,"分析目标为空");//名称不为空并且名称>100 提示名称过长ThrowUtils.throwIf(StringUtils.isNotBlank(name) && name.length() > 100,ErrorCode.PARAMS_ERROR,"图表名称过长");StrBuilder userInput = new StrBuilder();userInput.append("你是一个数据分析师,接下来我会给你我的分析目标和原始数据,请告诉我分析结论:").append("\n");userInput.append("分析目标:").append(goal).append("\n");String result = ExcelUtils.excelToCsv(multipartFile);userInput.append("数据:").append(result).append("\n");return ResultUtils.success(userInput.toString());}

利用AI生成结论和图表

生成结论

生成图表:
AI无法直接生成现成的图表,但是AI可以生成图表代码,可以把代码利用前端组件库(Echarts)在网页进行展示

预期生成的图表代码

AI提问技巧

如果想让AI更好的理解我们的输入,给我们预期的,精确格式的输出,我们就需要严格控制咱们的提问词
0)使用系统预设
1)控制输入格式(便于AI精确地理解我们的需求和提问)
2)控制输出格式(便于AI返回的内容能够更加方便的为我们所用)
3)指定一个示例问答

调用AI

直接调用AI大模型官网的接口

官方文档:https://platform.openai.com/docs/api-reference
优点:不经封装,最灵活,最原始
缺点:要钱,要魔法
本质上openAI就是提供了Http接口,我们可以用任何语言去调用
1)在请求头中指定OPENAI_API_KEY
2)找到你要使用的接口,比如AI对话接口
3)按照接口文档的示例,构造Http请求,比如用Hutool工具类,或者HttpClient

/*** AI 对话(需要自己创建请求响应对象)** @param request* @param openAiApiKey* @return*/
public CreateChatCompletionResponse createChatCompletion(CreateChatCompletionRequest request, String openAiApiKey) {if (StringUtils.isBlank(openAiApiKey)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "未传 openAiApiKey");}String url = "https://api.openai.com/v1/chat/completions";String json = JSONUtil.toJsonStr(request);String result = HttpRequest.post(url).header("Authorization", "Bearer " + openAiApiKey).body(json).execute().body();return JSONUtil.toBean(result, CreateChatCompletionResponse.class);
}

使用云服务商提供的,封装后的AI接口

比如:Azure云
优点:不用魔法
缺点:依然要钱,可能比直接调用原始的接口更贵

利用鱼聪明AI提供的开放SDK

优点:有很多现成的模型,可以预设
https://github.com/liyupi/yucongming-java-sdk

智能接口实现

echarts在线调试:https://echarts.apache.org/examples/zh/editor.html?c=line-simple

  1. 构造用户请求(用户消息,csv,图表类型)
  2. 调用鱼聪明sdk,得到AI响应结果
  3. 从AI响应结果中,取出需要的信息
  4. 保存图表到数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VisualGDB:Linux动态库项目创建、编译及库的使用

此篇接上篇 《VisualGDB:为Linux项目添加系统依赖库》,在本篇中我们重点分享一下如何基于VisualGDB 在VS中创建Linux动态库项目,如何编译及使用创建的动态库。 一、VisualGDB创建Linux动态库项目 如下,我们创建一个Linux下的动态库项目MyMath 二、编译动态库 我们稍微…

哈夫曼编码python算法实现(图片版)

一、问题&#xff1a; 请使用哈夫曼编码方法对给定的字符串&#xff0c;进行编码&#xff0c;以满足发送的编码总长度最小&#xff0c;且方便译码。“AABBCCDDEEABCDDCDBAEEAAA” 二、过程&#xff1a; 三、结果&#xff1a;

二叉树遍历算法

1.树层次遍历算法&#xff0c;返回树深度 #include <iostream> #include <queue>struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };int maxDepth(TreeNode* root) {if (root nullptr) {r…

代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 LeetCode 1005.K次取反后最大化的数组和 题目链接&#xff1a;LeetCode 1005.K次取反后最大化的数组和 思路&#xff1a; 按绝对值排序 class Solution { public:bool static cmp(int…

手动实现简易版RPC(四)

手动实现简易版RPC(四) 往期内容 手动实现简易版RPC&#xff08;一&#xff09;&#xff1a;RPC简介及系统架构 手动实现简易版RPC&#xff08;二&#xff09;&#xff1a;简单RPC框架实现 手动实现简易版RPC(三)&#xff1a;mock数据生成 前言 接上几篇博客我们实现了最…

C++类和类模板——入门

一、类模板&#xff1a; 1.什么是类模板&#xff1f; template<typename T> class Myclass { public&#xff1a;T index;T func(); };类模板相比于普通的类&#xff0c;实现了对类的复用&#xff0c;这里的T可以作为变量或者函数返回值的类型 2.怎么使用类模板&#…

完美实现vue3异步加载组件

经过几个小时的努力&#xff0c;终于实现了&#xff0c;根据组件名异常加载组件&#xff0c;直接上代码&#xff0c;网上的很多代码方都有坑&#xff0c;先贴出比较坑的代码&#xff1a; <template><view class"main"> <view class"tops"…

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中&#xff0c;跑通基于CAD模型为输入的demo&#xff0c;输出位姿信息&#xff0c;可视化结果。 然后分享NeRF物体重建部分的训练&#xff0c;以及RGBD图为输入的demo。 1、搭建环境 方案1&#xff1a;基于docker镜像&#xff08;推荐&#xf…

Centos Yum

什么是yum yum&#xff0c;全称为 Yellowdog Updater Modified&#xff0c;是一种基于 RPM 包管理器的开源软件包管理器&#xff0c;主要用于 CentOS、Red Hat Enterprise Linux&#xff08;RHEL&#xff09;和 Fedora 等 Linux 发行版。yum 用来简化软件的安装、更新和管理过…

重置密码之后无法ssh登录

背景描述 我这边有个服务器S&#xff0c;我从ServerA可以ssh上去&#xff0c;但是我从堡垒机B无法ssh上去&#xff1b;一开始以为是密码问题&#xff0c;手动重置密码&#xff0c;但是依然无法登录进去&#xff1b;一直提示密码错误&#xff1b;改了好几次密码都不行 问题原因…

5.9号模拟前端面试10问

5.9号模拟前端面试10问 1.html语义化的理解 HTML语义化是指使用具有明确含义的HTML标签来描述内容&#xff0c;而不仅仅是使用<div>和<span>等通用容器标签。语义化的HTML代码更易于阅读和维护&#xff0c;同时也有助于搜索引擎优化&#xff08;SEO&#xff09;。…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见&#xff0c;192.168.100.101客户端可以连接上19…

wish、亚马逊怎么给店铺引流?怎么运用自养号测评提高流量的转化率?

作为全球知名的跨境电商平台&#xff0c;wish、亚马逊为卖家提供了一个拓展海外市场的机会。然而&#xff0c;在wish、亚马逊平台上建立和经营一家成功的店铺需要有效的引流策略。那么&#xff0c;Wish、亚马逊怎样才能给店铺引流呢&#xff1f; 一、Wish、亚马逊怎么给店铺引…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…

李飞奇遇之键盘侠刘一刀

在这个充满挑战和机遇的信息时代&#xff0c;程序员和键盘侠在不同的领域中展现出了他们的智慧和勇敢。他们各自在自己的领域中取得了巨大的成功&#xff0c;但在面对邪恶势力的共同威胁时&#xff0c;他们也展现了超越个人之上的团结和合作精神。在这个充满挑战的时代&#xf…

javaMail快速部署——发邮件喽~

目录 功能阐述 前序步骤 &#xff08;1&#xff09;到QQ邮箱中获取到授权码 代码实现 坑 今天在写一个修改密码的功能的时候要用到邮箱的发送&#xff0c;然后因为这个项目比较老旧了&#xff0c;采用的是javaWeb和jsp的配置&#xff0c;对于我只使用过springBoot整合的ja…

苹果新款 M4 芯片专注于 AI

爆炸性消息&#xff01;苹果的新一代 M4 芯片来了&#xff01;这家伙拥有 38 万亿次操作的超强神经引擎&#xff0c;速度比苹果 A11 芯片的 NPU 快 60 倍&#xff01;虽然它的速度还没有达到 Snapdragon X Elite 的 45 TOPS&#xff0c;但苹果自夸 M4 将提供与最新 PC 芯片相同…

解决后端ID传到前端时被截断,末尾显示00

问题原因&#xff1a; Java后端Long类型的取值和前端Number类型取值范围不一样。 解决方案&#xff1a; 将id字段进行json序列化时转为字符串。 JsonSerialize(using ToStringSerializer.class) private Long id;

带你入门React

目录 前言一&#xff0c;基本配置1.1 环境搭建1.2 页面初始化渲染二&#xff0c;基础学习2.1 结构与样式开发2.2 数据展示2.3 行内样式2.4 条件渲染2.5 列表渲染2.6 点击事件 三&#xff0c;页面更新3.1 组件数据3.2 组件数据共享 总结 前言 笔者之前的工作经验都局限于Vue&am…

ICode国际青少年编程竞赛- Python-2级训练场-for循环中的变量

ICode国际青少年编程竞赛- Python-2级训练场-for循环中的变量 1、 for i in range(4):Dev.turnLeft()# 将i1作为Dev移动的步数Dev.step(i 1)2、 for i in range(4):Spaceship.step(i 1)Dev.step(3)Dev.step(-3)3、 for i in range(5):Dev.step(5 - i)Dev.turnRight()4、 …