SpringAI调用OpenAI Demo

news2024/11/27 21:55:48

Spring AI

在maven的setting.xml

<mirror>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <mirrorOf>spring-milestones</mirrorOf>
            <url>https://repo.spring.io/milestone</url>
        </mirror>

这里以调用GPT4o为例

后来为了测试JDK8是否可用  将版本调整成了2.7.2   结果不能使用

因国内无法直接访问  按了个nginx代理

server {
		 #HTTPS的默认访问端口443。
		 #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
		 listen 443 ssl;
		 
		 #填写证书绑定的域名
		 server_name xxxx xxxxxx;
	 
		 #填写证书文件绝对路径
		 ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
		 #填写证书私钥文件绝对路径
		 ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
	 
		 ssl_session_cache shared:SSL:1m;
		 ssl_session_timeout 5m;
		 
		 #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
		 #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
		 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		 #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

		 #表示优先使用服务端加密套件。默认开启
		 ssl_prefer_server_ciphers on;
		 location /v1/{
            chunked_transfer_encoding off;
            proxy_cache off;
            proxy_buffering off;
            proxy_redirect off;
            proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            proxy_ssl_server_name on;
            proxy_http_version 1.1;
            proxy_set_header Host api.openai.com;
			proxy_set_header X-Real-IP $server_addr;
			proxy_set_header X-Forwarded-For $server_addr;
			proxy_set_header X-Real-Port $server_port;
            proxy_set_header Connection '';
			proxy_pass https://api.openai.com/;

        }

配置ChatClient另外种方式

特定的对话风格或角色,通常建议详细定义你希望模型如何回应,然后在你的应用中相应地构建提示   其实就是对话之前

你也可以为每一个接口设置单独的预定义角色  例如

以流的方式返回

这个在postMan中不好提现

可以直接在浏览器

可以看到它是以流的方式返回的,但是乱码

 

除了使用nginx转发   还可以用本地代理   只要在应用启动前配置好就行

关于ChatClient和ChatModel

ChatClient:较为通用 

ChatModel:设置模型独有功能

模型选择

下面使用ChatModel演示调用

可以参数中指定, 也可以application.properties中指定

流式

演示文生图功能

文生语音

下面做法是有问题的,因为你保存到resources目录下的话   项目是打包之后运行的  因此你第一次运行保存之后是读不到的  要读只能重新启动,这里只是演示  就先这样了

重启应用

关于语音转文本

关于多模态(意思就是你可以要发文本,要发图片,要发语音)

意思只能用GPT4或4o模型才能用多模态

以上的代码

package com.example.springai.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Media;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.*;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.api.OpenAiAudioApi;
import org.springframework.ai.openai.audio.speech.SpeechPrompt;
import org.springframework.ai.openai.audio.speech.SpeechResponse;
import org.springframework.ai.openai.audio.transcription.AudioTranscriptionPrompt;
import org.springframework.ai.openai.audio.transcription.AudioTranscriptionResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * @author hrui
 * @date 2024/6/8 2:19
 */
@RestController
public class HelloGPT {
    @Autowired
    private ChatClient chatClient;

//    public HelloGPT(ChatClient.Builder chatClientBuilder) {
//        this.chatClient=chatClientBuilder.build();
//    }

    @GetMapping("/helloai")
    public Object generate(String userInput) {
        System.out.println("userInput:"+userInput);
        return chatClient.prompt()//提示词
                .user(userInput)//用户输入
                //.system("You are a helpful assistant.")
                .call()//调用
                .content();//返回文本
    }


    @GetMapping(value = "/helloai2",produces = "text/html;charset=UTF-8")
    public Flux<String> generate2(String userInput) {
        Flux<String> output = chatClient.prompt()
                .user(userInput)
                .stream()
                .content();
        return output;
    }


    @Autowired
    private OpenAiChatModel chatModel;//ChatModel可以自动装配  不需要@Bean

    @GetMapping("/helloai3")
    public Object generate3(String userInput) {
//        ChatResponse response = chatModel.call(
//                new Prompt(
//                        "Generate the names of 5 famous pirates.",//这个其实好比用户消息
//                        OpenAiChatOptions.builder()
//                                .withModel("gpt-4-32k")
//                                .withTemperature(0.8F)
//                                .build()
//                ));
        ChatResponse response = chatModel.call(
                new Prompt(
                        userInput,//底层封装成new UserMessage(userInput)
                        OpenAiChatOptions.builder()
                                .withModel("gpt-4-turbo")
                                .withTemperature(0.8F)
                                .build()
                ));
        return response.getResult().getOutput().getContent();
    }


    @GetMapping("/helloai4")
    public Flux<ChatResponse> generate4(String userInput) {
        System.out.println("userInput:"+userInput);
        Flux<ChatResponse> stream = chatModel.stream(
                new Prompt(
                        userInput//底层封装成new UserMessage(userInput)

                ));

        return stream;
    }


    @Autowired
    private OpenAiImageModel openAiImageModel;

    @GetMapping("/helloai6")
    public Object generate6(String userInput) {
        ImageResponse response = openAiImageModel.call(
                new ImagePrompt(userInput,
                        OpenAiImageOptions.builder()
                                //设置图片清晰度
                                .withQuality("hd")
                                .withModel("dall-e-3")//默认就是这个
                                .withN(1)//生成几张图片
                                //默认高度和宽度
                                .withHeight(1024)
                                .withWidth(1024).build())

        );

        return response.getResult().getOutput().getUrl();
    }


//    @Autowired
//    private OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel;
    @Autowired
    private OpenAiAudioSpeechModel openAiAudioSpeechModel;

    @GetMapping("/helloai7")
    public Object generate7(String userInput) {
        OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
                //用的模型
                .withModel(OpenAiAudioApi.TtsModel.TTS_1.value)
                //设置人声
                .withVoice(OpenAiAudioApi.SpeechRequest.Voice.ALLOY)
                .withResponseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)
                .withSpeed(1.0f)//合成语音的速度 0.0最慢  1.0最快
                .build();

        SpeechPrompt speechPrompt = new SpeechPrompt(userInput, speechOptions);
        SpeechResponse response = openAiAudioSpeechModel.call(speechPrompt);

        byte[] output = response.getResult().getOutput();

        try {
            // 指定文件名,这里以当前时间戳命名以避免重名
            String filename = "audio_" + System.currentTimeMillis() + ".mp3";
            // 指定保存路径
            Path path = Paths.get("src/main/resources/static/" + filename);
            // 写入文件
            Files.write(path, output);

            // 获取可访问的URL,假设你的服务运行在 localhost:8080
            String fileUrl = "http://localhost:8082/" + filename;
            return ResponseEntity.ok(fileUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error saving file");
        }

    }



    @Autowired
    private OpenAiAudioTranscriptionModel openAiTranscriptionModel;

    @GetMapping("/helloai8")
    public Object generate8() {
        //语音翻译的可选配置
        var transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()
                .withResponseFormat(OpenAiAudioApi.TranscriptResponseFormat.TEXT)
                //温度  0f不需要创造力,语音是什么,翻译什么
                .withTemperature(0f)
                .build();
        var audioFile=new ClassPathResource("hello.m4a");
        //var audioFile = new FileSystemResource("/path/to/your/resource/speech/jfk.flac");

        AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile, transcriptionOptions);
        AudioTranscriptionResponse response = openAiTranscriptionModel.call(transcriptionRequest);

        return response.getResult().getOutput();
    }



    @GetMapping("/helloai9")
    public Object generate9() throws IOException {
        //图片二进制流
        byte[] imageData=new ClassPathResource("1717865484569.png").getContentAsByteArray();

        //用户信息
        var userMessage=new UserMessage("这是什么", List.of(new Media(MimeTypeUtils.IMAGE_PNG,imageData)));

        OpenAiChatOptions build = OpenAiChatOptions.builder()
                .withModel(OpenAiApi.ChatModel.GPT_4_O.getValue()).build();

        ChatResponse response=chatModel.call(new Prompt(userMessage,build));


        return response.getResult().getOutput().getContent();
    }
}

关于Function call    应对大模型无法获取实时信息的弊端

比如说,我现在问  今天杭州火车东站的客流量是多少,这样GPT肯定无法回答

那么需要怎么办呢   我们可以调用第三方接口得到信息 再告知GPT  然后GPT回答问题

大概解释

例如 我问   杭州有多少人口

这类问题,GPT是无法回答的,当然现在GPT会查阅相关资料回答,假设

这句话里有  location和count两个关键        

Function Call的作用是    当问GPT一个类似问题之后,GPT用Function Call来回调我们的应用并携带关键信息 location和count信息,我们的应用去查数据库也好,去调用第三方接口也好,再告诉GPT   那么GPT就可以回答这个问题了

当GPT携带参数过来的时候会调用Function.apply(){}这个方法,那么我们在这个方法里写我们自己的逻辑  可以查数据库,可以调用第三方接口

创建一个实现Function接口的类

如果报错

所有代码

package com.example.springai.controller;

import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
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;


/**
 * @author hrui
 * @date 2024/6/9 1:16
 */
@RestController
public class FunctionCallController {

    @Autowired
    private OpenAiChatModel chatModel;


    @GetMapping("/functionCall")
    public Object functionCall(@RequestParam(value = "message",defaultValue = "杭州有多少个名字叫韩妹妹的人") String message) {

        OpenAiChatOptions aiChatOptions=OpenAiChatOptions.builder()
                //设置实现了Function接口的beanName
        .withFunction("locationCount")
        .withModel("gpt-3.5-turbo")
        .build();

        ChatResponse response=chatModel.call(new Prompt(message,aiChatOptions));
        //Flux<ChatResponse> stream = chatModel.stream(new Prompt(message, aiChatOptions));
        return response.getResult().getOutput().getContent();
    }
}

package com.example.springai.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Media;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.*;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.api.OpenAiAudioApi;
import org.springframework.ai.openai.audio.speech.SpeechPrompt;
import org.springframework.ai.openai.audio.speech.SpeechResponse;
import org.springframework.ai.openai.audio.transcription.AudioTranscriptionPrompt;
import org.springframework.ai.openai.audio.transcription.AudioTranscriptionResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * @author hrui
 * @date 2024/6/8 2:19
 */
@RestController
public class HelloGPT {
    @Autowired
    private ChatClient chatClient;

//    public HelloGPT(ChatClient.Builder chatClientBuilder) {
//        this.chatClient=chatClientBuilder.build();
//    }

    @GetMapping("/helloai")
    public Object generate(String userInput) {
        System.out.println("userInput:"+userInput);
        return chatClient.prompt()//提示词
                .user(userInput)//用户输入
                //.system("You are a helpful assistant.")
                .call()//调用
                .content();//返回文本
    }


    @GetMapping(value = "/helloai2",produces = "text/html;charset=UTF-8")
    public Flux<String> generate2(String userInput) {
        Flux<String> output = chatClient.prompt()
                .user(userInput)
                .stream()
                .content();
        return output;
    }


    @Autowired
    private OpenAiChatModel chatModel;//ChatModel可以自动装配  不需要@Bean

    @GetMapping("/helloai3")
    public Object generate3(String userInput) {
//        ChatResponse response = chatModel.call(
//                new Prompt(
//                        "Generate the names of 5 famous pirates.",//这个其实好比用户消息
//                        OpenAiChatOptions.builder()
//                                .withModel("gpt-4-32k")
//                                .withTemperature(0.8F)
//                                .build()
//                ));
        ChatResponse response = chatModel.call(
                new Prompt(
                        userInput,//底层封装成new UserMessage(userInput)
                        OpenAiChatOptions.builder()
                                .withModel("gpt-4-turbo")
                                .withTemperature(0.8F)
                                .build()
                ));
        return response.getResult().getOutput().getContent();
    }


    @GetMapping("/helloai4")
    public Flux<ChatResponse> generate4(String userInput) {
        System.out.println("userInput:"+userInput);
        Flux<ChatResponse> stream = chatModel.stream(
                new Prompt(
                        userInput//底层封装成new UserMessage(userInput)

                ));

        return stream;
    }


    @Autowired
    private OpenAiImageModel openAiImageModel;

    @GetMapping("/helloai6")
    public Object generate6(String userInput) {
        ImageResponse response = openAiImageModel.call(
                new ImagePrompt(userInput,
                        OpenAiImageOptions.builder()
                                //设置图片清晰度
                                .withQuality("hd")
                                .withModel("dall-e-3")//默认就是这个
                                .withN(1)//生成几张图片
                                //默认高度和宽度
                                .withHeight(1024)
                                .withWidth(1024).build())

        );

        return response.getResult().getOutput().getUrl();
    }


//    @Autowired
//    private OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel;
    @Autowired
    private OpenAiAudioSpeechModel openAiAudioSpeechModel;

    @GetMapping("/helloai7")
    public Object generate7(String userInput) {
        OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
                //用的模型
                .withModel(OpenAiAudioApi.TtsModel.TTS_1.value)
                //设置人声
                .withVoice(OpenAiAudioApi.SpeechRequest.Voice.ALLOY)
                .withResponseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)
                .withSpeed(1.0f)//合成语音的速度 0.0最慢  1.0最快
                .build();

        SpeechPrompt speechPrompt = new SpeechPrompt(userInput, speechOptions);
        SpeechResponse response = openAiAudioSpeechModel.call(speechPrompt);

        byte[] output = response.getResult().getOutput();

        try {
            // 指定文件名,这里以当前时间戳命名以避免重名
            String filename = "audio_" + System.currentTimeMillis() + ".mp3";
            // 指定保存路径
            Path path = Paths.get("src/main/resources/static/" + filename);
            // 写入文件
            Files.write(path, output);

            // 获取可访问的URL,假设你的服务运行在 localhost:8080
            String fileUrl = "http://localhost:8082/" + filename;
            return ResponseEntity.ok(fileUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error saving file");
        }

    }



    @Autowired
    private OpenAiAudioTranscriptionModel openAiTranscriptionModel;

    @GetMapping("/helloai8")
    public Object generate8() {
        //语音翻译的可选配置
        var transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()
                .withResponseFormat(OpenAiAudioApi.TranscriptResponseFormat.TEXT)
                //温度  0f不需要创造力,语音是什么,翻译什么
                .withTemperature(0f)
                .build();
        var audioFile=new ClassPathResource("hello.m4a");
        //var audioFile = new FileSystemResource("/path/to/your/resource/speech/jfk.flac");

        AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile, transcriptionOptions);
        AudioTranscriptionResponse response = openAiTranscriptionModel.call(transcriptionRequest);

        return response.getResult().getOutput();
    }



    @GetMapping("/helloai9")
    public Object generate9() throws IOException {
        //图片二进制流
        byte[] imageData=new ClassPathResource("1717865484569.png").getContentAsByteArray();

        //用户信息
        var userMessage=new UserMessage("这是什么", List.of(new Media(MimeTypeUtils.IMAGE_PNG,imageData)));

        OpenAiChatOptions build = OpenAiChatOptions.builder()
                .withModel(OpenAiApi.ChatModel.GPT_4_O.getValue()).build();

        ChatResponse response=chatModel.call(new Prompt(userMessage,build));


        return response.getResult().getOutput().getContent();
    }
}

package com.example.springai.function;

import org.springframework.context.annotation.Description;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.function.Function;

/**
 * @author hrui
 * @date 2024/6/9 1:46
 */
@Component("locationCount")
@Description("某个地方有多少个名字某某的人")
public class LocationCount implements Function<LocationCount.Request, LocationCount.Response> {

    @Override//接收GPT提取后的信息(自动调用该方法)
    public Response apply(Request request) {
        //好的(聪明的模型)当location和name确实时候根本不会来调用该方法
        if(!StringUtils.hasLength(request.location)||!StringUtils.hasLength(request.name)){
            return new Response("参数缺失,无需Function-Call,正常响应就可以");
        }
        //如果有值 调用数据库或者第三方接口

        return new Response("只有唯一强调唯一1个");
    }


    //密封类(好比有了@Data作用) 接收GPT信息
    public record Request(String name, String location) {}
    //密封类,最终响应GPT信息
    public record Response(String message) {}

}


package com.example.springai;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringaiApplication {


    @Bean
    public ChatClient chatClient(ChatClient.Builder chatClientBuilder){
        return chatClientBuilder.defaultSystem("你现在不是ChatGPT,也不是人工智能AI,现在开始你是一个正常人类,你的名字叫hrui")
                .build();
    }
    public static void main(String[] args) {
        //System.setProperty("proxyType","4");
        System.setProperty("proxyHost","127.0.0.1");
        System.setProperty("proxyPort","7897");
        //System.setProperty("proxySet","true");
        SpringApplication.run(SpringaiApplication.class, args);
    }

}

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

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

相关文章

RV32A\CSR\Counters 指令集

RV32A\CSR\Counters指令集 一、RV32A指令集1、Load-Reserved/Store-Conditional InstructionsLR.WSC.W2、Atomic Memory OperationsAMOSWAP.WAMOADD.WAMOAND.WAMOXOR.WAMOOR.W二、CSR(Control and Status Register) 指令集CSRRWCSRRSCSRRCCSRRWICSRRSICSRRCI三、"Zicntr…

uniapp上传头像并裁剪图片

第一步写上uniapp自带的选择图片button按钮 点击之后会弹出选择图片的方式 拍照或从相册选择图片后将会跳到图片裁剪 然后我们裁剪完之后点击确定在上传图片 这里是上传图片的接口 拿到本地图片 上传的话自己想以那种方式上传都可以

Multimodal Dynamics:用于多模态融合背景下的分类

Multimodal Dynamics&#xff08;MD&#xff09;是可信赖的多模态分类算法&#xff0c;该算法动态评估不同样本的特征级和模态级信息量&#xff0c;从而可信赖地对多模态进行融合。 来自&#xff1a;Multimodal Dynamics: Dynamical Fusion for Trustworthy Multimodal Classi…

代理模式与静态代理、动态代理的实现(Proxy.newProxyInstance、InvocationHandler)

代理模式 代理模式是23种设计模式中比较常用的一种&#xff0c;属于结构型设计模式。在 Android 领域中&#xff0c;有大量的库都使用了代理模式&#xff0c;例如 Retrofit 使用动态代理来实现 API 接口的调用&#xff0c;Dagger 使用代码生成和反射机制来创建依赖注入的代理对…

Bybatis动态SQL的绑定和公共sql语句片段

Mybatis除了大部分动态标签&#xff0c;最后还有三个标签&#xff0c;分别是bind&#xff0c;sql和include&#xff1a; ①bind&#xff1a;这个标签作用就是将OGNL标签里的值&#xff0c;进行二次加工&#xff0c;在绑定到另一个变量里&#xff0c;供其他标签使用 调用getUse…

RocketMQ集群搭建(1)

1.1 各角色介绍 Producer&#xff1a;消息的发送者&#xff1b;举例&#xff1a;发信者Consumer&#xff1a;消息接收者&#xff1b;举例&#xff1a;收信者Broker&#xff1a;暂存和传输消息&#xff1b;举例&#xff1a;邮局NameServer&#xff1a;管理Broker&#xff1b;举…

【CH32V305FBP6】USBD HS 描述符修改

文章目录 前言设备描述符完整描述符配置描述符CDC 描述符接口关联描述符接口描述符功能描述符端点描述符接口描述符端点描述符 HID 描述符接口描述符 新增一个 HID 设备 前言 USB HS 复合设备&#xff0c;CDCHID 功能&#xff1a;串口、DAP、CAN-HID、RS485 设备描述符 htt…

DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门

场景 DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;&#xff1a; DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;-CSDN博客 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代…

[12] 使用 CUDA 进行图像处理

使用 CUDA 进行图像处理 当下生活在高清摄像头的时代&#xff0c;这种摄像头能捕获高达1920*1920像素的高解析度画幅。想要实施的处理这么多的数据&#xff0c;往往需要几个TFlops地浮点处理性能&#xff0c;这些要求CPU也无法满足通过在代码中使用CUDA&#xff0c;可以利用GP…

【网络安全的神秘世界】磁盘空间告急?如何解决“no space left on device”的困扰

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 磁盘空间告急&#xff1f;如何解决“no space left on device”的困扰 &#x1f64b;‍♂️问题描述 错误信息 "write /var/lib/docker/tmp/GetIma…

计算机组成原理-流水CPU-指令流水

一、指令流水的定义 指令流水线是计算机处理器中的一种设计&#xff0c;用于提高指令执行的效率。考虑到执行指令的每个阶段用到的硬件不同&#xff0c;它将处理指令的各个步骤分解为若干个阶段&#xff0c;并允许多个指令在同一时刻在不同的阶段执行&#xff0c;从而实现指令…

InfiniBand网络内计算架构指南

InfiniBand网络内计算知多少&#xff1f; InfiniBand在高性能计算和人工智能领域占据核心地位&#xff0c;其高速、低延迟的网络通信能力支持大规模数据传输与复杂计算。在网络内计算领域&#xff0c;InfiniBand的应用日益广泛&#xff0c;通过内部计算降低延迟&#xff0c;提升…

【霸王餐系统】搭建部署,可设置二级分销

前言&#xff1a; 霸王餐项目通常是由外卖平台或商家发起的一种营销策略&#xff0c;旨在通过提供低成本甚至免费的外卖来吸引消费者&#xff0c;从而增加销量、优化评价并扩大市场影响力。这种项目往往能够实现平台、商家、推广者和消费者四方共赢的局面。 一、项目优势 市…

GPT-4o更易越狱?北航南洋理工上万次测试详解!

GPT-4o&#xff0c;比上一代更容易遭受越狱攻击&#xff1f; 北航和南洋理工的研究人员通过上万次API查询&#xff0c;对GPT-4o的各种模态安全性进行了详细测试。 结果发现&#xff0c;GPT-4o新引入的语音模态带来了新的攻击面&#xff0c;多模态整体安全性不如GPT-4V。 GPT-4o…

海洋气象期刊 | 个人统计

写在前面 这周末两天闲着无聊&#xff0c;统计了一些zotero中自己常看的期刊数量&#xff0c;少于5篇的未进行统计 Journal of the Atmospheric Sciences - (JAS) https://www.ametsoc.org/index.cfm/ams/publications/journals/journal-of-the-atmospheric-sciences/ 73篇 …

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

鸿蒙开发文件管理:【@ohos.statfs (statfs)】

statfs 该模块提供文件系统相关存储信息的功能&#xff0c;向应用程序提供获取文件系统总字节数、空闲字节数的JS接口。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import stat…

技术干货分享:初识分布式版本控制系统Git

初识Git版本控制 自动化测试代码反复执行&#xff0c;如果借用持续集成工具会提高测试效率&#xff0c;那么需要我们把自动化测试代码发布到正式环境中&#xff0c;这时候用Git版本控制工具高效、稳定、便捷。 分布式版本控制 Git可以把代码仓库完整地镜像下来&#xff0c;有…

每日一练——有效的括号

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 错误记录 #include<stddef.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h>typedef char STDataType;typedef struct Stack {STDataType* a;int capacity;int top; } Stack;vo…

Unity 实现WebSocket 简单通信——客户端

创建连接 ClientWebSocket socket new ClientWebSocket(); string url $"ws://{ip}:{port}"; bool createUri Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out Uri uri); if (createUri) {var task socket.ConnectAsync(uri, CancellationToken.None);task…