小红书三面后端Agent方向实习面经

《面试题目》

一、项目

  1. 项目经历与技术栈覆盖
    1. 除了简历上的两个项目之外,还开发过哪些项目?
    2. Demo 级项目主要做过哪些类型?
    3. 除 Java 外,Python、Go、前端(Vue)是否写过?掌握到什么程度?
  2. 深分页问题与 SQL 优化
    1. 描述一下之前解决过的深分页相关 bug。
    2. 这个分页问题是在哪个项目中遇到的?数据量大概有多少?
    3. 第一种优化方案是怎么做的?SQL 大概怎么写?
    4. 第一种方案里用于过滤的 ID 是怎么拿到的?
    5. 第一种方案有什么问题?
    6. 第二种基于上一页最后一条 ID 的分页方案是怎么做的?
    7. 如果前端允许用户直接输入页码跳转,没有上一页 ID,怎么处理?
    8. 如果分页场景伴随搜索和筛选,结果 ID 不一定递增,还能用 ID 方案处理吗?
    9. 如果按照商品名、价格等字段筛选,索引应该怎么建?
    10. 联合索引中商品名和价格字段的顺序如何确定?
    11. 如果只按价格区间筛选,没有商品名条件,联合索引是否还有效?这种情况怎么处理?
  3. 项目故障排查与异常处理
    1. 开发过程中遇到过什么比较奇怪的报错或故障?
    2. RAG 项目中大模型返回 JSON 格式异常导致链路报错,是怎么发现的?
    3. 大模型返回的 JSON 格式不正确,应该怎么解决?
    4. 对模型输出的 JSON 做过滤和修复时,一般怎么处理?
    5. 如果大模型没有返回正确 JSON,做降级处理有什么意义?
    6. 在意图识别或路由场景中,JSON 解析失败后下游如何兜底?
    7. 怎么尽量让大模型返回正确、稳定的 JSON?
    8. 除了优化 Prompt 和 Few-shot,还有哪些方案可以提升 JSON 输出稳定性?

二、八股

  1. OpenAI/Anthropic Chat 协议与流式输出
    1. Chat 协议中常用字段有哪些?
    2. 流式输出和普通 HTTP 一次性返回有什么区别?
    3. 流式接收端如何判断输出结束?
  2. Git
    1. 常用 Git 命令有哪些?
    2. 如果想撤销某次 commit 的代码,可以怎么做?
  3. Linux 排查
    1. Linux 机器很卡时,应该如何排查?
    2. 使用 top 之后,如何进一步定位问题进程?
    3. 如何杀掉一个进程?
    4. kill 和 kill -9 有什么区别?

三、算法:无

四、AI Coding:无


《参考解析》

  1. 深分页优化(基于游标的分页):传统 LIMIT offset, size 在 offset 很大时数据库仍需扫描并丢弃前面的记录,性能急剧下降。优化思路是记录上一页最后一条数据的排序字段值(通常是自增 ID 或时间戳),下一页查询改写为 WHERE id > 上页最后一个id ORDER BY id LIMIT size,利用索引直接定位起点,避免全表扫描前置数据。若业务要求支持任意页码跳转(没有上一页 ID),可以退化为先只查主键列做深分页定位、再用主键关联查详情(覆盖索引缩小扫描范围),或限制可跳转的最大页码。若查询带筛选且排序字段不连续递增,需要把筛选字段和排序字段一起纳入联合索引,按“等值列在前、范围列在后”的原则设计索引顺序(例如先按商品名等值过滤,再按价格排序/范围过滤);如果只有价格区间没有等值条件,联合索引的价格列仍可命中范围扫描,但选择性变差,可考虑单独给价格建索引或结合业务做分桶预聚合。

  2. RAG 项目中大模型 JSON 输出异常的兜底:线上通过异常日志/链路追踪发现下游解析报错,定位到是大模型偶发返回非严格 JSON(多余文本、字段缺失、格式错误)。常见解决方式:一是提示词层面用 few-shot + 明确 schema 约束模型必须输出纯 JSON;二是支持 JSON Schema/Function Calling(结构化输出)从模型侧收窄格式;三是接收端做容错解析,如正则提取 JSON 片段、用宽松解析库修复常见错误(缺引号、尾逗号);四是解析失败时走降级策略——返回兜底文案或触发一次重试,而不是让整条链路报错,避免影响用户体感;在意图识别/路由等场景,下游可以设置默认路由分支兜底,保证解析失败也不至于流程中断。

  3. Git 撤销某次 commit:本地未推送可用 git reset --soft/--mixed/--hard HEAD~1 回退到上一个提交(soft 保留改动到暂存区,mixed 保留到工作区,hard 完全丢弃);已推送到远程且不想改写历史,则用 git revert <commit> 生成一个反向提交,安全且不影响他人已拉取的历史。

  4. Linux 卡顿排查思路:先用 top/htop 看整体 CPU、内存、负载(load average)情况,定位是 CPU 高、内存打满还是 IO 等待高;用 top 里的 %CPU/%MEM 列或 ps aux --sort=-%cpu 找到具体高占用进程的 PID;确认是异常进程后用 kill <pid> 发送 SIGTERM 请求进程优雅退出,若进程无响应或僵死则用 kill -9 <pid> 发送 SIGKILL 强制终止(SIGKILL 不能被进程捕获或忽略,是强制手段,可能导致资源未释放,应作为最后手段)。