【微服务】Spring AI 使用详解

目录

一、前言

二、Spring AI  概述

2.1 什么是Spring AI

2.2 Spring AI 特点

2.3 Spring AI 带来的便利

2.4 Spring AI 应用领域

2.4.1 聊天模型

2.4.2 文本到图像模型

2.4.3 音频转文本

2.4.4 嵌入大模型使用

2.4.5 矢量数据库支持

2.4.6 数据工程ETL框架

三、Spring AI 对接 ChatGPT

3.1 前置准备

3.2 添加必要的依赖

3.3 接入操作流程

3.3.1 配置文件

3.3.2 增加一个测试接口

3.3.3 接口测试

3.4 OpenAiChatClient 使用

3.4.1 call使用Prompt传递参数方式1

3.4.2 call使用Prompt传递参数2

3.5 OpenAiImageClient使用

3.5.1 其他参数传递使用情况

3.6 OpenAiAudioTranscriptionClient 使用

3.7 OpenAiAudioSpeechClient使用

四、Spring AI对接Ollama

4.1 Ollama介绍

4.2 Ollama本地部署

4.2.1 下载安装包

4.2.2 执行安装

4.2.3 Ollama部署千问大模型

4.3 Ollama Web Ui部署与使用

4.3.1 可视化工具下载

4.4 Spring Ai接入Ollama

4.4.1 引入Ollama依赖

4.4.2 添加配置文件

4.4.3 使用Ollama聊天api

五、写在文末


一、前言

ChatGPT从去年到现在,热度一直不减,而且版本也在不断的升级,GPT的广泛推广和使用,让AI领域变得越来越热闹,于是基于ChatGPT的核心,越来越多的公司和技术团队加入了大模型的领域。比如阿里的通义千问,百度的千帆大模型等。在这其中,作为技术框架语言,像主流的python,java等,为了方便开发者对ChatGPT的使用,以及后续生态的融合,也开始在框架层面引入对ChatGPT的支持,本文聊聊spring框架下对ChatGPT的支持的一个新组件spring ai的使用。

二、Spring AI  概述

2.1 什么是Spring AI

官网地址:

Prompts :: Spring AI Reference

官网对Spring AI的定义如下:

 Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.

2.2 Spring AI 特点

Spring AI 是一个AI工程领域的应用程序框架,它的目标是将Spring生态系统的设计原则应用于人工智能领域,比如Spring生态系统的可移植性和模块化设计,并推广使用POJO来构建人工智能领域应用程序,但它并不是要构建一个自己的AI大模型,而是让你对接各种AI大模型,官网介绍Spring AI 具备如下特征:

  • 支持所有主要的模型提供商,如OpenAI、微软、亚马逊、谷歌和Huggingface;

  • 支持的模型类型有聊天和文本到图像,还有更多;

  • 可移植的API跨人工智能提供商聊天和嵌入模型。同时支持同步和流API选项。还支持下拉访问特定于型号的功能;

  • 人工智能模型输出到POJO的映射;

  • 支持所有主要的矢量数据库提供商,如Azure矢量搜索、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis和Weaviate;

  • 跨矢量存储提供商的可移植API,包括一个新的类似SQL的元数据过滤器API,它也是可移植的;

  • 支持函数调用;

  • 用于AI模型和矢量存储的Spring Boot自动配置和启动器;

  • 可以用于数据工程的ETL框架;

2.3 Spring AI 带来的便利

Spring Framework 和AI技术的结合,将为java生态对接人工智能提供了非常大的便利,尤其是技术组件生态完善的Spring 框架来说,这更是为项目开发AI应用提供了基础支撑,具体来说,好处如下:

  • 整合简单

    • Spring Framework 提供了广泛的功能和模块,结合人工智能技术可以打造完整的AI对接与解决方案。

  • 简化开发

    • Spring Framework 的框架和工具可以大大简化开发流程,而人工智能技术可以增强应用程序的智能化水平。

  • 高效性

    • 结合 Spring Framework 的性能优势和人工智能技术的高效处理能力,可以实现高性能的智能化应用程序。

  • 灵活性

    • 可能在 Spring Framework 的基础上开发出灵活、可扩展的人工智能模块,以满足不同应用场景的需求。

2.4 Spring AI 应用领域

从上文对Spring AI的特点介绍,不难发现,Spring AI将会在众多的领域提供有力的支撑,下面做详细说明。

2.4.1 聊天模型

Chat Models 支持很多种聊天模型,基于不同聊天模型,可以打造多场景下的聊天应用,比如当下各种聊天应用。

2.4.2 文本到图像模型

即Text-to-image Models,目前支持:

  • OpenAI with DALL-E;

  • StabilityAI;

文本转图像在现实中有着广泛的需求场景,用户按照自身的需求,输入特定的参数,即可生成预期的图片。

2.4.3 音频转文本

与上面的文本转图像类似,可以将一段音频中提取出文本内容,在某些商业领域有着较多的使用。

2.4.4 嵌入大模型使用

GPT问世之后,陆陆续续出现了很多可以商用的开源大模型,比如Ollama,ONNX等,使用spring ai作为底层开发框架,利用open ai就可以对接大模型,从而打造属于企业自身的大模型应用。

2.4.5 矢量数据库支持

Vector Store API提供了跨不同提供商的可移植性,其特点是提供了一种新颖的类似SQL的元数据过滤API,以保持可移植性,目前对矢量数据库的支持包括:

  • Azure Vector Search;

  • Chroma;

  • Milvus;

  • Neo4j;

  • PostgreSQL/PGVector;

  • PineCone;

  • Redis;

  • Weaviate;

  • Qdrant;

2.4.6 数据工程ETL框架

基于Spring AI 作为连接GPT的支撑,结合java自身优秀的数据处理特点,可以将其用于大数据ETL领域中,具体来说:

  • ETL框架的核心功能是使用Vector Store促进文档向模型提供者的传输。ETL框架基于Java函数式编程概念,可帮助您将多个步骤链接在一起;

  • 支持阅读各种格式的文档,包括PDF、JSON等;

  • 该框架允许数据操作以满足您的需求。这通常包括拆分文档以遵守上下文窗口限制,并使用关键字增强它们以提高文档检索效率;

  • 最后,处理后的文档存储在矢量数据库中,以便将来检索;

三、Spring AI 对接 ChatGPT

3.1 前置准备

在正式开始使用java对接ChatGPT之前,你需要做下面几件事,确保在后面的代码层面可以正常调用ChatGPT的相关接口。

  • api-key

    • 调用open-ai接口必须传递的参数,api-key的获取方式很多,可以通过官网注册,或者通过中转的渠道获取;

    • 如果是自己注册获得的api-key,需要解决本地的“科学”上网问题;

    • 如果是通过中转渠道获取的api-key,注意拿到中转的url,这个其实就是使用被人的代理服务器解决本地魔法上网的问题;

  • jdk17环境

    • 如果纯粹是调用open-ai接口,不用jdk17也没问题,但是后面需要使用spring ai集成调用,建议使用jdk17

  • 提前搭建springboot工程;

3.2 添加必要的依赖

本例使用springboot 3.2的版本,核心依赖如下

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--maven中心仓库还没有更新spring ai的jar包,所以使用spring的仓库ai包-->
    <repositories>
        <!--快照版本的仓库-->
        <repository>
            <id>spring-snapshot</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>

这里重点补充一下,由于目前maven中央仓库还没有spring ai的包,所以需要从spring官方提供的仓库里下载,所以在pom中需要配置官网提供的仓库地址

3.3 接入操作流程

3.3.1 配置文件

在配置文件中配置你的apkey,像我这里,使用的是中转的url,所以需要配置一下

server:
  port: 8088

spring:
  application:
    name: chat-001

  ai:
    openai:
      api-key: 你的apikey
      base-url: 默认的是openai的地址

3.3.2 增加一个测试接口

编写一个测试接口,使用OpenAiChatClient这个对象的api进行调用

import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ChatController {

    @Autowired
    private OpenAiChatClient openAiChatClient;

    //http://localhost:8088/chat?message=介绍下上海这个城市
    @GetMapping("/chat")
    public Object chat(@RequestParam("message") String message){
        String result = openAiChatClient.call(message);
        return result;
    }

}

3.3.3 接口测试

启动工程之后,调用一下接口,可以看到下面的效果

3.4 OpenAiChatClient 使用

上面通过一个简单的案例介绍了spring ai如何快速调用gpt的接口,在OpenAiChatClient这个对象中,还提供了很多种方式调用call的方法,从而返回响应结果,如下:

下面来分别聊聊几种不同API的用法

3.4.1 call使用Prompt传递参数方式1

传递一个字符串参数,使用call调用方法的时候,也可以传递一个Prompt的对象,返回的是一个ChatResponse对象,如下:

	//http://localhost:8088/chat/pro?message=介绍下上海这个城市
    @GetMapping("/chat/pro")
    public Object chatCallPrompt(@RequestParam("message") String message){
        ChatResponse call = openAiChatClient.call(new Prompt(message));
        return call;
    }

调用一下该接口,看到如下的响应结果,此时返回的是一个json对象

3.4.2 call使用Prompt传递参数2

从Prompt的对象参数中不拿发现,支持传递的构造对象方式有很多,上面是传递一个简单的字符串作为参数,也可以使用其他的方式

在官网的api文档中有详细的介绍:OpenAI Chat :: Spring AI Reference

看下面的写法,通过这种方式,可以更好的控制gpt接口返回的响应结果的质量,当然,Prompt里面可以传递的参数还有很多,可以结合官网的解释进一步理解

	//http://localhost:8088/chat/v2?message=介绍下上海这个城市
    @GetMapping("/chat/v2")
    public Object chatCallPromptV2(@RequestParam("message") String message){
        Prompt prompt = new Prompt(
                message,
                OpenAiChatOptions.builder()
                        .withModel("gpt-4-32k") //32k 参数量,参数量越大,越准确
                        .withTemperature(0.4f)  //温度值,温度值越高,准确率下降,但是创新性好
                        .build()
        );
        return openAiChatClient.call(prompt);
    }

补充

Prompt对象中的参数,也可以通过配置文件的形式进行配置,如果配置文件和代码中同时配置了,以代码中的生效

3.5 OpenAiImageClient使用

OpenAiImageClient是spring ai中提供的用于生成图片的核心对象,借助这个对象,可以传递相关的参数和描述,生成符合要求的图片,下面看一个具体的案例,如下,提供一个生成图片的接口:

import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ImageChatController {

    @Autowired
    private OpenAiImageClient openAiImageClient;

    //http://localhost:8088/image/generate?message=生成一张猫的图片
    @GetMapping("/image/generate")
    public Object chat(@RequestParam("message") String message){
        ImagePrompt imagePrompt = new ImagePrompt(message);
        ImageResponse imageResponse = openAiImageClient.call(imagePrompt);
        return imageResponse.getResult().getOutput();
    }

}

在这段代码中,通过传递一个message参数,从而构造出一个ImagePrompt的对象,最后调用openAiImageClient的call方法生成图片,调用接口,看的如下返回结果

然后将返回结果中的url输入到浏览器,就能看到一张猫的图片

注意点:

调用生成图片的接口,你的apikey需要使用GPT4.0的模型,3.5的将会报错

3.5.1 其他参数传递使用情况

在ImagePrompt对象的参数中,除了传递一个message之外,从下面的参数展示中,还可以传递其他类型的参数

在spring ai官方文档中,关于ImagePrompt对象的构造参数中,提供了如下的示例,即可以通过OpenAiImageOptions构造出第二个参数,一起传给ImagePrompt进行使用

下面看具体的接口示例

	//http://localhost:8088/image/generate/v2?message=生成一只狗的图片
    @GetMapping("/image/generate/v2")
    public Object genImageV2(@RequestParam("message") String message){
        ImagePrompt imagePrompt = new ImagePrompt(message, OpenAiImageOptions.builder()
                .withQuality("hd") //高清图像
                .withN(1) //生成1张图片,不同的模型可以生成的数量不一样
                .withHeight(1024)
                .withWidth(1024).build());
        ImageResponse imageResponse = openAiImageClient.call(imagePrompt);
        return imageResponse.getResult().getOutput();
    }

每个参数的具体含义,在官网的文档中也有详细的说说明,需要注意的是,这些参数也可以在工程的配置文件中进行配置,如果配置文件和代码中都设置了,以代码中的设置为准;

调用接口,返回如下信息

浏览器中输入这段url,可以看的正好是一张小狗的图片

3.6 OpenAiAudioTranscriptionClient 使用

即音频转文本的API对象,音频转文本的场景在日常生活中也比较常见,在GPT问世之前,也有一些厂商提供相关的商用软件,spring ai 官方的示例代码:spring-ai/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionClientWithTranscriptionResponseMetadataTests.java at main · spring-projects/spring-ai · GitHub

看下面的示例代码,需要本地目录下提供一个音频文件;

@RestController
public class TranslateController {

    @Autowired
    private OpenAiAudioTranscriptionClient openAiAudioTranscriptionClient;

    //http://localhost:8088/audio/translate/text
    @GetMapping("/audio/translate/text")
    public Object audioTranslateText(){
        Resource resource = new FileSystemResource("D:\\cat.mp3");
        String call = openAiAudioTranscriptionClient.call(resource);
        return call;
    }

}

3.7 OpenAiAudioSpeechClient使用

文本转语音的API对象,即将一段文本转为语音,参考如下代码

	@Autowired
    private OpenAiAudioSpeechClient openAiAudioSpeechClient;

    //http://localhost:8088/text/translate/audio?msg=春天悄然而至,绿意盎然的枝头绽放出无尽的生命力,仿佛是大自然的调色板,绘出一幅幅美妙的画卷。
    @GetMapping("/text/translate/audio")
    public Object textToAudio(@RequestParam String msg) throws Exception{
        byte[] call = openAiAudioSpeechClient.call(msg);
        FileOutputStream fos = new FileOutputStream("D:\\output.mp3");
        fos.write(call);
        System.out.println("字节数组写入文件成功!");
        return "success";
    }

执行完成后,本地将会生成一个音频文件

四、Spring AI对接Ollama

4.1 Ollama介绍

Ollama是一个用于部署和运行各种开源大模型的工具,能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。对用户来说,只需要通过执行几条命令就能在本地运行开源大模型,如Llama 2等。

官网:https://ollama.com/

4.2 Ollama本地部署

进入网站之后,点击右上角的 Download按钮,根据个人的实际情况,选择不同类型的安装包进行部署,我这里选择的是Windows的版本;

注意,Ollama部署的时候,对服务器或机器是有一定要求的,所以需要根据你的机器配置情况进行选择,在Ollama的官网通过github的链接点进去,可以看到如下的相关参数指导说明,在这里,你部署的大模型参数越多,理论上来说,对机器的配置要求就越高,目前先关注这一点即可。

4.2.1 下载安装包

这里选择的是windows版本

4.2.2 执行安装

Ollama的安装比较简单,双击执行这个exe文件,等待安装完成即可

安装完成之后,点击开始进入下面的shell窗口

Ollama常用命令

cmd窗口输入Ollama,即可了解常用的Ollama命令

如何理解本机部署的这个Ollama呢?如果使用过Docker的同学对docker部署一些中间件应该不陌生,比如使用docker中部署mysql或redis,只需要运行一段docker命令即可完成,非常方便,类比于Ollama,是一个大模型的部署管理工具,只需要使用Ollama的命令,也可以快速部署起一个本地的大模型进行使用。

如果你需要使用Ollama部署大模型,可以在Ollama官网进行搜索,类似于你使用docker search 镜像名一样

如下,进入到某个大模型中,拷贝命令到shell窗口中执行即可

4.2.3 Ollama部署千问大模型

“通义千问大模型”是阿里云推出的一个超大规模的语言模型,具有强大的归纳和理解能力,可以处理各种自然语言处理任务,包括但不限于文本分类、文本生成、情感分析等。此模型能够极大地提高了自然语言处理的效率和准确性,给用户提供了一种新的、简便的工具。

在Ollama中搜索关键字qwen,然后选择一个参数相对较少(对本地的空间和资源占用减小)的进行运行

使用下面的命令运行

ollama run qwen:0.5b-chat 

然后等待模型下载完成运行起来之后就可以使用了,下面这个进度窗口是不是与docker部署中间件很相像

然后就可以输入文本,与大千问模型进行对话,而后,就可以基于部署的模型应用于实际工作或业务中进行结合使用

4.3 Ollama Web Ui部署与使用

在上文中,我们在windows环境下部署了Ollama服务,基于Ollama部署了千问大模型,但是这个操作体验不是很友好,毕竟需要在命令行窗口去执行,事实上,Ollama官网也提供了比较多的可视化web操作界面可以使用,下面介绍一其中的一种。

4.3.1 可视化工具下载

通过Ollama官网的github链接进入,找到下面的位置,可以看到,web ui工具也有很多种

这里我们使用第一个Open WebUi,Open WebUI是一个可扩展、功能丰富、用户友好的自托管WebUI,它支持完全离线操作,支持各种LLM(Large Language Model)运行程序,包括Ollama和OpenAI兼容的API;

Github:https://github.com/open-webui/open-webui

官网:Open WebUI

4.4 Spring Ai接入Ollama

接下来演示如何在springboot项目中集成Ollama,参考下面的操作步骤

4.4.1 引入Ollama依赖

基于上述的spring ai版本,添加下面的依赖

		<dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
        </dependency>

4.4.2 添加配置文件

配置文件中添加Ollama相关的配置信息,注意的是,Ollama本地端口为11434

server:
  port: 8088

spring:
  application:
    name: chat-001

  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen:0.5b-chat
    openai:
      api-key: 你的apikey
      base-url: openai地址

4.4.3 使用Ollama聊天api

Ollama聊天API的核心对象为OllamaChatClient,与上述的spring ai中提供的client对象类似,在程序中可以直接调用其api,如下,传入一个msg参数,返回响应的文本内容

import jakarta.annotation.Resource;
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OllamaChatController {

    @Resource
    private OllamaChatClient ollamaChatClient;

    //http://localhost:8088/ollama/chat?msg=大数据的技术栈有哪些
    @GetMapping("/ollama/chat")
    public String ollamaChat(@RequestParam String msg){
        String resMsg = ollamaChatClient.call(msg);
        return resMsg;
    }

}

启动服务,调用一下接口,可以看到响应的内容,通过这种方式,相当于是利用spring ai接入了本地的大模型进行对话聊天。

也可以使用Prompt进行参数传递,看下面的接口

	@GetMapping("/ollama/chat/v2")
    public Object ollamaChatV2(@RequestParam String msg){
        Prompt prompt = new Prompt(msg);
        ChatResponse chatResponse = ollamaChatClient.call(prompt);
        return chatResponse;
    }

返回结果如下,返回这种结构的数据在实际使用的时候,需要对json中的字段进行解析即可

spring ai官网中也提供了Ollama的相关文档,地址:Ollama Chat :: Spring AI Reference,在文档中,可以找到很多有关Ollama的详细的配置参数,这些配置参数,都可以在Prompt对象或者配置文件中进行合理的使用,达到最佳的实践效果

比如,在下面的接口中,仍然使用Prompt对象,里面传入更多的参数选项做控制

	//http://localhost:8088/ollama/chat/v3?msg=中国排名前十的大学
    @GetMapping("/ollama/chat/v3")
    public Object ollamaChatV3(@RequestParam String msg){
        Prompt prompt = new Prompt(
                msg,
                OllamaOptions.create()
                        .withModel("qwen:0.5b-chat")
                        .withTemperature(0.4F)
        );
        ChatResponse chatResponse = ollamaChatClient.call(prompt);
        return chatResponse.getResult().getOutput().getContent();
    }

再次调用一下接口,当然这个结果是否一定准确呢?对于结果的使用还需要做认真的鉴别

五、写在文末

本文通过较大的篇幅详细介绍了Spring AI的使用,希望对看到的伙伴有用,本篇到此结束,感谢观看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

[SAP ABAP] SMW0上传模板

通常来说&#xff0c;一个批量导入的程序必须使用指定的模板&#xff0c;我们需要将模板保存到SAP系统中&#xff0c;以便用户下载并更改。这里我们可以使用事务码SMW0解决上述的问题 1.选择二进制类型 2.输入存放的包 3.创建对象 选择需要进行上传的本地模板文件到SAP系统中 …

HTML前端页面设计静态网站

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一个网…

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了&#xff0c;金媒婚恋相亲系统已经更新至最新的10.4版本了&#xff01;本人作为商业用户也已经更新至最新的旗舰版了&#xff0c;更新的内容是啥&#xff01;这个官方都有列出&#xff0c;一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…

Flink CDC 同步 Mysql 数据

文章目录 一、Flink CDC、Flink、CDC各有啥关系1.1 概述1.2 和 jdbc Connectors 对比 二、使用2.1 Mysql 打开 bin-log 功能2.2 在 Mysql 中建库建表准备2.3 遇到的坑2.4 测试 三、番外 一、Flink CDC、Flink、CDC各有啥关系 Flink&#xff1a;流式计算框架&#xff0c;不包含 …

软件标准研发管理流程文件,项目管理,项目经理管理(word原件)

为了规范系统开发流程&#xff0c;我们制定了详尽的规范文档&#xff0c;旨在通过标准化、系统化的方法提升开发效率与项目质量。该流程从明确需求阶段开始&#xff0c;通过详细的设计规划确保解决方案的可行性与前瞻性&#xff0c;随后进入高效的编码实现阶段&#xff0c;遵循…

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性&#xff08;ACID&#xff09; 1. 原子性(atomicity)&#xff1a; 2. 一致性(consistency)&#xff1a; 3. 隔离性(isolation)&#xff1a; 4. 持久性(durability)&#xff1a; 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …

固定电话怎么认证显示公司名称?

在当今商业环境中&#xff0c;企业的联系方式&#xff0c;尤其是固定电话&#xff0c;不仅是与客户沟通的重要桥梁&#xff0c;也是展示企业专业形象的一部分。许多企业希望通过拨打固定电话联系客户时&#xff0c;能够对外显示公司名称&#xff0c;以此来增加电话的可信度和品…

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…

GetX的一些高级API

目录 前言 一、一些常用的API 二、局部状态组件 1.可选的全局设置和手动配置 2.局部状态组件 1.ValueBuilder 1.特点 2.基本用法 2.ObxValue 1.特点 2.基本用法 前言 这篇文章主要讲解GetX的一些高级API和一些有用的小组件。 一、一些常用的API GetX提供了一些高级…

做一个干电池的电量检测器03:数值拟合与电路仿真

首先在表格中进行详细的计算&#xff0c;整理出所需的数据。接着&#xff0c;我们运用MATLAB的强大功能对这些数据进行插值处理&#xff0c;生成了一个离散的数值数组。这个数组的每个数值都精确地对应着模数转换器&#xff08;ADC&#xff09;采样到的信号。通过这些数值&…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十九)--mysql数据库基本操作

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十九&#xff09;–mysql数据库基本操作 一、MySQL的基本操作&#xff08;1&#xff09;&#xff08;难点&#xff09; 1、名词介绍 以Excel文件举例&#xff1a; 数据库&#xff1a…

关于我的编程语言——C/C++——第四篇(深入1)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09; 字符类型介绍 char…

【python】OpenCV—Tracking(10.4)—Centroid

文章目录 1、任务描述2、人脸检测模型3、完整代码4、结果展示5、涉及到的库函数6、参考 1、任务描述 基于质心实现多目标&#xff08;以人脸为例&#xff09;跟踪 人脸检测采用深度学习的方法 核心步骤&#xff1a; 步骤#1&#xff1a;接受边界框坐标并计算质心 步骤#2&…

Unity核心笔记

1、认识模型的制作 1.建模 2.展UV 3.材质和纹理贴图 4.骨骼绑定 5.动画制作 总结 2、图片导入概述 1.Unity支持的图片格式 2.图片设置的6大部分 3、纹理类型设置 1.纹理类型主要是设置什么 2.参数讲解 4、纹理形状设置 1.纹理形状主要设置什么 2.参数讲解 5、纹理高级设置 …

(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录 前言一、仿真测试模型二、仿真代码三、仿真结果四、迫零均衡器和MMSE均衡器的实现1.均衡器的MATLAB实现2.均衡器的性能测试 总结 前言 本文给出仿真模型与MATLAB代码&#xff0c;分别使用具有ISI的三个不同传输特性的信道&#xff0c;仿真测试了使用迫零均衡器和MMSE…

[项目] C++基于多设计模式下的同步异步日志系统

[项目] C基于多设计模式下的同步&异步日志系统 文章目录 [项目] C基于多设计模式下的同步&异步日志系统日志系统1、项目介绍2、开发环境3、核心技术4、日志系统介绍4.1 日志系统的价值4.2 日志系统技术实现4.2.1 同步写日志4.2.2 异步写日志 5、相关技术知识5.1 不定参…

动态规划应该如何学习?

动态规划如何学习 参考灵神的视频和题解做的笔记&#xff08;灵神YYDS&#xff0c;以后也都会用这套逻辑去思考&#xff09; 枚举选哪个&#xff1a; 动态规划入门&#xff1a;从记忆化搜索到递推_哔哩哔哩_bilibili 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&a…

RK3588的QT交叉编译环境搭建

主要参考为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版_rk3568交叉编译-CSDN博客 先说一下&#xff0c;使用的Ubuntu20.04.5版本&#xff0c;qt源码用的5.14.2版本&#xff0c;交叉编译器使用RK3588…

专利生成穿刺demo

一、做原型 做原型&#xff1f;具体需求是啥&#xff1f;只有一个“帮助客户生成专利说明书”这样一个笼统的要求&#xff1f; 只有这些肯定是不能用来指导原型开发的。既然目前没有准确的需求&#xff0c;那就先看看现有的产品现状吧。 1.竞品分析 怎么开展哪&#xff1f;…