【微服務】SpringBoot整合LangChain4j 操作AI大模型實戰詳解

【微服務】SpringBoot整合LangChain4j 操作AI大模型實戰詳解

一、前言

隨著人工智能技術的飛速發展,AI大模型已經在眾多領域展現出強大的能力,為業務拓展和商業價值提升帶來了新的機遇。SpringBoot作為一款廣受歡迎的Java微服務框架,以其簡潔、高效的特點深受開發者喜愛。而LangChain4j作為一款專注于AI大模型集成的開源庫,為Java開發者提供了一種簡單且高效的方式來接入和利用各種AI大模型。本文將詳細介紹如何在SpringBoot中整合LangChain4j,實現對AI大模型的操作,幫助讀者快速上手并應用到實際項目中。

二、LangChain4j概述

(一)LangChain4j介紹

LangChain4j是一款基于Java的輕量級框架,專為Java開發者設計,旨在簡化大型語言模型(LLMs)在Java應用中的集成。它借鑒了Python版LangChain的設計理念,提供了豐富的工具和組件,幫助開發者快速構建基于LLMs的應用程序,如聊天機器人、問答系統、文本生成等。

(二)主要特點

  1. 模塊化架構:允許開發者根據需要選擇和使用特定功能,如模型集成、數據加載、鏈式調用等。
  2. 支持多種LLM提供商:如OpenAI、Hugging Face等,方便切換和集成不同模型。
  3. 提供鏈式調用功能:允許將多個任務串聯,如文本生成后自動進行情感分析。
  4. 內置多種數據加載器和處理器:支持從不同來源加載數據并進行預處理。
  5. 提供豐富的API和擴展點:開發者可以自定義組件以滿足特定需求。

(三)核心組件

LangChain4j的核心組件包括語言模型(Language Model)、記憶(Memory)、工具(Tool)等。其中,語言模型是核心,負責生成文本;記憶用于存儲對話歷史,以便模型能夠進行上下文相關的回答;工具則可以擴展模型的能力,例如進行搜索、調用API等。

(四)核心優勢

  1. 簡單易用:提供了簡潔的API,方便開發者快速上手。
  2. 靈活性高:支持多種語言模型和工具,可以根據需求靈活組合。
  3. 安全性強:提供了API Key管理等功能,保障數據安全。

(五)核心應用場景

LangChain4j適用于多種場景,包括但不限于:

  • 聊天機器人:通過對話能力實現智能客服、虛擬助手等。
  • 問答系統:結合知識庫,提供準確的問答服務。
  • 文本生成:生成文章、故事、代碼等。

三、SpringBoot整合LangChain4j

(一)前置準備

  1. 獲取API Key

    • 如果使用OpenAI的模型,需要在OpenAI官網注冊賬號并獲取API Key。
    • 將API Key存儲在環境變量或配置文件中,避免直接寫在代碼里。
  2. 導入基礎依賴

    • pom.xml文件中添加LangChain4j相關依賴。例如,使用OpenAI的模型時,需要添加以下依賴:
      <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-core</artifactId><version>最新版本號</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>最新版本號</version></dependency>
      </dependencies>
      
  3. 添加配置文件

    • application.propertiesapplication.yml文件中配置語言模型的關鍵參數。以OpenAI為例:
      langchain4j.openai.apiKey=你的OpenAI API Key
      

(二)對話能力使用

1. Low Level API使用
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;@Service
public class ChatService {private final ChatLanguageModel chatModel;public ChatService() {this.chatModel = new OpenAiChatModel();}public String chat(String userMessage) {return chatModel.generate(userMessage);}
}
2. High Level API使用
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class ChatService {private final ChatLanguageModel model;public ChatService() {model = new OpenAiChatModel();}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).build();return chain.execute(userMessage);}
}
3. 設置角色
import dev.langchain4j.template.PromptTemplate;
import org.springframework.stereotype.Service;@Service
public class PromptService {private final PromptTemplate promptTemplate = PromptTemplate.from("你是一個{{role}},請用專業的角度回答:{{question}}");private final ChatLanguageModel chatModel;public PromptService(ChatLanguageModel chatModel) {this.chatModel = chatModel;}public String getResponse(String role, String question) {String prompt = promptTemplate.apply(Parameters.from("role", role,"question", question));return chatModel.generate(prompt);}
}

(三)會話記憶

1. Low Level API的實現
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;@Service
public class ChatService {private final ChatLanguageModel chatModel;private final MessageWindowChatMemory memory;public ChatService() {this.chatModel = new OpenAiChatModel();this.memory = MessageWindowChatMemory.builder().maxMessages(50).build();}public String chat(String userMessage) {memory.add(UserMessage.from(userMessage));String response = chatModel.generate(memory.messages());memory.add(AiMessage.from(response));return response;}
}
2. High Level API的實現
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;@Service
public class ChatService {private final ChatLanguageModel model;private final MessageWindowChatMemory memory;public ChatService() {model = new OpenAiChatModel();memory = MessageWindowChatMemory.builder().maxMessages(50).build();}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).chatMemory(memory).build();return chain.execute(userMessage);}
}

(四)Function Calling

1. 核心概念

Function Calling允許模型調用外部函數來獲取數據或執行操作。例如,模型可以調用一個搜索API來獲取最新的信息。

2. 應用場景
  • 聯網搜索:模型可以通過調用搜索API獲取實時信息。
  • 調用外部API:例如調用天氣API獲取天氣信息。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class FunctionCallingService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public FunctionCallingService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯,例如調用外部搜索APIreturn "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}
}

(五)RAG(Retrieval-Augmented Generation)

1. 核心概念

RAG是一種結合檢索和生成的技術,通過檢索相關文檔來增強模型的生成能力。

2. 應用場景
  • 問答系統:結合知識庫提供準確答案。
  • 文檔輔助寫作:根據文檔內容生成相關內容。
3. 案例代碼
import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.FileDocumentLoader;
import dev.langchain4j.data.segment.TextSegmenter;
import dev.langchain4j.data.segment.TextSegmenterFactory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.retrieval.Retriever;
import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;
import dev.langchain4j.vectorstore.VectorStore;
import dev.langchain4j.vectorstore.VectorStoreFactory;@Service
public class RagService {private final ChatLanguageModel model;private final Retriever retriever;public RagService() {model = new OpenAiChatModel();VectorStore vectorStore = VectorStoreFactory.create();retriever = new VectorStoreRetriever(vectorStore);}public String rag(String userMessage) {RetrievalAugmentedGenerationChain chain = RetrievalAugmentedGenerationChain.builder().chatLanguageModel(model).retriever(retriever).build();return chain.execute(userMessage);}public void loadDocuments() {DocumentLoader documentLoader = new FileDocumentLoader("path/to/documents");List<Document> documents = documentLoader.load();TextSegmenter segmenter = TextSegmenterFactory.create();List<TextSegment> segments = segmenter.segment(documents);retriever.add(segments);}
}

(六)工具調用

1. 核心概念

工具調用允許模型調用外部工具來完成任務,例如調用API、執行命令等。

2. 應用場景
  • 調用API:例如調用天氣API獲取天氣信息。
  • 執行命令:例如調用系統命令執行操作。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class ToolCallingService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public ToolCallingService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯,例如調用外部搜索APIreturn "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}
}

(七)自定義模型

1. 核心概念

自定義模型允許開發者根據需求實現自己的語言模型,例如使用本地模型或自定義邏輯。

2. 應用場景
  • 使用本地模型:例如使用本地的Transformer模型。
  • 自定義邏輯:例如實現特定的文本生成邏輯。
3. 案例代碼
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.ChatMessage;
import dev.langchain4j.model.chat.ChatResponse;
import org.springframework.stereotype.Service;@Service
public class CustomModelService {private final ChatLanguageModel customModel;public CustomModelService() {customModel = new CustomChatModel();}public String generate(String prompt) {return customModel.generate(prompt);}public static class CustomChatModel implements ChatLanguageModel {@Overridepublic ChatResponse generate(List<ChatMessage> messages) {// 實現自定義邏輯String response = "自定義模型生成的響應";return ChatResponse.builder().message(AiMessage.from(response)).build();}}
}

(八)自定義工具

1. 核心概念

自定義工具允許開發者根據需求實現自己的工具,例如調用外部API或執行特定操作。

2. 應用場景
  • 調用外部API:例如調用天氣API獲取天氣信息。
  • 執行特定操作:例如調用系統命令執行操作。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomToolService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public CustomToolService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "customTool", description = "自定義工具")public String customTool(String input) {// 實現自定義邏輯return "自定義工具的響應:" + input;}
}

(九)自定義鏈

1. 核心概念

自定義鏈允許開發者根據需求實現自己的鏈,例如將多個任務串聯起來。

2. 應用場景
  • 串聯多個任務:例如先進行文本生成,再進行情感分析。
  • 實現復雜邏輯:例如根據條件選擇不同的任務。
3. 案例代碼
import dev.langchain4j.chain.Chain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomChainService {private final ChatLanguageModel model;public CustomChainService() {model = new OpenAiChatModel();}public String execute(String userMessage) {CustomChain chain = new CustomChain(model);return chain.execute(userMessage);}public static class CustomChain implements Chain {private final ChatLanguageModel model;public CustomChain(ChatLanguageModel model) {this.model = model;}@Overridepublic String execute(String input) {// 實現自定義邏輯String response = model.generate(input);// 進行后續處理return response;}}
}

四、實戰案例

(一)案例背景

假設我們正在開發一個智能客服系統,需要實現以下功能:

  1. 用戶可以與客服機器人進行對話。
  2. 客服機器人能夠根據用戶的問題提供準確的答案。
  3. 客服機器人能夠調用外部API獲取實時信息,例如天氣信息。

(二)項目結構

src/main/java/com/example/aiassist
├── controller
│   ├── AiController.java
├── service
│   ├── ChatService.java
│   ├── FunctionCallingService.java
│   ├── RagService.java
│   ├── ToolCallingService.java
├── model
│   ├── CustomChatModel.java
│   ├── CustomTool.java
├── config
│   ├── AppConfig.java

(三)代碼實現

1. 控制器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/ai")
public class AiController {private final ChatService chatService;private final FunctionCallingService functionCallingService;private final RagService ragService;private final ToolCallingService toolCallingService;@Autowiredpublic AiController(ChatService chatService, FunctionCallingService functionCallingService, RagService ragService, ToolCallingService toolCallingService) {this.chatService = chatService;this.functionCallingService = functionCallingService;this.ragService = ragService;this.toolCallingService = toolCallingService;}@PostMapping("/chat")public String chat(@RequestBody String userMessage) {return chatService.chat(userMessage);}@PostMapping("/function-calling")public String functionCalling(@RequestBody String userMessage) {return functionCallingService.execute(userMessage);}@PostMapping("/rag")public String rag(@RequestBody String userMessage) {return ragService.rag(userMessage);}@PostMapping("/tool-calling")public String toolCalling(@RequestBody String userMessage) {return toolCallingService.execute(userMessage);}
}
2. 服務層
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.FileDocumentLoader;
import dev.langchain4j.data.segment.TextSegmenter;
import dev.langchain4j.data.segment.TextSegmenterFactory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.retrieval.Retriever;
import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;
import dev.langchain4j.vectorstore.VectorStore;
import dev.langchain4j.vectorstore.VectorStoreFactory;
import org.springframework.stereotype.Service;@Service
public class ChatService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;private final Retriever retriever;public ChatService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();VectorStore vectorStore = VectorStoreFactory.create();retriever = new VectorStoreRetriever(vectorStore);}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).toolRegistry(toolRegistry).retriever(retriever).build();return chain.execute(userMessage);}public String functionCalling(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}public String rag(String userMessage) {RetrievalAugmentedGenerationChain chain = RetrievalAugmentedGenerationChain.builder().chatLanguageModel(model).retriever(retriever).build();return chain.execute(userMessage);}public String toolCalling(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯return "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}public void loadDocuments() {DocumentLoader documentLoader = new FileDocumentLoader("path/to/documents");List<Document> documents = documentLoader.load();TextSegmenter segmenter = TextSegmenterFactory.create();List<TextSegment> segments = segmenter.segment(documents);retriever.add(segments);}
}
3. 自定義模型
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.ChatMessage;
import dev.langchain4j.model.chat.ChatResponse;
import org.springframework.stereotype.Service;@Service
public class CustomChatModelService {private final ChatLanguageModel customModel;public CustomChatModelService() {customModel = new CustomChatModel();}public String generate(String prompt) {return customModel.generate(prompt);}public static class CustomChatModel implements ChatLanguageModel {@Overridepublic ChatResponse generate(List<ChatMessage> messages) {// 實現自定義邏輯String response = "自定義模型生成的響應";return ChatResponse.builder().message(AiMessage.from(response)).build();}}
}
4. 自定義工具
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomToolService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public CustomToolService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "customTool", description = "自定義工具")public String customTool(String input) {// 實現自定義邏輯return "自定義工具的響應:" + input;}
}

五、總結

通過本文的詳細介紹,我們已經完成了在SpringBoot中整合LangChain4j的全過程。從基礎的對話能力、會話記憶,到高級的Function Calling、RAG、工具調用和自定義功能,LangChain4j為Java開發者提供了一個強大且靈活的框架來構建基于AI大模型的應用程序。通過實戰案例,我們展示了如何將這些功能應用到實際項目中,幫助讀者更好地理解和掌握。

在實際開發中,開發者可以根據具體需求靈活選擇和組合LangChain4j提供的功能,充分發揮AI大模型的能力,為用戶提供更加智能和高效的解決方案。

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

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

相關文章

一種單脈沖雷達多通道解卷積前視成像方法【論文閱讀】

一種單脈沖雷達多通道解卷積前視成像方法-李悅麗-2007 1. 論文的研究目標與實際意義1.1 研究目標1.2 實際問題與產業意義2. 論文提出的思路、方法及模型2.1 多通道解卷積(MCD)技術的核心思想2.1.1 數學模型與公式推導2.1.2 針對單脈沖雷達的改進2.2 方法與傳統技術的對比3. 實…

Codeforces Round 1016 (Div. 3)題解

題目地址 https://codeforces.com/contest/2093 銳評 在所有題意都理解正確的情況下&#xff0c;整體難度不算太難。但是偏偏存在F這么惡心的題意&#xff0c;樣例都不帶解釋一下的&#xff0c;根本看不懂題。D題也惡心&#xff0c;在于遞歸過程的拆分&#xff0c;需要點數學…

【python讀取并顯示遙感影像】

在Python中讀取并顯示遙感影像&#xff0c;可以使用rasterio庫讀取影像數據&#xff0c;并結合matplotlib進行可視化。以下是一個完整的示例代碼&#xff1a; import rasterio import matplotlib.pyplot as plt import numpy as np# 打開遙感影像文件 with rasterio.open(path…

怎樣使用Python編寫的Telegram聊天機器人

怎樣使用Python編寫的Telegram聊天機器人 代碼直接運行可用 以下是對這段代碼的詳細解釋: 1. 導入必要的庫 import loggingfrom telegram import Update from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, filters, MessageHandler import log…

moviepy學習使用筆記

目錄 1. moviepy安裝版本選擇安裝命令2. 使用文檔1.0.3文檔中文文檔寫的比較好的學習博客2.x文檔1.0.3到2.x快速上手3. 可能遇到的問題3.1 依賴問題3.2 中文顯示問題4. 特效示例中文顯示的問題1. moviepy安裝 版本選擇 moviepy有兩個主流版本: 1.0.3 和 2.x 目前2.x版本稱不…

docker各種清空緩存命令,下載jdk包總失敗,執行完好了

清理未使用的鏡像&#xff08;推薦&#xff0c;最常用&#xff09;&#xff1a; docker image prune -a 清理所有未使用的數據&#xff08;包括鏡像、容器、網絡和構建緩存&#xff09;&#xff1a; docker system prune -a 清理所有未使用的數據&#xff0c;包括未使用的卷…

NO.78十六屆藍橋杯備戰|數據結構-并查集|雙親表示法|初始化|查詢|合并|判斷|親戚|Lake Counting|程序自動分析(C++)

雙親表?法 接下來要學習到的并查集&#xff0c;本質上就是?雙親表?法實現的森林。因此&#xff0c;我們先認識?下雙親表?法。 在學習樹這個數據結構的時&#xff0c;講到樹的存儲?式有很多種&#xff1a;孩?表?法&#xff0c;雙親表?法、孩?雙親表?法以及孩?兄弟表…

Ubuntu掛載HDD遷移存儲PostgreSQL數據

關聯博客&#xff1a;windows通用網線連接ubuntu實現ssh登錄、桌面控制、文件共享 背景&#xff1a; 在個人ubuntu機器上安裝了pgsql&#xff0c;新建了一張表插入了2000w數據用于模擬大批量數據分頁查詢用&#xff0c;但是發現查詢也不慢&#xff08;在公司測試環境查詢1700…

Spring MVC與Spring Boot文件上傳配置項對比

Spring MVC與Spring Boot文件上傳配置項對比 一、Spring MVC配置項&#xff08;基于不同MultipartResolver實現&#xff09; 1. 使用 CommonsMultipartResolver&#xff08;Apache Commons FileUpload&#xff09; Bean public MultipartResolver multipartResolver() {Common…

Android 學習之 Navigation導航

1. Navigation 介紹 Navigation 組件 是 Android Jetpack 的一部分&#xff0c;用于簡化應用內導航邏輯&#xff0c;支持 Fragment、Activity 和 Compose 之間的跳轉。核心優勢&#xff1a; 單 Activity 架構&#xff1a;減少 Activity 冗余&#xff0c;通過 Fragment 或 Com…

Docker Compose 部署Nginx反向代理 tomcat

Nginx 、Tomcat (默認端口8080)》》compose services:nginx:image: nginx:latestcontainer_name: nginxrestart: alwaysports:- 80:80- 8080:8080volumes:# 文件夾會自動創建&#xff0c;但nginx.conf是文件&#xff0c;需要提前創建&#xff0c;否則 會自動創建nginx.conf文件…

數據庫7(數據定義語句,視圖,索引)

1.數據定義語句 SQL數據定義語言&#xff08;DDL&#xff09;用于定義和管理數據庫結構&#xff0c;包括創建、修改和刪除 數據庫對象。常見的DDL語句包括CREATE、DROP和ALTER。 它的操作的是對象&#xff0c;區分操作數據的語句&#xff1a;INSERT,DELETE,UPDATE 示例&#x…

QML面試筆記--UI設計篇02布局控件

1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 總結 1. QML 中常用的布局控件 1.1. Row 背景知識&#xff1a;Row 布局用于將子元素水平排列&#xff0c;適合簡單的線性布局&#xff0c;如工具欄按鈕或表單輸入…

Compose組件轉換XML布局1.0

文章目錄 學習JetPack Compose資源前言&#xff1a;預覽界面的實現Compose組件的布局管理一、Row和Colum組件&#xff08;LinearLayout&#xff09;LinearLayout&#xff08;垂直方向 → Column&#xff09;LinearLayout&#xff08;水平方向 → Row&#xff09; 二、相對布局 …

從零構建大語言模型全棧開發指南:第五部分:行業應用與前沿探索-5.2.1模型偏見與安全對齊(Red Teaming實踐)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 大語言模型全棧開發指南:倫理與未來趨勢 - 第五部分:行業應用與前沿探索5.2.1 模型偏見與安全對齊(Red Teaming實踐)一、模型偏見的來源與影響1. 偏見的定義與分類2. 偏見的實際影響案例二、安全對齊…

java基礎 迭代Iterable接口以及迭代器Iterator

Itera迭代 Iterable < T>迭代接口(1) Iterator iterator()(2) forEach(Consumer<? super T> action)forEach結合Consumer常見場景forEach使用注意細節 (3)Spliterator spliterator() Iterator< T>迭代器接口如何“接收” Iterator<T>核心方法迭代器的…

PyTorch構建自定義模型

PyTorch 提供了靈活的方式來構建自定義神經網絡模型。下面我將詳細介紹從基礎到高級的自定義模型構建方法&#xff0c;包含實際代碼示例和最佳實踐。 一、基礎模型構建 1. 繼承 nn.Module 基類 所有自定義模型都應該繼承 torch.nn.Module 類&#xff0c;并實現兩個基本方法&…

AI智算-K8s如何利用GPFS分布式并行文件存儲加速訓練or推理

文章目錄 GPFS簡介核心特性存儲環境介紹存儲軟件版本客戶端存儲RoCEGPFS 管理(GUI)1. 創建 CSI 用戶2. 檢查GUI與k8s通信文件系統配置1. 開啟配額2. 啟用filesetdf文件系統3. 驗證文件系統配置4. 啟用自動inode擴展存儲集群配置1. 啟用對根文件集(root fileset)配額2. igno…

gbase8s之邏輯導出導入腳本(完美版本)

該腳本dbexport.sh用于快速導出庫和導入庫&#xff08;使用多并發unload&#xff0c;和多并發dbload的方式&#xff09; #!/bin/sh #腳本功能&#xff1a;將數據導出成文本&#xff0c;遷移至其他實例 #最后更新時間&#xff1a;2023-12-19 #使用方法&#xff1a; #1.執行該腳…

springMVC-攔截器詳解

攔截器 概述 SpringMVC的處理器攔截器類似于Servlet開發中的過濾器Filter,用于對處理器進行預處理和后處理。開發者可以自己定義一些攔截器來實現特定的功能。 過濾器與攔截器的區別&#xff1a;攔截器是AOP思想的具體應用。 過濾器 servlet規范中的一部分&#xff0c;任何ja…