智能BI项目第三期

AIGC

AI 提问技巧

为了让 Al 更好地理解我们的输入,并给出预期精确的输出,需要严格控制我们的提问词。

1.使用系统预设 + 控制输入格式(便于Al精确地理解我们的需求)

你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容:
分析需求:
{数据分析的需求或者目标}
原始数据:
{csv格式的原始数据,用,作为分隔符}
请根据以上内容,帮我生成数据分析结论和可视化图表代码
2.控制输出格式(便于 AI 返回的内容能够更加方便地为我们所用)
你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容:
分析需求:
{数据分析的需求或者目标}
原始数据:
{csv格式的原始数据,用,作为分隔符}请根据这两部分内容,按照以下指定格式生成内容(此外不要输出任何多余的开头、结尾、注释)
----------------------------------------------------------------------------------
{前端 Echarts V5 的 option 配置对象js代码,合理地将数据进行可视化,不要生成任何多余的内容,比如注释}
----------------------------------------------------------------------------------
{明确的数据分析结论、越详细越好,不要生成多余的注释}----------------------------------------------------------------------------------
{title: {text: '网站用户增长情况',subtext: ''},tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},legend: {data: ['用户数']},xAxis: {data: ['1号', '2号', '3号']},yAxis: {},series: [{name: '用户数',type: 'bar',data: [10, 20, 30]}]
}
----------------------------------------------------------------------------------
根据数据分析可得,该网站用户数量逐日增长,时间越长,用户数量增长越多。
3.指定一个示例问答,one-shot 或者 few-shot

one-shot:给 AI 一轮示例问答

few-shot:给 AI 多轮示例问答

之后就可以慢慢训练这个模型,哪里不对就在预设和提示词里限制,训练成功后再放入示例。

如何调用AI
1.调用官方接口

比如 OpenAI 或者其他 AI 原始大模型官网的接口 👉 官方文档

  • 优点:不经封装,最灵活,最原始
  • 缺点:要钱、要魔法

本质上 OpenAI 就是提供了 HTTP 接口,我们可以用任何语言去调用

1)在请求头中指定 OPENAI_API_KEY → Authorization: Bearer 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);
}

最终结果可能返回以下内容:

2 使用云服务商提供的封装接口 

比如:Azure 云(微软官方)

  • 优点:本地都能用
  • 缺点:依然要钱,而且可能比直接调用原始的接口更贵
3 鱼聪明 AI 开放平台

使用星球 AI 助手 —— 鱼聪明 AI  移动端搜索公众号【鱼聪明AI】。

鱼聪明 AI 提供现成的 SDK,让用户更便捷地利用 AI 能力。

具体调用方式可查看:--- SDK项目文档

  • 优点:目前不要钱,而且有很多现成的模型(prompt 系统预设)给大家用
  • 缺点:不完全灵活,但是可以定义自己的模型
1.到上面的文档里引入依赖
2.在application.yml填加上你的accessKey和secretKey

3.创建一个类,注入client,并写入模型Id

package com.yupi.springbootinit.manager;import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.exception.BusinessException;
import com.yupi.yucongming.dev.client.YuCongMingClient;
import com.yupi.yucongming.dev.common.BaseResponse;
import com.yupi.yucongming.dev.model.DevChatRequest;
import com.yupi.yucongming.dev.model.DevChatResponse;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** 用于对接 AI 平台*/
@Service
public class AiManager {@Resourceprivate YuCongMingClient yuCongMingClient;/*** AI 对话** @param message* @return*/public String doChat(String message) {// 第三步,构造请求参数DevChatRequest devChatRequest = new DevChatRequest();// 模型id,尾后加L,转成long类型devChatRequest.setModelId(1651468516836098050L);devChatRequest.setMessage(message);// 第四步,获取响应结果BaseResponse<DevChatResponse> response = yuCongMingClient.doChat(devChatRequest);// 如果响应为null,就抛出系统异常,提示“AI 响应错误”if (response == null) {throw new BusinessException(ErrorCode.SYSTEM_ERROR, "AI 响应错误");}return response.getData().getContent();}
}

 然后创建一下测试类,按你预期设定的格式输入数据,便可以调用AI了

4.封装返回类接收
package com.ptu.api.model.vo;import lombok.Data;@Data
public class BiResponse {/*** 生成的图表代码*/private String genChart;/*** 生成的分析结论*/private String genResult;/*** 图表id*/private Long chartId;
}
5.编写代码

之前我们是拼接用户的输入,现在可以对之前的输入方式进行优化;

通过设定一个提示语(prompt)的方式来输入用户信息,而不必自己编写提示语。

这种优化方式使得我们可以直接调用现有模型来进行处理。

注入刚刚封装好的对象,

// 指定一个模型id(把id写死,也可以定义成一个常量)long biModelId = 1659171950288818178L;/** 用户的输入(参考)分析需求:分析网站用户的增长情况原始数据:日期,用户数1号,102号,203号,30* */// 构造用户输入StringBuilder userInput = new StringBuilder();userInput.append("分析需求:").append("\n");// 拼接分析目标String userGoal = goal;// 如果图表类型不为空if (StringUtils.isNotBlank(chartType)) {// 就将分析目标拼接上“请使用”+图表类型userGoal += ",请使用" + chartType;}userInput.append(userGoal).append("\n");userInput.append("原始数据:").append("\n");// 压缩后的数据(把multipartFile传进来)String csvData = ExcelUtils.excelToCsv(multipartFile);userInput.append(csvData).append("\n");// 拿到返回结果String result = aiManager.doChat(biModelId,userInput.toString());// 对返回结果做拆分,按照5个中括号进行拆分String[] splits = result.split("【【【【【");// 拆分之后还要进行校验if (splits.length < 3) {throw new BusinessException(ErrorCode.SYSTEM_ERROR,"AI 生成错误");
}String genChart = splits[1].trim();String genResult = splits[2].trim();// 插入到数据库Chart chart = new Chart();chart.setName(name);chart.setGoal(goal);chart.setChartData(csvData);chart.setChartType(chartType);chart.setGenChart(genChart);chart.setGenResult(genResult);chart.setUserId(loginUser.getId());boolean saveResult = chartService.save(chart);ThrowUtils.throwIf(!saveResult, ErrorCode.SYSTEM_ERROR, "图表保存失败");BiResponse biResponse = new BiResponse();biResponse.setGenChart(genChart);biResponse.setGenResult(genResult);biResponse.setChartId(chart.getId());return ResultUtils.success(biResponse);
6总结
  1. 构造用户请求(用户消息、csv 数据、图表类型)
  2. 调用鱼聪明 sdk,得到 AI 响应结果
  3. 从 AI 响应结果中,取出需要的信息
  4. 保存图表到数据库

前端开发

前端就大概过一下,不深究

1.开发用户表单

修改路由

把主页重定向至/add_chart,将/add_chart指定到/AddChart

复用写好的页面

复制User目录,粘贴至srcpages目录下;

并改名为AddChart,把其他文件删掉,留下index.tsx

 

index.tsx进行修改,删掉多余的内容。(比如::获取用户信息、处理提交.....)

import { listChartByPageUsingPOST } from '@/services/yubi/chartController';
import { useModel } from '@umijs/max';
import React, { useEffect, useState } from 'react';const Login: React.FC = () => {const [type, setType] = useState<string>('account');const { setInitialState } = useModel('@@initialState');useEffect(() => {listChartByPageUsingPOST({}).then((res) => {console.error('res', res);});});return (// 把页面内容指定一个类名add-chart<div className="add-chart"></div>);
};
export default Login;
去官网找模板

怎么去开发表单?去 ant.design 组件库 找一个表单组件;

我们需要用到多行输入(你的目标)、下拉输入(图表类型)、文件上传(原始数据)三个组件。

把这些内容放到return里面的div标签里

这部分内容放在return的外面(点击提交后的业务六级)

onFinishconst onFinish = (values: any) => {console.log('Received values of form: ', values);
};
简化内容

删除不必要的代码。

(比如:表格布局、样式,最大宽度,普通输入框、slider 滚动选项...)

import { listChartByPageUsingPOST } from '@/services/yubi/chartController';
import { UploadOutlined } from '@ant-design/icons';
import { useModel } from '@umijs/max';
import { Button, Form, Select, Space, Upload } from 'antd';
import TextArea from 'antd/es/input/TextArea';
import React, { useEffect, useState } from 'react';const Login: React.FC = () => {const [type, setType] = useState<string>('account');const { setInitialState } = useModel('@@initialState');useEffect(() => {listChartByPageUsingPOST({}).then((res) => {console.error('res', res);});});const onFinish = (values: any) => {console.log('Received values of form: ', values);};return (// 把页面内容指定一个类名add-chart<div className="add-chart"><Form// 表单名称改为addChartname="addChart"onFinish={onFinish}// 初始化数据啥都不填,为空initialValues={{  }}><Form.Item name="rate" label="Rate"><TextArea /></Form.Item><Form.Itemname="select"label="Select"hasFeedbackrules={[{ required: true, message: 'Please select your country!' }]}><Select placeholder="Please select a country"><Option value="china">China</Option><Option value="usa">U.S.A</Option></Select></Form.Item><Form.Itemname="upload"label="Upload"valuePropName="fileList"extra="longgggggggggggggggggggggggggggggggggg"><Upload name="logo" action="/upload.do" listType="picture"><Button icon={<UploadOutlined />}>Click to upload</Button></Upload></Form.Item><Form.Item wrapperCol={{ span: 12, offset: 6 }}><Space><Button type="primary" htmlType="submit">Submit</Button><Button htmlType="reset">reset</Button></Space></Form.Item></Form></div>);
};
export default Login;

编写前端代码
import { listChartByPageUsingPOST } from '@/services/yubi/chartController';
import { UploadOutlined } from '@ant-design/icons';
import { useModel } from '@umijs/max';
import { Button, Form, Input, Select, Space, Upload } from 'antd';
import TextArea from 'antd/es/input/TextArea';
import React, { useEffect, useState } from 'react';const Login: React.FC = () => {const [type, setType] = useState<string>('account');const { setInitialState } = useModel('@@initialState');useEffect(() => {listChartByPageUsingPOST({}).then((res) => {console.error('res', res);});});const onFinish = (values: any) => {// 看看能否得到用户的输入console.log('表单内容: ', values);};return (// 把页面内容指定一个类名add-chart<div className="add-chart"><Form// 表单名称改为addChartname="addChart"onFinish={onFinish}// 初始化数据啥都不填,为空initialValues={{  }}>{/* 前端表单的name,对应后端接口请求参数里的字段,此处name对应后端分析目标goal,label是左侧的提示文本,rules=....是必填项提示*/}<Form.Item name="goal" label="分析目标" rules={[{ required: true, message: '请输入分析目标!' }]}>{/* placeholder文本框内的提示语 */}<TextArea placeholder="请输入你的分析需求,比如:分析网站用户的增长情况"/></Form.Item>{/* 还要输入图表名称 */}<Form.Item name="name" label="图表名称"><Input placeholder="请输入图表名称" /></Form.Item>{/* 图表类型是非必填,所以不做校验 */}<Form.Itemname="selchartTypeect"label="图表类型"><Selectoptions={[{ value: '折线图', label: '折线图' },{ value: '柱状图', label: '柱状图' },{ value: '堆叠图', label: '堆叠图' },{ value: '饼图', label: '饼图' },{ value: '雷达图', label: '雷达图' },]}/></Form.Item>{/* 文件上传 */}<Form.Itemname="file"label="原始数据">{/* action:当你把文件上传之后,他会把文件上传至哪个接口。这里肯定是调用自己的后端,先不用这个 */}<Upload name="file"><Button icon={<UploadOutlined />}>上传 CSV 文件</Button></Upload></Form.Item><Form.Item wrapperCol={{ span: 12, offset: 6 }}><Space><Button type="primary" htmlType="submit">提交</Button><Button htmlType="reset">重置</Button></Space></Form.Item></Form></div>);
};
export default Login;

对接后端

使用openAPI生成后端接口,并且把src/services/ant-design-pro删掉,对应的引用也删掉

page下的Tablelist和对应的路由也删掉

代码
import { genChartByAiUsingPOST } from '@/services/yubi/chartController';
import { UploadOutlined } from '@ant-design/icons';
import { Button, Form, Input, message, Select, Space, Upload } from 'antd';
import TextArea from 'antd/es/input/TextArea';
import React from 'react';/*** 添加图表页面* @constructor*/
// 把多余的状态删掉,页面名称改为AddChart
const AddChart: React.FC = () => {/*** 提交* @param values*/const onFinish = async (values: any) => {// 对接后端,上传数据const params = {...values,file: undefined,};try {// 需要取到上传的原始数据file→file→originFileObj(原始数据)const res = await genChartByAiUsingPOST(params, {}, values.file.file.originFileObj);// 正常情况下,如果没有返回值就分析失败,有,就分析成功if (!res?.data) {message.error('分析失败');} else {message.success('分析成功');  }  // 异常情况下,提示分析失败+具体失败原因} catch (e: any) {message.error('分析失败,' + e.message);}};  .....此处省略,代码不变.....export default AddChart;

生成图表

使用库 —— ECharts

根据文档提示,使用命令进行安装。

npm install echarts-for-react
使用ECharts和优化前端代码
import { genChartByAiUsingPOST } from '@/services/yubi/chartController';
import { UploadOutlined } from '@ant-design/icons';
import { Button, Card, Col, Divider, Form, Input, message, Row, Select, Space, Spin, Upload } from 'antd';
import TextArea from 'antd/es/input/TextArea';
import React, { useState } from 'react';
import ReactECharts from 'echarts-for-react';/*** 添加图表页面* @constructor*/
// 把多余的状态删掉,页面名称改为AddChart
const AddChart: React.FC = () => {// 定义状态,用来接收后端的返回值,让它实时展示在页面上const [chart, setChart] = useState<API.BiResponse>();const [option, setOption] = useState<any>();// 提交中的状态,默认未提交const [submitting, setSubmitting] = useState<boolean>(false);/*** 提交* @param values*/const onFinish = async (values: any) => {// 如果已经是提交中的状态(还在加载),直接返回,避免重复提交if (submitting) {return;}// 当开始提交,把submitting设置为truesetSubmitting(true);// 如果提交了,把图表数据和图表代码清空掉,防止和之前提交的图标堆叠在一起// 如果option清空了,组件就会触发重新渲染,就不会保留之前的历史记录setChart(undefined);setOption(undefined);// 对接后端,上传数据const params = {...values,file: undefined,};try {// 需要取到上传的原始数据file→file→originFileObj(原始数据)const res = await genChartByAiUsingPOST(params, {}, values.file.file.originFileObj);// 正常情况下,如果没有返回值就分析失败,有,就分析成功if (!res?.data) {message.error('分析失败');} else {message.success('分析成功');  // 解析成对象,为空则设为空字符串const chartOption = JSON.parse(res.data.genChart ?? '');// 如果为空,则抛出异常,并提示'图表代码解析错误'if (!chartOption) {throw new Error('图表代码解析错误')// 如果成功} else {// 从后端得到响应结果之后,把响应结果设置到图表状态里setChart(res.data);setOption(chartOption);}}  // 异常情况下,提示分析失败+具体失败原因} catch (e: any) {message.error('分析失败,' + e.message);}// 当结束提交,把submitting设置为falsesetSubmitting(false);};  return (// 把页面内容指定一个类名add-chart<div className="add-chart">{/* 变成两列 gutter列与列之间的间隔*/}<Row gutter={24}>{/* 表单放在第一列,卡片组件里 */}<Col span={12}><Card title="智能分析"><Form// 表单名称改为addChartname="addChart"// label标签的文本对齐方式labelAlign="left" // label标签布局,同<Col>组件,设置 span offset 值,如 {span: 3, offset: 12} labelCol={{ span: 4 }}// 设置控件布局样式wrapperCol={{ span: 16 }}onFinish={onFinish}// 初始化数据啥都不填,为空initialValues={{  }}>{/* 前端表单的name,对应后端接口请求参数里的字段,此处name对应后端分析目标goal,label是左侧的提示文本,rules=....是必填项提示*/}<Form.Item name="goal" label="分析目标" rules={[{ required: true, message: '请输入分析目标!' }]}>{/* placeholder文本框内的提示语 */}<TextArea placeholder="请输入你的分析需求,比如:分析网站用户的增长情况"/></Form.Item>{/* 还要输入图表名称 */}<Form.Item name="name" label="图表名称"><Input placeholder="请输入图表名称" /></Form.Item>{/* 图表类型是非必填,所以不做校验 */}<Form.Itemname="chartType"label="图表类型"><Selectoptions={[{ value: '折线图', label: '折线图' },{ value: '柱状图', label: '柱状图' },{ value: '堆叠图', label: '堆叠图' },{ value: '饼图', label: '饼图' },{ value: '雷达图', label: '雷达图' },]}/></Form.Item>{/* 文件上传 */}<Form.Itemname="file"label="原始数据">{/* action:当你把文件上传之后,它会把文件上传至哪个接口。这里肯定是调用自己的后端,先不用这个;maxCount={1} 限制文件上传数量为1 */}<Upload name="file" maxCount={1}><Button icon={<UploadOutlined />}>上传 CSV 文件</Button></Upload></Form.Item>{/* offset设置和label标签一样的宽度,这样就能保持对齐;其他占用的列设置成16 */}<Form.Item wrapperCol={{ span: 16, offset: 4 }}><Space>{/* 加个loading:就是把submitting的状态加入进来,加个disabled:如果正在提交,就让这个按钮禁用,不允许重复点击*/}<Button type="primary" htmlType="submit" loading={submitting} disabled={submitting}>提交</Button><Button htmlType="reset">重置</Button></Space></Form.Item></Form></Card></Col>{/* 分析结论和图表放在第二列 */}<Col span={12}><Card title="分析结论">{/* 如果分析结论存在,就展示分析结论;不存在则显示'请先在左侧进行提交' */}{chart?.genResult ?? <div>请先在左侧进行提交</div>}{/* 提交中,还未返回结果,分析结论就显示加载中的组件 */}<Spin spinning={submitting}/></Card>{/* 加一个间距 */}<Divider /><Card title="可视化图表">{/* 如果它存在,才渲染这个组件 */}{// 后端返回的代码是字符串,不是对象,用JSON.parse解析成对象option ? <ReactECharts option={option} /> : <div>请先在左侧进行提交</div>}{/* 提交中,还未返回结果,图表就显示加载中的组件 */}<Spin spinning={submitting}/></Card></Col></Row></div>);
};
export default AddChart;

主要代码:option ? <ReactECharts option={option} /> : <div>请先在左侧进行提交</div>

修改页面的名字name和图标icon

ps.图标可以去组件库内挑选,点击图标就可复制。

最终成品:

 后期会引入多线程、消息队列等机制来优化这个网站

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

<<编码>> 第 14 章 反馈与触发器(1)--振荡器 示例电路

继电器振荡器 info::操作说明 无需操作, 保持控制开关常闭以形成振荡 如需停止振荡, 则断开控制开关 注: 要看到灯闪烁的效果, 右上角 “仿真速度” 控制杆应设置为一个较低的位置(靠左侧) 另: 因继电器内部开关跳动动画效果耗时太长, 即便设置为较低的仿真速度也无法观察到开关…

不要沉迷大模型的技术与理论,学习大模型的方法——从做一个小应用开始

“ 在应用中学习技术&#xff0c;而不是沉迷于技术本身 ” 不知道大家都是怎么学习大模型技术的&#xff0c;但从个人的经验和公众号的反馈来看&#xff0c;有些人在学习大模型技术时转进了牛角尖&#xff0c;导致很多东西学不明白&#xff0c;事倍功半。 今天就从个人的学习…

PDF标准详解(五)——图形状态

在第三节中&#xff0c;我们说到Q/q 这一对操作符是用来保存和还原图形状态的&#xff0c;那个时候只有一个简单的概念&#xff0c;变换矩阵是图形状态的一员&#xff0c;那么什么是图形状态&#xff0c;以及有哪些图形状态呢&#xff1f;本节将要描述这部分的内容 图形状态 …

PHP邮箱系统:从入门到实战搭建教程指南!

PHP邮箱系统配置教程&#xff1f;如何选用合适的PHP邮箱系统库&#xff1f; 为了满足个性化和定制化的需求&#xff0c;许多开发者选择使用PHP来搭建自己的邮箱系统。AokSend将带你从入门到实战&#xff0c;详细介绍如何搭建一个功能完善的PHP邮箱系统。 PHP邮箱系统&#xf…

dcmtk在MWLSCP会忽略对于字符集的匹配

版本信息 dcmtk v3.6.4 2018-11-29 发现的原因 在我将dcmtk的wlmscpfs当作MWLSCP使用的时候&#xff0c;我在SCU端为了防止过来的数据中存在不识别的字符集&#xff0c;对于收到的数据数据进行了字符集的过滤&#xff0c;但是发现过滤没有生效。 确保数据源 首先需要确认数…

从openAI最新模型GPT-o1再谈思维链(Cot)技术,大模型该怎么提升其逻辑推理能力?

“ 推理能力是大模型迈向AGI的必经之路 ” 最近openAI发布了号称史上最强模型——o1&#xff0c;其具有强大的逻辑推理能力&#xff0c;号称能达到人类的博士生水平。 而从o1模型的评测来看&#xff0c;o1模型在数学竞赛&#xff0c;编码&#xff0c;科学问答等方面表现良好&…

这几个电脑文件加密的方法你都知道吗?

1. 使用操作系统自带的加密功能 Windows BitLocker&#xff1a;Windows的BitLocker是一个内置的磁盘加密工具。你可以通过右键点击磁盘驱动器&#xff0c;选择“启用BitLocker”&#xff0c;然后按照提示设置密码或使用USB密钥加密整个硬盘或分区。macOS FileVault&#xff1a…

AQS详解

线程创建方式 继承Thread类实现Runnable接口实现Callable接口 LockSupport的使用 LockSupport.park()/LockSupport.unpark() LockSupport是一个工具类&#xff0c;提供了基本的线程阻塞和唤醒功能&#xff0c;它是创建锁和其他同步组件的基础工具&#xff0c;内部是使用sun…

医学数据分析实训 项目七 继承学习--空气质量指标--天气质量分析和预测

项目七&#xff1a;集成学习 实践目的 理解集成学习算法原理&#xff1b;熟悉并掌握常用集成学习算法的使用方法&#xff1b;熟悉模型性能评估的方法&#xff1b;掌握模型优化的方法。 实践平台 操作系统&#xff1a;Windows7及以上Python版本&#xff1a;3.8.x及以上集成开…

【大模型技术教程】FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统

FastGPT是一个功能强大的平台&#xff0c;专注于知识库训练和自动化工作流程的编排。它提供了一个简单易用的可视化界面&#xff0c;支持自动数据预处理和基于Flow模块的工作流编排。FastGPT支持创建RAG系统&#xff0c;提供自动化工作流程等功能&#xff0c;使得构建和使用RAG…

C++速通LeetCode中等第3题-字母异位词分组

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

C++入门 之 类和对象(中)

目录 一、类的默认成员函数 ​编辑二、构造函数 三、析构函数 四、拷贝构造函数 五.运算符重载 六、赋值运算重载 七、日期类的实现 1、Date.h 2、Date.cpp 八、取地址运算符重载 1、const成员函数 2、取地址运算符重载 一、类的默认成员函数 默认成员函数就是用户不…

java之顺序表的创建

顺序表的定义&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 我们现在要实现的顺序表功能有&#xff1a;增&#xff08;add&#xff09;、删(remove)、查(get&#xff09; …

什么是PDM系统?PDM系统核心功能是什么?如何进行产品数据管理

PDM系统介绍 PDM全称为产品数据管理&#xff0c;是一种企业级的产品研发协作平台。它集成了信息技术&#xff0c;通过全面管理和协同研发业务流程&#xff0c;提升企业的整体研发管理水平&#xff0c;缩短产品研发周期&#xff0c;降低成本&#xff0c;提高产品质量。PDM系统不…

「iOS」push与present

iOS学习 前言push与poppresent与dismiss使用dismiss弹出多级PresentedViewController 与 PresentingViewController区别 总结 前言 在此前就学习过视图的push与present。与之对应的退出方法为pop与dismiss。这里进行一次总结。 push与pop pushViewController 是通过导航控制器…

开放式耳机好用吗?哪个开放式耳机好用?

现在市面上的开放式耳机真的越来越火了&#xff0c;所以很多小伙伴也会来问我&#xff0c;有哪些品牌值得入手&#xff0c;开放式耳机到底好不好用的这个问题&#xff0c;作为专业的开放式耳机测评博主对于这个问题当然是信手拈来啦&#xff0c;这篇文章就来告诉大家如何才能选…

百度Android IM SDK组件能力建设及应用

作者 | 星途 导读 移动互联网时代&#xff0c;随着社交媒体、移动支付、线上购物等行业的快速发展&#xff0c;对即时通讯功能的需求不断增加。对于各APP而言&#xff0c;接入IM SDK&#xff08;即时通讯软件开发工具包&#xff09;能够大大降低开发成本、提高开发效率&#…

js 如何代码识别Selenium+Webdriver

Python 的 Selenium 可以模拟用户操作打开浏览器&#xff0c;前端如何去识别是人机还是真人&#xff1a; window.navigator.webdriver Selenium 人机下是这样的&#xff1a; 正常使用&#xff1a;

SpringCloud Feign 以及 一个标准的微服务的制作

一个标准的微服务制作 以一个咖啡小程序项目的订单模块为例&#xff0c;这个模块必将包括&#xff1a; 各种实体类&#xff08;pojo,dto,vo....&#xff09; 控制器 controller 服务类service ...... 其中控制器中有的接口需要提供给其他微服务&#xff0c;订单模块也需要…