面灵AI→

CVTE 应用软件开发一面+HR 面:ReAct、SSE 与网络八股

轮次
一面+HR面
时间
2026-09
来源
牛客网

《面试题目》

  1. 项目里 ReAct 的整体流程是怎样的?
  2. ReAct 和 Plan-and-Execute、Multi-Agent 有什么区别?
  3. 什么时候用 ReAct,什么时候用 Plan,什么时候用 Multi-Agent?
  4. 计算机网络里怎么实现流式输出?SSE 和 WebSocket 怎么选?
  5. SSE 的底层原理是什么,基于什么协议,怎么实现的?
  6. 在浏览器输入一个域名后发生了什么?
  7. 如果让你实现一个类似 SSE 的协议,你会怎么做?
  8. 上面这套实现里,分段传输在网络中怎么区分每个包已经结束了?
  9. 网络的拥塞控制和流量控制详细讲一下。
  10. Multi-Agent 实现一个任务,和用 ReAct 多阶段串行、按 skill 执行也能实现,两者有什么区别?
  11. 整个面试过程中你认为自己哪里不够好?
  12. 手撕:高精度加法(给出一份别人的代码,讲解思路并指出代码里的问题)。
  13. 手撕:买卖股票(贪心解法),写完后改版——不限制买入卖出次数怎么做?
  14. 之前实习有说转正吗?让你转正为什么不转正?
  15. 之前公司的工作环境不好,是什么原因?
  16. 未来 5 年打算做什么?
  17. 未来 10 年打算做什么?
  18. 怎么看待加班?
  19. 自己找工作看重什么,会考虑哪些因素?

《参考解析》

ReAct、Plan-and-Execute 与 Multi-Agent 怎么选:ReAct 是”边想边做”,每一步 Thought → Action → Observation 循环推进,适合步骤数事先不确定、必须根据工具返回动态调整的任务,代价是 token 消耗大、容易绕圈、很难做全局最优。Plan-and-Execute 先产出完整计划再逐步执行,好处是计划能被缓存、被审阅、能并行,适合流程明确可拆解的任务,弱点是首版计划错了整条链路都错,所以要配 replan 与计划校验。Multi-Agent 把不同角色或不同工具权限拆给多个独立上下文的 Agent,适合需要多视角或职责隔离的复杂任务,代价是通信开销、状态同步和成本成倍放大。工程上的判断顺序是:单步能解决的别上 Agent,步骤固定就写 workflow 或 Plan,只有步骤不确定且必须调工具时才用 ReAct,只有角色真的需要独立上下文与权限边界时才拆 Multi-Agent。面试官追问成本时,落到具体控制手段上更有说服力:最大步数、超时、重复动作检测、工具白名单、每步的成本预算。

SSE 原理与 WebSocket 的取舍:SSE 是架在 HTTP 上的单向文本流:响应头 Content-Type: text/event-stream、Cache-Control: no-cache,服务端不结束响应、持续按 data: ...\n\n 的事件块写数据,浏览器用 EventSource 解析,自带断线重连和 Last-Event-ID 续传。它的优势是”就是一个普通 HTTP 接口”——不用改协议、天然穿过大部分代理和网关、服务端实现简单;限制是单向(客户端要发消息得另开一个请求)、HTTP/1.1 下同一域名并发连接数有限(HTTP/2 多路复用可以缓解)、以及需要自己处理心跳防止中间层掐连接。WebSocket 是全双工、二进制友好、可自定义子协议,但要 upgrade 握手、自己做心跳重连与消息分片,部分 CDN 与网关支持不佳。大模型对话的需求是”服务端持续推 token、客户端只发一次请求”,SSE 完全够用且更省事;只有真正需要双向实时交互(协同编辑、实时对战)才值得上 WebSocket。

分段传输里怎么判断一条消息结束:TCP 只保证字节流有序到达,不保证写入与读取的边界对齐,所以”包”的边界必须由应用层协议自己表达,主流四种:定长、分隔符、长度前缀、自描述格式。SSE 走的是分隔符路线——空行(\n\n)表示一个事件结束,因此 payload 里不能出现裸空行,内部换行要被拆成多个 data: 行来转义。gRPC 走的是长度前缀,HTTP 分块传输用 chunk size。实现时都要维护接收缓冲区:循环解析直到剩余数据不足一条完整消息就停下等下一次可读,也就是同时处理”粘包”和”半包”。还有一个容易忽略的点是必须设单条消息上限——长度前缀如果被伪造,解析方会按声明长度申请内存,直接被一条报文打爆。

流量控制与拥塞控制:流量控制解决”别把接收方压垮”,接收方通过 TCP 头里的接收窗口 rwnd 通告自己还剩多少缓冲,发送方据此限制在途未确认数据;窗口变成 0 时会周期性发零窗口探测,避免双方互相死等。拥塞控制解决”别把网络压垮”,发送方维护拥塞窗口 cwnd:慢启动阶段指数增长到 ssthresh,之后进入拥塞避免线性增长;发现丢包(超时或重复 ACK)就收缩,经典 Reno 用快重传加快恢复把 cwnd 减半,现代实现里 CUBIC 按三次函数探测可用带宽、BBR 则直接估计带宽和最小 RTT 而不把丢包当唯一信号。两者作用点不同、最终生效的是 min(rwnd, cwnd),面试里能把”一个保护接收端缓冲、一个保护链路”这条分界讲清楚,比背状态机名字更能说明理解。

手撕题的解法要点:高精度加法给别人的代码让改,考察顺序应该是先看数据表示(字符串逐位还是数组倒序存放、进位怎么传递、有没有处理前导零、是否支持负数),再挑边界(空串、长度不等、全是 9 导致末尾进位、非法字符),最后讲怎么改而不是推翻重写——面试官看的是 review 能力。买卖股票那题,允许无限次交易时贪心是成立的:把区间收益拆成相邻两天之差,所有正差分累加就是最大利润,O(n) 一趟扫完;但”不限制次数”这个前提一旦变化(含手续费、有冷冻期、最多 k 次),贪心立刻失效,必须回到 DP 状态机——每天两个状态(持有/不持有)按天转移,约束变了就加维度。能把”贪心为什么可行、什么时候不可行、怎么退回 DP”讲清楚,比写出代码本身更得分。