面灵AI→

字节 AI 全栈二面:八股一点都不问,全程项目 + AI 工具

轮次
二面
结果
挂
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍。
  2. 你为什么要做 AI Agent 方向?
  3. 介绍你简历里最熟悉的一个项目。
  4. 项目中有哪些和 AI 相关的地方?
  5. 你这个 Agent 平台怎么用?API 调用还是 IM 接入?
  6. 用户怎么和你这个 Agent 交互?
  7. Agent 在回答之前会做澄清反问吗?什么情况下触发?
  8. 整个问答链路是什么样的?从用户输入到最终输出中间经过哪些处理环节?
  9. 你们怎么做意图识别的?意图识别树是什么?怎么构建?
  10. 意图识别准确率怎么测?评测集怎么构建?大概多少条?
  11. 你用过 MCP 吗?MCP 工具使用有什么注意事项?
  12. 如果工具调用失败怎么办?
  13. 用户数量是多少?每天会话数是多少?
  14. 你在实验室做的是什么?
  15. 做过模型训练相关吗?做过图像分类吗?
  16. 你平时怎么用 AI 写代码?
  17. AI 生成代码能跑但逻辑烂,哪些问题必须改?
  18. 你怎么发现这些问题?有没有自动化检查手段?
  19. 如果 AI 连续三次没修好一个 Bug,你会怎么处理?
  20. 你用 Cursor 还是 Codex 还是 Claude Code?
  21. 你设计过工具调用结果缓存吗?哪些结果可缓存?
  22. 用户长期偏好怎么存储?什么数据结构?
  23. Agent 敏感信息泄露怎么防?输入过滤、输出脱敏怎么做?
  24. 系统设计:智能文档审阅 Agent,风险标注、修改建议怎么做?
  25. Java ThreadLocal 在会话管理中怎么用?内存泄漏注意什么?
  26. 意图识别模块:分类模型 vs 规则引擎?准确率怎么提升?
  27. 工具调用链路怎么设计?
  28. Skill 与 workflow 的对比?为什么把 workflow 改成 Skill?
  29. 怎样判断一个 Skill 是不是好 Skill?
  30. 手撕:反转链表。追问:线程池怎么配置?从技术层面讲,不要从业务层面讲。

《参考解析》

1. 问答链路与意图识别。 链路:接入(鉴权、限流、渠道归一)→ 前置(清洗、注入与敏感词检测)→ 会话组装(近几轮原文加摘要加长期偏好)→ 意图识别与槽位抽取 → 路由(闲聊直答、需工具走 Agent 循环、缺槽位挂起澄清)→ 工具编排执行(权限、超时、重试、结果裁剪)→ 生成与后处理(结构校验、脱敏、引用)→ 落库埋点。意图树按层级组织(业务意图、具体能力、工具或模板),构建靠聚类真实问法形成标签体系、为每个叶子写正负例,规则保高频准确、小模型或 LLM few-shot 覆盖长尾。准确率分两层测:意图级的准确率、召回率与混淆矩阵(重点盯“错路由到危险动作”的假阳性),以及链路级的端到端任务成功率;评测集按意图分布分层采样并加入难例与对抗改写,千级起步。澄清反问只在刚性槽位缺失、或置信度低且操作代价高时触发。

2. MCP 注意事项与工具调用链路。 注意点:工具名与描述是模型唯一的说明书,含糊是调用错误的第一大来源;工具数量要克制,全量塞进 prompt 既贵又容易误选,按意图做工具检索或分级暴露;写操作标注副作用并走确认或幂等;参数走 schema 校验;超时与取消显式设计。链路是注册与发现(元数据、schema、权限标签)、选择(按意图筛候选再由模型决策)、参数构造与校验、执行(沙箱或网关,带超时、并发、限流、重试)、结果归一与裁剪、审计。失败要分类处理:超时与 5xx 退避重试一到两次,限流退避更久或排队;参数错、权限不足、资源不存在是确定性失败,重试无意义,要把结构化错误回灌让模型改参数或换工具;连续失败就熔断该工具并降级,绝不静默吞错假装成功。

3. AI 生成代码必须改的问题与“三次修不好”。 典型问题:边界与异常未处理;错误被吞掉(空 catch、失败返回默认值);资源未释放;并发不安全;安全漏洞(SQL 拼接、命令注入、路径穿越、越权、敏感信息进日志);业务语义错(金额用浮点、没考虑时区、幂等键选错)。发现要分层:机器查类型检查、静态分析、依赖与密钥扫描、边界与并发用例;人读 diff 重点看错误处理、并发、事务边界与权限,并要求 AI 改前讲方案、改后列出自己不确定的地方。连续三次修不好就停止打补丁:固化最小复现、二分缩小范围、把事实与假设分开写,然后换本质不同的路径(换定位手段、换粒度、换模型或加一轮 review);仍不行就回滚或绕过并记为已知未解问题。

4. 工具结果缓存与长期偏好存储。 可缓存的判据是三条同时成立:纯读且幂等、时效可接受、调用成本高。可缓存天气、汇率、POI 与路线、公开文档检索、用户基本资料;不可缓存下单、支付、发消息这类写操作,以及库存余额等强一致数据。缓存键要含全部影响结果的参数、用户或租户维度与工具版本,值带过期时间与来源,避免串号与把过期数据当实时用。长期偏好用结构化画像而不是一段自然语言:KV 或宽表存高频小字段(语言、时区、常用地址、预算档、忌口),文档或向量库存多轮对话沉淀的偏好片段(带来源、置信度、时间戳),读取时高频字段拼进系统提示、片段按命中注入。机制上要可更新、可衰减、可溯源,新指令能覆盖旧偏好,否则错误记忆会污染后续所有会话。

5. 敏感信息防泄露与文档审阅 Agent。 按入口、过程、出口三段防:入口检测注入(含编码、分段、多语言绕过写法)与个人敏感信息并做本地脱敏;过程用结构化消息把系统提示与用户可控内容严格分隔,工具按身份最小权限鉴权,不给模型任意执行命令的能力;出口做规则脱敏(手机号掩码、卡号与身份证截断、内部 ID 与密钥过滤)并检测系统提示片段,命中就替换为拒绝话术。原则是不把系统提示当机密依赖,里面本就不该放密钥。文档审阅 Agent 的要点是“可溯源、可执行、可反馈”:解析保留章节与页码;规则引擎给确定性命中(格式、必填、术语与合规词),模型给语义级风险(逻辑矛盾、表述不清、风险条款);每条输出“位置、级别、依据”,建议给原文与建议文对照;按位置去重排序、支持逐条采纳,反馈回流成评测样本。

6. ThreadLocal 与 Skill 的取舍。 ThreadLocal 用来存一次请求内到处要用但不便一路传参的上下文(身份、租户、traceId、会话引用),入口 set、finally remove;泄漏根因是 key 是弱引用而 value 是强引用,线程池线程长期存活时 key 被回收而 value 无法释放,请求一多就 OOM,所以要 static final 持有实例、始终 remove、只放 ID(大对象进 Redis),异步之后线程会切换、应显式传上下文。Skill 是把方法、资料与工具打包成模型可读的资产、由模型运行时决定怎么用;workflow 是代码写死的确定性编排。判据是输入空间能否枚举:流程固定、合规要求强用 workflow,长尾多、需要判断与组合用 Skill,实际常混用。好 Skill 的判据是边界清楚、自包含、可验证、输入输出稳定、粒度合适、有评测集与失败样例。

7. 反转链表与线程池配置。 反转链表用三指针迭代:先存 next,再 cur.next = prev,然后 prev = cur、cur = next,返回 prev;递归版基线是空节点或单节点,长链表有栈溢出风险。线程池要讲清 corePoolSize 是常驻并发、maximumPoolSize 只是队列满后的应急扩容,所以队列必须有界(无界会让最大线程数形同虚设并最终 OOM);提交顺序是核心线程满才入队、队列满才扩容、再满走拒绝策略;线程数按任务画像定,CPU 密集型取核数加一,IO 密集型按“核数 ×(1 + 等待时间除以计算时间)”估算并靠压测校准;拒绝策略选背压或落库重试,绝不静默丢弃;线程工厂要命名线程,异常必须捕获;监控活跃线程数、队列深度、拒绝次数与任务耗时。