文章目录
-
- 前言
- 一、 核心数据传输格式详解
-
- 1. 请求格式
- 2. 响应格式:非流式
- 3. 响应格式:流式
- 二、 流程图分析:从输入到输出
-
- 1. 流程逻辑描述
- 2. 流程图 (Mermaid 代码表示)
- 三、 原理架构图分析
-
- 1. 架构层级说明
- 2. 架构图 (Mermaid 代码表示)
- 四、 关键技术原理深度解析
-
- 1. 为什么选择 SSE 而不是 WebSocket?
- 2. Token 与数据传输的关系
-
- 3. 数据压缩
- 五、 总结
前言
Ai聊天工具(如ChatGPT、Claude、文心一言等)的数据传输是核心功能的基石。要深入理解其背后的机制,我们需要从数据格式标准、交互流程、以及系统架构原理三个维度进行剖析。 以下是关于AI聊天工具数据传输格式的详细汇总分析:
一、 核心数据传输格式详解
在AI聊天应用中,最主流的数据交互格式是 JSON,但传输方式分为同步和异步流式两种。
1. 请求格式
这是客户端发送给服务端的 payload 结构。目前业界基本遵循 OpenAI 制定的 API 标准规范。
- 核心字段说明:
- messages: 数组类型,包含对话历史上下文。
- role: 角色,分为 system (设定人格)、user (用户输入)、assistant (AI历史回复)。
- content: 具体的文本内容或多模态数据(如图片URL)。
- stream: 布尔值,false 为一次性返回,true 为流式返回。 JSON 示例:
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "你是一个专业的代码助手。"},
{"role": "user", "content": "请写一个Python冒泡排序。"}
],
"temperature": 0.7,
"stream": true
}
2. 响应格式:非流式
服务端生成完毕后一次性返回所有数据。
- 缺点: 用户需等待数秒才能看到完整回复,体验较差。
- 结构: 包含 id, choices (回复选项), usage (Token消耗统计)。 JSON 示例:
{
"id": "chatcmpl-123",
"object": "chat.completion",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "这是一个冒泡排序的实现…"
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 100,
"total_tokens": 120
}
}
3. 响应格式:流式
这是现代AI聊天的核心体验(打字机效果)。基于 SSE (Server-Sent Events) 技术。
- 传输格式: HTTP 连接保持长连接,服务端分块传输数据。
- 数据帧格式: 每一行以 data: 开头,以 \\n\\n 结尾。
- 增量更新: delta 字段只包含本次新增的几个字符,而不是全量文本。 原始数据流示例:
data: {"id":"chatcmpl-123","choices":[{"delta":{"content":"这"},"index":0}]}
data: {"id":"chatcmpl-123","choices":[{"delta":{"content":"是"}}, {"delta":{"content":"一"}}]}
data: [DONE] <– 结束标志
二、 流程图分析:从输入到输出
这里分析最常用的流式交互流程,它展示了数据如何在客户端、网关、推理引擎之间流转。
1. 流程逻辑描述
2. 流程图 (Mermaid 代码表示)
推理引擎
API网关
客户端
用户
推理引擎
API网关
客户端
用户
#mermaid-svg-SkGSvOsDHf5c5jn3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SkGSvOsDHf5c5jn3 .error-icon{fill:#552222;}#mermaid-svg-SkGSvOsDHf5c5jn3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SkGSvOsDHf5c5jn3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SkGSvOsDHf5c5jn3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SkGSvOsDHf5c5jn3 .marker.cross{stroke:#333333;}#mermaid-svg-SkGSvOsDHf5c5jn3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SkGSvOsDHf5c5jn3 p{margin:0;}#mermaid-svg-SkGSvOsDHf5c5jn3 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SkGSvOsDHf5c5jn3 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SkGSvOsDHf5c5jn3 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-SkGSvOsDHf5c5jn3 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-SkGSvOsDHf5c5jn3 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-SkGSvOsDHf5c5jn3 .sequenceNumber{fill:white;}#mermaid-svg-SkGSvOsDHf5c5jn3 #sequencenumber{fill:#333;}#mermaid-svg-SkGSvOsDHf5c5jn3 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-SkGSvOsDHf5c5jn3 .messageText{fill:#333;stroke:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SkGSvOsDHf5c5jn3 .labelText,#mermaid-svg-SkGSvOsDHf5c5jn3 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .loopText,#mermaid-svg-SkGSvOsDHf5c5jn3 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SkGSvOsDHf5c5jn3 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-SkGSvOsDHf5c5jn3 .noteText,#mermaid-svg-SkGSvOsDHf5c5jn3 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-SkGSvOsDHf5c5jn3 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SkGSvOsDHf5c5jn3 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SkGSvOsDHf5c5jn3 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SkGSvOsDHf5c5jn3 .actorPopupMenu{position:absolute;}#mermaid-svg-SkGSvOsDHf5c5jn3 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-SkGSvOsDHf5c5jn3 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SkGSvOsDHf5c5jn3 .actor-man circle,#mermaid-svg-SkGSvOsDHf5c5jn3 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-SkGSvOsDHf5c5jn3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Headers:
Accept: text/event-stream
loop
[流式生成]
输入问题
构造JSON Payload
(messages + stream:true)
HTTP POST /chat/completions
鉴权 & 限流
转发请求
Prompt处理 & Tokenize
返回数据帧
data: {"delta": {"content": "a"}}
转发SSE流
实时渲染文字
发送 [DONE] 信号
关闭连接
更新Token用量统计
三、 原理架构图分析
数据传输不仅仅是格式问题,更涉及到整个系统的架构设计。AI 聊天工具的架构通常采用控制面与数据面分离的设计。
1. 架构层级说明
- 接入层: 负责 HTTP 请求的接入、SSL 卸载、SSE 连接保持。
- 应用逻辑层: 处理会话管理、历史记录存储、Prompt 拼接。
- 推理引擎层: 真正运行模型的地方,如 vLLM, TensorRT-LLM。这一层通常是高算力节点,不直接对外暴露。
- 数据层: 存储 Vector DB (向量数据库用于RAG) 和 Redis/SQL (会话历史)。
2. 架构图 (Mermaid 代码表示)
#mermaid-svg-n0SH74IXDBRFHROi{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-n0SH74IXDBRFHROi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-n0SH74IXDBRFHROi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-n0SH74IXDBRFHROi .error-icon{fill:#552222;}#mermaid-svg-n0SH74IXDBRFHROi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n0SH74IXDBRFHROi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-n0SH74IXDBRFHROi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n0SH74IXDBRFHROi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n0SH74IXDBRFHROi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-n0SH74IXDBRFHROi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n0SH74IXDBRFHROi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n0SH74IXDBRFHROi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n0SH74IXDBRFHROi .marker.cross{stroke:#333333;}#mermaid-svg-n0SH74IXDBRFHROi svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n0SH74IXDBRFHROi p{margin:0;}#mermaid-svg-n0SH74IXDBRFHROi .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-n0SH74IXDBRFHROi .cluster-label text{fill:#333;}#mermaid-svg-n0SH74IXDBRFHROi .cluster-label span{color:#333;}#mermaid-svg-n0SH74IXDBRFHROi .cluster-label span p{background-color:transparent;}#mermaid-svg-n0SH74IXDBRFHROi .label text,#mermaid-svg-n0SH74IXDBRFHROi span{fill:#333;color:#333;}#mermaid-svg-n0SH74IXDBRFHROi .node rect,#mermaid-svg-n0SH74IXDBRFHROi .node circle,#mermaid-svg-n0SH74IXDBRFHROi .node ellipse,#mermaid-svg-n0SH74IXDBRFHROi .node polygon,#mermaid-svg-n0SH74IXDBRFHROi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-n0SH74IXDBRFHROi .rough-node .label text,#mermaid-svg-n0SH74IXDBRFHROi .node .label text,#mermaid-svg-n0SH74IXDBRFHROi .image-shape .label,#mermaid-svg-n0SH74IXDBRFHROi .icon-shape .label{text-anchor:middle;}#mermaid-svg-n0SH74IXDBRFHROi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-n0SH74IXDBRFHROi .rough-node .label,#mermaid-svg-n0SH74IXDBRFHROi .node .label,#mermaid-svg-n0SH74IXDBRFHROi .image-shape .label,#mermaid-svg-n0SH74IXDBRFHROi .icon-shape .label{text-align:center;}#mermaid-svg-n0SH74IXDBRFHROi .node.clickable{cursor:pointer;}#mermaid-svg-n0SH74IXDBRFHROi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-n0SH74IXDBRFHROi .arrowheadPath{fill:#333333;}#mermaid-svg-n0SH74IXDBRFHROi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-n0SH74IXDBRFHROi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-n0SH74IXDBRFHROi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-n0SH74IXDBRFHROi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-n0SH74IXDBRFHROi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-n0SH74IXDBRFHROi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-n0SH74IXDBRFHROi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-n0SH74IXDBRFHROi .cluster text{fill:#333;}#mermaid-svg-n0SH74IXDBRFHROi .cluster span{color:#333;}#mermaid-svg-n0SH74IXDBRFHROi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-n0SH74IXDBRFHROi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-n0SH74IXDBRFHROi rect.text{fill:none;stroke-width:0;}#mermaid-svg-n0SH74IXDBRFHROi .icon-shape,#mermaid-svg-n0SH74IXDBRFHROi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-n0SH74IXDBRFHROi .icon-shape p,#mermaid-svg-n0SH74IXDBRFHROi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-n0SH74IXDBRFHROi .icon-shape rect,#mermaid-svg-n0SH74IXDBRFHROi .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-n0SH74IXDBRFHROi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-n0SH74IXDBRFHROi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-n0SH74IXDBRFHROi :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据存储层
模型推理层
业务逻辑层
接入与协议层
客户端层
HTTPS/JSON
POST /chat
鉴权通过
获取历史上下文
查询知识库
组装最终 Prompt
合规请求
调度
生成 Token
SSE 流
text/event-stream
Web/App 界面
OpenAI SDK / HTTP Client
负载均衡
API Gateway支持 SSE 长连接
会话管理服务上下文拼接
RAG 检索增强服务向量数据库查询
内容安全审核
推理引擎PagedAttention/vLLM
GPU 计算集群
向量数据库
Redis 缓存
MySQL/Mongo 持久化
四、 关键技术原理深度解析
1. 为什么选择 SSE 而不是 WebSocket?
虽然 WebSocket 是全双工的,但在 AI 聊天场景下,数据主要是单向流动(服务端 -> 客户端)。
- SSE 优势:
- 基于 HTTP,无需握手升级协议,穿透防火墙能力强。
- 天然支持断线重连(浏览器自动重连)。
- 数据格式简单(纯文本),解析效率高。
- 完美契合 LLM 的“生成即推送”模式。
2. Token 与数据传输的关系
在传输层,我们看到的 JSON 字符串,但在模型计算层,数据是 Token(词元)。
- 原理: 英文通常 1 Token ≈ 4 字符,中文通常 1 Token ≈ 1.5-2 汉字。
- 传输影响: 并非每生成一个 Token 就立即传输一个网络包。为了平衡网络开销和用户体验,服务端通常会设置一个微小的缓冲(例如攒够 2-3 个 Token 或间隔 10ms)再发送一个 TCP 包。这就是为什么有时看到文字是一小段一小段蹦出来的原因。
3. 数据压缩
由于 JSON 是文本格式,且包含大量重复的键名(如 choices, delta, content),在高并发场景下,通常会在 HTTP 层开启 Gzip 或 Brotli 压缩,能将数据体积压缩 60%-80%,显著降低带宽成本。
五、 总结
开发或分析 AI 聊天工具时,必须掌握的数据传输核心点如下:



