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

大模型MCP更高效的通信:StreamableHTTP协议

随着大语言模型(LLMs)的飞速发展,模型与应用之间的通信效率和灵活性变得至关重要。Model Context Protocol (MCP) 作为专为模型交互设计的协议,一直在不断进化以满足日益增长的需求。近期,MCP引入了一个令人振奋的新特性——StreamableHTTP 通信协议。这一特性旨在提供一种更高效、更通用、更易于集成的方式来实现模型服务器与客户端之间的流式数据交换。

1. MCP 新特性概览:StreamableHTTP 成为焦点

传统的 MCP 通信方式(如 stdio)在某些场景下表现出色,尤其是在本地进程间通信。然而,随着模型服务的分布式部署、云原生架构的普及以及对 Web 友好性的追求,stdio 的局限性逐渐显现。

StreamableHTTP 的引入,为 MCP 带来了以下关键优势:

  • Web 友好性:基于 HTTP/1.1 Chunked Transfer Encoding 或 HTTP/2 Streams,天然兼容现有的 Web 基础设施,如反向代理、负载均衡器、防火墙等。
  • 标准化与通用性:HTTP 是应用最广泛的协议之一,开发者对此非常熟悉,降低了学习和集成成本。
  • 双向流式处理:支持高效的双向流,这对于需要持续交换上下文或进行多轮对话的大模型应用至关重要。
  • 持久连接:通过单个 HTTP 连接处理多个 MCP 请求和响应流,减少了连接建立的开销。
  • 元数据处理:HTTP Headers 可以方便地携带元数据,简化了认证、路由等机制的实现。

可以预见,StreamableHTTP 将成为 MCP 在分布式环境中部署和应用的首选传输方式。

2. 为什么选择 StreamableHTTP?与 stdio、SSE 的对比

在深入 StreamableHTTP 实现之前,我们有必要理解为什么需要一种新的通信方式,以及它与现有方案(如 stdio 和 Server-Sent Events (SSE))相比有何优势。

  • MCP over stdio (mcp://stdio)

    • 优点:简单直接,适用于本地父子进程通信,延迟低。例如,一个应用直接启动并管理一个本地模型进程。
    • 缺点
      • 非网络化:不适用于分布式系统或远程模型调用。
      • 扩展性差:难以实现负载均衡和水平扩展。
      • 单连接限制:通常一个 stdio 通道对应一个模型实例的完整生命周期。
  • Server-Sent Events (SSE)

    • 优点
      • 基于 HTTP,Web 友好。
      • 实现简单,用于服务器向客户端单向推送事件流。
    • 缺点
      • 单向性:SSE 主要设计为服务器到客户端的单向流。虽然客户端可以通过独立的 HTTP 请求发送数据给服务器,但这并非原生的双向流,也无法在同一连接上高效处理客户端流式输入。
      • 不完全适合 MCP 场景:MCP 通常需要双向流式交互,客户端可能流式发送输入(例如,长文档分块处理),服务器同时流式返回结果。SSE 在此方面能力有限。
      • 元数据处理相对局限:虽然可以通过事件数据本身携带,但不如 HTTP Headers 灵活。
  • StreamableHTTP for MCP (mcp://httpmcp://https)

    • 核心机制:利用 HTTP/1.1 的 Transfer-Encoding: chunked 或 HTTP/2 的 Streams 特性,在单个持久 HTTP 连接上实现双向、任意长度的数据流传输。
    • 优点
      • 双向流:完美支持客户端到服务器、服务器到客户端的并发流数据。
      • Web 基础设施兼容:轻松集成到现有网络架构中,如 API 网关、Service Mesh 等。
      • 标准化:开发者熟悉 HTTP,有大量现成的库和工具支持。
      • 元数据与控制:HTTP Headers 提供了丰富的元数据传递机制,方便实现认证、内容协商、错误处理等。
      • 高性能,多路复用 (HTTP/2):HTTP/2 进一步支持在单个连接上并发处理多个请求和响应流,效率更高。
      • 持久连接:减少了为每个 MCP 会话建立新 TCP 连接的开销。

对比总结:

特性MCP over stdioServer-Sent Events (SSE)StreamableHTTP for MCP
方向性双向(本地)单向(服务器 -> 客户端)双向
网络化
Web 兼容
基础设施不适用标准 Web 服务器标准 Web 服务器/代理
持久连接进程生命周期是 (但常用于单向推送)是 (为双向流优化)
元数据有限 (依赖协议本身)有限 (事件内数据)丰富 (HTTP Headers)
适用场景本地模型集成实时通知、简单数据流分布式模型服务、复杂交互

显然,StreamableHTTP 通过结合 HTTP 的强大功能和流式处理的效率,为 MCP 提供了一个更现代化、更通用的解决方案,特别适合构建可扩展、高性能的大模型应用。

3. 实战:构建基于 StreamableHTTP 的 MCP 应用

接下来,我们将通过具体的 Python 代码示例,演示如何搭建一个简单的 MCP 服务器和客户端,它们之间通过 StreamableHTTP 进行通信。

3.1 环境准备

首先,确保您有一个 Python 环境 (推荐 Python 3.8+)。我们将使用虚拟环境来管理依赖:

python -m venv mcp_env
# Windows
# mcp_env\Scripts\activate
# macOS/Linux
source mcp_env/bin/activate

3.2 安装依赖

pip install "mcp"
pip install aiohttp uvicorn

3.3 MCP Server 端实现 (echo_server.py)

我们将创建一个简单的 MCP 服务器,它承载一个 EchoModel

import asyncio
import logging
from mcp import (ProcessContext,McpModel,McpOptions,McpRequest,McpServer,# McpTransport, # McpTransport 基类在此示例中未直接使用,可省略content,error,
)
from mcp.transport.streamable_http import StreamableHttpTransport # 关键导入# 配置日志,方便观察
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 更详细的日志格式
)
logger = logging.getLogger(__name__) # 获取当前模块的 loggerclass EchoModel(McpModel):"""一个简单的回显模型,流式处理输入并流式返回"""async def handle_request(self, request: McpRequest, process_context: ProcessContext):request_id = request.request_id # 获取请求 ID 用于日志追踪logger.info(f"EchoModel [{request_id}] received request.")if request.content_type != content.CONTENT_TYPE_TEXT:logger.warning(f"EchoModel [{request_id}] received unsupported content type: {request.content_type}")# 抛出 MCPError 会被服务器框架捕获并发送给客户端raise error.McpError(error_type=error.ERROR_TYPE_BAD_REQUEST,message=f"Unsupported content type: {request.content_type}. Expected '{content.CONTENT_TYPE_TEXT}'.",)try:# 开始响应,指定内容类型await process_context.begin_response(content_type=content.CONTENT_TYPE_TEXT)logger.info(f"EchoModel [{request_id}] started response stream.")# 流式读取请求内容并逐块回显chunk_count = 0async for chunk in request.read_chunks():chunk_count += 1if isinstance(chunk, bytes):text_chunk = chunk.decode('utf-8')logger.info(f"EchoModel [{request_id}] echoing chunk #{chunk_count}: '{text_chunk}'")await process_context.write_chunk(text_chunk.encode('utf-8'))# 在实际应用中,这里可能是模型处理的延迟await asyncio.sleep(0.1) # 模拟处理延迟,更清晰地观察流式效果else:# 理论上 read_chunks() 应该总是返回 bytes,这是一个防御性日志logger.warning(f"EchoModel [{request_id}] received non-bytes chunk (type: {type(chunk)}): {chunk}")if chunk_count == 0:logger.info(f"EchoModel [{request_id}] received no chunks in request body.")# 即使没有输入块,也可能需要发送一个空响应或特定响应# await process_context.write_chunk(b"Received empty stream.\n")# 结束响应流await process_context.end_response()logger.info(f"EchoModel [{request_id}] finished response stream successfully.")except error.McpError as e: # 捕获可预期的 MCP 错误logger.error(f"EchoModel [{request_id}] McpError during handling: {e.message}")# 重新抛出,让服务器框架处理raiseexcept Exception as e:logger.error(f"EchoModel [{request_id}] Unhandled exception during request processing: {e}", exc_info=True)# 对于未处理的异常,构造并发送一个标准的 MCP 内部错误# 确保在发送错误前响应流没有开始,或者以错误方式结束if not process_context.response_begun:await process_context.begin_response(content_type=content.CONTENT_TYPE_MCP_ERROR,is_error=True,)await process_context.write_chunk(error.McpError(error_type=error.ERROR_TYPE_INTERNAL, message=f"Internal server error: {str(e)}").to_json().encode('utf-8'))elif not process_context.response_ended: # 如果流已开始但未结束# 尝试写入错误信息,但这可能因流的状态而出错try:await process_context.write_chunk(error.McpError(error_type=error.ERROR_TYPE_INTERNAL, message=f"Error mid-stream: {str(e)}").to_json().encode('utf-8'))except Exception as write_err:logger.error(f"EchoModel [{request_id}] Could not write error to stream: {write_err}")if not process_context.response_ended:await process_context.end_response() # 总是尝试结束响应async def main():options = McpOptions() # 使用默认选项models = {"echo/v1": EchoModel()} # 注册模型及其键# 配置 StreamableHttpTransport# 默认监听: host="localhost", port=8080, path="/mcp"# 若要监听所有接口,可使用 host="0.0.0.0"transport = StreamableHttpTransport(host="localhost", port=8080, path="/mcp")logger.info(f"Initializing StreamableHTTP MCP server on http://{transport.host}:{transport.port}{transport.path}")server = McpServer(options=options, models=models, transports=[transport])try:logger.info("Starting MCP server...")await server.serve() # 运行服务器直到被中断except KeyboardInterrupt:logger.info("KeyboardInterrupt received, shutting down server...")except Exception as e:logger.error(f"Server failed to run: {e}", exc_info=True)finally:logger.info("Attempting to shut down the server gracefully...")await server.shutdown()logger.info("Server has been shut down.")if __name__ == "__main__":asyncio.run(main())

代码解读 (Server):

  1. 导入模块:导入了 MCP SDK 的核心组件以及 StreamableHttpTransport
  2. EchoModel(McpModel)
    • 继承自 McpModel,这是实现自定义模型的标准方式。
    • handle_request 是核心方法,当服务器收到针对此模型的请求时被调用。
    • 它首先检查 content_type,然后使用 process_context.begin_response() 开始一个流式响应。
    • 通过 async for chunk in request.read_chunks(): 异步迭代读取客户端发送的流式数据块。
    • process_context.write_chunk() 将数据块写回给客户端。
    • process_context.end_response() 标记响应流结束。
    • 包含了基本的错误处理逻辑。
  3. main() 函数
    • 创建 McpOptions 和模型字典 models。我们将 EchoModel 实例注册到路径 echo/v1
    • 关键transport = StreamableHttpTransport() 创建了一个 StreamableHTTP 传输实例。默认情况下,它监听 localhost:8080/mcp 路径。
    • McpServer 用选项、模型和传输方式列表进行初始化。
    • server.serve() 启动服务器,server.shutdown() 用于优雅关闭。

3.4 MCP Client 端实现 (echo_client.py)

现在我们来编写一个客户端,它将连接到上述服务器,发送流式文本,并接收和打印服务器的流式回显。

import asyncio
import logging
from mcp import McpConnection, McpRequestOptions, content, error# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 更详细的日志格式
)
logger = logging.getLogger(__name__) # 获取当前模块的 loggerasync def stream_data_generator(data_list, delay=0.2): # 稍微调整延迟以观察"""一个异步生成器,模拟流式发送数据块"""logger.info("Client data stream generator started.")for i, item in enumerate(data_list):chunk_to_send = item.encode('utf-8')logger.info(f"Client sending chunk #{i+1}: '{item}'")yield chunk_to_sendawait asyncio.sleep(delay) # 模拟数据块之间的处理或网络延迟logger.info("Client data stream generator finished.")async def main():# 服务器的 MCP 端点 URL。确保它与服务器配置完全匹配。# `mcp+http` 表示使用 StreamableHTTP (非加密)# `localhost:8080` 是服务器监听的地址和端口# `/mcp` 是服务器 StreamableHttpTransport 配置的路径server_mcp_url = "mcp+http://localhost:8080/mcp"logger.info(f"Attempting to connect to MCP server at: {server_mcp_url}")try:# 建立到 MCP 服务器的连接。# 对于 StreamableHTTP,这通常意味着客户端会发起一个 HTTP 请求 (可能升级到 WebSocket 或使用长轮询/chunked encoding)async with McpConnection.create(target_url=server_mcp_url) as conn:logger.info(f"Successfully connected to MCP server: {server_mcp_url}")request_options = McpRequestOptions(model_key="echo/v1",  # 必须与服务器端注册的模型键匹配content_type=content.CONTENT_TYPE_TEXT, # 指定请求体的内容类型# accept_content_types=[content.CONTENT_TYPE_TEXT] # 可以指定期望的响应类型)# 准备要流式发送的数据data_to_stream = ["Hello, ", "MCP Server! ", "This is a ", "streaming test."]# 创建一个流式请求并获取响应处理器# request_body_generator 参数接收一个异步生成器logger.info(f"Client initiating streaming request for model '{request_options.model_key}'...")response_handler = await conn.streaming_request(request_options=request_options,request_body_generator=stream_data_generator(data_to_stream))logger.info(f"Client request sent. Request ID: {response_handler.request_id}. Waiting for response...")# 检查响应元数据logger.info(f"Response Content-Type: {response_handler.response_content_type}")logger.info(f"Response Is Error: {response_handler.is_error}")if response_handler.is_error:logger.error("Server indicated an error in response.")# 如果是错误,内容通常是 McpError 的 JSON 序列化形式error_content_bytes = b""async for chunk in response_handler.read_response_chunks():error_content_bytes += chunktry:mcp_err = error.McpError.from_json(error_content_bytes.decode('utf-8'))logger.error(f"MCP Error from server: Type='{mcp_err.error_type}', Message='{mcp_err.message}'")except Exception as e:logger.error(f"Could not parse MCP error from response: {error_content_bytes.decode('utf-8')}, Parse Error: {e}")return # 错误发生,提前退出# 流式接收和打印响应full_response_text = ""logger.info("Client receiving stream from server:")chunk_count = 0async for chunk in response_handler.read_response_chunks():chunk_count +=1if isinstance(chunk, bytes):text_chunk = chunk.decode('utf-8')print(text_chunk, end='', flush=True) # 实时打印,不带换行full_response_text += text_chunkelse:# 理论上 read_response_chunks() 应该总是返回 byteslogger.warning(f"Client received non-bytes chunk (type: {type(chunk)}): {chunk}")print() # 在所有块接收完毕后打印一个换行符if chunk_count == 0:logger.info("Client received an empty response stream.")logger.info(f"Client received full response: '{full_response_text}'")except ConnectionRefusedError:logger.error(f"Connection refused. Ensure the MCP server is running at {server_mcp_url} and accessible.")except error.McpError as e: # 捕获客户端操作中可能发生的 MCP 特定错误logger.error(f"An MCPError occurred on the client-side: {e.message} (Type: {e.error_type})")except Exception as e:logger.error(f"An unexpected error occurred in the client: {e}", exc_info=True)if __name__ == "__main__":asyncio.run(main())

代码解读 (Client):

  1. server_mcp_url:定义了 MCP 服务器的 StreamableHTTP 端点。注意前缀是 mcp+http (或 mcp+https 如果启用了 TLS)。路径 /mcp 必须与服务器端 StreamableHttpTransport 配置的 path 一致。
  2. McpConnection.create(target_url=server_mcp_url):异步上下文管理器,用于建立和管理到服务器的连接。
  3. McpRequestOptions:指定要调用的模型 (echo/v1) 和内容类型。
  4. stream_data_generator:这是一个异步生成器,用于模拟客户端流式发送请求体。在实际应用中,这可能来自文件、用户输入或其他流式来源。
  5. conn.streaming_request(...):发起一个流式请求。它需要 request_options 和一个可选的 request_body_generator。此方法返回一个 response_handler 对象。
  6. response_handler.read_response_chunks():异步迭代读取服务器返回的响应数据块。
  7. 客户端代码会逐块打印服务器回显的内容。

3.5 运行与结果

  1. 启动服务器
    打开一个终端,激活虚拟环境,然后运行服务器脚本:

    python echo_server.py
    
    INFO:__main__:Starting StreamableHTTP MCP server on localhost:8080/mcp
    INFO:aiohttp.access:127.0.0.1 [DD/Mon/YYYY:HH:MM:SS +0000] "GET /mcp HTTP/1.1" 101 - "-" "-" # (这是 WebSocket 升级请求,或者 HTTP streaming 初始请求)
    
  2. 运行客户端
    打开另一个终端,激活虚拟环境,然后运行客户端脚本:

    python echo_client.py
    

客户端输出:

INFO:__main__:Connected to MCP server at mcp+http://localhost:8080/mcp
INFO:__main__:Client sent request for model 'echo/v1'
INFO:__main__:Client sending chunk: 'Hello, '
INFO:__main__:Response Content-Type: text/plain
INFO:__main__:Client receiving stream:
Hello, INFO:__main__:Client sending chunk: 'MCP over HTTP! '
MCP over HTTP! INFO:__main__:Client sending chunk: 'This is '
This is INFO:__main__:Client sending chunk: 'a stream.'
a stream.
INFO:__main__:
Client received full response: 'Hello, MCP over HTTP! This is a stream.'

服务器端额外输出 (对应一次客户端连接和请求):

INFO:__main__:EchoModel received request: <some_request_id>
INFO:__main__:EchoModel [<some_request_id>] started response stream.
INFO:__main__:EchoModel [<some_request_id>] echoing chunk: 'Hello, '
INFO:__main__:EchoModel [<some_request_id>] echoing chunk: 'MCP over HTTP! '
INFO:__main__:EchoModel [<some_request_id>] echoing chunk: 'This is '
INFO:__main__:EchoModel [<some_request_id>] echoing chunk: 'a stream.'
INFO:__main__:EchoModel [<some_request_id>] finished response stream.

客户端逐块发送数据,服务器也逐块接收并回显,客户端再逐块接收并打印。这清晰地展示了双向流式通信的过程。

4. 总结

StreamableHTTP 的引入不仅仅是一个传输选项的增加,它对 MCP 生态和 LLM 应用架构可能带来深远影响:

  1. 简化云原生部署

    • HTTP 是云原生环境的通用语言。MCP 服务可以更容易地容器化,并通过 Kubernetes 等编排工具进行管理。
    • 可以无缝集成到 Service Mesh (如 Istio, Linkerd) 中,利用其流量管理、可观察性和安全特性。
    • API 网关可以轻松地将 MCP 服务暴露给外部消费者,并处理认证、速率限制等。
  2. 提升互操作性

    • 任何支持标准 HTTP 客户端库的语言或平台都可以相对容易地与 MCP StreamableHTTP 服务器交互,即使没有原生的 MCP SDK。开发者只需理解 MCP 的消息分帧(通常是长度前缀或其他分隔符,具体取决于 StreamableHTTP 在 MCP 中的实现细节)和核心协议语义。
    • 这为构建异构系统和集成现有 Web 服务提供了便利。
  3. 性能考量

    • HTTP/1.1 的 Chunked Encoding 已经相当成熟。
    • HTTP/2 的流多路复用可以显著减少延迟,尤其是在高并发场景下,因为它允许在单个 TCP 连接上并行处理多个请求/响应流,避免了队头阻塞问题。MCP SDK 和服务器实现需要支持 HTTP/2 才能充分发挥此优势。
    • 持久连接减少了 TCP 和 TLS握手的开销。
  4. 安全性

    • 可以直接利用 HTTPS (HTTP over TLS) 来确保传输层安全,这是 Web 安全的标准做法。
    • HTTP Headers 可以方便地承载认证令牌 (如 JWT Bearer tokens),与常见的 Web 认证方案兼容。
  5. 未来展望与挑战

    • HTTP/3 (QUIC):随着 HTTP/3 的普及,未来 MCP StreamableHTTP 可能会支持基于 QUIC 的传输,进一步改善连接建立速度和弱网环境下的表现。
    • 标准化细节:确保 MCP 消息在 HTTP 流中的分帧方式、错误处理、元数据约定等细节得到清晰的标准化和文档化至关重要。这包括如何区分不同的 MCP 消息(如果一个 HTTP 流承载多个独立的 MCP 消息)以及如何处理特定于 MCP 的错误与 HTTP 级别的错误。
    • 开发者工具:需要更好的开发者工具来调试和监控 StreamableHTTP 上的 MCP 通信,例如能够解析和显示 MCP 消息流的代理工具。
  6. 与 gRPC 的比较
    gRPC 是另一个流行的基于 HTTP/2 的高性能 RPC 框架,也支持双向流。

    • 相似之处:都利用 HTTP/2 实现高效双向流。
    • 不同之处
      • Schema 定义:gRPC 依赖 Protocol Buffers 进行接口定义和序列化,提供了强类型和代码生成。MCP 本身更侧重于上下文和交互模式,内容类型相对灵活 (如 JSON, text, bytes)。
      • 生态和侧重点:gRPC 更通用,用于各种微服务通信。MCP 专为模型交互设计,其核心概念(如上下文管理、模型能力协商等)是其特有价值。
      • StreamableHTTP for MCP 提供了在不引入 Protobuf 依赖的情况下,利用 HTTP/2 (或 HTTP/1.1) 流能力的途径。对于希望保持简单或已有 JSON/text 기반 API 的场景可能更有吸引力。

相关文章:

大模型MCP更高效的通信:StreamableHTTP协议

随着大语言模型&#xff08;LLMs&#xff09;的飞速发展&#xff0c;模型与应用之间的通信效率和灵活性变得至关重要。Model Context Protocol (MCP) 作为专为模型交互设计的协议&#xff0c;一直在不断进化以满足日益增长的需求。近期&#xff0c;MCP引入了一个令人振奋的新特…...

防火墙在网络安全体系中的核心作用与原理

防火墙在网络安全体系中的核心作用与原理 一、核心作用解析 1. 访问控制中枢 功能维度实现方式典型场景黑白名单控制基于IP/端口/协议的规则过滤限制外部IP访问财务系统&#xff0c;仅开放VPN端口权限分级用户组策略映射&#xff08;如AD集成&#xff09;禁止普通员工访问核心…...

MySQL事务和JDBC中的事务操作

一、什么是事务 事务是数据库操作的最小逻辑单元&#xff0c;具有"全有或全无"的特性。以银行转账为例&#xff1a; 典型场景&#xff1a; 从A账户扣除1000元 向B账户增加1000元 这两个操作必须作为一个整体执行&#xff0c;要么全部成功&#xff0c;要么全部失败…...

每日脚本学习5.10 - XOR脚本

xor运算的简介 异或就是对于二进制的数据可以 进行同0异1 简单的演示 &#xff1a; 结果是 这个就是异或 异或的作用 1、比较两数是否相等 2、可以进行加密 加密就是需要key 明文 :0b010110 key : 0b1010001 这个时候就能进行加密 明文 ^ key密文 还有这个加密比…...

【编译原理】总结

核心 闭包&#xff0c;正则闭包 产生式&#xff08;规则&#xff09; 文法 G[S](&#xff0c;&#xff0c;P&#xff0c;S) 一组规则的集合 &#xff1a;非终结符 &#xff1a;终结符 P&#xff1a;产生式 S&#xff1a;开始符号 推导 归约 规范&#xff08;最右&#xff…...

docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤

备忘&#xff1a;后续偶尔忘记了docker虚拟机与宿主机的端口映射关系&#xff0c;来这里查看即可&#xff1a; docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…...

OpenVLA:开源的视觉-语言-动作模型

1. 简介 让我们先来介绍一下什么是OpenVLA&#xff0c;在这里&#xff1a; https://openvla.github.io/ 可以看到他们的论文、数据、模型。 OpenVLA 是一个拥有 70亿参数的开源 **视觉-语言-动作&#xff08;VLA&#xff09;**模型。它是在 Open X-Embodiment 数据集 中的 97万…...

Matlab/Simulink的一些功能用法笔记(4)

水一篇帖子 01--MATLAB工作区的保护眼睛颜色设置 默认的工作区颜色为白色 在网上可以搜索一些保护眼睛的RGB颜色参数设置 在MATLAB中按如下设置&#xff1a; ①点击预设 ②点击颜色&#xff0c;点击背景色的三角标符号 ③点击更多颜色&#xff0c;找到RGB选项 ④填写颜色参数…...

【比赛真题解析】混合可乐

这次给大家分享一道比赛题:混合可乐。 洛谷链接:U561549 混合可乐 【题目描述】 Jimmy 最近沉迷于可乐中无法自拔。 为了调配出他心目中最完美的可乐,Jimmy买来了三瓶不同品牌的可乐,然后立马喝掉了一些(他实在是忍不住了),所以 第一瓶可口可乐最大容量为 a 升,剩余 …...

Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?

作者&#xff1a;来自 Elastic Kelly Manrique SWIFT 和 Elastic 如何应对基础设施复杂性、误报问题以及日益增长的合规要求。 金融服务公司在全球范围内管理实时支付方面面临前所未有的挑战。SWIFT&#xff08;Society for Worldwide Interbank Financial Telecommunication -…...

matlab介绍while函数

MATLAB 中的 while 语句介绍 在 MATLAB 中&#xff0c;while 语句是一种循环结构&#xff0c;用于在满足特定条件时反复执行一段代码块。与 for 循环不同&#xff0c;while 循环的执行次数是动态的&#xff0c;取决于循环条件是否为真。 语法 while condition% 循环体代码 e…...

如何解决 PowerShell 显示 “此系统上禁用了脚本运行” 的问题

在 Windows 11 或 10 的 PowerShell 中运行脚本时,你可能会遇到一个错误,提示系统上禁用了脚本运行。这是一种安全功能,而不是系统问题,旨在防止可能有害的脚本自动运行。然而,如果你需要运行脚本来完成某些任务,或者你在系统上做了软件开发或测试的环境,那么你需要在 P…...

深入浅出之STL源码分析4_类模版

1.引言 我在上面的文章中讲解了vector的基本操作&#xff0c;然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0&#xff0c;而我们要讲解的是STL&#xff08;标准模板库&#xff09;&#xff0c;那么二者之间的关系是什么&#x…...

探索科技的前沿动态:科技爱好者周刊

探索科技的前沿动态:科技爱好者周刊 在信息爆炸的时代,我们每时每刻都被新技术、新理念包围。而如何在这纷繁复杂的信息中找到对自己有价值的内容,成了一大挑战。今天,我们要介绍的是一个宝贵的资源——科技爱好者周刊,它致力于为科技爱好者提供优质的科技资讯,每周五发…...

初学者入门指南:什么是网络拓扑结构?

初学者入门指南&#xff1a;什么是网络拓扑结构&#xff1f; 在构建或学习计算机网络时&#xff0c;一个绕不开的核心概念便是“网络拓扑结构”&#xff08;Network Topology&#xff09;。它决定了网络中各个设备如何连接、通信以及如何扩展。理解网络拓扑不仅有助于我们更清…...

在 Vue 3 中实现刮刮乐抽奖

&#x1f389; 在 Vue 3 中实现刮刮乐抽奖 当项目中需要做一些活动互动页时&#xff0c;需要实现刮刮乐&#xff0c;请看如下效果&#xff1a; 这里感谢github用户Choicc分享的组件&#xff0c;具体可点击传送门查看 1. 引入组件 将/src/components下ScratchCard.vue复制到自…...

Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力

Satori&#xff1a;元动作 内建搜索机制&#xff0c;让大模型实现超级推理能力 论文大纲一、背景&#xff1a;LLM 推理增强的三类方法1. 基于大规模监督微调&#xff08;SFT&#xff09;的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二…...

SDC命令详解:使用all_outputs命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于创建一个输出端口对象集合&#xff0c;关于设计对象和集合的更详细介绍&#xff0c;可以参考下面的博客。 Synopsys&#xff1a;设计对象https://chenzhang.blog.csdn…...

printf调试时候正常,运行时打印不出来

问题是在添加了 printf 功能后&#xff0c;程序独立运行时无法正常打印输出&#xff0c;而调试模式下正常。这表明问题可能与 printf 的重定向实现、标准库配置、或编译器相关设置有关。 解决&#xff1a; 原来是使用 Keil/IAR&#xff0c;printf可能需要启用 MicroLIB 或正确…...

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;适用于 FramePack项目中。 &#xff08;一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形&#xff09; FramePack项目参考资料 FramePack部署&#xff08;从PyCharm解…...

分布式-Redis分布式锁

Redis实现分布式锁优点 &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 实现思路 &#xff08;1&#xff09;获取锁的时候&#xff0c;使用setnx加锁&#xff0c;并使用expire命令为锁…...

UniRepLknet助力YOLOv8:高效特征提取与目标检测性能优化

文章目录 一、引言二、UniRepLknet 的框架原理&#xff08;一&#xff09;架构概述&#xff08;二&#xff09;架构优势 三、UniRepLknet 在 YOLOv8 中的集成&#xff08;一&#xff09;集成方法&#xff08;二&#xff09;代码实例 四、实验与对比&#xff08;一&#xff09;对…...

自研时序大模型讲解(4月29日)直播回顾

4 月 29 日&#xff0c;清华团队揭秘&#xff1a;时序大模型如何让数据“活”起来线上直播圆满结束。清华大学软件学院博士生&#xff0c;IoTDB 原生机器学习引擎 AINode 研发同学刘雍在线上面向数千人次的时序数据分析人员与 AI 大模型行业关注者&#xff0c;就时序大模型的发…...

The Action Replay Process

Preface A commonly used inequality − x > ln ⁡ ( 1 − x ) , 0 < x < 1 -x > \ln(1 - x), \quad 0 < x < 1 −x>ln(1−x),0<x<1 Proof: Let f ( x ) ln ⁡ ( 1 − x ) x f(x) \ln(1 - x) x f(x)ln(1−x)x, for 0 < x < 1 0 < …...

k8s之ingress解释以及k8s创建业务的流程定义

matchLabels ingress Ingress 是反向代理规则&#xff0c;用来规定 HTTP/S 请求应该被转发到哪个 Service 上&#xff0c;比如根据请求中不同的 Host 和 url 路径让请求落到不同的 Service 上。 Ingress Controller 就是一个反向代理程序&#xff0c;它负责解析 Ingress 的反向…...

LVGL对象的盒子模型和样式

文章目录 &#x1f9f1; LVGL 对象盒子模型结构&#x1f50d; 组成部分说明&#x1f3ae; 示例代码&#x1f4cc; 总结一句话 &#x1f9f1; 一、样式的本质&#xff1a;lv_style_t 对象&#x1f3a8; 二、样式应用的方式&#x1f9e9; 三、样式属性分类&#xff08;核心&#…...

从0开始学习大模型--Day05--理解prompt工程

提示词工程原理 N-gram&#xff1a;通过统计&#xff0c;计算N个词共同出现的概率&#xff0c;从而预测下一个词是什么。 深度学习模型&#xff1a;有多层神经网络组成&#xff0c;可以自动从数据中学习特征&#xff0c;让模型通过不断地自我学习不断成长&#xff0c;直到模型…...

计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践

概述 设想一下&#xff0c;你在多地拥有多个仓库&#xff0c;要同时监控每个仓库的实时状况&#xff0c;这对于时间和精力而言&#xff0c;都构成了一项艰巨挑战。从成本和可靠性的层面考量&#xff0c;大规模部署计算设备也并非可行之策。一方面&#xff0c;大量计算设备的购…...

【计算机视觉】OpenCV项目实战:OpenCV_Position 项目深度解析:相机定位技术

OpenCV_Position 项目深度解析&#xff1a;基于 OpenCV 的相机定位技术 一、项目概述二、技术原理&#xff08;一&#xff09;单应性矩阵&#xff08;Homography&#xff09;&#xff08;二&#xff09;算法步骤&#xff08;三&#xff09;相机内参矩阵 三、项目实战运行&#…...

LAMMPS分子动力学基于周期扰动法的黏度计算

关键词&#xff1a;黏度,周期扰动法&#xff0c;SPC/E水分子&#xff0c;分子动力学&#xff0c;lammps 目前分子动力学计算黏度主要有以下方法&#xff1a;&#xff08;1&#xff09;基于 Green - Kubo 关系的方法。从微观角度出发&#xff0c;利用压力张量自相关函数积分计算…...