SSE 事件流 是什么?

SSE (Server-Sent Events,服务器发送事件) 是一种基于 HTTP 协议的服务器向浏览器单向推送实时数据的技术。

简单来说,它允许服务器在有新消息时,“主动”地把数据推送到网页上,而不需要浏览器反复询问(轮询)。

以下是关于 SSE 的详细介绍:

1. 工作原理

传统的 HTTP 请求是“一问一答”模式:客户端发请求,服务器给响应,连接关闭。
SSE 的方式不同:

  1. 客户端通过 JavaScript 的 EventSource 接口向服务器发起一个常规的 HTTP 请求。
  2. 服务器保持连接开启(Keep-Alive)。
  3. 服务器在有新数据时,以特定的格式(text/event-stream)不断地通过这个连接发送数据。
  4. 浏览器接收到数据后,触发对应的事件处理函数。

2. SSE 的主要特点

  • 单向通信: 只能是服务器向客户端推送。如果客户端需要频繁向服务器发消息,通常需要配合普通的 AJAX 请求。
  • 基于 HTTP 协议: 它使用标准的 HTTP 协议,不需要像 WebSocket 那样升级协议,因此能通过大多数代理服务器和防火墙。
  • 轻量级: 协议非常简单,实现起来比 WebSocket 容易。
  • 断线重连: 浏览器内置了自动重连机制。如果连接断开了,浏览器会自动尝试重新连接,并且可以通过 Last-Event-ID 告诉服务器上一次接收到的消息 ID,以便实现断点续传。
  • 文本传输: 默认只支持发送 UTF-8 格式的文本(虽然可以通过 Base64 传输二进制,但不如 WebSocket 高效)。

3. 数据流格式 (Event Stream)

SSE 的响应头必须包含:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

数据流由一条条“消息”组成,每条消息以两个换行符 \n\n 结尾。常见的字段包括:

  • data: 消息内容。
  • event: 事件类型(自定义名称)。
  • id: 消息 ID。
  • retry: 指定客户端重连的等待时间(毫秒)。

例子:

id: 1
event: message
data: Hello world!

id: 2
event: update
data: {"price": 100, "symbol": "BTC"}

4. 代码示例

客户端 (JavaScript)
const source = new EventSource('/api/stream');

source.onmessage = (event) => {
    console.log("收到新消息:", event.data);
};

source.addEventListener('update', (event) => {
    console.log("收到 update 事件:", event.data);
});

source.onerror = (err) => {
    console.error("连接出错:", err);
};

5. SSE vs. WebSocket

特性 SSE (Server-Sent Events) WebSocket
通信方向 单向 (Server -> Client) 双向 (Full Duplex)
协议 HTTP 自定义的 ws 协议
重连机制 浏览器内置自动重连 需要手动实现
数据格式 文本 (UTF-8) 文本 + 二进制
复杂度 非常简单 较复杂
适用场景 股票看板、通知推送、ChatGPT 回答流 网络游戏、实时聊天室、协同编辑

6. 为什么现在 SSE 很火?

最主要的原因是 生成式 AI (如 ChatGPT) 的兴起。
当大语言模型生成文本时,由于模型输出是一个字一个字蹦出来的,等待所有文本生成完再返回会让用户感到很慢。使用 SSE 技术,服务器可以生成一个词就往前端推一个词,用户就能看到实时“打字机”效果的回复。

总结

SSE 是一条“长长的、单向的数据管道”。它在不需要双向实时交互(如聊天、游戏)的场景下,是比 WebSocket 更简洁、更可靠的选择。

包含 HITL 中断恢复逻辑(handleCardConfirm/handleCardCancel) 中的HITL 是什么意思?

在计算机科学和人工智能(AI)领域,HITLHuman-in-the-Loop 的缩写,中文通常翻译为**“人机回环”“人工介入”**。

结合你提到的 handleCardConfirm(处理卡片确认)和 handleCardCancel(处理卡片取消)逻辑,HITL 的具体含义和作用如下:

1. HITL 的核心定义

Human-in-the-Loop (HITL) 指的是在自动化流程或 AI 决策过程中,加入人工干预环节。系统不是完全自动运行,而是在某些关键节点停下来,等待人的指令、审核或修正后再继续执行。

2. 在你的业务场景中是什么意思?

在你提到的场景中,HITL 通常出现在 AI Agent(智能体)自动化工作流 中。

  • 中断 (Interruption): 当 AI 执行到一个“高风险”或“需要决策”的步骤时(例如:发送邮件、支付订单、删除数据库),系统会暂停,并向前端发送一个“确认卡片”(Card)。
  • 恢复 (Recovery):
    • handleCardConfirm 人类用户点击了“确认”,系统收到信号后,从刚才中断的地方恢复,继续执行下一步。
    • handleCardCancel 人类用户点击了“取消”,系统终止该任务或回滚到安全状态。

3. 为什么需要 HITL?

  • 安全性 (Safety): 防止 AI 自动做出不可挽回的错误操作。
  • 准确性 (Accuracy): AI 可能不确定某个判断,需要人来校准。
  • 合规性 (Compliance): 某些法律或业务流程要求必须由真人签字或点击确认。

4. 举个简单的例子

想象一个“AI 自动买机票”的机器人:

  1. AI 自动运行: 搜索航班、对比价格、填写信息。
  2. 触发 HITL: 到了付款环节,AI 不能直接刷你的卡。它通过 SSE 事件流 发送一个“确认购买卡片”到前端。
  3. 用户介入: 页面弹出对话框,显示:“机票 2000 元,是否确认购买?”
  4. 逻辑处理:
    • 如果你点“确定”,触发 handleCardConfirm -> AI 继续运行(扣款、下单)。
    • 如果你点“取消”,触发 handleCardCancel -> AI 停止任务

总结

在代码逻辑里,HITL 机制就是**“给自动化流程装上刹车和方向盘,把控制权交还给人”**的一种设计模式。handleCardConfirmhandleCardCancel 就是人与这个自动化流程进行通信的“接口”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。