字节 AI 全栈二面:八股一点都不问,全程项目 + AI 工具
- 轮次
- 二面
- 结果
- 挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 你为什么要做 AI Agent 方向?
- 介绍你简历里最熟悉的一个项目。
- 项目中有哪些和 AI 相关的地方?
- 你这个 Agent 平台怎么用?API 调用还是 IM 接入?
- 用户怎么和你这个 Agent 交互?
- Agent 在回答之前会做澄清反问吗?什么情况下触发?
- 整个问答链路是什么样的?从用户输入到最终输出中间经过哪些处理环节?
- 你们怎么做意图识别的?意图识别树是什么?怎么构建?
- 意图识别准确率怎么测?评测集怎么构建?大概多少条?
- 你用过 MCP 吗?MCP 工具使用有什么注意事项?
- 如果工具调用失败怎么办?
- 用户数量是多少?每天会话数是多少?
- 你在实验室做的是什么?
- 做过模型训练相关吗?做过图像分类吗?
- 你平时怎么用 AI 写代码?
- AI 生成代码能跑但逻辑烂,哪些问题必须改?
- 你怎么发现这些问题?有没有自动化检查手段?
- 如果 AI 连续三次没修好一个 Bug,你会怎么处理?
- 你用 Cursor 还是 Codex 还是 Claude Code?
- 你设计过工具调用结果缓存吗?哪些结果可缓存?
- 用户长期偏好怎么存储?什么数据结构?
- Agent 敏感信息泄露怎么防?输入过滤、输出脱敏怎么做?
- 系统设计:智能文档审阅 Agent,风险标注、修改建议怎么做?
- Java ThreadLocal 在会话管理中怎么用?内存泄漏注意什么?
- 意图识别模块:分类模型 vs 规则引擎?准确率怎么提升?
- 工具调用链路怎么设计?
- Skill 与 workflow 的对比?为什么把 workflow 改成 Skill?
- 怎样判断一个 Skill 是不是好 Skill?
- 手撕:反转链表。追问:线程池怎么配置?从技术层面讲,不要从业务层面讲。
《参考解析》
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 + 等待时间除以计算时间)”估算并靠压测校准;拒绝策略选背压或落库重试,绝不静默丢弃;线程工厂要命名线程,异常必须捕获;监控活跃线程数、队列深度、拒绝次数与任务耗时。