SpringAI调用OpenAI Demo

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 {@Autowiredprivate 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;}@Autowiredprivate 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;}@Autowiredprivate 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;@Autowiredprivate 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:8080String 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");}}@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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;}@Autowiredprivate 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;}@Autowiredprivate 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;@Autowiredprivate 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:8080String 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");}}@Autowiredprivate 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 {@Beanpublic 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.rhkb.cn/news/348083.html

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

相关文章

C++ 12 之 指针引用

c12指针引用.cpp #include <iostream>using namespace std;struct students12 {int age; };int main() {students12 stu;students12* p &stu; // 结构体指针students12* &pp p; // 结构体指针起别名pp->age 20;// (*pp).age 22;cout << "…

sqli-labs 靶场 less-7 第七关详解:OUTFILE注入与配置

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它&#xff0c;我们可以学习如何识别和利用不同类型的SQL注入漏洞&#xff0c;并了解如何修复和防范这些漏洞。Less 7 SQLI DUMB SERIES-7判断注入点 进入页面中&#xff0c;并输入数据查看结果。 发现空数据提…

【Python】成功解决ModuleNotFoundError: No module named ‘PyQt5‘

【Python】成功解决ModuleNotFoundError: No module named ‘PyQt5’ 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985…

nodejs——原型链污染

一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象的概念&#xff0c;所以我们要先明确一点&#xff1a; JavaScript中一切引用类型都是对象&#xff0c;对象就是属性的集合。 Array类型、Function类型、Object类型、Date类型、RegExp类型等都是引用类型。 也就…

WPS JSA 宏脚本入门和样例

1入门 WPS window版本才支持JSA宏的功能。 可以自动化的操作文档中的一些内容。 参考文档&#xff1a; WPS API 参考文档&#xff1a;https://open.wps.cn/previous/docs/client/wpsLoad 微软的Word API文档&#xff1a;Microsoft.Office.Interop.Word 命名空间 | Microsoft …

Latex | 数学公式

Latex 最近在学习使用 LaTeX 来敲公式&#xff0c;写材料。说实话&#xff0c;这个工具在写公式方面&#xff0c;确实堪称神器&#xff01;不只是我&#xff0c;连爱因斯坦要是看到它&#xff0c;估计都会点个赞。 在这里&#xff0c;我也得给大家分享一个宝藏网址&#xff1…

SolidWorks官方授权代理商亿达四方带您解读最新SW版本特性

在快速迭代的工业设计领域&#xff0c;每一次软件的更新都预示着生产力的跃升和设计边界的拓展。作为行业领先的3D CAD解决方案&#xff0c;SolidWorks的最新版本再次站在了技术创新的前沿&#xff0c;为企业和设计师们带来了前所未有的设计效率与创意自由度。亿达四方&#xf…

LeakSearch:针对网络公开凭证的安全扫描与检测工具

关于LeakSearch 在红队演戏过程中&#xff0c;往往需要获取到针对目标域的访问权限。在这个过程中&#xff0c;很多红队人员会选择使用暴露在互联网上的代理服务器来实现目标域的访问&#xff0c;那么此时就需要在互联网上收集公开暴露的凭证信息。 对于蓝队来说&#xff0c;…

每日5题Day23 - LeetCode 111 - 115

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…

python的%time 、%%time 、%timeit、%%timeit的区别

%time 、%timeit 要在ipython下才可以使用。(所以说Jupyter Notebook当然是可以用的,pycharm里的python环境也是jupyter Notebook的) %time可以测量一行代码执行的时间 %timeit可以测量一行代码多次执行的时间 网上有说法说,%timeit是测量一行代码100000次循环内,3次最快速…

Vulnhub-DC-1,7

靶机IP:192.168.20.141 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 前言 1和7都是Drupal的网站&#xff0c;只写了7&#xff0c;包含1的知识点 信息收集 用nmap扫描端口及版本号 进入主页查看作者给的提示&#xff0c;不是暴力破解的…

PostgreSQL学习笔记

一、安装 官网下载地址&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 双击安装程序进行安装 选择端口&#xff0c;默认的即可 验证是否安装成功 在开始菜单里找到PGAdmin 4 打开这个大象头&#xff0c;会在浏览器中打开新的标签页。第一次打开会…

【vue-8】记事本案例

小知识点&#xff1a; 列表末尾插入数据&#xff1a; list.push("lihua") 列表删除数据&#xff1a; # index要删除数据的索引值&#xff0c;1为删除数据长度 list.splice(index,1) 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en&quo…

Vue3+Vite报错:vite忽略.vue扩展名 Failed to resolve import ..... Does the file exist?

Vue3Vite报错&#xff1a;vite忽略.vue扩展名 Failed to resolve import … Does the file exist? 先看报错&#xff1a; 分析原因 原因是我们没有写后缀名 建议你在你的vite.config.js中加上如下配置 import { defineConfig } from "vite"; import vue from &qu…

NMF算法

1. NMF算法 NMF算法&#xff0c;即非负矩阵分解&#xff0c;是一种无监督学习算法&#xff0c;主要用于数据降维和特征提取&#xff0c;特别是在数据元素具有非负性约束的情况下。 NMF是一种数据降维模型&#xff0c;它的基本模型是通过矩阵分解将非负数据转换到新的空间&…

【调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录】

调试笔记-系列文章目录 调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 文章目录 调试笔记-系列文章目录调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 前言一、调试环境操作系统&…

MIPI A-PHY协议学习

一、说明 A-PHY是一种高带宽串行传输技术,主要为了减少传输线并实现长距离传输的目的,比较适用于汽车。同时,A-PHY兼容摄像头的CSI协议和显示的DSI协议。其主要特征: 长距离传输,高达15m和4个线内连接器; 高速率,支持2Gbps~16Gbps; 支持多种车载线缆(同轴线、屏蔽差分…

5.2 参照完整性

5.2.1 外键约束 语法格式&#xff1a;constraint < symbol > foreign key ( col_nam1[, col_nam2... ] ) references table_name (col_nam1[, col_nam2...]) [ on delete { restrict | cascade | set null | no action } ] [ on update { restrict | cascade | set nu…

[CAN] 创建解析CAN报文DBC文件教程

&#x1f449;本教程需要先安装CANdb软件&#xff0c;[CAN] DBC数据库编辑器的下载与安装 &#x1f64b;前言 DBC(全称为Database CAN)&#xff0c;是用于描述单个CAN网络中各逻辑节点的信息。 DBC是汽车ECU&#xff08;Electronic Control Unit&#xff0c;电子控制单元&…

RocketMQ事务性消息

RocketMQ事务性消息是一定能保证消息发送成功的 事务消息发送步骤&#xff1a; &#xff08;1&#xff09;发送方将半事务消息发送至RocketMQ服务端。 &#xff08;2&#xff09;RocketMQ服务端将消息持久化之后&#xff0c;向发送方返回ack确认消息已经发送成功。由于消息为…