大模型数据传输3 种方式对比

在现代 AI Agent 和 MCP (Model Context Protocol) 架构中,通信方式主要分为以下三种。它们的演进路线是:本地交互 -> Web 广播 (SSE) -> 无状态高速流 (Streamable HTTP)。

1. Stdio (Standard Input/Output) ------ 本地管道

核心定位 :本地 (Local) 、隐私 、零网络开销 。
适用场景:本地 Agent(如 Cursor, Windsurf)调用本机运行的工具或模型。

  • 原理:

    • 不走网络 :基于操作系统的标准输入 (stdin) 和标准输出 (stdout)。
    • 进程通信:Client 启动 Server 作为子进程,直接通过管道"递纸条"。
  • 数据格式 :通常是 NDJSON (换行符分隔的 JSON),直接在控制台输出。

  • 优点:

    • 🚀 速度最快:没有 HTTP 握手、TLS 加密等网络开销。
    • 🔒 最安全:数据完全不出本机,防火墙无法拦截。
  • 缺点 :无法跨机器使用。调试时需注意区分 stdout(数据)和 stderr(日志),否则会破坏 JSON 结构。


2. SSE (Server-Sent Events) ------ 传统的 Web 订阅流

核心定位 :浏览器 (Browser) 、有状态订阅 、Legacy (旧标准) 。
适用场景:Web 前端应用(ChatGPT 网页版)、需要服务器主动推送的场景。

  • 原理:

    • 有状态连接:客户端建立连接后,连接保持打开,服务器随时可以推送数据。
    • 协议封装 :强制 MIME 类型 text/event-stream。
  • 数据格式 :穿制服的 JSON 。必须包含 data: 前缀和双换行。

text 复制代码
data: {"result": "Hel"}\n\n
data: {"result": "lo"}\n\n
  • 优点:

    • 🌐 浏览器原生支持:Chrome/Edge 调试工具可直接查看 EventStream。
    • 🔥 防火墙友好:基于标准 HTTP 端口 (80/443)。
  • 缺点:

    • 连接限制:浏览器对 SSE 连接数有限制(通常 6 个)。
    • 有状态负担:在最新的 MCP 规范中,这种维持长连接的方式被认为扩展性较差(Stateful),正逐渐被 Streamable HTTP 取代。

3. Streamable HTTP ------ 现代的无状态高速流

核心定位 :后端 (Backend) 、无状态 (Stateless) 、高并发 。
适用场景:后端微服务互调、Ollama API、最新的 MCP 协议传输层。

  • 原理:

    • 无状态模型 :不同于 SSE 的"长连接订阅",它更像标准的 HTTP POST 请求,只是响应是流式的。发一个请求,回一串流,流完即断,服务器不保存会话状态。
    • 传输层 :利用 HTTP Transfer-Encoding: chunked。
  • 数据格式 (分两种流派):

  1. NDJSON (主流):Ollama、Docker 均采用此方式。裸 JSON,一行一个。

    json 复制代码
    {"response": "Hel"}\n
    {"response": "lo"}\n
  2. SSE 兼容模式 :为了兼容部分客户端,部分 Streamable HTTP 也会在内部使用 SSE 的格式(data:),但交互模式是 Request-Response(无状态),而不是 Subscribe-Publish(有状态)。

    特性 传统 SSE (订阅-发布) SSE 兼容模式 (请求-响应)
    触发方式 客户端连接一次,服务器被动推送消息 客户端发送 Prompt 指令,服务器执行任务
    连接时长 长期保持 (Long-lived) 任务处理结束即断开 (Short-lived)
    状态维护 服务器需要维护在线用户列表 (Stateful) 服务器不保存会话状态 (Stateless)
    应用场景 类似直播间弹幕、实时股价更新 类似 AI 聊天回复、长文本生成过程
  • 优点 :
    • ⚡ 高并发扩展:因为是无状态的,负载均衡器(Nginx/LB)更容易处理。
    • 🛠 支持 POST:完美支持携带大量 Prompt 上下文(解决了 SSE 原生不支持 POST 的痛点)。
    • 🧹 纯净高效:NDJSON 模式下无任何协议废话,载荷有效率最高。

📊 终极对比表 (可直接复制)

特性 Stdio SSE (Legacy/Web) Streamable HTTP (Modern)
通信介质 本地管道 (Pipe) 网络 (HTTP 长连接) 网络 (HTTP 请求-响应流)
典型用户 本地 Agent (Cursor) 浏览器前端 (JS) 后端服务 (Python/Go), Ollama
数据外观 {"a":1}\n data: {"a":1}\n\n {"a":1}\n (NDJSON)
HTTP 方法 N/A 原生 GET (fetch 可模拟 POST) 原生 POST
状态管理 进程生命周期 Stateful (有状态) Stateless (无状态)
MCP 支持 ✅ 官方推荐 (本地) ⚠️ 逐步废弃 / 仅用于特定场景 ✅ 官方推荐 (远程)
调试难度 困难 (需分离日志) 简单 (浏览器 DevTools) 中等 (需抓包或 curl -N)

💡 关键结论

  1. 做本地插件 :无脑选 Stdio。
  2. 做 Web 网页 :选 SSE 格式(但建议用 POST fetch 方式调用,即"Streamable HTTP 的行为 + SSE 的皮肤")。
  3. 做后端服务/网关 :选 Streamable HTTP (NDJSON),这是目前大模型 API (如 Ollama, vLLM) 的事实标准,也是 MCP 协议推崇的未来方向。

好的,我们一起来梳理这份笔记。要把"传统 SSE 被取代"这个逻辑讲清楚,核心在于对比浏览器接口的能力差异,而不仅仅是协议本身。

这份笔记的核心逻辑是:底层协议没变(都是分块传输),变的是客户端的"遥控器" (从旧的 EventSource 换成了新的 fetch)。

以下是为你整理的笔记结构:


📝 为什么现代 AI 选择 Streamable HTTP (fetch) 而非传统 SSE ?

1. 核心概念辨析 🧠
  • 底层技术(没变): 依然是基于 HTTP 的分块传输(Chunked Transfer Encoding)。
  • 传统 SSE: 特指浏览器提供的老旧接口 EventSource API。
  • Streamable HTTP: 特指使用现代 fetch API 配合 ReadableStream 来手动处理流式数据。
2. 被取代的三大原因 (The "Why")

① 运载能力的硬伤 (GET vs. POST) 📦

  • 传统 SSE (EventSource):

    • 强制使用 GET 请求。
    • 痛点: 数据必须放在 URL 参数中。由于浏览器和服务器对 URL 长度有限制(通常几 KB),无法承载 AI 对话中动辄几万 token 的 Prompt(提示词)和上下文历史。
  • Streamable HTTP (fetch):

    • 支持 POST 请求。
    • 优势: 数据放在 Body 中,容量几乎无限制,完美适配 RAG(检索增强生成)和长上下文场景。

② 鉴权的安全性 (Headers) 🛡️

  • 传统 SSE (EventSource):

  • 不支持自定义请求头(Headers)。

  • 痛点: 无法传递标准的 Authorization: Bearer token。只能将 Token 拼在 URL 里(如 ?token=xyz),极易在历史记录或日志中泄露。

  • Streamable HTTP (fetch):

    • 完全支持自定义 Headers。
    • 优势: 符合现代 API 安全标准,Token 隐蔽且安全。

③ 流程的掌控权 (Control) 🎮

  • 传统 SSE (EventSource):

  • 全自动:连接断开会自动重连。

  • 痛点: 在 AI 生成场景下,如果生成一半断网,自动重连可能导致后台重新生成、重复扣费,且难以处理具体的业务错误(如"余额不足")。

  • Streamable HTTP (fetch):

  • 全手动:建立、解析、断开全由代码控制。

  • 优势: 可以精确控制何时停止接收(AbortController),如何处理错误,以及是否需要重试。

3. 总结对比表 📊
特性 传统 SSE (EventSource) Streamable HTTP (fetch)
HTTP 方法 🚫 仅 GET (容量受限) ✅ POST (容量无限)
鉴权方式 ⚠️ URL 参数 (不安全) ✅ Custom Headers (安全)
控制机制 🤖 自动重连 (不可控) ⚙️ 手动控制 (灵活)
适用场景 简单的消息推送、监控数据 大模型对话、复杂 API 交互
相关推荐
碧海银沙音频科技研究院1 小时前
基于炬芯ATS3089X自研AEC声学回声消除算法
算法
通问AI2 小时前
在两台 Mac Studio 上跑 800B 模型:MLX + RDMA over Thunderbolt 实测与四道门选型法
算法
ZywOo6232 小时前
《算法竞赛进阶指南》0x03 前缀和与差分
算法
Scintilla_y2 小时前
DAY2 滑动窗口
算法·leetcode·散列表
lvwangshu2 小时前
笛卡尔树
算法·图论
026d232 小时前
状态信号只知“其然”不知“其所以然”:变工况机械故障诊断的物理盲区
算法
姜鱼问生2 小时前
备份和服务器在同一台机器上,等于没备份
算法·架构
姜鱼问生3 小时前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构
特立独行的猫a3 小时前
仓颉语言UI开发实战:我用仓颉写了个桌面版力扣
算法·leetcode·ui·tauri·仓颉·cj-tarui
y1su3 小时前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划