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

【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南

在现代Web开发中,实时通信已经成为许多应用的核心需求。从聊天应用到股票市场更新,从游戏服务器到AI模型通信,各种技术应运而生以满足这些需求。最近,Model Context Protocol (MCP) 引入了一种新的传输机制 —— Streamable HTTP,它为服务器到客户端的实时通信提供了更优雅的解决方案。本文将深入探讨Streamable HTTP相较于Server-Sent Events (SSE)的优势,并通过实际代码示例展示其实现。

实时通信技术的演进

在深入Streamable HTTP之前,我们先简要回顾一下Web实时通信技术的发展历程:

长轮询 (Long Polling)

长轮询是早期使用的一种"黑客"方式,用于在浏览器中通过HTTP实现服务器-客户端消息传递。客户端发送HTTP请求,服务器保持连接开放直到有新数据可用。一旦服务器发送响应,客户端立即发起新的请求。这种方法虽然简单,但效率低下且可能导致消息丢失。

// 长轮询的JavaScript客户端实现
function longPoll() {fetch('http://example.com/poll').then(response => response.json()).then(data => {console.log("接收到数据:", data);longPoll(); // 立即建立新的长轮询请求}).catch(error => {// 10秒后重试setTimeout(longPoll, 10000);});
}
longPoll(); // 启动长轮询

WebSockets

WebSockets提供了一种全双工通信机制,允许在单个长连接上双向传输数据。这项技术克服了HTTP请求-响应周期的开销,非常适合低延迟、高频率更新的场景。

// WebSocket的JavaScript客户端实现
const socket = new WebSocket('ws://example.com');socket.onopen = function(event) {console.log('连接已建立');// 向服务器发送消息socket.send('你好,服务器!');
};socket.onmessage = function(event) {console.log('来自服务器的消息:', event.data);
};

尽管WebSocket API基础使用简单,但在生产环境中处理连接断开、重连和心跳检测等问题是相当复杂的。

Server-Sent Events (SSE)

Server-Sent Events提供了一种标准方式,通过HTTP将服务器更新推送到客户端。与WebSockets不同,SSE专为单向通信(从服务器到客户端)设计,适用于新闻推送、体育比分更新等场景。

// SSE的JavaScript客户端实现
const evtSource = new EventSource("https://example.com/events");// 处理消息事件
evtSource.onmessage = event => {console.log('收到消息: ' + event.data);
};

SSE的优点是自动重连及使用标准HTTP协议,但它存在一些局限性,如:

  • 需要维护长期连接
  • 浏览器限制每个域名最多6个并发连接
  • 在企业环境中可能受到代理和防火墙的限制

Streamable HTTP:新一代实时通信方案

Streamable HTTP是MCP协议在2025年3月引入的一种新传输机制,旨在取代之前的HTTP+SSE传输模式。它的设计理念是在保留SSE优点的同时克服其限制,特别是提供更好的可扩展性和企业环境兼容性。

Streamable HTTP的工作原理

Streamable HTTP的核心思想是提供一个统一的HTTP端点,同时支持POST和GET方法:

  1. POST方法:用于客户端向服务器发送请求和接收响应
  2. GET方法(可选):用于建立SSE流,接收服务器实时推送的消息

与传统HTTP+SSE不同,Streamable HTTP不要求维护单独的初始化连接和消息端点,简化了协议设计并提高了可靠性。

Streamable HTTP相比SSE的五大优势

1. 简化的通信模型

传统的HTTP+SSE方法需要两个不同的端点:一个用于建立连接,另一个用于发送消息。而Streamable HTTP提供了一个统一的端点,简化了客户端和服务器之间的交互。

传统SSE实现(两个端点):

// 服务器端(传统SSE)
router.get("/connect", async (req, res) => {const transport = new SSEServerTransport(POST_ENDPOINT, res);transports[transport.sessionId] = transport;await server.connect(transport);
});router.post(POST_ENDPOINT, async (req, res) => {const sessionId = req.query.sessionId;if (!transports[sessionId]) {res.status(400).send({ message: "无效的会话ID" });return;}await transports[sessionId].handlePostMessage(req, res, req.body);
});

Streamable HTTP实现(单一端点):

// 服务器端(Streamable HTTP)
app.post("/mcp", async (req, res) => {const sessionId = req.headers['mcp-session-id'];if (sessionId && transports[sessionId]) {// 使用现有传输await transports[sessionId].handleRequest(req, res, req.body);return;}if (!sessionId && isInitializeRequest(req.body)) {// 创建新传输const transport = new StreamableHTTPServerTransport({sessionIdGenerator: () => randomUUID(),});await server.connect(transport);await transport.handleRequest(req, res, req.body);const newSessionId = transport.sessionId;if (newSessionId) {transports[newSessionId] = transport;}return;}res.status(400).json({ error: "无效的请求" });
});app.get("/mcp", async (req, res) => {const sessionId = req.headers['mcp-session-id'];if (!sessionId || !transports[sessionId]) {res.status(400).json({ error: "无效的会话ID" });return;}await transports[sessionId].handleRequest(req, res);
});

2. 支持无状态模式

Streamable HTTP的一个重要创新是支持完全无状态操作。通过设置sessionIdGenerator: () => undefined,服务器可以在不维护会话状态的情况下处理请求,非常适合无服务器环境。

// 无状态模式配置
const transport = new StreamableHTTPServerTransport({sessionIdGenerator: () => undefined, // 启用无状态模式
});

这种无状态模式特别适合:

  • 部署在AWS Lambda、Azure Functions等无服务器环境
  • 短暂交互而非长期连接的场景
  • 需要最小化服务器内存使用的应用

3. 更好的可伸缩性

由于Streamable HTTP可以在无状态模式下运行,它非常适合容器化和自动扩展场景。服务器不需要维护长期连接,可以根据请求动态分配资源,显著提高可伸缩性。

这解决了SSE的一个主要问题:当有大量客户端时,每个客户端都需要维持一个长连接,可能导致服务器资源耗尽。使用Streamable HTTP的无状态模式,服务器只在处理请求时分配资源,处理完成后即可释放。

4. 提高的可靠性

Streamable HTTP的简化设计减少了出错机会:

  • 会话管理:在有状态模式下,会话ID通过HTTP头而非查询参数传递,减少安全风险
  • 重连处理:客户端可以在会话有效期内随时重连,无需复杂的重连逻辑
  • 错误恢复:简化的协议使错误处理和恢复更加直观

5. 更好的企业环境兼容性

在企业环境中,代理服务器和防火墙常常会阻止非标准HTTP连接。Streamable HTTP使用标准HTTP通信,大大减少了这类问题:

  • 使用标准HTTP POST和GET,无需特殊配置
  • 不依赖长连接,减少代理超时问题
  • 会话ID通过HTTP头传递,更符合企业安全要求

实现Streamable HTTP的最佳实践

以下是一个实现Streamable HTTP服务器的完整示例,包含了所有最佳实践:

import express from 'express';
import { Request, Response } from 'express';
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import { randomUUID } from 'crypto';// 创建MCP服务器
const server = new Server({name: "streamable-http-demo",version: "1.0.0"
}, {capabilities: {tools: {},logging: {}}
});// 创建Express应用
const app = express();
app.use(express.json());// 会话存储
const transports: { [sessionId: string]: StreamableHTTPServerTransport } = {};// 单一MCP端点
const MCP_ENDPOINT = "/mcp";// 处理POST请求
app.post(MCP_ENDPOINT, async (req: Request, res: Response) => {const sessionId = req.headers['mcp-session-id'] as string | undefined;try {// 1. 重用现有会话if (sessionId && transports[sessionId]) {await transports[sessionId].handleRequest(req, res, req.body);return;}// 2. 创建新会话(初始化请求)if (!sessionId && isInitializeRequest(req.body)) {const transport = new StreamableHTTPServerTransport({sessionIdGenerator: () => randomUUID(),// 无状态模式: sessionIdGenerator: () => undefined});await server.connect(transport);await transport.handleRequest(req, res, req.body);// 存储新会话const newSessionId = transport.sessionId;if (newSessionId) {transports[newSessionId] = transport;console.log(`新会话创建: ${newSessionId}`);}return;}// 3. 处理错误情况res.status(400).json(createErrorResponse("无效的会话ID或请求方法"));} catch (error) {console.error('处理请求出错:', error);res.status(500).json(createErrorResponse("内部服务器错误"));}
});// 处理GET请求(SSE流)
app.get(MCP_ENDPOINT, async (req: Request, res: Response) => {const sessionId = req.headers['mcp-session-id'] as string | undefined;if (!sessionId || !transports[sessionId]) {res.status(400).json(createErrorResponse("无效的会话ID"));return;}try {const transport = transports[sessionId];await transport.handleRequest(req, res);console.log(`SSE流已为会话 ${sessionId} 建立`);} catch (error) {console.error('建立SSE流出错:', error);if (!res.headersSent) {res.status(500).json(createErrorResponse("建立SSE流出错"));}}
});// 辅助函数
function isInitializeRequest(body: any): boolean {return body && body.method === 'initialize';
}function createErrorResponse(message: string): any {return {jsonrpc: '2.0',error: {code: -32000,message: message,},id: null,};
}// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`服务器运行在 http://localhost:${PORT}`);
});

在客户端,使用Streamable HTTP也非常直观:

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { URL } from 'url';async function main() {// 1. 创建客户端const client = new Client({ name: "streamable-http-client", version: "1.0.0" });// 2. 创建传输实例const transport = new StreamableHTTPClientTransport(new URL('http://localhost:3000/mcp'));// 3. 连接到服务器await client.connect(transport);console.log('已连接到服务器');// 4. 设置通知处理transport.onmessage = (message) => {console.log('接收到消息:', message);};// 5. 调用工具示例const result = await client.callTool({name: 'example-tool',arguments: { param: 'value' },});console.log('工具调用结果:', result);
}main().catch(console.error);

处理Streamable HTTP的常见挑战

尽管Streamable HTTP提供了许多优势,但在实际应用中仍需注意一些挑战:

1. 会话管理

在有状态模式下,需要妥善管理会话资源,避免内存泄漏。一个好的实践是设置会话超时机制:

// 会话超时管理
function setupSessionTimeout(sessionId, timeoutMs = 30 * 60 * 1000) {const timeoutId = setTimeout(() => {if (transports[sessionId]) {console.log(`会话 ${sessionId} 已超时,正在清理`);delete transports[sessionId];}}, timeoutMs);// 存储超时ID以便可以取消sessionTimeouts[sessionId] = timeoutId;
}// 在活动时重置超时
function resetSessionTimeout(sessionId) {if (sessionTimeouts[sessionId]) {clearTimeout(sessionTimeouts[sessionId]);setupSessionTimeout(sessionId);}
}

2. 断线重连策略

客户端应实现断线重连策略,特别是在移动网络等不稳定环境中:

class MCPClient {// ...async connectWithRetry(url, maxRetries = 5, delayMs = 1000) {let retries = 0;while (retries < maxRetries) {try {await this.connect(url);console.log('连接成功');return;} catch (error) {retries++;console.log(`连接失败,第 ${retries} 次重试...`);await new Promise(resolve => setTimeout(resolve, delayMs));// 指数退避delayMs *= 1.5;}}throw new Error('连接失败,已达到最大重试次数');}
}

3. 处理未送达事件

当客户端断线重连时,可能会错过服务器发送的事件。一个解决方案是使用事件ID和断点续传:

// 服务器端
app.post("/mcp", async (req, res) => {// ...// 包含最后事件IDconst lastEventId = req.headers['last-event-id'];if (lastEventId && sessionId) {// 发送错过的事件await sendMissedEvents(transport, lastEventId);}
});// 客户端
let lastEventId = null;transport.onmessage = (message) => {if (message.id) {lastEventId = message.id;localStorage.setItem('lastEventId', lastEventId);}
};// 重连时包含最后事件ID
async function reconnect() {lastEventId = localStorage.getItem('lastEventId');const headers = {};if (lastEventId) {headers['last-event-id'] = lastEventId;}transport = new StreamableHTTPClientTransport(url, { headers });await client.connect(transport);
}

结论

Streamable HTTP代表了Web实时通信的一个重要进步,特别适合需要在各种环境中可靠工作的企业应用。与传统SSE相比,它提供了更简化的通信模型、可选的无状态模式、更好的可伸缩性、提高的可靠性以及更好的企业环境兼容性。

随着越来越多的服务采用MCP协议,Streamable HTTP有望成为构建实时通信应用的首选方法,特别是在AI工具集成和企业应用领域。

如果你正在考虑在项目中实现实时通信,Streamable HTTP绝对值得考虑,尤其是当你的应用需要在各种网络环境中可靠运行,或者部署在无服务器环境中时。

参考资料

  1. Model Context Protocol官方规范:https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http
  2. MCP TypeScript SDK:https://github.com/modelcontextprotocol/typescript-sdk
  3. RxDB博客 - WebSockets vs SSE vs 长轮询:https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.html
  4. 使用SSE代替WebSockets的场景:https://blog.csdn.net/adcwa/article/details/146942148
  5. MCP服务器实现示例:https://medium.com/@itsuki.enjoy/mcp-server-and-client-with-sse-the-new-streamable-http-d860850d9d9d

相关文章:

【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南

在现代Web开发中&#xff0c;实时通信已经成为许多应用的核心需求。从聊天应用到股票市场更新&#xff0c;从游戏服务器到AI模型通信&#xff0c;各种技术应运而生以满足这些需求。最近&#xff0c;Model Context Protocol (MCP) 引入了一种新的传输机制 —— Streamable HTTP&…...

CentOS的防火墙工具(firewalld和iptables)的使用

CentOS的防火墙工具因版本不同而异&#xff0c;以下是具体操作步骤&#xff1a; 一、firewalld&#xff08;CentOS 7及以上默认工具&#xff09;‌ ‌1、安装与启动‌&#xff1a; 安装&#xff1a;sudo yum install firewalld 启动服务&#xff1a;sudo systemctl start fir…...

解析小米大模型MiMo:解锁语言模型推理潜力

一、基本介绍 1.1 项目背景 在大型语言模型快速发展的背景下,小米AI团队推出MiMo系列模型,突破性地在7B参数规模上实现卓越推理能力。传统观点认为32B以上模型才能胜任复杂推理任务,而MiMo通过创新的训练范式证明:精心设计的预训练和强化学习策略,可使小模型迸发巨大推理…...

web 自动化之 Selenium 元素定位和浏览器操作

文章目录 一、元素定位的八大方法1、基于 id/name/class/tag_name 定位2、基于 a 标签元素的链接文本定位3、基于xpath定位4、css定位 二、浏览器操作1、信息获取2、 浏览器关闭3、 浏览器控制 一、元素定位的八大方法 web 自动化测试就是通过代码对网页进行测试&#xff0c;在…...

vscode如何使用 GitHub Copilot

1.在vscode中扩展工具栏搜索“copilot”&#xff0c;选择GitHub Copilot安装。 2.使用快捷键CtrlAltI 打开聊天界面&#xff0c;输入问题后回车即可使用。 注意&#xff1a; 使用copilot需要使用GitHub账号先登录&#xff0c;如果打不开登录页面&#xff0c;需要修改host文件&a…...

AWS之存储服务

存储术语 分类 接口/技术类型 应用场景特点 关系及区别 机械硬盘接口 IDE&#xff08;Integrated Drive Electronics&#xff09; 早期用于个人电脑&#xff0c;现已逐渐淘汰 机械硬盘接口、固态硬盘接口是硬盘与主机或其他设备连接的物理和协议规范&#xff1b; FC - …...

安装 Docker

一、CentOS 系统安装 Docker 1. 卸载旧版本&#xff08;如有&#xff09; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2. 安装依赖工具 sudo yum install -y…...

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

在现代网络中&#xff0c;代理服务器是一种常见的工具&#xff0c;用于提高安全性、匿名性和访问速度。常见的代理协议包括HTTP、HTTPS和SOCKS5。本文将详细解析这三种代理协议&#xff0c;并帮助您根据具体需求选择最合适的代理协议。 一、HTTP代理 1.1 特点 用途广泛&…...

用于构建安全AI代理的开源防护系统

大家读完觉得有帮助记得及时关注&#xff01;&#xff01;&#xff01; 大型语言模型&#xff08;LLMs&#xff09;已经从简单的聊天机器人演变为能够执行复杂任务的自主代理&#xff0c;例如编辑生产代码、编排工作流程以及基于不受信任的输入&#xff08;如网页和电子邮件&am…...

CTF-DAY10

[SWPUCTF 2021 新生赛]zipbomb 题目描述&#xff1a; 请注意&#xff0c;不要以任何方式尝试完全解压该文件&#xff0c;运存被塞满后果自负。请尝试分析该文件。 使用WinRAR解压打开 CTFSHOW刷题 crypto11 密文&#xff1a;a8db1d82db78ed452ba0882fb9554fc 提交 flag{明…...

WHAT - react-query(TanStack Query) vs swr 请求

文章目录 react-query什么是 TanStack Query&#xff08;原 React Query&#xff09;核心特性 TanStack Query vs SWR 对比具体特性对比哪个更适合你 总结 react-query react-query&#xff08;现已更名为 TanStack Query&#xff09;和 SWR 一样&#xff0c;都是专注于 远程数…...

WebFlux与HttpStreamable关系解析

1-Streamable 1-WebFlux与HttpStreamable关系解析2-MCP协议Streamable HTTP 2-参考网址 MCP协议Streamable HTTPMCP协议重大升级&#xff0c;Spring AI Alibaba联合Higress发布业界首个Streamable HTTP实现方案 3-WebFlux与HttpStreamable关系解析 WebFlux 和 HttpStreamabl…...

深度学习工程化:基于TensorFlow的模型部署全流程详解

深度学习工程化&#xff1a;基于TensorFlow的模型部署全流程详解 引言 在深度学习项目中&#xff0c;模型训练只是第一步&#xff0c;将模型成功部署到生产环境才是真正创造价值的关键。本文将全面介绍TensorFlow模型从训练到部署的完整工程化流程&#xff0c;涵盖多种部署场…...

RAG技术在测试用例生成中的应用

测试用例中的 RAG 通常指 Retrieval-Augmented Generation&#xff08;检索增强生成&#xff09; 在测试领域的应用&#xff0c;是一种结合检索与生成的技术方法&#xff0c;用于自动化生成或优化测试用例。 ​​核心概念​​ RAG 技术背景&#xff1a; • RAG 最初由 Meta 提出…...

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图)

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图) 代码示下,不再赘述。 动作面板组件:https://nutui-uniapp.netlify.app/components/feedback/actionsheet.html 项目背景 业务需求 描述: uniapp + vue3 + 京东Nut框架:实现登录弹框组…...

在登录页面上添加验证码

这是一个简单的登录页面&#xff0c;里面必须通过验证码通过之后才能够进入页面 创建一个servlet&#xff08;验证码的&#xff09; package qcby.util;import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; im…...

人协同的自动化需求分析

多人协同的自动化需求分析是指通过技术工具和协作流程&#xff0c;让多个参与者&#xff08;如产品经理、开发人员、测试人员等&#xff09;在需求分析阶段高效协作&#xff0c;并借助自动化手段提升需求收集、整理、验证和管理的效率与质量。以下是其核心要点&#xff1a; 1. …...

C++使用PoDoFo库处理PDF文件

&#x1f4da; PoDoFo 简介 PoDoFo 是一个用 C 编写的自由开源库&#xff0c;专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序&#xff0c;比如批量生成、修改、合并、提取元数据、绘图等。 &#x1f31f; 核心特点 特性说明&#x1f4c4; P…...

18.Java 序列化与反序列化

18.Java 序列化与反序列化 概述 在Java中&#xff0c;序列化是将对象的状态信息转换为可以存储或传输的格式的过程&#xff0c;而反序列化则是将这种格式转换回Java对象的过程。 序列化 要使一个对象支持序列化&#xff0c;该对象必须实现java.io.Serializable接口。这个接…...

大语言模型主流架构解析:从 Transformer 到 GPT、BERT

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

flow-matching 之学习matcha-tts cosyvoice

文章目录 matcha 实现cosyvoice 实现chunk_fmchunk_maskcache_attn stream token2wav 关于flow-matching 很好的原理性解释文章&#xff0c; 值得仔细读&#xff0c;多读几遍&#xff0c;关于文章Flow Straight and Fast: Learning to Generate and Transfer Data with Rectifi…...

聊聊自动化办公未来趋势

1. 自动化办公未来趋势 1.1 智能化与AI融合加深 随着人工智能技术的不断成熟&#xff0c;其在自动化办公中的应用将更加广泛和深入。未来&#xff0c;办公软件将具备更强的智能交互能力&#xff0c;能够理解自然语言指令&#xff0c;自动完成复杂的任务&#xff0c;如文档编辑…...

软件工程之需求分析涉及的图与工具

需求分析与规格说明书是一项十分艰巨复杂的工作。用户与分析员之间需要沟通的内容非常的多&#xff0c;在双方交流信息的过程中很容易出现误解或遗漏&#xff0c;也可能存在二义性。如何才能更加准确的表达双方的意思&#xff0c;且清楚明了&#xff0c;绘制各类图形就显得非常…...

火影bug,未保证短时间数据一致性,拿这个例子讲一下Redis

本文只拿这个游戏的bug来举例Redis&#xff0c;如果有不妥的地方&#xff0c;联系我进行删除 描述&#xff1a;今天在高速上打火影&#xff08;有隧道&#xff0c;有时候会卡&#xff09;&#xff0c;发现了个bug&#xff0c;我点了两次-1000的忍玉&#xff08;大概用了1千七百…...

机器人领域和心理学领域 恐怖谷 是什么

机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…...

Hadoop MapReduce 图文代码讲解

一、MapReduce原理 首先要了解一下MapReduce的几个过程&#xff0c;每个数据集中需要编写的逻辑会有所不同&#xff0c;但是大致是差不多的 1、MapReduce大致为这几个过程&#xff1a; 1、读取数据集并根据文件大小128MB拆分成多个map同时进行下面步骤 2、Map: 匹配和数据筛…...

【Rust】结构体

目录 结构体结构体的定义和实例化结构体使用场景方法定义方法多参数方法关联函数多个 impl 块 结构体 结构体&#xff0c;是一个自定义数据类型&#xff0c;允许包装和命名多个相关的值&#xff0c;从而形成一个有意义的组合&#xff0c;类似于 C语言中的结构体或者 Java 中的…...

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备 一、Rust核心特性应用场景开发工具社区与生态 二、Rust 和 Python 比较1. **内存安全与并发编程**2. **性能**3. **零成本抽象**4. **跨平台支持**5. **社区与生态系统**6. **错误处理**7. **安全性**适用场景总结 三、…...

深入理解Embedding Models(嵌入模型):从原理到实战(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、嵌入模型是什么 2、在NLP、推荐系统、知识图谱等领域…...

世界耳机品牌与排名

耳机可以说是日常用的比较多的产品之一&#xff0c;而且现在的耳机相较于传统的耳机还多了很多的功能&#xff0c;比如现在经常开车的人实用的蓝牙耳机&#xff0c;虽然日常用的多&#xff0c;那么你知道全球知名的耳机品牌有哪些吗&#xff1f; 拜亚耳机&#xff0c;德国品牌&…...

防静电地板人工费多少钱一平方米?2025年报价解析!

在机房、实验室、数据中心等专业场所&#xff0c;防静电地板是保障设备正常运行的关键“防线”。但很多人在装修时&#xff0c;面对“防静电地板安装人工费”的报价往往一头雾水——有的报25元/㎡&#xff0c;有的却要50元/㎡&#xff0c;差价背后究竟藏着什么门道&#xff1f;…...

【详细图文】使用MobaXterm的SSH功能远程连接服务器,并创建pytorch环境,使用yolov8训练数据集

目录 一、使用MobaXterm连接服务器 1、官网下载MobaXterm 2、SSH连接服务器 二、查看服务器的基本信息 1、查看服务器基本信息(可选) (1)查看主机名和系统版本 (2)查看CPU信息 (3)查看内存信息 (4)查看网卡信息 (5)查看总进程数 (6)查看活动进程数 (…...

路由器断流排查终极指南:从Ping测试到Wireshark抓包5步定位法

测试路由器是否出现“断流”&#xff08;网络连接间歇性中断&#xff09;&#xff0c;需通过多维度排查硬件、软件及外部干扰因素。以下是详细步骤指南&#xff1a; 一、基础环境准备 设备连接 有线测试&#xff1a;用网线将电脑直接连接路由器LAN口&#xff0c;排除WiFi干扰。…...

小白借助ai对全栈进行浅浅理解(学习笔记)-Lambda、Optional 避免空指针与新的日期时间 API

学习顺序&#xff1a;Java 基础 → Spring Boot → Vue → 前后端整合 → 数据库 → 部署 → 进阶实战。 Lambda 表达式&#xff08;Lambda 表达式是 Java 8 引入的核心特性&#xff0c;旨在简化函数式编程&#xff0c;替代冗长的匿名内部类&#xff0c;使代码更简洁、灵活 &am…...

可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse

可观测性&#xff08;Observability&#xff09;是指通过系统的外部输出数据&#xff0c;推断其内部状态的能力。可观测性平台通过采集、存储、可视化分析三大可观测性数据&#xff1a;日志&#xff08;Logging&#xff09;、链路追踪&#xff08;Tracing&#xff09;和指标&am…...

100个常用的DeepSeek指令

日常生活类&#xff08;20个&#xff09; 1. 新闻解读&#xff1a;请为我解读今天的热点新闻。 2. 天气查询&#xff1a;请查询……的天气并推荐着装。 3. 旅行攻略&#xff1a;请制定前往……的旅行攻略。 4. 菜谱生成&#xff1a;请生成……菜的具体做法。 5. 解决方案&…...

【C语言】--指针超详解(二)

目录 一.const修饰指针 1.1--const修饰变量 1.2--const修饰指针变量 二.野指针 2.1--野指针成因 2.1.1--指针未初始化 2.1.2--指针越界访问 2.1.3-- 指针指向的空间释放 2.2--如何规避野指针 2.2.1--指针初始化 2.2.2--小心指针越界 2.2.3--指针变量不再使用时&am…...

git 多个提交记录合并为一个

1.场景 有时候用devops等平台测试问题&#xff0c;需要多次修改小的记录提交&#xff0c;但是最终我们在合并主干的时候不想留那么多乱七八糟的记录&#xff0c;就需要在此分支合并这些提交记录&#xff0c;再合并到主干。 2.交互式变基 2.1 确定要合并的提交范围 # 查看最近…...

AI视频生成的艺术:镜头语言

前言 AI视频生成技术正逐渐改变我们创作和消费视频内容的方式,各式各样的AI视频制作软件正在不断的涌现,比如可灵、即梦、runway等。虽然AI视频生成的交互方式(自然语言)极大的减少了我们创作视频的门槛,但要让AI正确理解并创造出符合我们期望的视频,我们可能还是需要了解…...

机器学习与深度学习

目录 一、机器学习 &#xff08;一&#xff09;机器学习的分类 1. 监督学习 2. 无监督学习 3. 强化学习 &#xff08;二&#xff09;机器学习的应用场景 二、深度学习 &#xff08;一&#xff09;深度学习的核心原理 &#xff08;二&#xff09;常见的深度学习模型 …...

数字孪生市场格局生变:中国2025年规模214亿,工业制造领域占比超40%

一、技术深度解析&#xff1a;数字孪生的核心技术栈与演进 1. 从镜像到自治&#xff1a;数字孪生技术架构跃迁 三维重建突破&#xff1a;LiDAR点云精度达2cm&#xff0c;无人机测深刷新频率5Hz&#xff0c;支撑杭州城市大脑内涝预警模型提前6小时预测。AI算法融合&#xff1a…...

数字孪生[IOC]常用10个技术栈(总括)

1. 什么是数字孪生&#xff1f; 数字孪生&#xff08;Digital Twin&#xff09; 是通过数字化技术对物理实体&#xff08;如设备、系统或环境&#xff09;进行高精度建模和实时映射的虚拟副本。其核心是通过 数据驱动 实现物理世界与虚拟世界的双向交互&#xff0c;支持实时监控…...

WPF主窗体子窗体关联方法

步骤&#xff1a; 1、创建WPF项目 2、设计主窗体&#xff0c;选定显示子窗体的区域&#xff08;MainWindow.xaml) 3、在想要显示子窗体的区域填写如下代码&#xff08;MainWindow.xaml) 4、创建子窗体 5、建立调用子窗体事件&#xff0c;下图一是load事件&#xff0c;也可以是…...

笔记本电脑实现网线内网 + Wi-Fi外网同时使用的配置方案

1、同时连接两个网络‌ 插入网线连接内网&#xff0c;确保内网IP地址正常获取&#xff08;如10.143.88.x&#xff09;&#xff1b;连接Wi-Fi接入外网&#xff0c;确认可正常访问互联网&#xff08;如网关为192.168.8.1&#xff09;。 2、 记录关键网络参数‌ 内网网关&#…...

探讨关于智能体(Agent)结合 Dify、大语言模型(LLM)以及 Qwen-3 模型的项目或概念

1. Dify 的作用 Dify 是一个开源的 AI 框架&#xff0c;它可以帮助开发者快速搭建和部署 AI 应用。它可以作为一个基础架构&#xff0c;为智能体提供以下支持&#xff1a; 应用开发与部署&#xff1a;Dify 可以帮助开发者快速搭建智能体的前端和后端架构&#xff0c;包括用户界…...

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…...

【electron+vue】常见功能之——调用打开/关闭系统软键盘,解决打包后键盘无法关闭问题

效果图展示 实现思路&#xff1a;通过input标签聚焦失焦的方式&#xff0c;实现系统软键盘的显示隐藏。 使用场景&#xff1a;一体机电脑&#xff0c;无外接键盘。 html <el-input v-model"idNumber" placeholder"请输入" focus"showKeyboard&qu…...

告别手动输入密码:基于SSHPass的自动化文件传输实践告别手动输入密码:基于SSHPass的自动化文件传输实践

一、运维人员的共同痛点 在日常运维工作中&#xff0c;我们经常需要在多台服务器之间传输文件。传统的手动操作方式需要反复执行以下步骤&#xff1a; 输入scp命令等待密码提示输入复杂密码确认传输结果手动修改文件权限 这种重复劳动不仅效率低下&#xff0c;在批量操作时更…...

Python序列Day3

序列 序列是一种数据存储方式&#xff0c;用方括号标注&#xff0c;逗号分隔的一组值。在内存中&#xff0c;序列就是一块用来存放多个值的连续的内存空间。 常见序列结构有&#xff1a;字符串、列表、元组、字典、集合 列表 用于存储任意数目&#xff0c;任意类型的数据集…...

22、近端策略优化算法(PPO)论文笔记

近端策略优化算法&#xff08;PPO&#xff09;论文笔记 一、研究背景与目标二、**方法****3.1 策略梯度基础****3.2 信任区域方法&#xff08;TRPO&#xff09;****3.3 剪切代理目标函数&#xff08;LCLIP&#xff09;****3.4 自适应KL惩罚系数****3.5 算法实现** 三、 L CLIP…...