【微服务】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.mzph.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…