基于 Spring AI 的 MCP 客户端/服务端实现

        模型上下文协议(MCP)由Anthropic开源的开放协议,为AI模型与外部数据/工具提供了“标准化桥梁”,通过统一的接口规范,使模型能够动态调用本地文件、数据库、API等资源,实现“上下文感知”的智能交互。MCP的核心价值在于:

  • 标准化集成:告别“一对一”定制开发,通过协议对接即可连接任意兼容MCP的数据源或工具,大幅降低生态构建成本。

  • 安全与灵活性:支持本地部署,数据无需离境,兼顾隐私合规与实时访问需求。

  • 智能体赋能:为AI Agent提供“手脚”,使其能自主执行查询、分析、操作等复杂任务流。

        在 MCP)​的上下文中,STDIO 和 SSE 是两种不同的通信方式,用于实现客户端(如开发工具、IDE 等)与服务器(如语言模型、知识库服务等)之间的交互。

  STDIO 是指通过标准输入(stdin)和标准输出(stdout)进行通信的方式。这是一种常见的进程间通信(IPC)机制,通常用于本地运行的 MCP 服务器与客户端之间的交互。一般用于本地开发工具集成

  SSE(Server-Sent Events)是一种基于 HTTP 的服务器推送技术,用于实现服务器主动向客户端推送数据的通信方式。与 STDIO 不同,SSE 是一种网络通信机制,适用于客户端和服务器分布在不同机器上的场景。

     Spring AI作为Java生态中领先的AI开发框架,通过深度集成MCP协议,为开发者提供了企业级解决方案:其模块化架构、对同步/异步通信的支持、以及与Spring Boot的无缝融合,使得构建本地MCP客户端与服务端变得高效且可靠。无论是快速搭建文件系统的本地数据中台,还是构建与业务系统(如CRM、ERP)的实时联动,Spring AI的声明式配置、注解驱动开发模式极大降低了技术门槛。

代码(SSE模式)

mcp server

创建项目mcp-server,依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sqz</groupId><artifactId>mcp-server</artifactId><version>0.0.1-SNAPSHOT</version><name>mcp-server</name><description>mcp-server</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>21</java.version></properties><dependencies><!-- 只支持 STDIO 传输,使用如下两个依赖 --><!--        <dependency>--><!--            <groupId>org.springframework.ai</groupId>--><!--            <artifactId>spring-ai-starter-mcp-server</artifactId>--><!--        </dependency>--><!--        <dependency>--><!--            <groupId>org.springframework</groupId>--><!--            <artifactId>spring-web</artifactId>--><!--        </dependency>--><!-- 支持 SSE 传输,使用如下依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20210307</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><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><repository><id>aliyunmaven</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

 定义一个查询天气的工具:

package com.sqz.mcpserver.weather;import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;@Service
@Slf4j
public class WeatherService {private static final String BASE_URL = "http://api.openweathermap.org/data/2.5/weather";@Value("${OPEN_WEATHER_API_KEY}")private String OPEN_WEATHER_API_KEY;public RestTemplate restTemplate = new RestTemplate();@Tool(description = "获取指定城市的当前天气情况,返回格式化后的天气报告")public String getWeather(@ToolParam(description = "城市名称必须是英文,例如:London 或者 Beijing") String city) throws UnsupportedEncodingException {log.info("====调用了查询天气=====");String query = String.format("?q=%s&APPID=%s&units=metric&lang=zh_cn",URLEncoder.encode(city, "UTF-8"),URLEncoder.encode(OPEN_WEATHER_API_KEY, "UTF-8"));ResponseEntity<String> responseEntity = restTemplate.getForEntity(BASE_URL + query, String.class);if (responseEntity.getStatusCode().is2xxSuccessful()) {String body = responseEntity.getBody();JSONObject data = new JSONObject(body);JSONObject main = data.getJSONObject("main");JSONArray weatherArray = data.getJSONArray("weather");JSONObject weather = weatherArray.getJSONObject(0);JSONObject wind = data.getJSONObject("wind");String weatherDescription = weather.optString("description", "无描述");double temperature = main.optDouble("temp", Double.NaN);double feelsLike = main.optDouble("feels_like", Double.NaN);double tempMin = main.optDouble("temp_min", Double.NaN);double tempMax = main.optDouble("temp_max", Double.NaN);int pressure = main.optInt("pressure", 0);int humidity = main.optInt("humidity", 0);double windSpeed = wind.optDouble("speed", Double.NaN);return String.format("""城市: %s 天气描述: %s 当前温度: %.1f°C 体感温度: %.1f°C 最低温度: %.1f°C 最高温度: %.1f°C 气压: %d hPa 湿度: %d%% 风速: %.1f m/s """, data.optString("name", city),weatherDescription,temperature,feelsLike,tempMin,tempMax,pressure,humidity,windSpeed);}return null;}}

在启动类里面注册工具:

package com.sqz.mcpserver;import com.sqz.mcpserver.weather.WeatherService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.config.EnableWebFlux;@SpringBootApplication
@EnableWebFlux
public class McpServerApplication {public static void main(String[] args) {SpringApplication.run(McpServerApplication.class, args);}@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}

配置文件:

spring.application.name=mcp-server
#指定 MCP 服务器的名称为 spring-ai-mcp-weather
spring.ai.mcp.server.name=spring-ai-mcp-weather#配置应用监听的端口为 8081
server.port=8081#禁用 Spring Boot 启动时的横幅(Banner)显示,对于使用 STDIO 传输的 MCP 服务器,禁用横幅有助于避免输出干扰。
spring.main.banner-mode=off#如下参数启用并设置为空,将禁用控制台日志输出格式,减少输出干扰
logging.pattern.console=#配置日志文件的输出路径,将日志写入指定的文件中
logging.file.name=D:/java-workspace/ai-learning-java-repository/mcp-server/mcp-weather-stdio-server.log#访问 OpenWeather API 的密钥,自己获取每天可免费调用100次
OPEN_WEATHER_API_KEY=#设置日志的根级别为 INFO
logging.level.root=INFO

mcp client

创建项目mcp-server,依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sqz</groupId><artifactId>mcp-client</artifactId><version>0.0.1-SNAPSHOT</version><name>mcp-client</name><description>mcp-client</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><!-- 导入 Spring AI - Anthropic 依赖--><!--        <dependency>--><!--            <groupId>org.springframework.ai</groupId>--><!--            <artifactId>spring-ai-starter-model-anthropic</artifactId>--><!--        </dependency>--><!-- 导入 Spring AI - OpenAI 依赖--><!--        <dependency>--><!--            <groupId>org.springframework.ai</groupId>--><!--            <artifactId>spring-ai-starter-model-openai</artifactId>--><!--        </dependency>--><!-- 导入Spring AI Alibaba - 通义千问依赖 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M6.1</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

使用CommandLineRunner启动聊天机器人,代码:

package com.sqz.mcpclient;import io.modelcontextprotocol.client.McpSyncClient;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;import java.util.List;
import java.util.Scanner;@SpringBootApplication
public class McpClientApplication {public static void main(String[] args) {SpringApplication.run(McpClientApplication.class, args);}/*** 启动聊天机器人* CommandLineRunner 是 Spring Boot 提供的一个接口,用于在应用程序启动完成后执行一些初始化任务或自定义逻辑。它非常适合用于演示、测试或预加载数据等场景。* 当 Spring Boot 应用程序启动时,它会扫描应用程序中的 CommandLineRunner 实现类,并按照它们的顺序执行它们的 run 方法。* 这样,你可以在应用程序启动时执行一些初始化操作,而不需要在代码中显式地调用这些操作。* 例如,你可以使用 CommandLineRunner 来加载数据库数据、预加载缓存、执行一些一次性任务等。* 这使得应用程序的启动过程更加简洁和可维护,同时也方便了测试和调试。* @param chatClientBuilder 用于构建聊天客户端的构建器**/@Beanpublic CommandLineRunner chatbot(ChatClient.Builder chatClientBuilder, List<McpSyncClient> mcpSyncClients) {return args -> {// 构建聊天客户端ChatClient chatClient = chatClientBuilder//设置系统提示,引导 AI 的行为和角色.defaultSystem("你是一个可以查询天气的助手,可以调用工具回答用户关于天气相关问题。")//配置工具回调提供者,使 AI 能调用外部工具.defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients))//设置对话记忆,使用内存存储对话历史,保持上下文.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).build();// 开始聊天循环System.out.println("\n我是你的AI助手。\n");try (Scanner scanner = new Scanner(System.in)) {while (true) {System.out.print("\n用户: ");String content = scanner.nextLine();System.out.println("\n助手: " +chatClient.prompt(content) // chatClient.prompt(...):将用户输入作为提示发送给 LLM.call().content());//.call().content():调用 LLM 模型并获取响应内容}}};}}

配置:

spring.application.name=mcp-client#指定应用类型为非 Web 应用,适用于命令行工具、批处理任务或仅作为客户端运行的场景
spring.main.web-application-type=none#使用 Claude LLM,需要在pom.xml中引入对应依赖
#spring.ai.anthropic.api-key=your_anthropic_api_key
#spring.ai.anthropic.chat.options.model=claude-3-haiku-20240307#使用 Deepseek LLM,需要在pom.xml中引入对应依赖
#spring.ai.openai.api-key=your_deepseek_api_key
#spring.ai.openai.base-url=https://api.deepseek.com
#spring.ai.openai.chat.options.model=deepseek-chat#使用 通义千问 LLM,需要在pom.xml中引入对应依赖
spring.ai.dashscope.api-key=sk-d7805feb808941c8a929b96414725274
spring.ai.dashscope.chat.options.model=qwen-plus#STDIO 模式,指定 MCP 客户端的服务器配置文件路径
#spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json#SSE 模式,配置名为 server1 的 MCP 服务器连接,远程连接到指定的服务器地址
spring.ai.mcp.client.sse.connections.server1=http://localhost:8081

启动server再启动client,在控制台输入指令测试:

STDIO模式

在mcp-client项目执行打包mvn clean package -DskipTests,然后在resources下面新建文件mcp-servers-config.json:

{"mcpServers": {"spring-ai-mcp-weather": {
#java命令注意版本及以上"command": "C:\\Program Files\\Java\\jdk-21\\bin\\java.exe","args": ["-Dspring.ai.mcp.server.transport=STDIO","-jar",
#自己serverjar包"D:\\java-workspace\\ai-learning-java-repository\\mcp-server\\target\\mcp-server-0.0.1-SNAPSHOT.jar"]}}
}

修改mcp-client配置文件:

#指定应用类型为非 Web 应用,适用于命令行工具、批处理任务或仅作为客户端运行的场景
spring.main.web-application-type=none#使用 Claude LLM,需要在pom.xml中引入对应依赖
#spring.ai.anthropic.api-key=your_anthropic_api_key
#spring.ai.anthropic.chat.options.model=claude-3-haiku-20240307#使用 Deepseek LLM,需要在pom.xml中引入对应依赖
#spring.ai.openai.api-key=your_deepseek_api_key
#spring.ai.openai.base-url=https://api.deepseek.com
#spring.ai.openai.chat.options.model=deepseek-chat#使用 通义千问 LLM,需要在pom.xml中引入对应依赖
spring.ai.dashscope.api-key=sk-d7805feb808941c8a929b96414725274
spring.ai.dashscope.chat.options.model=qwen-plus#STDIO 模式,指定 MCP 客户端的服务器配置文件路径
spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json#SSE 模式,配置名为 server1 的 MCP 服务器连接,远程连接到指定的服务器地址
#spring.ai.mcp.client.sse.connections.server1=http://localhost:8081

修改mcp-server依赖:

 <!-- 只支持 STDIO 传输,使用如下两个依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><!-- 支持 SSE 传输,使用如下依赖 --><!--       <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency>-->

mcp-server启动类去掉webflux:

package com.sqz.mcpserver;import com.sqz.mcpserver.weather.WeatherService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class McpServerApplication {public static void main(String[] args) {SpringApplication.run(McpServerApplication.class, args);}@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}

不用启动mc-server,直接启动mcp-client,mcp-client会自动启动mcp-server测试如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习打卡day50

DAY 50 预训练模型CBAM模块 知识点回顾&#xff1a; resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps&#xff1a;今日的代码训练时长较长&#xff0c;3080ti大概需要40min的训练时长 作业&#xff1a; 好好理解下resnet18的模型结构尝试…

54、错误处理-【源码流程】异常处理流程

54、错误处理-【源码流程】异常处理流程 #### 异常处理流程概述 1. **执行目标方法**&#xff1a; - 程序执行目标方法&#xff0c;期间若发生异常&#xff0c;会被捕获并记录&#xff0c;标志当前请求结束。 - 将异常信息赋值给 dispatchException 变量。 2. **进入视图解析…

使用 VSCode 开发 FastAPI 项目(1)

一、引言 FastAPI 是一款现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;使用 Python 3.7 及更高版本。它基于标准 Python 类型提示&#xff0c;具有自动生成文档等出色功能。而 VSCode 凭借其轻量、强大的特性&#xff0c;为开发者…

Bash 脚本中的特殊变量

在 Bash 脚本和命令行中&#xff0c;​特殊变量​&#xff08;Special Variables&#xff09;主要用于获取脚本或命令的上下文信息&#xff0c;如参数、进程状态、返回值等。以下是常见的特殊变量及其典型应用场景&#xff1a; ​1. 脚本参数处理​ $0、$1、$2 ... $9、${10}.…

免部署的数字人 API 调用教程:基于 wav2lip模型训练的开放API,附 PHP 代码示例

前言 去年我开始研究数字人模型算法&#xff0c;测试了市面上几乎所有开源数字人模型&#xff0c;过程中踩了不少坑。最大的痛点就是训练太烧显卡了&#xff0c;光租显卡的费用就花了我6个月的薪资&#xff0c;每次看到账单都心疼。不过现在终于把基于wav2lip的数字人API做出来…

力扣HOT100之贪心算法:45. 跳跃游戏 II

这道题刷代码随想录的时候也刷过&#xff0c;本来以为有了上一题55.跳跃游戏的基础&#xff0c;这道题会好做一点&#xff0c;但是依旧想不出来思路&#xff0c;回去看了下自己当时写的博客&#xff0c;没想到今天的感受和当时的感受都一模一样。。。What can I say?看了下代码…

使用Docker申请Let‘s Encrypt证书

1、安装Docker # 安装Docker https://docs.docker.com/get-docker/# 安装Docker Compose https://docs.docker.com/compose/install/# CentOS安装Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA 2、申请Lets Encrypt证书 详见&#xff1a; https://docs.linuxse…

算法题(167):FBI树

审题&#xff1a; 本题需要我们将字符串按照题目要求进行递归展开&#xff0c;并按照后序遍历的顺序输出 思路&#xff1a; 方法一&#xff1a;递归 首先我们需要模拟一下题目的意思 其实就是第一步判断属于什么字符&#xff0c;然后将字符串分两半进行下一轮判断。而由于题目要…

从“分散开发”到“智能协同” —— Gitee 如何赋能河南农担构建金融级研发体系?

河南省农业信贷担保有限责任公司&#xff08;以下简称「河南农担」&#xff09;成立于 2016 年&#xff0c;是河南省属骨干国有企业&#xff0c;承担破解“三农”融资难题的重要职责。截至 2024 年底&#xff0c;河南农担累计实现担保规模 1037.05 亿元&#xff0c;位居全国农担…

青少年编程与数学 01-011 系统软件简介 14 Foxpro数据库

青少年编程与数学 01-011 系统软件简介 14 Foxpro数据库 一、历史沿革二、技术架构三、主要功能四、应用场景五、产品版本六、使用方法七、技术价值八、历史意义全文总结 **摘要&#xff1a;**FoxPro 是一款经典的桌面数据库管理系统&#xff0c;起源于 1984 年的 FoxBASE&…

android studio向左向右滑动页面

本文演示了Android Studio中使用ViewPager实现页面切换的方法。通过创建包含3个页面的ViewPager示例&#xff0c;详细展示了实现步骤&#xff1a;1)在XML布局中配置ViewPager和切换按钮&#xff1b;2)使用LayoutInflater动态加载页面布局&#xff1b;3)自定义SimplePagerAdapte…

数据可视化新姿势:Altair的声明式魔法

文章目录 一、告别编程式绘图的苦日子二、5分钟极速入门安装篇&#xff08;记得先备好虚拟环境&#xff01;&#xff09;核心三剑客 三、高阶玩法揭秘1. 交互功能秒实现2. 复合图表so easy3. 魔改样式有套路 四、避坑指南&#xff08;血泪经验&#xff09;五、Altair vs 其他库…

PostgreSQL --数据库操作

一、基本操作 1、登录 #切换pg用户 su - postgres#重启服务 pg_ctl -D /usr/local/pgsql/data -l logfile restart#进入pg psql2、数据库操作 2.1、列出库 \l\lselect datname from database; \l&#xff1a;输出比\l多了Size,Tablespace 和 Description 列 &#xff1a;扩展输…

树莓派超全系列教程文档--(63)rpicam-apps可用选项介绍之常用选项

rpicam-apps可用选项介绍之常用选项 rpicam-apps 选项参考常用选项helpversionlist-camerascameraconfigtimeoutpreviewfullscreenqt-previewnopreviewinfo-textwidth 和 heightviewfinder-width 和 viewfinder-heightmode打包格式详细信息解压格式详细信息 viewfinder-modelor…

AI的发展过程:深度学习中的自然语言处理(NLP);大语言模型(LLM)详解;Transformer 模型结构详解;大模型三要素:T-P-G 原则

AI的发展过程&#xff1a;深度学习中的自然语言处理&#xff08;NLP&#xff09;&#xff1b;大语言模型&#xff08;LLM&#xff09;详解&#xff1b;Transformer 模型结构详解&#xff1b;大模型三要素&#xff1a;T-P-G 原则 AI的发展过程与大模型原理详解一、AI的发展过程符…

SDXL 和 SDXL-Turbo 的区别

(1) SDXL&#xff08;Stable Diffusion XL&#xff09; 标准扩散模型&#xff0c;基于传统的多步去噪&#xff08;通常 20~50 步&#xff09;。 训练充分&#xff0c;特征更稳定&#xff0c;适合用于特征提取、方向学习&#xff08;如 LoRA、SAE&#xff09;。 计算成本高&am…

PyTorch:让深度学习像搭积木一样简单!!!

文章目录 &#x1f680; 一、 PyTorch的王炸&#xff1a;动态图 vs 静态图静态图的“痛苦回忆”&#xff08;前方高能吐槽&#xff01;&#xff09;PyTorch动态图的降维打击&#x1f525; &#x1f525; 二、 不只是灵活&#xff01;PyTorch的三大杀器1. 张量&#xff08;Tenso…

LeetCode--27.移除元素

解题思路&#xff1a; 1.获取信息&#xff1a; 给定一个数组和一个值&#xff0c;删除数组中等于这个值的值 要求是&#xff0c;返回数组中不等于这个值的数的数目 并且要求在数组上删除&#xff0c;不能使用额外辅助空间 还是给了评测标准&#xff08;你可以根据它的原理来实现…

WebRTC(二):工作机制

核心组成 GetUserMedia&#xff1a;获取本地音视频设备&#xff08;摄像头、麦克风&#xff09;数据流。RTCPeerConnection&#xff1a;实现点对点的媒体流传输和网络连接管理。RTCDataChannel&#xff1a;点对点的任意数据通道&#xff08;除音视频外传输数据&#xff09;。 …