字节数据中台 Agent 全栈面经:一面二面与手撕题
- 轮次
- 一面、二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 拷打两个实习项目(约 20 分钟)。
- 实现一个通用智能体要考虑哪些功能点?
- HTTPS 的端到端链路是怎样的?
- 手撕:二叉树的右视图。
- 拷打一个实习项目(约 37 分钟)。
- 手撕:前缀树。
- 前缀树的应用场景有哪些?
- 应用层、传输层的职责分别是什么?
- 从浏览器请求到服务机房的全链路是怎样的?
- 什么情况下会把某个能力做成 Skill?什么时候做成 Tool?实习当中遇到过这样的问题吗?
- LangChain、LangGraph 的区别?
- 除 ReAct 还有别的模型交互模式吗?
- SSE 底层实现原理是什么?
《参考解析》
通用智能体要考虑哪些功能点
按一条请求的生命周期拆:模型接入与路由(多模型、降级、配额)、上下文工程(system prompt、历史裁剪、检索、记忆的读写与遗忘)、工具层(注册表、参数 schema、权限、超时、幂等、结果裁剪)、循环调度(步数预算、终止条件、并行与串行)、状态与恢复(状态机、checkpoint、断点续跑)、可观测(trace、token 与成本、失败率)、评测与回归(用例集、灰度)、安全(沙箱、prompt 注入防护、写操作审批)、多租户与限流。能把这条链路讲完,比罗列「有工具、有记忆」高一个层次。
HTTPS 端到端链路
DNS 拿到 IP 后先做 TCP 三次握手,再做 TLS 握手。TLS 1.3 是 1-RTT:客户端 ClientHello 里直接带上 key_share,服务端 ServerHello 选定参数并携带证书与 Finished,客户端校验证书后发 Finished,之后就是加密的 HTTP 报文。证书校验的要点:用本地信任库里的根 CA 逐级验签,校验证书有效期、SAN 里的域名匹配、EKU 是否允许 serverAuth,查吊销状态(CRL 或 OCSP,实际多用 OCSP stapling),最后用证书公钥验证握手签名。TLS 1.2 需要 2-RTT,会话复用靠 session ticket。
应用层与传输层的职责
传输层负责端到端的数据搬运:TCP 提供面向连接、可靠有序、带流量控制与拥塞控制的字节流,UDP 提供无连接、不保证可靠的数据报;它还负责端口复用和差错校验。应用层定义报文的语义与交互规则:HTTP 的方法、状态码、头字段与缓存语义,DNS 的查询与记录类型,SSE、WebSocket 的帧与事件格式。常见的表述错误是「TLS 属于传输层」——它是介于应用层与传输层之间的安全子层。
从浏览器到机房的完整链路
URL 解析 → 查缓存(浏览器、系统、Hosts)→ DNS 递归解析(本地 DNS → 根 → TLD → 权威)→ 拿到 IP 后经 ARP 与网关出网 → TCP 握手 → TLS 握手 → 发 HTTP 请求。请求可能先落到 CDN 边缘节点,回源时进四层负载(LVS/ECMP,按 IP 加端口转发)→ 七层网关(Nginx/Envoy,按 Host、Path、Header、Cookie 做路由、限流、鉴权、灰度)→ 应用服务 → 服务间 RPC(服务发现、序列化、超时重试、熔断)→ 缓存与数据库。回答时把「哪一层能做什么决策」讲清楚,比单纯背名词更得分。
前缀树与它的应用
前缀树(Trie)每个节点代表一个前缀,边上是字符,插入与查询复杂度都是 O(L)(L 为串长),与词表规模无关。应用场景:搜索框联想与自动补全、IP 路由的最长前缀匹配、敏感词过滤(配合 AC 自动机做多模式匹配)、拼写检查与词频统计、字符串去重与前缀统计。手撕要点:子节点用数组(字符集小时省内存)或哈希表(Unicode 时);节点带 isEnd 标记;查询要区分「前缀存在」和「完整单词存在」;删除时回溯剪掉没有子节点且非结尾的节点。如果要省内存,可以提压缩 Trie(Radix Tree)或双数组 Trie。
Skill 与 Tool 怎么选
Tool 是原子能力:一个函数、入参出参明确、无状态、最好幂等,比如「查订单」「发消息」。Skill 是带流程的封装:一次多步工具编排加领域知识,还带约束、示例和验收标准,比如「退款处理」要先查订单、判规则、再发起退款并回查。判断依据是这段逻辑能不能被枚举成稳定的多步流程、是否需要额外上下文、复用边界和维护者是谁。把可枚举的流程固化成 Skill,既减少模型自由发挥的空间,也便于单独评测和迭代。
ReAct 之外的交互模式
Plan-and-Execute 先产出一份计划再逐步执行,步数少、方向稳;Reflexion 让模型对自己的失败做反思并重试;Router/Dispatch 先用一个分类器把请求分派给专用子流程;Planner-Worker-Critic 用多角色分工互相校验;Code-as-Action 让模型直接写代码调工具,把多次工具调用压缩成一次执行。ReAct 的优点是通用、无需预定义流程,缺点是步数多、成本高、容易绕圈,所以生产上常见的是「Router 加 Plan 加局部 ReAct」的组合。
SSE 底层实现原理
SSE 就是一条不关闭的 HTTP 响应:服务端返回 Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive,然后持续往响应体里写文本帧。帧格式是若干 field: value 行加一个空行结尾,字段有 data(数据)、event(事件名)、id(事件 id,用于断线重连时带 Last-Event-ID)、retry(重连间隔)。服务端必须每次 write 后 flush,否则会被缓冲住。实践中的坑:中间层(Nginx、CDN、网关)会掐掉长时间无字节流动的连接,所以要定期发注释行(以 : 开头的空事件)当心跳;浏览器原生 EventSource 不支持自定义请求头、只能 GET,需要带鉴权头时用 fetch 加 ReadableStream 自己解析。HTTP/2 下 SSE 走多路复用,不受单域名连接数限制。