当前位置: 首页 > news >正文

【AI大模型】SpringBoot整合Spring AI 核心组件使用详解

目录

一、前言

二、Spring AI介绍

2.1 Spring AI介绍

2.2 Spring AI主要特点

2.3 Spring AI核心组件

2.4 Spring AI应用场景

2.5 Spring AI优势

2.5.1 与 Spring 生态无缝集成

2.5.2 模块化设计

2.5.3 简化 AI 集成

2.5.4 支持云原生和分布式计算

2.5.5 安全性保障

2.5.6 高性能和可扩展性

2.5.7 降低开发成本

三、SpringBoot 整合 Spring AI 核心组件使用

3.1 前置准备

3.1.1 准备一个springboot工程

3.1.2 导入核心依赖

3.1.3 选择大模型并申请apikey

3.1.4 配置文件信息

3.2 对话能力使用

3.2.1 自定义配置类

3.2.2 添加一个测试接口

3.2.3 流式输出

3.3 设置角色

3.4 会话记忆能力

3.4.1 理解Advisor

3.4.2 Spring AI内置Advisor

3.4.3 ChatMemory使用案例

3.4.4 会话记忆注意点

3.5 RAG与向量数据库

3.5.1 为什么需要向量数据库

3.5.2 向量数据库的好处

3.5.3 RAG 流程介绍

3.5.4 spring ai rag 核心代码实现

四、写在文末


一、前言

人工智能发展到今天,与各个AI大模型的强大能力有着密切的关系,为了适配上层各类应用的AI能力,各种编程语言也在积极降低对接大模型的成本,可以肯定的是,在大模型能力和生态渐臻完善的情况下,接下来就是在应用层的接入、商用和市场化进程,基于此,以Java生态spring框架为例,从一开始推出spring ai,就是在积极布局与各个大模型的通用对接能力,基于spring ai 可以快速对接chatgpt模型,也可以对接主流厂商的大模型,从而快速接入AI能力,本文以springboot 为例,详细介绍如何对接并深度使用spring ai 的各项组件能力。

二、Spring AI介绍

2.1 Spring AI介绍

Spring AI 是 Spring 生态系统中的一个新兴项目,旨在将人工智能(AI)能力集成到 Spring 应用程序中。它提供了一套工具和框架,帮助开发者轻松地将 AI 功能(如机器学习、自然语言处理、计算机视觉等)整合到 Spring 应用中。官往地址:Prompts :: Spring AI Reference

2.2 Spring AI主要特点

Spring AI具备如下特点:

  1. 简化集成:Spring AI 提供了简洁的 API 和注解,使得在 Spring 应用中集成 AI 功能更加容易。

  2. 模块化设计:支持多种 AI 框架和库(如 TensorFlow、PyTorch、Hugging Face 等),开发者可以根据需求选择合适的工具。

  3. 自动化配置:通过 Spring Boot 的自动配置机制,减少手动配置的复杂性。

  4. 与 Spring 生态无缝集成:与 Spring 的其他项目(如 Spring Data、Spring Security 等)无缝集成,提供一致的开发体验。

  5. 支持多种 AI 任务:包括但不限于文本生成、图像识别、语音处理、推荐系统等。

2.3 Spring AI核心组件

Spring AI提供了丰富的组件可供开发者快速使用,具体来说:

  1. Spring AI Core:提供基础 API 和工具,支持常见的 AI 任务。

    1. 它简化了 AI 模型的集成和管理,使得开发者可以专注于业务逻辑而不是底层实现。

    2. 主要功能

      • 提供统一的 API 接口,支持多种 AI 框架(如 TensorFlow、PyTorch、Hugging Face 等)。

      • 支持模型加载、推理和评估。

      • 提供工具类和方法,简化数据处理和预处理。

  2. Spring AI Data:简化 AI 模型训练和推理过程中数据的处理和管理。

    1. 它提供了数据加载、清洗、转换和存储的工具,确保数据在 AI 流程中的高效使用。

    2. 主要功能

      • 支持多种数据源(如数据库、文件、API 等)。

      • 提供数据预处理和增强工具。

      • 支持数据批处理和流处理。

  3. Spring AI Security:确保 AI 模型和数据的安全性,支持模型加密和访问控制。

    1. 它提供了模型加密、访问控制和数据隐私保护等功能,防止未经授权的访问和数据泄露。

    2. 主要功能

      • 支持模型加密和解密。

      • 提供基于角色的访问控制(RBAC)。

      • 支持数据脱敏和隐私保护。

  4. Spring AI Cloud:提供与云平台(如 AWS、Google Cloud、Azure)的集成,支持分布式训练和推理。

    1. 它简化了在云环境中部署和管理 AI 模型的过程。

    2. 主要功能

      • 支持主流云平台(如 AWS、Google Cloud、Azure)。

      • 提供分布式训练和推理的工具。

      • 支持自动扩展和负载均衡。

Spring AI 的核心组件为开发者提供了全面的工具和框架,使得在 Spring 应用中集成和实现 AI 功能变得更加简单和高效。通过 Spring AI Core、Spring AI Data、Spring AI Security 和 Spring AI Cloud,开发者可以轻松处理数据、确保安全性、并在云环境中部署 AI 模型。这些组件共同构成了 Spring AI 的强大功能,帮助开发者构建智能应用。

2.4 Spring AI应用场景

在下面的场景中,可以考虑选择使用Spring AI进行集成使用:

  1. 智能推荐系统:利用机器学习模型为用户提供个性化推荐。

    1. 智能推荐系统广泛应用于电商、内容平台、社交媒体等领域,通过分析用户行为和偏好,为用户提供个性化的推荐。

  2. 自然语言处理:集成 NLP 模型,实现文本分类、情感分析、机器翻译等功能。

    1. 自然语言处理广泛应用于聊天机器人、情感分析、文本分类、机器翻译等领域。

  3. 计算机视觉:集成 CV 模型,实现图像识别、目标检测等功能。

    1. 计算机视觉广泛应用于图像识别、目标检测、人脸识别、自动驾驶等领域。

  4. 语音处理:集成语音识别和合成模型,实现语音助手等功能。

    1. 语音处理广泛应用于语音助手、语音识别、语音合成等领域。

  5. 异常检测

    1. 异常检测广泛应用于金融风控、网络安全、工业设备监控等领域,通过检测异常行为或事件,及时发出预警。

Spring AI 提供了丰富的工具和框架,支持多种 AI 应用场景,包括智能推荐系统、自然语言处理、计算机视觉、语音处理和异常检测等。通过 Spring AI Core、Spring AI Data、Spring AI Security 和 Spring AI Cloud 等核心组件,开发者可以轻松构建和部署智能应用,满足各种业务需求。

2.5 Spring AI优势

Spring AI 作为 Spring 生态系统中的一部分,旨在简化人工智能(AI)功能在 Spring 应用中的集成和开发。以下是 Spring AI 的主要优势:

2.5.1 与 Spring 生态无缝集成

Spring AI 完全兼容 Spring 生态系统(如 Spring Boot、Spring Data、Spring Security 等),开发者可以利用熟悉的 Spring 开发模式和工具,快速构建 AI 驱动的应用。

  • 优势

    • 无需学习新的开发框架,降低学习成本。

    • 与 Spring 的依赖注入、AOP、事务管理等特性无缝结合。

    • 支持 Spring Boot 的自动配置,简化 AI 模型的集成。

2.5.2 模块化设计

Spring AI 采用模块化设计,支持多种 AI 框架和工具(如 TensorFlow、PyTorch、Hugging Face 等),开发者可以根据需求灵活选择技术栈。

  • 优势

    • 支持多种 AI 任务(如自然语言处理、计算机视觉、语音处理等)。

    • 提供统一的 API 接口,屏蔽底层框架的复杂性。

    • 易于扩展,支持自定义模型和算法。

2.5.3 简化 AI 集成

Spring AI 提供了简洁的 API 和注解,使得在 Spring 应用中集成 AI 功能变得更加容易。

  • 优势

    • 提供开箱即用的工具,减少开发工作量。

    • 支持模型加载、推理、评估等常见操作。

    • 提供数据预处理和增强工具,简化数据处理流程。

2.5.4 支持云原生和分布式计算

Spring AI 与云平台(如 AWS、Google Cloud、Azure)深度集成,支持分布式训练和推理,适合大规模 AI 应用。

  • 优势

    • 支持分布式训练,加速模型训练过程。

    • 提供自动扩展和负载均衡功能,适应高并发场景。

    • 与 Kubernetes 等云原生技术兼容,便于部署和管理。

2.5.5 安全性保障

Spring AI 提供了完善的安全机制,确保 AI 模型和数据的安全性。

  • 优势

    • 支持模型加密和解密,防止模型被篡改或盗用。

    • 提供基于角色的访问控制(RBAC),限制对敏感数据的访问。

    • 支持数据脱敏和隐私保护,符合 GDPR 等数据隐私法规。

2.5.6 高性能和可扩展性

Spring AI 针对高性能和可扩展性进行了优化,适合处理大规模数据和复杂模型。

  • 优势

    • 支持 GPU 加速,提升模型推理速度。

    • 提供批处理和流处理工具,适应不同规模的数据。

    • 支持模型版本管理和热更新,便于维护和扩展。

2.5.7 降低开发成本

通过提供开箱即用的工具和框架,Spring AI 显著降低了 AI 功能的开发成本。

  • 优势

    • 减少开发时间和人力成本。

    • 提供预训练模型和工具,快速实现 AI 功能。

    • 支持多种开源 AI 框架,避免昂贵的商业解决方案。

三、SpringBoot 整合 Spring AI 核心组件使用

接下来通过案例操作演示在SpringBoot项目中如何使用Spring AI的相关核心组件。

3.1 前置准备

3.1.1 准备一个springboot工程

本地搭建一个springboot工程,这里略过。

3.1.2 导入核心依赖

导入如下核心依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/>
</parent><properties><docker.image.prefix>dcloud</docker.image.prefix><junit.version>5.11.4</junit.version>
</properties><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository>
</repositories><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.2.4</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-moonshot-spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies><build><finalName>boot-docker</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

3.1.3 选择大模型并申请apikey

Spring AI 支持与多种大模型进行整合使用,这里提供下面几种作为选择:

moonshot:

https://platform.moonshot.cn/docs/intro#%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8B

通义千问系列

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

智谱API

智谱AI开放平台

文心一言

百度智能云千帆大模型平台

聚合API

Home - AI工具集

这里比如选择第一个moonshot为例,进入APIKEY申请页面:Moonshot AI - 开放平台,然后在这里创建一个apikey,后续在代码中集成使用;

3.1.4 配置文件信息

基于上面的操作和申请的apikey信息,在配置文件中添加如下信息:

  • 注意,这里以moonshot这个大模型为例进行集成使用,你也可以更换为其他大模型,比如通义千问的,或者openai的都可以,只需要pom文件中导入相应的依赖,并调整这里的配置参数即可;

server:port: 8081spring:ai:moonshot:api-key: 你的apikeychat:options:model: moonshot-v1-8ktemperature: 0.7

3.2 对话能力使用

首先尝试使用一下moonshot的对话模型能力,需要在工程中做下面几步操作

3.2.1 自定义配置类

添加一个自定义的配置类,为全局注册一个ChatClient的bean

import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.moonshot.MoonshotChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@RequiredArgsConstructor
public class ChatConfig {final MoonshotChatModel model;@Beanpublic ChatClient chatClient() {return ChatClient.builder(model).defaultSystem("假如你的身份是特朗普,接下里的对话你必须以特朗普的语气来进行").build();}}

3.2.2 添加一个测试接口

增加如下接口用于测试

package com.congge.web;import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ChatAPI {private ChatClient chatClient;public ChatAPI(ChatClient.Builder builder) {this.chatClient = builder.build();}//localhost:8081/ai/chat?message=你是如何看待拜登这个人@GetMapping("/ai/chat")public String chat(@RequestParam(value = "message") String message){return chatClient.prompt().user(message).call().content();}//localhost:8081/ai/common/chat?message=你是如何看待拜登这个人@GetMapping("/ai/common/chat")public String chatCommon(@RequestParam(value = "message") String message){return chatClient.prompt().user(message).call().content();}}

效果测试

启动工程后,调用下上述接口,可以看到下面的效果

3.2.3 流式输出

参考下面的代码


/**** 流式方式实现聊天功能* localhost:8081/ai/chat/memory?message=你是如何看待拜登这个人* @param message 提示词* @return 聊天结果流*/
@GetMapping(value = "/ai/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream(@RequestParam(value = "message") String message) {return chatClient.prompt().user(message).stream().content();
}

3.3 设置角色

LLM中常用的3种角色

  • System

    • system角色用于设置AI的行为、角色、背景等,通常可以用于设定对话的语境,让AI在指定的语境下工作;

  • Assistant

    • Assistant指的AI回复的信息,由API自动生成

  • User

    • 代表用户的提问

基于上一步的整合,我们提前为ChatClient 设置一个系统角色,添加一个配置类

package com.congge.config;import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.moonshot.MoonshotChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@RequiredArgsConstructor
public class Init {final MoonshotChatModel model;@Beanpublic ChatClient chatClient() {return ChatClient.builder(model).defaultSystem("假如你是特朗普。接下里的对话你必须以特朗普的语气来进行").build();}}

接口做简单的调整,如下:

package com.congge.web;import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequiredArgsConstructor
public class ChatAPI {private final ChatClient chatClient;//localhost:8081/ai/chat?message=你是如何看待拜登这个人@GetMapping("/ai/chat")public String chat(@RequestParam(value = "message") String message){return chatClient.prompt().user(message).call().content();}}

再次调用接口,观察效果如下,不难发现,为ChatClient 设置了默认身份之后,回答问题的时候就会以符合这个身份的方式进行回答

3.4 会话记忆能力

会话记忆,即让AI能够记住上下文的对话信息,具备记忆能力,语言模型本身其实是没有会话记忆的,所有的会话记忆其实都是在每一次发送请求时,将之前所有的上下文信息都携带到这个请求中来。

3.4.1 理解Advisor

Advisor的设计与spring中的filter的设计非常相似,通过添加不同的advisor来为会话提供不同的能力

3.4.2 Spring AI内置Advisor

Spring AI内置了3种Advisor

3.4.3 ChatMemory使用案例

自定义一个ChatMemory的bean,然后配置到ChatClient中,如下:

package com.congge.config;import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.moonshot.MoonshotChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@RequiredArgsConstructor
public class Init {final MoonshotChatModel model;@Beanpublic InMemoryChatMemory chatMemory(){return new InMemoryChatMemory();}@Beanpublic ChatClient chatClient(ChatMemory chatMemory) {return ChatClient.builder(model)//.defaultSystem("你是一个数据库专家,接下来请以这个身份进行回答").defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory)).build();}}

提供如下的测试接口

package com.congge.web;import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequiredArgsConstructor
public class ChatAPI {private final ChatClient chatClient;//localhost:8081/ai/chat?message=你是如何看待拜登这个人@GetMapping("/ai/chat")public String chat(@RequestParam(value = "message") String message){return chatClient.prompt().user(message).call().content();}//localhost:8081/ai/chat/memory?message=java8之后创建线程有哪些方式@GetMapping("/ai/chat/memory")public String chatMemory(@RequestParam(value = "message") String message){return chatClient.prompt().user(message).call().content();}}

为了测试我们的会话记忆是否生效,先后提两个问题,先看问题一

基于上面的回答,我们接着问第二个问题

3.4.4 会话记忆注意点

目前会话记忆可能存在下面的问题点:

  • 所有的AI语言模型支持的上下文都是有限制的,比如moonshot-v1-8k这个模型支持的最大上下文是8k,因此当会话的内容超过上下文的限制,就会产生信息丢失;

  • 较大的上下文信息意味着更高额的价格和算力支出;

3.5 RAG与向量数据库

3.5.1 为什么需要向量数据库

任何一个AI大模型都做不到能够对你的私人文档,或者企业内部的资料库进行检索,假如现在你所在的团队有一个内部的培训文档,而你又希望AI在回答你的问题时能够参考你的文档,这个时候就需要结合向量数据库进行使用了。

  • 大语言模型(如GPT系列)通常仅依赖其训练数据中的知识,缺乏实时更新能力。当用户询问超出训练数据范围的问题时,模型的回答可能不准确或无关。

  • 通过将外部文档或数据库(如知识库、网页或文献等)纳入到模型的生成过程中,RAG允许模型检索实时信息并将其作为上下文生成答案,从而增强生成模型的知识覆盖面。

3.5.2 向量数据库的好处

大语言模型生成长篇内容时,会因为模型上下文窗口的限制(通常为几千个tokens)而丢失前面提到的关键信息。

RAG解决方案:通过检索外部信息源(例如相关文档或数据库条目),RAG能动态地为模型提供更多的上下文,减少生成过程中的信息丢失问题,尤其对于需要综合大量信息的任务(如法律文件解读、科研论文分析等)效果尤为显著。

3.5.3 RAG 流程介绍

在真实的业务场景中,RAG的典型应用主要包括三个步骤:

  • Indexing(索引):将文档分割成chunk,编码成向量,并存储在向量数据库中

    • 这个即文本向量化的过程,向量数据库的选择也很多,比如Chroma,pg,es等

  • Retrieval(检索):根据语义相似度检索与问题最相关的前k个chunk

    • 类似于使用es时,根据关键字进行检索的过程;

  • Generation(生成):将原始问题和检索到的chunk一起输入到LLM中,生成最终答案

    • 实际应用中,将上一步检索得到的结果,并组装成完整的提示词发给大模型生成最终的结果。

3.5.4 spring ai rag 核心代码实现

添加一个配置类,该配置类主要提供如下功能:

  • 配置 ChatClient 作为 spring bean,设置系统默认角色为机器人产品专家, 负责处理用户查询并生成回答向量存储配置;

  • 初始化 SimpleVectorStore,加载机器人产品说明书文档,将文档转换为向量形式存储;

SimpleVectorStore 是将向量保存在内存 ConcurrentHashmap 中,Spring AI 提供多种可以存储向量数据的方式,比如 Redis、MongoDB、PG 等,可根据实际情况选择适合的存储方式,这里为了演示先放在内存中。

package com.congge.config;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration
public class RagConfig {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("你将作为一名机器人产品的专家,对于用户的使用需求作出解答").build();}@BeanVectorStore vectorStore(EmbeddingModel embeddingModel) {SimpleVectorStore simpleVectorStore = new SimpleVectorStore(embeddingModel);// 生成一个机器人产品说明书的文档List<Document> documents = List.of(new Document("产品说明书:产品名称:智能机器人\n" +"产品描述:智能机器人是一个智能设备,能够自动完成各种任务。\n" +"功能:\n" +"1. 自动导航:机器人能够自动导航到指定位置。\n" +"2. 自动抓取:机器人能够自动抓取物品。\n" +"3. 自动放置:机器人能够自动放置物品。\n"));simpleVectorStore.add(documents);return simpleVectorStore;}}

提供一个测试接口,参考下面的代码

package com.congge.web;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/rag")
public class RagController {@Autowiredprivate ChatClient chatClient;@Autowiredprivate VectorStore vectorStore;//localhost:8081/rag/chat?message=机器人有哪些功能?@GetMapping(value = "/chat", produces = "text/plain; charset=UTF-8")public String generation(@RequestParam String message) {// 发起聊天请求并处理响应return chatClient.prompt().user(message).advisors(new QuestionAnswerAdvisor(vectorStore)).call().content();}
}

启动工程后,调用下接口做一下测试,可以看到,通过这种方式就能够获取到本地知识库文档的数据

四、写在文末

本文通过较大的篇幅详细介绍了Spring AI核心组件的使用,并通过案例操作展示了其在实际应用中的细节点,希望对看到的同学有用哦,本篇到此结束,感谢观看。

相关文章:

【AI大模型】SpringBoot整合Spring AI 核心组件使用详解

目录 一、前言 二、Spring AI介绍 2.1 Spring AI介绍 2.2 Spring AI主要特点 2.3 Spring AI核心组件 2.4 Spring AI应用场景 2.5 Spring AI优势 2.5.1 与 Spring 生态无缝集成 2.5.2 模块化设计 2.5.3 简化 AI 集成 2.5.4 支持云原生和分布式计算 2.5.5 安全性保障…...

linux-文件操作

在 Linux 系统中&#xff0c;文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建&#xff0c;以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里&#xff0c;cp 命令可用于复制文件或目录&#xff…...

丢失的数字 --- 位运算

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a; 268. 丢失的数字 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码实现 class Solution { public:int missingNumb…...

从Rtos到Linux:学习的策略

这里目的只是为了学习&#xff0c;哪天工作需要用上了能更顺利的上手&#xff0c;写文章的目的是为了记录和便于查询。工作的前两年主要是以mcu裸机为主&#xff0c;目的是压缩资源以最少的ram和flash实现最多的功能&#xff0c;后来五年做的东西越来越复杂的跑的rtos&#xff…...

BUUCTF——Mark loves cat

BUUCTF——Mark loves cat 进入靶场 简单的看了一下功能点 扫一下目录吧 扫目录发现一个.git 下一下源码看看 找到个flag.php和index.php <?php$flag file_get_contents(/flag);再看看index.php&#xff08;代码有点长&#xff0c;所以只留了后面有用的&#xff09; &…...

C/C++滑动窗口算法深度解析与实战指南

C/C滑动窗口算法深度解析与实战指南 引言 滑动窗口算法是解决数组/字符串连续子序列问题的利器&#xff0c;通过动态调整窗口边界&#xff0c;将暴力解法的O(n)时间复杂度优化至O(n)。本文将系统讲解滑动窗口的核心原理、C/C实现技巧及经典应用场景&#xff0c;助您掌握这一高…...

Webug4.0靶场通关笔记15- 第19关文件上传(畸形文件)

目录 第19关 文件上传(畸形文件) 1.打开靶场 2.源码分析 &#xff08;1&#xff09;客户端源码 &#xff08;2&#xff09;服务器源码 3.渗透实战 &#xff08;1&#xff09;构造脚本 &#xff08;2&#xff09;双写绕过 &#xff08;3&#xff09;访问脚本 本文通过《…...

黑马点评大总结

8.2.1 短信登录 首先是用户提交手机号&#xff0c;后端将生成的验证码以及用户信息存入session中&#xff0c;用户登录时进行拦截并从session中拿出来信息校验&#xff0c;并把用户信息存入ThreadLocal中session共享问题&#xff1a;每个tomcat有自己的一份session&#xff0c…...

LeetCode:返回倒数第k个结点

1、题目描述 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 k 2 输出&#xff1a; 4 说明&#xff1a; 给定的 k 保证是有效的。 2、…...

zotero pdf中英翻译插件使用

最近发现一个pdf中英翻译的神器zotero-pdf2zh&#xff0c;按照官方安装教程走一遍的时候&#xff0c;发现一些流程不清楚的问题&#xff0c; 此文就是整理一些安装需要的文件以及遇到的问题&#xff1a; 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具&#xff0…...

Java后端程序员学习前端之CSS

什么是css Cascading Style Sheet 层叠级联样式表 表现 (美化网页) 字体&#xff0c;颜色&#xff0c;边距&#xff0c;高度&#xff0c;宽度&#xff0c;背景图片&#xff0c;网页定位&#xff0c;网页浮动.. 发展史 CSS1.0 CSS2.0 DIV(块)CSS&#xff0c;HTML与CSS结构分离…...

MySQL——数据库基础操作

学习MySQL之前&#xff0c;要先配置好相关环境与软件下载&#xff0c;怎么就不展开了&#xff1a;找找网上对应环境下的教程即可 目录 数据库与MySQL 案例使用 MySQL架构 SQL指令分类 储存引擎 库操作 创建数据库 编码集与校验规则 校验规则的影响 删除数据库 数…...

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

随着低代码平台和大语言模型工具的不断发展,将企业数据与智能交互能力融合,成为提高办公效率与自动化水平的关键一步。明道云作为一款成熟的低代码平台,Dify 则是一个支持自定义工作流的开源 LLM 应用框架。两者结合,可以实现灵活、高效的智能化业务处理。 本文将详解明道…...

湖北理元理律师事务所:规模化债事服务的探索与实践

在个人债务问题日益普遍化的当下&#xff0c;如何通过合法、系统化的服务帮助债务人化解危机&#xff0c;成为法律服务业的重要课题。湖北理元理律师事务所作为经国家司法局批准设立的债事服务机构&#xff0c;其构建的“法律技术金融”服务模式&#xff0c;为债务优化领域提供…...

MySQL JOIN详解:掌握数据关联的核心技能

一、为什么需要JOIN&#xff1f; 在关系型数据库中&#xff0c;数据通常被拆分到不同的表中以提高存储效率。当我们需要从多个表中组合数据时&#xff0c;JOIN操作就成为了最关键的技能。通过本文&#xff0c;您将全面掌握MySQL中7种JOIN操作&#xff0c;并学会如何在实际场景中…...

深入浅出数据库规范化的三大范式

数据库的“成长之路”&#xff1a;从1NF到3NF的规范化进化 在数据库的世界里&#xff0c;关系模式就像一个“孩子”&#xff0c;需要一步步学习“规矩”&#xff0c;才能健康成长。今天&#xff0c;我们就来聊聊数据库的规范化历程——从第一范式&#xff08;1NF&#xff09;出…...

精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析

精益数据分析&#xff08;39/126&#xff09;&#xff1a;SaaS与移动应用商业模式的关键要点剖析 在创业和数据分析的探索之旅中&#xff0c;每一次深入研究不同的商业模式都是一次宝贵的学习机会。今天&#xff0c;依旧怀揣着与大家共同进步的期望&#xff0c;深入解读《精益…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL数据脱敏实战&#xff1a;从模糊处理到动态掩码的全流程解析4.3 数据脱敏与安全&#xff1a;模糊处理与掩码技术深度实践4.3.1 数据脱敏的核心技术体系4.3.1.1 技…...

nginx面试题

nginx 返回状态码413 Nginx 状态码 413 表示“请求实体过大”&#xff08;Request Entity Too Large&#xff09;&#xff0c;意味着客户端发送的请求体大小超过了服务器允许的限制。 解决方法 修改 Nginx 配置文件&#xff1a; 找到 Nginx 配置文件&#xff0c;通常位于 /etc…...

flink rocksdb状态说明

文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…...

Linux | WEB服务器的部署及优化

一. web服务的常用知识 1.1 www www&#xff08;World Wide Web&#xff09;&#xff1a;即为万维网&#xff0c;常被称为“全球信息广播”。它是一种基于超文本和HTTP协议&#xff0c;能够将文字、图形、影像以及声音等多媒体信息&#xff0c;通过超链接的方式组织在一起&…...

Nginx正反向代理与正则表达式

目录 一&#xff1a;正向代理 1.编译安装nginx 2.配置正向代理 二&#xff1a;反向代理 1.配置nginx七层代理 2.配置nginx四层代理 三&#xff1a;nginx 缓存 1.缓存功能的核心原理和缓存类型 2.代理缓存功能设置 四&#xff1a;nginx rewrite 和正则表达式 1.Nginx…...

字节:LLM自动化证明工程基准

&#x1f4d6;标题&#xff1a;APE-Bench I: Towards File-level Automated Proof Engineering of Formal Math Libraries &#x1f310;来源&#xff1a;arXiv, 2504.19110 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM&#xff09;的最新进展在形式定理证明…...

豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理

豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理 上下文理解与记忆:我会分析每一轮用户输入的文本内容,理解其中的语义、意图和关键信息,并将这些信息与之前轮次的对话内容相结合,形成对整个对话上下文的理解和记忆。例如,在一个关于旅游规划的对话中,用户先…...

ADK 第四篇 Runner 执行器

智能体执行器 Runner&#xff0c;负责完成一次用户需求的响应&#xff0c;是ADK中真正让Agent运行起来的引擎&#xff0c;其核心功能和Agents SDK中的Runner类似&#xff0c;具体作用如下&#xff1a; 会话管理&#xff1a;自动读取/写入 SessionService&#xff0c;维护历史信…...

yolo 用roboflow标注的数据集本地训练 kaggle训练 comet使用 训练笔记5

本地训练 8gb内存&#xff0c;机械硬盘用了4分钟训练完了 ........... model torch.hub.load(path/to/yolov5, custom, path./runs/train/exp10/weights/best.pt, sourcelocal) 连不上github kaggel训练 传kaggle了 # Train YOLOv5s on COCO128 for 3 epochs !python train…...

chili3d笔记11 连接yolo python http.server 跨域请求 flask

from ultralytics import YOLO from flask import Flask, request, jsonify from flask_cors import CORS import base64 from io import BytesIO from PIL import Image import json# 加载模型 model YOLO(./yolo_detect/best.pt)app Flask(__name__) CORS(app) # 启用跨域…...

安全为上,在系统威胁建模中使用量化分析

*注&#xff1a;Open FAIR™ 知识体系是一种开放和独立的信息风险分析方法。它为理解、分析和度量信息风险提供了分类和方法。Open FAIR作为领先的风险分析方法论&#xff0c;已得到越来越多的大型组织认可。 在数字化风险与日俱增的今天&#xff0c;企业安全决策正面临双重挑战…...

STA中的multi_cycle 和false_path详细讨论

特殊路径&#xff1a;跨时钟域下的exception_path&#xff1a;分为多种情况优先 1、不同clk_domain ,但频率相同 create_clock -name CLKM -period 10 -waveform {0 5} [get_ports CLKM] create_clock -name CLKP -period 10 -waveform {0 5} [get_ports CLKP] set_multicycl…...

Vite 的工作流程

Vite 的工作流程基于其创新的 “预构建 按需加载” 机制&#xff0c;通过利用现代浏览器对原生 ES 模块的支持&#xff0c;显著提升了开发效率和构建速度。以下是其核心工作流程的详细分析&#xff1a; 一、开发环境工作流程 1. 启动开发服务器 冷启动&#xff1a;通过 npm …...

NGINX 的 ngx_http_auth_jwt_module模块

一、模块概述 ngx_http_auth_jwt_module 模块用于通过验证请求中提供的 JWT 来进行客户端授权。此模块支持 JSON Web 签名&#xff08;JWS&#xff09;、JSON Web 加密&#xff08;JWE&#xff09;以及嵌套 JWT&#xff08;Nested JWT&#xff09;&#xff0c;使其成为一种灵活…...

【Game】Powerful——Transformation Card(10)

文章目录 1 级卡片2 级卡片3 级卡片4 级卡片5 级卡片6 级卡片7 级卡片8 级卡片8.1、神兽8.2、珍兽 9、其他9.1、5 级变身卡9.2、8 级变身卡 10、PK 汇总物理 11、卡片合成 1 级卡片 千变万化等级要求&#xff1a;1 级 金钱龟&#xff0c;防御30⬆ 大耳兔&#xff0c;速度15⬆…...

【算法学习】递归、搜索与回溯算法(一)

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 这个专题与前面的相比是比较有难度的&#xff0c;但是在平时刷题时出现的概率还是非常高的&#xff0c;下面还是按照之前的逻辑来理清一下这几道…...

发行基础:上传版本注意事项

1、steam的规则是上传&#xff0c;提审&#xff0c;随时可更新。 2、基本流程&#xff1a;根据app id以及depot id&#xff0c;上传本地游戏文件到服务器&#xff0c;把分支版本设置为默认&#xff0c;发布。 试玩版与正式版的app id与depot id是相互独立的。 3、理论上开发者…...

智算中心建设方案和前景分析

智算中心建设方案和前景分析 一、智算中心的概念与重要性 1.1 定义与内涵 智算中心&#xff0c;即智能计算中心&#xff0c;是基于最新人工智能理论&#xff0c;采用领先的人工智能计算架构&#xff0c;专门为人工智能应用提供所需的算力服务、数据服务和算法服务的新型基础…...

亚马逊卖家复刻案例:用社群分层策略实现海外用户月均消费3.2次

近年来&#xff0c;随着跨境电商市场的快速发展&#xff0c;全球消费模式经历深刻变革。尤其是在美国、欧洲等成熟市场&#xff0c;中小卖家面对高度市场集中和运营成本上升的双重压力&#xff0c;纷纷寻求以更精细化的用户运营来提高客户复购率&#xff0c;增加单用户价值。20…...

小刚说C语言刷题—1038编程求解数学中的分段函数

1.题目描述 编程求解数学中的分段函数。 …………x1 (当 x>0 )。 yf(x)…0 (当 x0 )。 ………x−1 (当 x<0 )。 上面描述的意思是&#xff1a; 当x>0 时 yx1 ; 当 x0 时 y0 ; 当 x<0 时 yx−1 。 输入 输入一行&#xff0c;只有一个整数x(−30000≤x≤30…...

kotlin 03flow-stateFlow和sharedFlow企业中使用

一 stateFlow和sharedFlow企业中使用 在企业级 Kotlin 项目中&#xff0c;StateFlow 和 SharedFlow 是 状态管理 与 事件分发 的核心工具&#xff0c;尤其在 MVVM 架构中扮演着极为关键的角色。 ✅ 企业中如何使用 StateFlow 和 SharedFlow 场景工具示例UI 状态同步&#xff…...

【机器学习|学习笔记】决策树Decision Tree(DT)的起源、原理、发展、改进和应用(附代码)

【机器学习|学习笔记】决策树Decision Tree&#xff08;DT&#xff09;的起源、原理、发展、改进和应用&#xff08;附代码&#xff09; 【机器学习|学习笔记】决策树Decision Tree&#xff08;DT&#xff09;的起源、原理、发展、改进和应用&#xff08;附代码&#xff09; 文…...

Kotlin-空值和空类型

变量除了能引用一个具体的值之外,还有一种特殊的值,那就是 null, 它代表空值, 也就是不引用任何对象 在Kotlin中, 对空值的处理是非常严格的,正常情况下,我们的变量是不能直接赋值为 null 的,否则无法编译通过, 这直接在编译阶段就避免了空指针问题 Kotlin中所有的类型默认都是…...

Java 企业级开发设计模式全解析

Java 企业级开发设计模式全解析 在 Java 企业级开发的复杂领域中&#xff0c;设计模式如同精湛的工匠工具&#xff0c;能够帮助开发者构建高效、可维护、灵活且健壮的软件系统。它们是无数开发者在长期实践中总结出的解决常见问题的最佳方案&#xff0c;掌握这些模式对于提升开…...

高并发内存池

文章目录 前言一、项目介绍二、内存池介绍1.池化技术2.内存池3.malloc视角下内存的管理 三、定长内存池3.1 设计思路3.2 数据结构 四、高并发内存池整体框架设计4.1 thread cachethreadcache哈希桶映射对齐规则threadcache TLS无锁访问 4.2 central cachecentral cache结构设计…...

常用对称加密算法的Python实现及详解

文章目录 **常用对称加密算法的Python实现及详解****1. 对称加密概述****1.1 对称加密的基本原理****1.2 对称加密的分类****1.3 对称加密的应用** **2. DES&#xff08;Data Encryption Standard&#xff09;****2.1 算法原理****2.2 Python实现****2.3 安全性分析** **3. 3DE…...

ByteArrayInputStream 类详解

ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流&#xff0c;位于 java.io 包。它允许将内存中的字节数组当作输入流来读取&#xff0c;是处理内存数据的常用工具。 1. 核心特性 内存数据源&#xff1a;从字节数组&#xff08;b…...

MySQL C API高效编程:C语言实现数据库操作的深入解析

知识点【MySQL C API】 1、头文件及MYSQL * 句柄 //头文件 #include <mysql/mysql.h>1、MYSQL MYSQL是一个结构体&#xff0c;封装了与数据库连接相关的所有状态&#xff0c;配置和数据。 2、MYSQL *的本质 类似于 FILE*&#xff0c;代表一个与数据库连接的通道&…...

字符串,数组,指针之间的关系

在C语言中&#xff0c;字符串、指针和数组之间有着紧密且复杂的关系&#xff0c;它们在内存存储、操作方式等方面相互关联&#xff0c;以下为你详细介绍&#xff1a; 字符串 定义&#xff1a;字符串是由字符组成的序列&#xff0c;以空字符&#xff08;\0&#xff09;作为结束…...

2025流感疫苗指南+卫健委诊疗方案|高危人群防护+并发症处理 慢性肾脏病饮食指南2025卫健委版|低盐低磷食谱+中医调理+PDF 网盘下载 pdf下载

2025 年卫健委发布的《成人肥胖食养指南&#xff08;2024 年版&#xff09;》为减肥提供了科学的饮食指导。 &#x1f4e2;提示&#xff1a;文章排版原因&#xff0c;资源链接地址放在文章结尾&#x1f447;&#x1f447;&#xff0c;往下翻就行 &#x1f4e2;提示&#xff1…...

学习路线(机器人软件架构)

机器人软件系统架构从入门到专家学习路线 一、基础阶段&#xff08;6-12个月&#xff09;基础知识储备机器人基础概念&#xff1a;编程技能必备语言&#xff1a;工具链&#xff1a; 入门框架推荐资源&#xff1a; 中级阶段&#xff08;1-2年&#xff09;系统架构基础ROS进阶架构…...

Stellaris 群星 [DLC 解锁] CT 表 [Steam] [Windows SteamOS macOS]

Stellaris 群星 [DLC 解锁] & CT 表 [Steam] [Windows & SteamOS & macOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明&#xff1b; DLC 解锁列表&#xff08;仅供参考&#xff09; 《群星》 - Symbols of Domina…...

题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置

题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置 时间限制: 2s 内存限制: 192MB 提交: 673 解决: 130 题目描述 画展策展人小蓝和助理小桥为即将举办的画展准备了 N 幅画作&#xff0c;其艺术价 值分别为 A1, A2, . . . , AN。他们需要从这 N 幅画中挑选 M 幅&#xff0c;并…...