Agent高频送分题:为什么AI Agent多用SEE?以及SSE和WebSocket技术选型

为什么你这个Agent项目选择用 SSE 而不是 WebSocket?是怎么考虑的技术选型

在最近的 AI Agent 相关面试中,我发现这是一个必考的“送分题”。如果仅仅背诵“SSE 是单向、WebSocket 是双向”这类基础定义,很难打动面试官。

面试官真正想考察的,是你对业务场景的适配能力以及对网络协议架构的深度思考。以下是我总结的深度回答思路。

一、 核心分歧点:场景驱动选型

在面试中,我通常会先抛出一个观点:没有最好的协议,只有最适合业务的协议。

  • SSE (Server-Sent Events):本质是基于 HTTP 的“长轮询升级版”。服务器在处理完请求后,保持连接开启,不断推送数据(流式)。
  • WebSocket:一个独立的 TCP 全双工协议。客户端和服务器可以随时随地相互“插话”。

二、 为什么在 AI Agent 中 SSE 是首选?

大部分 AI Agent(如智能对话助手)的核心诉求是 “流式输出(Streaming)” ,即大模型生成内容的速度较慢,前端需要逐字显示。此时使用 SSE 具有显著优势:

  1. 协议轻量,兼容性好:SSE 基于标准 HTTP。在大多数企业架构中,负载均衡器(Nginx, HAProxy)对 HTTP 的支持非常完善,不需要特殊的协议升级配置。
  2. 自带“重连”特性:SSE 协议标准中内置了 Last-Event-ID,当网络发生抖动断开时,浏览器会自动尝试重连并请求断点续传。这在弱网环境下对 AI 对话体验极其重要。
  3. 开发运维成本极低:后端只需将响应头设置为 Content-Type: text/event-stream,无需维护复杂的心跳检测(Heartbeat)机制。

三、 什么时候必须“弃 SSE 投 WebSocket”?

当面试官追问“什么时候必须用 WebSocket”时,我会列举以下场景:

  • 真正的双向实时性:如果 AI Agent 需要支持 “语音实时打断” 功能。用户在说话时,必须立即向服务器发送中止指令,此时 SSE 的单向性无法满足,必须使用 WebSocket 实现全双工通信。
  • 高频交互与多端协同:如果 AI Agent 不仅仅是问答,还涉及到多人同时操作一个画布、实时状态同步,WebSocket 的低延迟和双向控制能力是 SSE 无法替代的。
  • 复杂二进制传输:WebSocket 支持二进制帧传输,如果业务涉及实时流式处理音频、视频或复杂的 protobuf 数据,WebSocket 的效率会更高。

四、 面试总结:我的回答模板

在面试回答时,我会采用 “结论先行 + 场景对比 + 进阶思考” 的逻辑:

“在 AI Agent 的开发中,我倾向于优先选择 SSE,因为大模型对话本质上是基于 HTTP 的单向流式渲染,SSE 能够以最小的运维成本实现流畅的‘打字机效果’,且自带重连,用户体验极佳。

但如果业务进入了 ‘实时交互’(如语音对话打断)‘多端协同’ 阶段,我会切换为 WebSocket。因为此时我们需要双向的高频交互,SSE 的单向性会成为架构的瓶颈。

此外,我认为技术选型还应考量运维复杂性。SSE 在 Nginx 等中间件配置上非常简单,而 WebSocket 需要考虑连接保活(心跳包)、多实例下的 Session 同步等问题,如果不是刚需,我会尽量规避 WebSocket 的复杂性。”

#AI求职记录##AI求职实录##面试题刺客退退退#
全部评论
感觉好多面经都只说协议,没人讲具体的业务考量啊
点赞 回复 分享
发布于 03-25 13:50 吉林
SSE那种打字机效果真的解压
点赞 回复 分享
发布于 03-25 13:50 北京
emmm,要是业务涉及多人同时操作画布还要边聊边画,这种场景下SSE是不是就完全没戏了?
点赞 回复 分享
发布于 03-25 13:48 北京
确实啊,之前我用WebSocket做流式输出,光心跳检测就写了一大堆代码,麻了简直
点赞 回复 分享
发布于 03-25 13:47 山东
大佬,那你在项目里写SSE重连的时候,Last-Event-ID这个细节面试官真的会问这么细吗?
点赞 回复 分享
发布于 03-25 13:46 北京

相关推荐

04-17 14:44
门头沟学院 Java
RAG与知识库构建● RAG知识库中存入的向量数据来源于哪里?● 你的文本分块(Chunking)具体是怎么做的?● 深度追问: 如果让你重新设计一个RAG系统,你了解哪些文档分块的最佳实践(比如单一窗口切多大合适)?● 深度追问: 如果采用“大分块+小分块”的父子结构策略,几万字文档的大分块具体要怎么切出来?● 深度追问: 采用固定大小切分时,如何避免语义被割裂?Agent记忆管理(短期与长期记忆)● 短期记忆是如何实现的?● 深度追问: 当对话达到设定的5轮并进行了一次压缩后,如果后续对话继续增加(第6、7、8轮...),你的系统是如何再次处理和压缩这些上下文的?● 长期记忆是如何实现的?● 深度追问: 选择在什么时机进行长期记忆的持久化保存?● 深度追问: 如果用户在同一个Session中聊了完全不同的多个话题,你在压缩总结并存入向量库之前,会如何设计提示词(Prompt)?为什么必须要做这一步总结提炼?● 深度追问: 长期记忆成功保存后,后续的具体使用场景和机制是什么?存储在哪里?系统架构与工程化挑战● 从前端到后端,你是如何准确判断和捕获Session关闭的触发时机(特别是用户直接关闭浏览器页面的情况)的?● 在执行长期记忆的持久化时,如何保证数据库写入一定成功(例如遇到报错、需要重试时如何处理以防止记忆丢失)?● 你的项目集成了哪些MCP(Model Context Protocol)工具?ELK和Prometheus是如何协同工作的?● 你的Agent是只能被动响应用户的提问,还是能做到主动发现异常并给出提示/解决方案?● 场景题: 如果抛给你一条执行非常慢的SQL语句,你的Agent从头到尾的分析和处理链路是怎样的?AI编程工具的日常实践● 平时写代码在用什么IDE和AI模型?● 使用Cursor时,有什么最佳实践能让生成的代码更加准确?● 深度追问: 开发前的需求分析是你自己做,还是借助AI来做?● 深度追问: 在让Cursor最终修改代码前,生成的代码是以什么样的“中间态”交给你进行Review的?● 深度追问: 使用Cursor时,有没有自定义过相关的规则文件(如 .cursorrules)?
查看21道真题和解析
点赞 评论 收藏
分享
评论
8
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务