LangChain4j 框架模仿豆包實現智能對話系統:架構與功能詳解

系統整體架構設計

基于 LangChain4j 框架構建的智能對話系統采用 "前后端分離 + 大模型中樞" 的三層架構設計,實現了與豆包類似的智能交互體驗。系統架構圖如下所示:

┌──────────────────────────────────────────────────────────┐
│                        前端展示層                         │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐      │
│  │ 對話界面 │  │ 輸入組件 │  │ 歷史記錄 │  │ 用戶操作 │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────┘      │
├──────────────────────────────────────────────────────────┤
│                      通信與協議層                         │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐          │
│  │  SSSE      │  │  REST API  │  │  消息格式   │          │
│  └────────────┘  └────────────┘  └────────────┘          │
├──────────────────────────────────────────────────────────┤
│                        后端邏輯層                         │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐      │
│  │ 模型調用 │  │ 上下文  │  │ 提示工程 │  │ 檢索增強 │     │
│  │ (LLM)   │  │ 管理    │  │  模塊   │  │  (RAG)  │       │
│  └─────────┘  └─────────┘  └─────────┘  └─────────┘      │
├──────────────────────────────────────────────────────────┤
│                      數據持久層                           │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐      │
│  │ 對話歷史 │  │ 向量存儲 │  │ 知識庫  │  │ 用戶信息 │     │
│  └─────────┘  └─────────┘  └─────────┘  └─────────┘      │
└──────────────────────────────────────────────────────────┘

圖 1:LangChain4j 智能對話系統架構圖

該架構的核心優勢在于:

  • 前后端解耦:前端采用 Vue3 構建交互界面,后端基于 LangChain4j 處理 AI 邏輯,分工明確
  • 大模型能力封裝:通過 LangChain4j 標準化接口,屏蔽不同 LLM 提供商的差異
  • 企業級擴展:支持集群部署、負載均衡和數據持久化,滿足高并發場景

前端功能模塊詳解

1. 對話界面模塊

前端界面采用 Vue3 實現,模仿豆包的 UI 設計風格,主要包含三大區域:

頂部導航區,中部對話區以及底部輸入區。

<template><!-- 整體容器 --><div class="doubao-layout"><!-- 1. 頂部導航區 --><header class="doubao-header"><div class="header-inner"><!-- 標題與新對話 --><div class="left-group "><el-button type="primary" icon="Plus" size="mini" class="mr-4" @click="handleNewChat">新對話</el-button><h2 class="header-title">{{ chatTitle }}</h2></div><!-- 操作與頭像 --><div class="right-group"><el-icon @click="handleShare"><Share /></el-icon><el-icon @click="handleFavorite"><Star /></el-icon><el-avatar size="medium"src="https://img0.baidu.com/it/u=2648433959,1760892301&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500"class="cursor-pointer" @click="handleUserCenter" /></div></div></header><!-- 2. 對話內容區 --><div class="chat-container"><!-- 對話內容區 --><section class="doubao-chat" ref="chatContainer"><div class="chat-inner"><!-- 對話歷史列表 --><div v-for="(msg, index) in chatHistory" :key="index" class="message-container"><!-- 用戶消息 - 居右對齊 --><div v-if="msg.isUser" class="user-message"><div class="message-bubble"><div style="display: flex;align-items: center;" class="message-content"><p style="text-align: left;margin-right: 7px;" class="message-text">{{ msg.content}}</p><el-avatar size="medium"src="https://img0.baidu.com/it/u=2648433959,1760892301&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500"class="avatar-fixed" @click="handleUserCenter" /></div></div></div><!-- AI消息 - 居左對齊 --><div v-else class="ai-message"><div class="message-bubble"><div style="display: flex;align-items: center;" class="message-content"><el-avatar size="medium" src="/doubao.png" @click="handleUserCenter"class="avatar-fixed" /><p style="text-align: left;margin-left: 7px;" class="message-text">{{ msg.content }}</p></div></div></div></div></div></section></div><!-- 3. 輸入對話框 --><footer class="doubao-input"><div class="input-inner"><el-input v-model="prompt" class="input-main" placeholder="請輸入內容..." clearable@keyup.enter="sendMessage" /><el-button type="primary" icon="Search" size="mini" class="ml-2" @click="sendMessage"style="margin-left: 10px;">發送</el-button></div></footer></div>
</template>
核心交互邏輯:
  • 自動滾動:通過監聽chatHistory變化,使用scrollTop = scrollHeight實現新消息自動定位
  • 對話標題:根據歷史記錄動態更新標題,使用computed屬性實現響應式
  • 用戶操作:集成分享(復制鏈接)、收藏(引導快捷鍵)、新建對話等功能

2. 狀態管理模塊

采用組合式 API 管理對話狀態,核心代碼如下:

import { ref, computed, watch } from 'vue';
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';// 對話狀態
const chatHistory = ref([]);
const prompt = ref('');
const isLoading = ref(false);
const currentAIResponse = ref('');// 動態標題
const route = useRoute();
const chatTitle = computed(() => {if (chatHistory.value.length > 1) {const firstUserMsg = chatHistory.value.find(msg => msg.isUser);return firstUserMsg?.content || '新對話';}return '新對話';
});// 自動滾動
const chatContainer = ref(null);
const scrollToBottom = () => {if (chatContainer.value) {chatContainer.value.scrollTop = chatContainer.value.scrollHeight;}
};
watch(chatHistory, () => nextTick(scrollToBottom));

3. 主要功能展示

創建新對話:

對話詳情:

后端核心功能實現

后端基于 LangChain4j 框架構建,核心功能模塊包括:

配置文件:

server:port: 9000servlet:encoding:charset: UTF-8enabled: trueforce: true# openai相關配置
openai:apiKey: #替換成自己的apiKeymodel: gpt-4o-minibaseUrl: https://api.chatanywhere.tech/v1/temperature: 0.7# 單條對話最多存儲多少條對話歷史記錄maxMessages: 100spring:application:name: llm_appdatasource:druid:url: jdbc:mysql://localhost:3306/llm_app?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=trueusername: # 數據庫用戶名password: # 數據庫密碼 不存儲到數據庫就不需要driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedata:redis:password: # 你的redis密碼 如果設置了database: 1host: localhostport: 6379timeout: 5000

1. 大模型交互模塊

通過LLMConfig進行統一配置,統一管理大模型調用,支持多模型切換:

package com.example.config;import com.example.entity.ChatLLM;
import com.example.service.*;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.memory.chat.TokenWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import dev.langchain4j.model.openai.OpenAiTokenCountEstimator;
import dev.langchain4j.service.AiServices;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author: znly* @Description:* @Date: 2025/7/2 9:08*/
@Configuration
public class LLMConfig {@Autowiredprivate ApplicationContext context;@Resourceprivate RedisChatMemoryStore redisChatMemoryStore;@Autowiredprivate OpenAIProperties openAIProperties;@Beanpublic ChatModel chatModel() {return OpenAiChatModel.builder().modelName(openAIProperties.getModel()).baseUrl(openAIProperties.getBaseUrl()).apiKey(openAIProperties.getApiKey()).temperature(openAIProperties.getTemperature()).build();}/*** 創建一個流式模型** @return*/@Beanpublic StreamingChatModel streamingChatModel() {return OpenAiStreamingChatModel.builder().modelName(openAIProperties.getModel()).baseUrl(openAIProperties.getBaseUrl()).apiKey(openAIProperties.getApiKey()).temperature(openAIProperties.getTemperature()).maxTokens(openAIProperties.getMaxTokens()).build();}@Beanpublic ChatLLMService chatLLMService(StreamingChatModel streamingChatModel) {return AiServices.builder(ChatLLMService.class).streamingChatModel(streamingChatModel).chatMemoryProvider(memoryId -> {return MessageWindowChatMemory.withMaxMessages(10);}).build();}@Bean(name = "chatMessageWindowChatMemory")public ChatMemoryAssistant chatMessageWindowChatMemory(ChatModel chatModel) {return AiServices.builder(ChatMemoryAssistant.class).chatModel(chatModel).chatMemoryProvider(memoryId -> {return MessageWindowChatMemory.withMaxMessages(10);}).build();}@Bean(name = "chatTokenWindowChatMemory")public ChatMemoryAssistant chatTokenWindowChatMemory(ChatModel chatModel) {return AiServices.builder(ChatMemoryAssistant.class).chatModel(chatModel).chatMemoryProvider(memoryId -> {return TokenWindowChatMemory.withMaxTokens(1000, new OpenAiTokenCountEstimator("gpt-4o-mini"));}).build();}@Bean(name = "chatRedisChatMemory")public ChatMemoryAssistant chatRedisChatMemory(ChatModel chatModel) {ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).chatMemoryStore(redisChatMemoryStore).build();return AiServices.builder(ChatMemoryAssistant.class).chatModel(chatModel).chatMemoryProvider(chatMemoryProvider).build();}@Bean(name = "chatExternal")public ChatLLMServiceSimple chatLLMServiceExternal(ChatModel chatModel) {return AiServices.builder(ChatLLMServiceSimple.class).chatModel(chatModel).tools(new WeatherService()).build();}@Bean(name = "chatLLM")public ChatMemoryAssistant chatLLM(ChatModel chatModel) {ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).chatMemoryStore(redisChatMemoryStore).build();return AiServices.builder(ChatMemoryAssistant.class).chatModel(chatModel).chatMemoryProvider(chatMemoryProvider).tools(new ExternalService()).build();}@Bean(name = "chatLLMStream")public ChatMemoryAssistant chatLLMStream(StreamingChatModel streamingChatModel) {ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(openAIProperties.getMaxMessages()).chatMemoryStore(redisChatMemoryStore).build();return AiServices.builder(ChatMemoryAssistant.class).streamingChatModel(streamingChatModel).chatMemoryProvider(chatMemoryProvider).tools(new ExternalService()).build();}}

2. 上下文管理模塊

實現對話歷史的存儲與檢索,支持會話級和用戶級上下文:

本系統通過redis實現臨時存儲,不存儲至數據庫,可以在配置文件中中對存儲上限進行動態修改。

@Bean(name = "chatLLMStream")public ChatMemoryAssistant chatLLMStream(StreamingChatModel streamingChatModel) {ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(openAIProperties.getMaxMessages()).chatMemoryStore(redisChatMemoryStore).build();return AiServices.builder(ChatMemoryAssistant.class).streamingChatModel(streamingChatModel).chatMemoryProvider(chatMemoryProvider).tools(new ExternalService()).build();}

3. 提示工程模塊

封裝提示詞模板與解析邏輯,提升大模型輸出質量:

例如,可以利用@SystemMessage來定義你的提示詞,確保大模型只回復相關領域的知識內容。

package com.example.service;import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;/*** @Author: znly* @Description:* @Date: 2025/7/3 10:43*/
public interface ChatMemoryAssistant {/*** 帶記憶緩存的對話* @param userId* @param prompt* @return*/
@SystemMessage("你是一位本科和研究生均畢業于北京大學的專業后端開發工程師,擁有十年大廠后端開發工作經驗,你的主要編程語言是java和python。" +
"你只能回答你的業務領域內的問題,如果問題涉及到其他領域請回復不知道")String chat(@MemoryId String memoryId, @UserMessage String prompt);Flux<String> chatStream(@MemoryId String memoryId, @UserMessage String prompt);}

4. 函數調用

針對大模型對于相關城市天氣,當天時間等需要聯網查詢,或者是用戶自己相關的知識,可以通過@Tool這個注解來實現函數調用。

例如:針對天氣和時間問題,會調用以下兩個函數來執行,大模型不會直接回答。

package com.example.service;import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author: znly* @Description: 外部服務類* @Date: 2025/7/3 22:18*/
@Service
public class ExternalService {@Tool(value = "今天天氣怎么樣")public String getWeather(@P("城市") String city) {System.out.println("城市:" + city);//調用外部 服務return "今天" + city + "的天氣是晴天";}@Tool(value = "今天日期是多少")public String getDate() {System.out.println("今天日期" + LocalDate.now().toString());return LocalDate.now().toString();}@Tool(value = "告訴我現在的北京時間")public String getTime() {// 獲取當前時間LocalDateTime now = LocalDateTime.now();// 定義日期時間格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化時間String formattedDateTime = now.format(formatter);// 輸出格式化后的時間System.out.println("當前時間: " + formattedDateTime);return "當前時間是:" + formattedDateTime;}
}

5. 檢索增強生成 (RAG) 模塊

結合向量檢索與大模型生成,提升專業領域回答準確性:

// 文檔加載與處理
DocumentLoader loader = new FileSystemDocumentLoader("knowledge-base");
DocumentParser parser = new MarkdownDocumentParser();
TextSplitter splitter = new RecursiveCharacterTextSplitter(RecursiveCharacterTextSplitterConfig.builder().chunkSize(800).chunkOverlap(100).build()
);
List<Document> documents = splitter.split(parser.parse(loader.load()));// 向量存儲
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder().apiKey(API_KEY).build();
EmbeddingStore embeddingStore = PineconeEmbeddingStore.builder().apiKey(PINECONE_KEY).environment("us-west1-gcp").indexName("knowledge-index").build();
embeddingStore.storeDocuments(documents, embeddingModel);// RAG服務
Rag rag = Rag.builder().embeddingModel(embeddingModel).embeddingStore(embeddingStore).documentLoader(loader).textSplitter(splitter).build();// 生成回答
String userQuery = "如何配置LangChain4j的RAG模塊?";
List<Document> relevantDocs = rag.relatedDocuments(userQuery, 3);
String response = rag.chain().promptTemplate(PromptTemplate.builder().template("根據以下文檔回答用戶問題:\n{documents}\n用戶問題:{userQuery}\n回答:").build()).languageModel(model).build().invoke(Map.of("documents", relevantDocs, "userQuery", userQuery));

技術亮點與創新點

1. 多模態對話增強

在標準文本對話基礎上,擴展支持:

  • 富文本處理:解析 Markdown 格式輸出,支持加粗、列表等樣式
  • 代碼塊處理:自動識別代碼塊并高亮顯示,提升技術對話體驗
  • 數學公式支持:通過 KaTeX 渲染 LaTeX 公式,滿足學術交流需求

2. 智能對話控制

實現多種對話策略:

  • 追問策略:當用戶問題不明確時,自動生成追問提示(如 "你能具體說明一下嗎?")
  • 多輪上下文:智能截斷過長對話歷史,保留關鍵信息(基于令牌數統計)
  • 敏感詞過濾:集成內容安全模塊,自動識別并處理敏感信息

3. 企業級能力集成

與企業系統深度整合:

  • OA 系統集成:對接企業 OA 系統,自動提取日程、審批等信息
  • CRM 集成:根據客戶歷史訂單生成個性化推薦
  • 知識庫對接:連接企業內部知識庫,提供專業領域支持

應用場景與典型案例

1. 企業智能客服

某電商平臺集成該系統后,實現:

  • 85% 的常見問題自動解答,減少客服人力成本
  • 基于購買歷史的個性化推薦,提升轉化率 15%
  • 多輪對話上下文保持,客戶滿意度提升 20%

2. 技術支持助手

為軟件開發團隊提供:

  • 代碼問題解答(基于官方文檔和項目代碼庫)
  • 錯誤日志分析與解決方案推薦
  • 技術選型建議(如 "Spring Boot 與 Quarkus 如何選擇")

3. 學術研究助手

服務科研人員:

  • 文獻摘要生成與關鍵信息提取
  • 實驗方案設計建議
  • 論文寫作輔助(語法檢查、引用建議)

總結與未來規劃

基于 LangChain4j 構建的智能對話系統,充分發揮了 Java 的企業級優勢和 LangChain4j 的大模型集成能力,在功能完整性、性能表現和可擴展性方面均達到生產級水平。系統不僅實現了豆包的核心對話功能,還通過 RAG 技術、多模態支持和企業級集成,拓展了智能對話的應用邊界。

未來規劃包括:

  1. 多模態增強:支持語音、圖像輸入輸出,實現更自然的交互
  2. 聯邦學習集成:保護企業數據隱私,支持跨機構協作
  3. 邊緣計算優化:針對邊緣設備進行模型輕量化和推理優化
  4. 低代碼平臺:提供可視化流程編排工具,降低使用門檻

該系統的成功實踐證明,Java 與 LangChain4j 的組合不僅適用于企業級大模型應用開發,還能在用戶體驗、性能優化和系統集成方面超越傳統 Python 方案,為智能對話技術的工業化落地提供了新的技術路徑。

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

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

相關文章

基于uni-app的書法學習管理小程序的設計與實現

一、設計的目的 書法是中華民族傳統文化的瑰寶&#xff0c;更是人類文明的寶貴財富&#xff0c;具有深遠的意義和實價值。在當今數字化時代&#xff0c;隨著信息技術的飛速發展&#xff0c;傳統書法學習模式面臨著諸多挑戰和需要解決的問題。為推動書法學習的現代化轉型&#…

NumPy 函數庫在數學建模中的基本使用方法

一、引言 在數學建模的世界里,我們常常需要處理大量的數據和進行復雜的數值計算。Python 中的 NumPy 庫就像是一位得力的助手,它為我們提供了強大的多維數組對象和豐富的數學函數,讓我們能夠高效地完成各種數值計算任務。接下來,我們將深入探討 NumPy 在數學建模中的基本使…

模塊三:現代C++工程實踐(4篇)第一篇《C++模塊化開發:從Header-only到CMake模塊化》

引言&#xff1a;現代C工程化的核心挑戰&#xff08;終極擴展版&#xff09; 在云計算與物聯網時代&#xff0c;C項目規模呈指數級增長。傳統Header-only開發模式暴露出編譯效率低下、依賴管理混亂、版本沖突頻發等致命問題。本文通過CMake 3.22Conan 2.0工具鏈的深度集成&…

uniapp啟動圖被拉伸問題

記錄下&#xff1a; 安卓手機有不同的規格&#xff0c;很難所有規格都去適配。如果不適配所有機型&#xff0c;那么就會導致部分機型的啟動圖被拉伸。 安卓提供了.9.png圖片格式&#xff0c;允許標注部分拉伸&#xff0c;這樣啟動圖中間的logo就不會被拉伸。 下面2張圖是沒有…

stm32的三種開發方式

以下是針對STM32F103RC實現LED閃爍&#xff08;PC13引腳&#xff09;的三種開發方式示例代碼&#xff0c;每種方式均保持相同的核心邏輯&#xff1a; 1. 寄存器開發方式&#xff08;直接操作寄存器&#xff09; #include "stm32f10x.h"int main(void) {// 1. 開啟G…

SpringBoot問卷調查系統設計與實現

概述 基于SpringBoot開發的問卷調查系統&#xff0c;該系統集成了問卷管理、題目管理等多種功能模塊。 主要內容 核心功能模塊&#xff1a; ??個人信息管理??&#xff1a; 修改密碼個人信息修改 ??問卷管理??&#xff1a; 問卷新增問卷修改問卷刪除 ??題目管理?…

Linux進程管理:從基礎到實戰

在 Linux 系統編程中&#xff0c;進程&#xff08;Process&#xff09; 是操作系統進行資源分配和調度的基本單位。理解進程的概念是掌握系統編程、多任務處理、并發編程的基礎。 目錄 一、什么是進程&#xff1f; 定義&#xff1a; 二、進程的生命周期 示例&#xff1a;查…

工業物聯網中的 Modbus:傳感器與網關通信實戰(二)

四、實戰案例解析 4.1 項目背景與目標 某智能工廠致力于提升生產過程的自動化和智能化水平&#xff0c;對生產線上的各種設備進行實時監控和數據分析。在該工廠的一個生產車間中&#xff0c;存在著大量的傳感器&#xff0c;用于監測設備的運行狀態、環境參數等信息。這些傳感…

飛算 JavaAI 智控引擎:全鏈路開發自動化新圖景

免責聲明: 此文章的所有內容皆是本人實驗測評&#xff0c;并非廣告推廣&#xff0c;并非抄襲。如有侵權&#xff0c;請聯系&#xff0c;謝謝! 文章目錄&#x1f4dd;前言一、飛算 Java AI 智能開發助手簡介1.1何為飛算 Java AI智能助手&#xff1f;2.2 飛算Java AI 直擊開發全場…

MYSQL數據庫(九)MVCC-多版本并發控制

目錄 一 前景導入 1 當前讀 2 快照讀 二 MVCC 1 隱藏字段 2 UndoLog 回滾日志 (1 UndoLog日志 (2 UndoLog版本鏈 3 Read View 面試八股 介紹一下MVCC 一 前景導入 1 當前讀 可使當前事務讀取的是最新版本的數據&#xff0c;讀取時還要保證其他并發事務不能修改當中…

[Pytest] [Part 2]增加 log功能

開始實現需求之前先做個log類&#xff0c;可以給其他模塊使用&#xff0c;也方便以后修改log類的功能和屬性。 使用的是python中的logging包來進行簡單的封裝&#xff0c;具體代碼如下 import logging import sysclass TefLogger:def __init__(self, logger_nameTEST_FRAMEWOR…

NeighborGeo:基于鄰居的IP地理定位(三)

NeighborGeo:基于neighbors的IP地理定位 X. Wang, D. Zhao, X. Liu, Z. Zhang, T. Zhao, NeighborGeo: IP geolocation based on neighbors, Comput. Netw. 257 (2025) 110896, 3. NeighborGeo 本文提出NeighborGeo,利用圖結構學習和有監督對比學習來建立可靠的地標-目標關…

python使用fastmcp包編寫mcp服務端(mcp_server)和mcp客戶端(mcp_client)

安裝fastmcp pip install fastmcp編寫mcp服務端代碼 from fastmcp import FastMCP mcp FastMCP(weather)mcp.tool() def get_weather(city: str):獲取對應城市的天氣:param city: 目標城市:return: 該城市的天氣return f"{city}天氣晴朗&#xff0c;溫度60度&#xff01…

(1)機器學習小白入門 YOLOv:從概念到實踐

(1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 目標檢測一直是一個機器學習的一個重要的應用方向。而 YOLOv&#xff08;You Only Look Once&…

Appium 簡介

Appium 是一個開源的移動應用自動化測試框架&#xff0c;用于測試原生應用(native)、混合應用(hybrid)和移動網頁應用(mobile web)。它支持 iOS、Android 和 Windows 平臺。 https://www.bilibili.com/video/BV1R93szkEhi/? App自動化測試&#xff1a;App測試AppiumUiAutomato…

【C語言刷題】第十一天:加量加餐繼續,代碼題訓練,融會貫通IO模式

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

免費版安全性縮水?ToDesk、TeamViewer、向日葵、網易UU遠程訪問隱私防護測評

一、前言 在這個居家辦公、遠程技術支持成為常態的時代&#xff0c;我們經常需要把電腦控制權交給遠方的同事或技術人員。但你想過沒有&#xff0c;那些免費遠程控制軟件&#xff0c;真的能保護好你的隱私嗎&#xff1f; 好用的遠程軟件通常會收費運營&#xff0c;投入經費去開…

nginx部署發布Vite項目

1 引言 在之前的文章《Ubuntu云服務器上部署發布Vite項目》中筆者使用了Vite提供的預覽服務(npm run preview)來在云服務器上發布Web應用。這樣做輕量應用是沒問題的&#xff0c;不過遇到一些專業的問題就不行了&#xff0c;最好還是使用專業的HTTP服務器。除此之外&#xff0…

Unity文件夾標簽 —— FolderTag

GitHub地址 FolderTag 下載之后解壓&#xff0c;將FolderTag文件夾拖進Unity項目的Assets文件夾 選中文件夾&#xff0c;填上標簽

【0基礎開發油猴腳本】某漫畫網站圖片旋轉

有朋友在用某漫畫網站在線看漫畫&#xff0c;但是那個網站會把漫畫圖片右旋90度&#xff0c;如圖。于是&#xff0c;他就像我發起了求助&#xff0c;問我能不能寫個腳本。我說&#xff0c;AI都發展到2025了&#xff0c;前端&#xff08;腳本&#xff09;這種東西還用自己寫嗎&a…