水滴 AI 全栈工程师高频考点:Agent 记忆、SSE 流式与后端八股覆盖面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 完整讲一遍 RAG 或 Agent 工作流平台的整体链路,团队怎么分工,你负责哪些模块,前后端哪些是自己实现的?
- Agent Loop 的执行流程是怎样的?
- Function Calling 和 MCP 分别是什么?MCP 的 Host、Client、Server 三者怎么分工?
- Function Calling 和 MCP 的联系与差异是什么?
- Agent 的记忆怎么做?短期记忆和长期记忆分别怎么存?为什么短期选 Redis、长期选 MongoDB?
- 项目里为什么选 SSE 而不是 WebSocket?
- SSE 断开之后,后端任务还会继续跑吗?
- 断线重连、消息续传、消息去重怎么做?
- 大模型幻觉怎么缓解?多轮对话下的幻觉怎么处理?
- KV-Cache 的原理是什么?怎么降低 Token 消耗?
- ReAct、Plan-and-Execute 这类 Agent 范式各有什么特点?
- GraphRAG 和传统向量 RAG 有什么区别?各自适用什么场景、优缺点是什么?
- 多步骤 Agent 的准确率逐层下降,怎么优化?
- 子 Agent、多 Agent 的设计思路是什么?
- 进程、线程、协程有什么区别?
- Go 的 GMP 调度模型和 Work-Stealing 是怎么工作的?
- 并发与并行有什么区别?CPU 密集型和 IO 密集型任务各有什么特性?
- 虚拟内存解决什么问题?
- 多线程加锁有哪些常见问题?
- TCP 三次握手的过程是怎样的?可靠性靠什么保证?
- HTTP、SSE、WebSocket 有什么区别?
- TCP 是字节流、没有消息边界,怎么判定一个完整的 JSON 报文?
- MySQL 的聚簇索引、回表、覆盖索引分别是什么?
- B+ 树为什么适合做数据库索引?
- 事务的 ACID 是怎么保证的?
- 库存并发争抢这类场景怎么处理?
- 缓存穿透、击穿、雪崩分别是什么?怎么防?
- 布隆过滤器的原理是什么?
- Redis Stream 在流式对话场景里起什么作用?
- Kafka 消息重复消费的原因是什么?幂等怎么实现?
- Kafka 高吞吐的原理是什么?
- Rebalance 的触发条件是什么?会带来什么问题?
- Kafka 和 RabbitMQ 怎么选型?
- 异步任务场景下出现故障、宕机、文件丢失,怎么做重试、补偿和任务状态维护?
- 这套 Agent 或 RAG 方案解决什么业务痛点?
- 中间件和存储组件的选型理由是什么?
- 异步链路里的故障和数据不一致风险怎么处理?
- 用过哪些 AI 编程工具?日常写代码、排查问题怎么用?
- 怎么甄别 AI 输出的错误、做校验?
- 通用聊天机器人和 AI Agent 的产品形态有什么差异?
- 二面偏设计题:Agent 整体架构、多 Agent 协同怎么设计?Transformer 底层优化(Flash-Attention、KV-Cache)了解多少?
《参考解析》
记忆分层与存储选型:短期记忆是会话上下文、工具中间结果和最近几轮,写多读多、只在会话内有效、要毫秒级延迟,放 Redis:按 session 用 hash 或 list 组织,配 TTL 过期,会话内的消息流也可以直接用 Stream,顺带解决消费位点。长期记忆是用户偏好、稳定事实、历史结论,要可检索、可单条更新、结构随业务演进,放 MongoDB:文档结构灵活,语义字段与元数据(来源、时间、置信度)放在一个文档里,再挂向量索引做语义召回。难点不在选型而在写入策略——不能每轮都灌,要先抽取候选、与已有条目去重合并、带时间衰减与置信度;读取时按相关性过滤,否则三个月前的一句偏好会污染当前对话;还要留一条显式纠错路径。
SSE 与断线续传:SSE 单向、跑在普通 HTTP 上,天然穿过代理与现有鉴权,服务端用响应流持续推事件,浏览器自带重连;WebSocket 双向、帧开销小,但要独立升级握手、自己管连接状态、中间设备兼容性差。只推 token 和任务状态,SSE 够用。要讲清 SSE 断开不等于后端任务停止——任务得跑在独立执行体里,消息按 session 加递增序号落存储。客户端重连带 Last-Event-ID 或 seq 续传,按序号去重,缺号就补拉一次快照再走增量。两个必踩的坑:网关空闲超时会掐断长连接,要发注释行心跳;多实例部署时推送要经 Pub/Sub 广播到持有那条连接的实例。
幻觉与多步衰减:幻觉来自按概率生成、训练数据缺口、上下文不足或冲突;缓解靠检索增强、工具查询、要求引用出处和输出校验。多轮对话里更麻烦的是错误累积与上下文漂移,要做摘要压缩、把已确认事实固化成结构化状态而不是塞回自然语言历史。多步 Agent 的衰减是乘性的,单步 95% 正确十步只剩六成,所以方向不是「每步更准」而是「少依赖每步都对」:中间产物结构化并校验、关键节点用规则或检索兜底、失败即停并回滚、能并行就并行、限制总步数。ReAct 适合探索型任务,Plan-and-Execute 适合可预先规划的复杂任务,真实系统常是「先规划、执行中允许重规划」。
GraphRAG 与向量 RAG:向量 RAG 做单跳事实检索便宜好用,短板是跨文档多跳和全局性问题(「这批文档里的主要矛盾是什么」)。后者需要图:实体关系构成结构,社区摘要支持全局问答。代价是构图要跑实体关系抽取,贵且慢,抽取错误会沿图传播,增量更新也麻烦。选型看问题形态,多数业务是混合:向量保证事实准确,图补关系与全局视角。
后端八股会被追到底的点:GMP 是 G(协程)、M(内核线程)、P(逻辑处理器,默认 GOMAXPROCS)三层,每个 P 有本地队列,空了就去全局队列或别的 P 那里偷(work-stealing),M 陷入阻塞系统调用时把 P 交出去(hand-off)。字节流边界:TCP 只保证字节有序,必须自己定界,长度前缀最稳,粘包半包都靠缓冲区拼装,不能假设一次 recv 就是一个完整 JSON。缓存三兄弟:穿透是查不存在的数据,用布隆过滤器或空值缓存;击穿是热点 key 过期瞬间打库,用单飞或逻辑过期;雪崩是大量 key 同时失效或缓存层挂掉,用过期时间打散、多级缓存、熔断降级。Kafka 是至少一次语义,重复来自重试、Rebalance 位点回退、生产者重发,幂等靠业务唯一键加去重;高吞吐来自顺序写、页缓存、零拷贝、批量压缩与分区并行;Rebalance 由成员增减、订阅变化、心跳超时触发,迁移期间消费停顿。
异步链路的故障与一致性:任务要有状态机(待处理、进行中、成功、失败、超时)和幂等键,重试带退避与上限,超限进死信,再由定时任务扫超时任务做补偿;文件链路走对象存储加分片、断点续传与校验和,别把大文件塞进消息体。选型理由要落到业务约束上:吞吐、延迟、是否需要顺序、团队能否运维。