【大模型】Spring AI對接ChatGpt使用詳解

目錄

一、前言

二、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.2.4 補充說明

4.3?Spring Ai接入Ollama

4.3.1 引入Ollama依賴

4.3.2 添加配置文件

4.3.3 使用Ollama聊天api

五、寫在文末


一、前言

ChatGPT從問世到現在,熱度一直不減,GPT的廣泛推廣和使用,讓AI領域變得越來越熱鬧,于是基于ChatGPT的核心,越來越多的公司和技術團隊加入了大模型的領域。在這其中,作為技術框架語言,像主流的python,java等,為了方便開發者對ChatGPT的使用,以及后續生態的融合,也開始在框架層面引入對ChatGPT的支持,本文聊聊spring框架下對ChatGPT的支持的一個新組件spring ai的使用。

二、spring ai介紹

2.1 什么是Spring AI

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,和base-url信息

server:port: 8088spring:application:name: chat-001ai:openai:api-key: 你的apikeybase-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 {@Autowiredprivate 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對象,也可以使用ChatResponse 獲取單純的文本結果

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 {@Autowiredprivate 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 {@Autowiredprivate 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對象,即將一段文本轉為語音,參考如下代碼

    @Autowiredprivate 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等。

官網:Ollama

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.2.4 補充說明

大模型參數數量與資源消耗具有如下關系:

  • 大模型參數越多
    • 模型的尺寸就越大;
    • 模型的輸出結果越準確;
    • 允許所需要的資源成本越高;
  • 本地開發不適合使用尺寸較大的模型;
  • 折中的方案
    • 開發時在本地運行參數較少的模型;
    • 集成測試時使用外部服務

4.3?Spring Ai接入Ollama

接下來演示如何在springboot項目中集成Ollama,參考下面的操作步驟

4.3.1 引入Ollama依賴

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

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

4.3.2 添加配置文件

配置文件中添加Ollama相關的配置信息,注意的是,Ollama默認端口為11434

server:port: 8088spring:application:name: chat-001ai:ollama:base-url: http://localhost:11434chat:options:model: qwen:0.5b-chatopenai:api-key: 你的apikeybase-url: openai地址

4.3.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 {@Resourceprivate 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的使用,并通過案例詳細介紹了spring ai中常用的api使用方法,最后通過本地安裝安裝Ollama并部署大模型接入通義千問,希望對看到的同學有用,本篇到此結束感謝觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15559.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024-05-22 VS2022使用modules

點擊 <C 語言編程核心突破> 快速C語言入門 VS2022使用modules 前言一、準備二、使用其一, 用VS installer 安裝模塊:第二個選項就是, 與你的代碼一同編譯std模塊, 這個非常簡單, 但是也有坑. 總結 前言 要解決問題: 使用VS2022開啟modules. 想到的思路: 跟著官方文檔整…

Java進階學習筆記19——內部類

1、 內部類&#xff1a; 是類中五大成分之一&#xff08;成員變量、方法、構造函數、內部類、代碼塊&#xff09;&#xff0c;如果一個類定義在另一個 類的內部&#xff0c;這個類就是內部類。 場景&#xff1a;當一個類的內部&#xff0c;包含了一個完整的事物&#xff0c;且…

Android ART 虛擬機簡析

源碼基于&#xff1a;Android U 1. prop 名稱選項名稱heap 變量名稱功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虛擬機在啟動時&#xff0c;向系統申請的起始內存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 應用可使用的 max…

Scikit-Learn樸素貝葉斯

Scikit-Learn樸素貝葉斯 1、樸素貝葉斯1.1、貝葉斯分類1.2、貝葉斯定理1.3、貝葉斯定理的推導1.4、樸素貝葉斯及原理1.5、樸素貝葉斯的優缺點2、Scikit-Learn樸素貝葉斯2.1、Sklearn中的貝葉斯分類器2.2、Scikit-Learn樸素貝葉斯API2.3、Scikit-Learn樸素貝葉斯實踐(新聞分類與…

Python——文件操作相關

1. 讀文件方式 第一種 有規律的名稱 第二種 無規律的名稱 2. 文件名稱 用 “{:05d}” 來規范輸出數字所占位數&#xff0c;例如&#xff1a; for i in range(100):gt_file Reference/ image "{:05d}".format(i) .jpgprint(gt_file)輸出&#xff1a; ... Re…

爬山算法的詳細介紹

目錄 &#x1f349;概述 &#x1f349; 步驟 &#x1f349; 優缺點 &#x1f348;優點 &#x1f348;缺點 &#x1f348;應對策略 &#x1f349;示例 &#x1f348;旅行商問題 &#x1f34d;步驟 &#x1f34d;分解代碼 &#x1f34e;包含頭文件 &#x1f34e;定義函…

Cortex-M3的SysTick 定時器

目錄 概述 1 SysTick 定時器 1.1 SysTick 定時器功能介紹 1.2 SysTick 定時器功能實現 1.3 SysTick在系統中的作用 2 SysTick應用的實例 2.1 建立異常服務例程 2.2 使能異常 2.3 鬧鐘功能 2.4 重定位向量表 2.5 消滅二次觸發 3 SysTick在FreeRTOS中的應用 3.1 STM…

【代碼】結構體

哈嘍大家好&#xff0c;我是學霸小羊&#xff0c;今天講講結構體。 先看例題&#xff1a; 例1.老師給了小楊一份同學們的考試成績&#xff0c;包括語數英三科&#xff0c;老師讓小明按照總分排序&#xff0c;請你幫幫他吧&#xff01; 輸入數據&#xff1a; 第1行 學生總人…

在docker中運行SLAM十四講程序

《十四講》的示例程序依賴比較多&#xff0c;而且系統有點舊。可以在容器中運行。 拉取鏡像 docker pull ddhogan/slambook:v0.1這個docker對應的github&#xff1a;HomeLH/slambook2-docker 拉下來之后&#xff0c;假如是Windows系統&#xff0c;需要使用XLaunch用于提供X11…

面試大雜燴之kafka

面試這個領域最近環境不行&#xff0c;所以卷起來流量挺大 關于K8s 其實看我之前的博客&#xff0c;k8s剛有點苗頭的時候我就研究過&#xff0c;然后工作的時候間接接觸 也自己玩過 但是用的不多就忘記了&#xff0c;正苦于不知道寫什么&#xff0c;水一篇 用來面試應該是夠了…

C++ | Leetcode C++題解之第111題二叉樹的最小深度

題目&#xff1a; 題解&#xff1a; class Solution { public:int minDepth(TreeNode *root) {if (root nullptr) {return 0;}queue<pair<TreeNode *, int> > que;que.emplace(root, 1);while (!que.empty()) {TreeNode *node que.front().first;int depth que…

VC編譯sample_onnx_mnist提示無法打開輸入文件cudnn.lib

出現錯誤 LNK1181 無法打開輸入文件“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib\x64\cudnn.lib” 解決辦法&#xff1a;下載cudnn&#xff0c;NVIDIA cuDNN | NVIDIA Developer 拷貝相應的文件到CUDA安裝的目錄下。 VC編譯libtorch提示無法打開輸入文件cu…

huggingface 筆記:PretrainModel

1 from_pretrained 從預訓練模型配置中實例化一個 PyTorch 預訓練模型默認情況下&#xff0c;模型使用 model.eval() 設置為評估模式&#xff08;Dropout 模塊被禁用&#xff09; 要訓練模型&#xff0c;應該首先使用 model.train() 將其設置回訓練模式 1.1 主要參數 pretra…

java 子類繼承父類

為什么需要繼承 我現在要有兩個類一個 一個是小學生&#xff0c;一個是大學生 代碼 小學生 package b; public class encapsulatio{public String name;public int age;public double score;public void setscore (double score) {this.scorescore;}public void testing() {S…

(三)MySQL 索引

歡迎訪問 什么是索引&#xff1f; 提高查詢效率的一種數據結構&#xff0c;索引是數據的目錄 索引的分類 按「數據結構」分類&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存儲」分類&#xff1a;聚簇索引、二級索引。按「字段特性」分類&#xff1a;主鍵索引…

Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)

詳細實現操作步驟 具體實現內容&#xff1a;我們運用 Spring6 和 MyBatis 實現一個轉賬操作(該轉賬操作&#xff0c;進行一個事務上的控制&#xff0c;運用 MyBatis 執行 SQL 語句)。 第一步&#xff1a;準備數據庫表 使用t_act表&#xff08;賬戶表&#xff09; 連接數據庫的…

三個有意思的鏈表面試題的完成

上一篇博客我們已經完成了鏈表的所有內容&#xff0c;那么這一篇博客我們來看一下三個特別有意思的鏈表題目。 **第一個題目如下&#xff1a;**相信不少朋友看到這題目就已經暈了&#xff0c;那就簡單說明下這個題目&#xff0c;題目就是創建一個鏈表&#xff0c;其中每個節點…

深入探索Java中的流式編程:優雅地處理集合數據

Java流式編程&#xff08;Stream API&#xff09;是Java 8引入的一項重要特性&#xff0c;它為處理集合數據提供了一種更為優雅和函數式的方式。通過流式操作&#xff0c;開發者可以以更簡潔、更直觀的方式處理數據&#xff0c;從而提高代碼的可讀性和可維護性。本文將深入探討…

Android14 - 繪制系統 - 概覽

從Android 12開始&#xff0c;Android的繪制系統有結構性變化&#xff0c; 在繪制的生產消費者模式中&#xff0c;新增BLASTBufferQueue&#xff0c;客戶端進程自行進行queue的生產和消費&#xff0c;隨后通過Transation提交到SurfaceFlinger&#xff0c;如此可以使得各進程將緩…

【vue3+elementuiplus】el-select下拉框會自動觸發校驗規則

場景&#xff1a;編輯彈框省份字段下拉框必填&#xff0c;觸發方式change&#xff0c;有值第一次打開不會觸發校驗提示&#xff0c;關閉彈框再次打開觸發必填校驗提示&#xff0c;但是該字段有值 問題的原因是&#xff1a;在關閉彈層事件中&#xff0c;我做了resetfileds&…