【源力覺醒 創作者計劃】文心一言與deepseek集成springboot開發哪個更方便

一.實驗背景

當前文心一言和deepseek都開源了,二者都可以作為大模型應用開發的模型基礎了,我們都可以編寫springboot項目來集成deepseek和文心一言了

二.實驗目標

本文基于實際操作,通過實際操作來對比文心一言和deepseek在集成到springboot項目中的異同,并通過其各自的能力來對比分析二者的異同點,為便新手開發者集成大模型開發具體應用并提供實際的開發建議.

注:鑒于模型部署非同一臺硬件資源能力,故本文不對模型自身性能進行對比,只對比其集成到開發能力方便的便捷程度等

三.實驗環境

3.1 開發環境規劃

? 基于springboot 2.6.13,jdk11,maven 3.3.3

3.2 文心一言規劃

? A.版本:4.5系列。本文使用的具體版本是文心一言4.5 Turbo VL即ERNIE 4.5 Turbo VL

? B.調用方式:本文不做本地環境搭建,使用文心一言開發者賬號下官方部署的模型,通過賬號+sdk完成功能調用

? C.開發者平臺:文心一言開發者平臺

? ? ? https://console.bce.baidu.com/qianfan/modelcenter/model/buildIn/list

3.3 deepseek規劃

? A.版本:同樣

? B.調用方式:不做本地環境搭建,使用DeepSeek的官方網站(https://www.deepseek.com)提供的API密鑰或訪問令牌來調用其能力,使用okhttp調api方式

? C.開發者平臺?deepseek開發者平臺

3.4 實驗功能規劃

主要從開發流程,文檔完整度,開發sdk獲取便利度,開發方式,開發過程踩坑度,開發支持的功能,功能實現的表現等幾方面進行評估

四.環境準備

4.1.文心一言

版本:ERNIE 4.5 Turbo VL

? 創建文心一言開發者賬號,并注冊訪問令牌,并下載sdk(sdk可以使用maven,本文以maven為例)

先注冊登錄

??

進入頁面之后,選擇文心一言大模型4.5系列,本文按照ERNIE4.5 Turbo VL為例?

選中后,進入api文檔,連接:文心一言4.5 api?

?

可以看到調用api的接口文檔都在這里了。

我們調用api前需要進行安全認證,或者accesskey等。

創建apikey(子用戶底下進行創建)

參考:https://cloud.baidu.com/doc/qianfan-api/s/ym9chdsy5

這個訪問也是sdk方式訪問的憑證,所以先生成,sdk直接使用maven進行下載后配置使用即可

?選擇中間下面的藍色按鈕:創建子賬戶,通過子賬戶訪問文心一言4.5官方模型

按步驟操作后獲取訪問的key,并下載到本地。供后續項目中配置使用?。

有了訪問key,還需要域名:

https://qianfan.baidubce.com

?就可以到springboot中配置sdk了

創建應用appid

操作連接:https://console.bce.baidu.com/ai-engine/speech/overview/index

文心一言的環境準備到此告一段落,下面開始準備deepseek的。?

具體文檔參考地址:https://cloud.baidu.com/doc/qianfan-api/s/ym9chdsy5

4.2. deepseek

版本:DeepSeek-R1?

創建deepseek賬號,并注冊訪問令牌,并下載sdk(sdk可以使用maven,本文以maven為例)

登錄注冊,地址:deepseek開發平臺

需要進行驗證郵箱,提供郵箱,點擊驗證碼之后,在郵箱獲取驗證碼后再進行校驗

獲取訪問accesskey

?將此key拷貝,備用,這個就是項目中配置的訪問key。對應的訪問域名使用

獲取對應的域名:https://platform.deepseek.com/?

到此步驟,deepseek的環境準備基本結束,可以在項目里配置api域名,訪問key了。

五.實驗步驟

5.1.創建springboot項目

? ?項目使用maven進行包管理。為了方便,本文簡述步驟。通過簡單的頁面訪問

選擇模塊

初始項目??

對項目jdk,maven環境進行配置,本文略過

保證可正常打包

項目正常啟動

?

5.2 集成文心一言?ERNIE 4.5 Turbo VL

版本:ERNIE 4.5 Turbo VL

5.2.1? pom文件增加依賴

 <!-- 文心一言 SDK --><dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.16.1</version> <!-- 使用最新版本 --></dependency>

5.2.2 創建類,配置文件,controller,service類,并編寫代碼;創建html文件用來演示操作

config文件

package globalfairy.top.wenxinyiyandeepseekdemo.demos.web.config;import com.baidu.aip.imageclassify.AipImageClassify;
import com.baidu.aip.imagesearch.AipImageSearch;
import com.baidu.aip.nlp.AipNlp;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ErnieConfig {@Value("${ernie.app-id}")private String APP_ID;@Value("${ernie.api-key}")private String API_KEY;@Value("${ernie.secret-key}")private String SECRET_KEY;@Beanpublic AipImageClassify ernieClient() {return new AipImageClassify(APP_ID,API_KEY, SECRET_KEY);}@Beanpublic AipNlp ernieNlpClient() {return new AipNlp(APP_ID,API_KEY, SECRET_KEY);}@Beanpublic AipImageSearch AipImageSearchClient() {AipImageSearch client = new AipImageSearch(APP_ID,API_KEY, SECRET_KEY);return client;}}

處理文本的核心客戶端類:

@Bean
? ? public AipNlp ernieNlpClient() {
? ? ? ? return new AipNlp(APP_ID,API_KEY, SECRET_KEY);
? ? }

?處理圖片的核心客戶端類

@Bean
? ? public AipImageSearch AipImageSearchClient() {
? ? ? ? AipImageSearch client = new AipImageSearch(APP_ID,API_KEY, SECRET_KEY);
? ? ? ? return client;
? ? }

?controller

package globalfairy.top.wenxinyiyandeepseekdemo.demos.web.controller;import globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service.ErnieService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.Collections;
import java.util.Map;@RestController
@RequestMapping("/api/ernie")
public class ErnieController {@Resourceprivate ErnieService ernieServiceImpl;@PostMapping("/generate")public Map<String, String> generateText(@RequestBody Map<String, String> request) {String prompt = request.get("prompt");String result = ernieServiceImpl.generateText(prompt);return Collections.singletonMap("result", result);}
}

?serviceimpl

package globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service.impl;import com.baidu.aip.imageclassify.AipImageClassify;
import com.baidu.aip.nlp.AipNlp;
import globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service.ErnieService;
import org.json.JSONObject;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.HashMap;@Service
public class ErnieServiceImpl implements ErnieService {@Resourceprivate AipNlp client;@Overridepublic String generateText(String prompt) {try {// 文心一言文本生成調用JSONObject response = client.dnnlmCn(prompt, new HashMap<>());return response.toString(2); // 返回格式化JSON} catch (Exception e) {throw new RuntimeException("文心一言調用失敗", e);}}
}

service接口:?

package globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service;public interface ErnieService {String generateText(String prompt);
}

頁面:?

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>DeepSeek 聊天</title><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #f9f9f9;}h1 {text-align: center;color: #333;}.chat-container {display: flex;flex-direction: column;align-items: center;border: 1px solid #ccc;border-radius: 8px;padding: 20px;background-color: #ffffff;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);}#messages {margin-top: 20px;border: 1px solid #ccc;border-radius: 5px;padding: 10px;max-height: 400px;overflow-y: auto;width: 100%;background-color: #f1f1f1;box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);display: flex;flex-direction: column;gap: 10px; /* 使用 gap 來增加消息之間的間距 */}.message {padding: 10px;border-radius: 5px;max-width: 80%;white-space: normal; /* 允許正常換行 */word-wrap: break-word; /* 長單詞換行 */overflow-wrap: break-word; /* 長單詞換行 */background: #c8e6c9; /* 默認背景色 */display: inline-block; /* 使用 inline-block 以保持其流動性 */}.user-message {background-color: #e1f5fe;align-self: flex-end;text-align: right;border: 1px solid #b3e5fc;}.response-message {align-self: flex-start;text-align: left;border: 1px solid #a5d6a7;}input[type="text"] {padding: 10px;width: 70%;border-radius: 5px;border: 1px solid #ccc;margin-right: 10px;}button {padding: 10px 15px;border-radius: 5px;border: none;background-color: #007bff;color: white;cursor: pointer;transition: background-color 0.3s;}button:hover {background-color: #0056b3;}.loading {color: #ff9800;font-weight: bold;text-align: center;}</style>
</head>
<body>
<div class="chat-container"><h1>聊天流</h1><div><input type="text" id="prompt" placeholder="輸入您的消息" /><button id="start">開始聊天</button></div><div id="messages"></div>
</div><script>let eventSource;document.getElementById('start').addEventListener('click', function() {const prompt = document.getElementById('prompt').value;if (!prompt) {alert("請輸入消息。");return;}if (eventSource) {eventSource.close(); // 關閉之前的連接}// 清空輸入框document.getElementById('prompt').value = '';// 添加加載狀態const messageDiv = document.getElementById('messages');messageDiv.innerHTML += '<span class="loading">加載中...</span>';eventSource = new EventSource(`/api/events?prompt=${encodeURIComponent(prompt)}`);eventSource.onmessage = function(event) {const data = JSON.parse(event.data); // 假設返回的是 JSON 格式const messageDiv = document.getElementById('messages');const responseMessage = document.createElement('span'); // 使用 span 而非 divresponseMessage.classList.add('message', 'response-message');responseMessage.textContent = data.response;messageDiv.appendChild(responseMessage);messageDiv.scrollTop = messageDiv.scrollHeight; // 滾動到最新消息};eventSource.onerror = function(err) {// 僅在連接意外關閉時顯示錯誤if (eventSource.readyState === EventSource.OPEN) {console.error("EventSource 連接失敗:", err);const messageDiv = document.getElementById('messages');const errorMessage = document.createElement('span'); // 使用 span 而非 diverrorMessage.classList.add('message', 'error-message');errorMessage.textContent = '連接時出現錯誤。';messageDiv.appendChild(errorMessage);}eventSource.close(); // 關閉連接};// 監聽連接關閉事件eventSource.onclose = function() {console.log("EventSource 連接已關閉");};});
</script>
</body>
</html>

?訪問并測試:

https://localhost:8443/

經調試 改為文本調用之后:

package globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service.impl;import com.baidu.aip.imageclassify.AipImageClassify;
import com.baidu.aip.nlp.AipNlp;
import globalfairy.top.wenxinyiyandeepseekdemo.demos.web.service.ErnieService;
import org.json.JSONObject;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.HashMap;@Service
public class ErnieServiceImpl implements ErnieService {@Resourceprivate AipNlp client;@Overridepublic String generateText(String prompt) {try {// 文心一言文本生成調用JSONObject response = client.dnnlmCn(prompt, new HashMap<>());return response.toString(2); // 返回格式化JSON} catch (Exception e) {throw new RuntimeException("文心一言調用失敗", e);}}
}

仍然報錯:

可以看到提示非常清楚,針對性進行優化。

5.3 集成 deepseek?

5.3.1pom

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version></dependency>
5.3.2
package com.globalfairy.dsweb.demos.web.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;import java.time.Duration;@Configuration
public class AIClientConfig {// 讀取配置參數@Value("${deepseek.api.url:http://localhost:11434/api/generate}")private String apiUrl;@Value("${deepseek.api.key:}")private String apiKey;@Beanpublic WebClient deepseekWebClient() {return WebClient.builder().baseUrl(apiUrl).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader("Authorization", "Bearer " + apiKey) // 認證頭.clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(60)) // 模型響應需要較長時間)).build();}
}

5.3.3

package com.globalfairy.dsweb.demos.web.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setConnectTimeout(5000);   // 5秒連接超時factory.setReadTimeout(60000);      // 60秒讀取超時return new RestTemplate(factory);}
}

5.3.3

package com.globalfairy.dsweb.demos.web.service;import com.globalfairy.dsweb.demos.web.bean.CompletionRequest;
import com.globalfairy.dsweb.demos.web.bean.CompletionResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;import java.time.Duration;@Service
@Slf4j
public class DeepSeekService {private final WebClient webClient;public DeepSeekService(WebClient deepseekWebClient) {this.webClient = deepseekWebClient;}// 普通請求public CompletionResponse generateSync(String prompt) {return webClient.post().bodyValue(CompletionRequest.builder().model("deepseek").prompt(prompt).temperature(0.7).max_tokens(2000).build()).retrieve().bodyToMono(CompletionResponse.class).block();}// 流式響應處理public Flux<String> generateStream(String prompt) {return webClient.post().bodyValue(CompletionRequest.builder().model("deepseek-r1:1.5B").prompt(prompt).stream(true).max_tokens(50).build()).retrieve().bodyToFlux(String.class).timeout(Duration.ofMinutes(5)) // 長時對話場景.onErrorResume(e -> {log.error("API調用異常", e);return Flux.just("服務暫時不可用");});}
}

?5.3.5頁面

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>DeepSeek 聊天</title><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #f9f9f9;}h1 {text-align: center;color: #333;}.chat-container {display: flex;flex-direction: column;align-items: center;border: 1px solid #ccc;border-radius: 8px;padding: 20px;background-color: #ffffff;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);}#messages {margin-top: 20px;border: 1px solid #ccc;border-radius: 5px;padding: 10px;max-height: 400px;overflow-y: auto;width: 100%;background-color: #f1f1f1;box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);display: flex;flex-direction: column;gap: 10px; /* 使用 gap 來增加消息之間的間距 */}.message {padding: 10px;border-radius: 5px;max-width: 80%;white-space: normal; /* 允許正常換行 */word-wrap: break-word; /* 長單詞換行 */overflow-wrap: break-word; /* 長單詞換行 */background: #c8e6c9; /* 默認背景色 */display: inline-block; /* 使用 inline-block 以保持其流動性 */}.user-message {background-color: #e1f5fe;align-self: flex-end;text-align: right;border: 1px solid #b3e5fc;}.response-message {align-self: flex-start;text-align: left;border: 1px solid #a5d6a7;}input[type="text"] {padding: 10px;width: 70%;border-radius: 5px;border: 1px solid #ccc;margin-right: 10px;}button {padding: 10px 15px;border-radius: 5px;border: none;background-color: #007bff;color: white;cursor: pointer;transition: background-color 0.3s;}button:hover {background-color: #0056b3;}.loading {color: #ff9800;font-weight: bold;text-align: center;}</style>
</head>
<body>
<div class="chat-container"><h1>聊天流</h1><div><input type="text" id="prompt" placeholder="輸入您的消息" /><button id="start">開始聊天</button></div><div id="messages"></div>
</div><script>let eventSource;document.getElementById('start').addEventListener('click', function() {const prompt = document.getElementById('prompt').value;if (!prompt) {alert("請輸入消息。");return;}if (eventSource) {eventSource.close(); // 關閉之前的連接}// 清空輸入框document.getElementById('prompt').value = '';// 添加加載狀態const messageDiv = document.getElementById('messages');messageDiv.innerHTML += '<span class="loading">加載中...</span>';eventSource = new EventSource(`/api/events?prompt=${encodeURIComponent(prompt)}`);eventSource.onmessage = function(event) {const data = JSON.parse(event.data); // 假設返回的是 JSON 格式const messageDiv = document.getElementById('messages');const responseMessage = document.createElement('span'); // 使用 span 而非 divresponseMessage.classList.add('message', 'response-message');responseMessage.textContent = data.response;messageDiv.appendChild(responseMessage);messageDiv.scrollTop = messageDiv.scrollHeight; // 滾動到最新消息};eventSource.onerror = function(err) {// 僅在連接意外關閉時顯示錯誤if (eventSource.readyState === EventSource.OPEN) {console.error("EventSource 連接失敗:", err);const messageDiv = document.getElementById('messages');const errorMessage = document.createElement('span'); // 使用 span 而非 diverrorMessage.classList.add('message', 'error-message');errorMessage.textContent = '連接時出現錯誤。';messageDiv.appendChild(errorMessage);}eventSource.close(); // 關閉連接};// 監聽連接關閉事件eventSource.onclose = function() {console.log("EventSource 連接已關閉");};});
</script>
</body>
</html>

六.結論

兩者在開發流程,文檔完整度,開發sdk獲取便利度,開發方式上基本上區別不大。

不過文心一言開發過程在驗權上要復雜不少,如果能更簡潔就更好了?

起來輕松玩轉文心大模型吧一文心大模型免費下載地址:https://ai.gitcode.com/theme/1939325484087291906

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

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

相關文章

核磁共振數據T2幾何均值計算

1、T? 幾何均值公式如下&#xff1a;2、核磁T2幾何均值計算代碼 CSV 文件文件格式&#xff1a; 每一行是一個樣點&#xff08;樣品深度&#xff09;&#xff0c;列為&#xff1a;第一列是“深度”或其他&#xff1b;第二列及以后&#xff08;如 TASPEC0 ~ TASPEC199&#xff0…

微服務架構技巧篇——接口類設計技巧

目錄 一、微服務架構的特點 二、微服務接口類設計技巧 2.1、BFF(Backend For Frontend) 2.1.1、 服務分布式帶來的第一個挑戰導致的幾個典型問題 2.1.2、什么是 BFF 2.1.3、BFF 應用場景 2.1.4、BFF 落地經驗 2.1.4.1、前端負責 BFF 開發優缺點 2.1.4.2、后端負責 BFF 開發優…

C++游戲開發(2)

直接上代碼 1.首先是頭文件編寫 #include <iostream> #include <graphics.h> #include <string> 2,添加畫布 長1280&#xff0c;寬720 initgraph(1280, 720); 3.添加主循環 bool running true; while(runing) { } 4.定義結構體變量msg ExMessge msg; 5.開…

Unity開發2D類銀河惡魔城游戲學習筆記目錄

Unity開發2D類銀河惡魔城游戲學習筆記 Unity教程&#xff08;零&#xff09;Unity和VS的使用相關內容 玩家狀態機 Unity教程&#xff08;一&#xff09;開始學習狀態機 Unity教程&#xff08;二&#xff09;角色移動的實現 Unity教程&#xff08;三&#xff09;角色跳躍的實現…

智慧社區項目開發(三)——基于 Spring Boot 實現動態路由加載:從數據庫到前端菜單的完整方案

在后臺管理系統中&#xff0c;不同用戶角色往往擁有不同的操作權限&#xff0c;對應的菜單展示也需動態調整。動態路由加載正是解決這一問題的核心方案 —— 根據登錄用戶的權限&#xff0c;從數據庫查詢其可訪問的菜單&#xff0c;封裝成前端所需的路由結構并返回。本文將詳細…

Python在自動化與運維領域的核心角色:工具化、平臺化與智能化

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 引言 在 IT 系統日益復雜、運維任務持續增長的今天&#xff0c;自動化已成為企業基礎設施管理的關鍵方向。Python 以其簡潔的語法、強大…

RAG實戰指南 Day 28:RAG系統緩存與性能優化

【RAG實戰指南 Day 28】RAG系統緩存與性能優化 開篇 歡迎來到"RAG實戰指南"系列的第28天&#xff01;今天我們將深入探討RAG系統的緩存機制與性能優化策略。在實際生產環境中&#xff0c;RAG系統往往面臨高并發、低延遲的需求&#xff0c;而合理的緩存設計和性能優…

swanlab實驗優雅起名

init中的參數的作用project&#xff1a;整個實驗的名字&#xff1b;experiment_name&#xff1a;在這個實驗中&#xff0c;你的名字是什么&#xff1b; 比如說現在我們要進行對比實驗&#xff0c;PEAN和Triflownet分別是對比方法的名字&#xff0c;這樣的好處是&#xff0c;她們…

Nestjs框架: NestJS 核心機制解析 —— DI(依賴注入)容器與模塊化工作原理

理解 NestJS 的 DI 管理機制 我們想要了解依賴注入&#xff08;Dependency Injection, DI&#xff09;最核心的工作邏輯NestJS 擁有自己的一套 DI 管理系統&#xff0c;它通過一個稱為 DI 容器 的機制&#xff0c;來統一管理應用中所有類&#xff08;class&#xff09;的依賴關…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(12):文法+單詞

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;12&#xff09;&#xff1a;文法單詞 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff11;ーたぶん 多分&#xff12;ーV&#xff08;て&#xff09;いく ? V&…

【趙渝強老師】OceanBase租戶的資源管理

OceanBase數據庫是多租戶的數據庫系統&#xff0c;一個集群內可包含多個相互獨立的租戶&#xff0c;每個租戶提供獨立的數據庫服務。在OceanBase數據庫中&#xff0c;使用資源配置&#xff08;Unit Config&#xff09;、資源單元&#xff08;Unit&#xff09;和資源池&#xff…

8K、AI、低空智聯,H.266能否撐起下一代視頻通路?

一、&#x1f4c8; 爆發式增長的 AI 與視頻數據&#xff1a;智能時代的“數據燃料革命” 隨著生成式 AI、大模型推理、多模態理解等技術的迅猛發展&#xff0c;視頻數據從“記錄工具”轉變為“感知基礎設施”&#xff0c;其在現代智能系統中的戰略地位日益凸顯。 1?? 視頻數…

保姆級別IDEA關聯數據庫方式、在IDEA中進行數據庫的可視化操作(包含圖解過程)

本文以mysql為例&#xff0c;學會了Mysql&#xff0c;其它的數據庫也是類似的模版~如果您覺得這邊文章對你有幫助&#xff0c;可以收藏防止找不到~如果您覺得這篇文章不錯&#xff0c;也感謝您的點贊對我創作的支持1.1 打開側邊欄的Database2.2 選擇要連接的數據庫&#xff08;…

33.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--財務服務--記賬

這篇文章我們一起把記賬模塊從單體應用遷移到微服務架構中。記賬模塊的功能想必大家都已經了解了&#xff0c;主要是記錄用戶的收入和支出&#xff0c;以及對這些記錄的刪除修改和查詢等操作。具體的功能可以參考單體應用專欄&#xff0c;在這里就不多講了。我們現在一起開始遷…

Cursor結合Playwright MCP Server支持自動化

Cursor結合Playwright MCP Server支持自動化 今天分享一下 playwright MCP Server&#xff0c;其提供了瀏覽器自動化能力&#xff0c;使大型語言模型能夠在真實的瀏覽器環境中與網頁交互&#xff0c; 也可以執行任務&#xff0c;例如運行JavaScript、截屏和導航網頁元素&…

Python 求梯形面積的程序(Program to find area of a Trapezoid)

梯形的定義&#xff1a; 梯形是凸四邊形&#xff0c;至少有一對邊平行。平行邊稱為梯形的底邊&#xff0c;另外兩條不平行的邊稱為梯形的腿。梯形也可以有兩對底邊。在上圖中&#xff0c;CD || AB&#xff0c;它們構成底邊&#xff0c;而另外兩條邊&#xff0c;即AD和BC&#…

C語言 —— 指針(4)

動態內存分配動態內存需要手動申請&#xff0c;手動歸還&#xff0c;其內存是開辟在堆區。申請的函數為&#xff1a;void *malloc(size_t size) &#xff08;需包含頭文件#include<stdlib.h>&#xff09;size&#xff1a;要分配的內存大小&#xff0c;以字節為單位。申請…

常用算法思想及模板

今天繼續整理一些關于算法競賽中C適用的一些模板以及思想。 保留x位小數 保留x位小數在C語言中可以使用printf中的"%.xf"來實現&#xff0c;但是很多C選手由于關閉了同步流&#xff0c;害怕cin、cout與scanf、printf混用容易出錯&#xff0c;所以就給大家介紹一個強…

GitLab 倉庫 — 常用的 git 命令

在公司的 gitlab 公共倉庫中寫代碼做項目時&#xff0c;主要涉及以下常用 git 命令&#xff1a;一、單個命令講解1. 拉取代碼&#xff08;1&#xff09;git clone [倉庫 URL]?克隆遠程倉庫到本地&#xff08;需確保 URL 正確&#xff09; ?&#xff08;?2&#xff09;git pu…

【28】C# WinForm入門到精通 ——多文檔窗體MDI【屬性、方法、實例、源碼】【多窗口重疊、水平平鋪、垂直平鋪、窗體傳值】

文章目錄1多文檔窗體MDI2 基本設置3 實例&#xff1a;多窗口重疊、水平平鋪、垂直平鋪3.1 主窗口屬性設置3.2 主窗口3.3 主窗口窗口添加MenuStrip菜單3.4 添加處理函數3.5 測試效果4 利用窗體參數定義進行傳值4.1 在Form2、Form3添加相關控件4.2 Form3 定義函數public Form3(st…