小红书三面后端Agent方向实习面经
《面试题目》
一、项目
- 项目经历与技术栈覆盖
- 除了简历上的两个项目之外,还开发过哪些项目?
- Demo 级项目主要做过哪些类型?
- 除 Java 外,Python、Go、前端(Vue)是否写过?掌握到什么程度?
- 深分页问题与 SQL 优化
- 描述一下之前解决过的深分页相关 bug。
- 这个分页问题是在哪个项目中遇到的?数据量大概有多少?
- 第一种优化方案是怎么做的?SQL 大概怎么写?
- 第一种方案里用于过滤的 ID 是怎么拿到的?
- 第一种方案有什么问题?
- 第二种基于上一页最后一条 ID 的分页方案是怎么做的?
- 如果前端允许用户直接输入页码跳转,没有上一页 ID,怎么处理?
- 如果分页场景伴随搜索和筛选,结果 ID 不一定递增,还能用 ID 方案处理吗?
- 如果按照商品名、价格等字段筛选,索引应该怎么建?
- 联合索引中商品名和价格字段的顺序如何确定?
- 如果只按价格区间筛选,没有商品名条件,联合索引是否还有效?这种情况怎么处理?
- 项目故障排查与异常处理
- 开发过程中遇到过什么比较奇怪的报错或故障?
- RAG 项目中大模型返回 JSON 格式异常导致链路报错,是怎么发现的?
- 大模型返回的 JSON 格式不正确,应该怎么解决?
- 对模型输出的 JSON 做过滤和修复时,一般怎么处理?
- 如果大模型没有返回正确 JSON,做降级处理有什么意义?
- 在意图识别或路由场景中,JSON 解析失败后下游如何兜底?
- 怎么尽量让大模型返回正确、稳定的 JSON?
- 除了优化 Prompt 和 Few-shot,还有哪些方案可以提升 JSON 输出稳定性?
二、八股
- OpenAI/Anthropic Chat 协议与流式输出
- Chat 协议中常用字段有哪些?
- 流式输出和普通 HTTP 一次性返回有什么区别?
- 流式接收端如何判断输出结束?
- Git
- 常用 Git 命令有哪些?
- 如果想撤销某次 commit 的代码,可以怎么做?
- Linux 排查
- Linux 机器很卡时,应该如何排查?
- 使用 top 之后,如何进一步定位问题进程?
- 如何杀掉一个进程?
- kill 和 kill -9 有什么区别?
三、算法:无
四、AI Coding:无
《参考解析》
-
深分页优化(基于游标的分页):传统
LIMIT offset, size在 offset 很大时数据库仍需扫描并丢弃前面的记录,性能急剧下降。优化思路是记录上一页最后一条数据的排序字段值(通常是自增 ID 或时间戳),下一页查询改写为WHERE id > 上页最后一个id ORDER BY id LIMIT size,利用索引直接定位起点,避免全表扫描前置数据。若业务要求支持任意页码跳转(没有上一页 ID),可以退化为先只查主键列做深分页定位、再用主键关联查详情(覆盖索引缩小扫描范围),或限制可跳转的最大页码。若查询带筛选且排序字段不连续递增,需要把筛选字段和排序字段一起纳入联合索引,按“等值列在前、范围列在后”的原则设计索引顺序(例如先按商品名等值过滤,再按价格排序/范围过滤);如果只有价格区间没有等值条件,联合索引的价格列仍可命中范围扫描,但选择性变差,可考虑单独给价格建索引或结合业务做分桶预聚合。 -
RAG 项目中大模型 JSON 输出异常的兜底:线上通过异常日志/链路追踪发现下游解析报错,定位到是大模型偶发返回非严格 JSON(多余文本、字段缺失、格式错误)。常见解决方式:一是提示词层面用 few-shot + 明确 schema 约束模型必须输出纯 JSON;二是支持 JSON Schema/Function Calling(结构化输出)从模型侧收窄格式;三是接收端做容错解析,如正则提取 JSON 片段、用宽松解析库修复常见错误(缺引号、尾逗号);四是解析失败时走降级策略——返回兜底文案或触发一次重试,而不是让整条链路报错,避免影响用户体感;在意图识别/路由等场景,下游可以设置默认路由分支兜底,保证解析失败也不至于流程中断。
-
Git 撤销某次 commit:本地未推送可用
git reset --soft/--mixed/--hard HEAD~1回退到上一个提交(soft 保留改动到暂存区,mixed 保留到工作区,hard 完全丢弃);已推送到远程且不想改写历史,则用git revert <commit>生成一个反向提交,安全且不影响他人已拉取的历史。 -
Linux 卡顿排查思路:先用
top/htop看整体 CPU、内存、负载(load average)情况,定位是 CPU 高、内存打满还是 IO 等待高;用top里的%CPU/%MEM列或ps aux --sort=-%cpu找到具体高占用进程的 PID;确认是异常进程后用kill <pid>发送 SIGTERM 请求进程优雅退出,若进程无响应或僵死则用kill -9 <pid>发送 SIGKILL 强制终止(SIGKILL 不能被进程捕获或忽略,是强制手段,可能导致资源未释放,应作为最后手段)。