面灵AI→

测试开发岗一二三面全记录:Python、RAG 项目与质量工程 84 问

轮次
一二三面
时间
2026-10
来源
牛客网

《面试题目》

一面(节选,完整 54 问):

  1. Python 装饰器的实现原理,手写一个带参数的装饰器
  2. async/await 的底层事件循环,协程和线程的区别
  3. __init__ 与 __new__ 的区别,super 的执行逻辑
  4. 生成器与迭代器的差异,什么场景优先用生成器
  5. FastAPI 中 Pydantic 模型校验原理,mode 参数不同取值的区别
  6. RESTful API 设计规范,举几个你踩过的接口设计问题
  7. SSE 流式响应的底层原理,和 WebSocket 的差异,测试 SSE 接口怎么设计用例
  8. Flask 的 session 实现机制,session 和 JWT 怎么取舍
  9. MySQL 索引底层 B+ 树,什么场景索引会失效(至少 4 种)
  10. 讲一个你做过的索引优化完整案例,慢查询排查的完整步骤
  11. Redis 常用数据结构,什么场景会出现大 key,大 key 有什么风险
  12. Git 工作流,merge 和 rebase 的区别,冲突处理策略
  13. Docker Compose 的服务依赖启动问题,depends_on 的局限性如何解决
  14. Linux 下排查服务 CPU 高、内存泄漏的常用命令
  15. pytest fixture 的 scope 有哪些,fixture 之间如何依赖,conftest 的作用
  16. 什么是集成测试,单元测试与集成测试的边界怎么划分
  17. 故障注入的概念,你做故障注入验证异常重试链路时设计了哪些故障点
  18. 评测集构建的原则,怎么避免数据泄露,评测抖动怎么处理
  19. 准确率、召回率的定义,Recall@5 的含义,什么场景优先关注 Recall
  20. 接口自动化中遇到偶现失败,你的排查思路
  21. 如何设计接口的异常、边界、幂等性测试用例
  22. 多知识库隔离除知识库 ID 过滤外,还有哪些潜在权限漏洞
  23. 文档异步解析任务,后台解析进程崩溃后任务状态如何保证一致性
  24. 文档切片策略:用什么切分器、大小怎么定,切大切小分别有什么问题
  25. 向量召回 Top20 再 Reranker 取 Top5,为什么不直接召回 Top5?优劣分析
  26. Redis 缓存高频问答的 key 怎么设计、失效策略,如何处理击穿、穿透、雪崩
  27. 答案溯源的元信息(页码、文件名)丢失会是什么原因,如何测试校验完整性
  28. 评测集 Recall@5 达到 100%,这个指标的局限性与发现不了的问题
  29. 端到端 P95、P50 怎么采集统计,并发上涨时哪些环节会成为瓶颈
  30. 该 RAG 系统如果做完整自动化测试套件,你会设计哪些测试类型
  31. LangGraph 状态图 7 节点、3 组条件边,请描述完整状态流转
  32. SQL 安全校验的 6 道闸门,剥离字面量与注释依靠 SQL 骨架串判断有什么绕过风险
  33. 字段扰动注入制造 1054 异常怎么做的,还会设计哪些数据库异常做重试链路测试
  34. 双重回炉重试的重试次数上限如何控制,什么条件停止重试防止死循环
  35. 双执行路径(大模型路径与本地规则引擎路径)结果不一致时如何校验
  36. Prompt 迭代从 v1 到 v2 正确率从 52.78% 到 100%,改了哪些点,怎么排除随机种子干扰
  37. Function Calling 调用失败有哪些情况,Agent 工具调用如何设计测试用例
  38. 36 道评测集 6 种题型,怎么保证样本分布合理,会不会过拟合评测集
  39. 116 个 pytest 用例哪些属于单元、哪些属于集成,怎么隔离数据库依赖
  40. Flask-Bcrypt 加密密码的加盐逻辑,能否通过彩虹表攻击,为什么
  41. 大文件分片上传的分片校验、断点续传怎么设计,对应测试点有哪些
  42. 本地缓存与 Redis 分布式缓存的区别,多实例部署本地缓存会带来什么问题
  43. 针对 RAG 系统你会设计哪些测试 case 识别幻觉问题
  44. Milvus 向量库插入、检索异常场景如何做容错测试
  45. 如何设计评测方式评估 Reranker 的效果好坏
  46. 大模型 API 调用超时、限流,系统层面怎么处理,如何自动化模拟限流做测试
  47. 测试开发和后端开发你怎么定位,为什么投测试开发岗
  48. 如果交给你一个 AI 大模型应用,需要搭建整套自动化测试与评测体系,你的整体方案框架是什么
  49. CI 流程中如何把 pytest 用例、评测集自动评测嵌入流水线
  50. 项目上线前你会输出哪些质量指标来评估发布风险

二面(技术总主管面,节选): 51. RAG 系统并发上来后 Milvus 检索、大模型调用、文档解析分别成为瓶颈,从测试侧如何定位、会设计哪些性能测试场景 52. Text-to-SQL Agent 线上偶现生成错误 SQL,但离线评测集全部通过,请分析根因并改进评测体系 53. 讲讲你理解的测试左移,结合两个个人项目谈如何落地 54. 容器化服务在测试环境会遇到哪些环境一致性问题 55. 接口幂等测试如何自动化构造重复请求 56. 如何把故障注入变成自动化测试用例 57. LangChain 组件版本升级,如何设计回归测试保证 RAG 系统不退化 58. 向量数据库脏数据会对 RAG 结果造成什么影响,如何自动化检测脏向量 59. 如何区分 bug 属于大模型本身、prompt 问题、检索召回问题还是业务代码问题 60. 从零搭建 AI 应用自动化评测平台,说出核心模块 61. MySQL 慢 SQL 除索引外还有哪些因素影响查询性能,如何自动化检测慢 SQL 62. SSE 流式输出的自动化测试如何校验输出流完整性与中断场景 63. 多服务 Docker Compose 部署时网络、端口冲突,测试环境怎么规避

《参考解析》

评测集与指标这一组是全场技术含量最高的部分,答题要落在「统计口径」上。 Recall@5 只衡量「前 5 条里有没有正确文档」,它不关心顺序、不关心答案质量、也不关心拒答:如果每道题的正确答案都能被检索到,Recall@5 就是 100%,但生成阶段照样可以答错,或者把不相关内容排在第一导致模型被带偏。所以 100% 的 Recall 必须搭配别的指标才有意义——MRR/NDCG 看排序质量、精确率或 Context Precision 看噪声、答案正确率与「有依据回答率」看端到端效果、拒答准确率看幻象治理。评测抖动(同一版本多次运行结果不同)的处理:固定随机种子与温度(尽量降到 0)、对同一题目多次采样取稳定统计而不是单次判定、用配对对比(同一批样本上新旧版本各跑一遍)而不是跨批次比较、以及给指标加置信区间,别把 1% 的波动当成改进。数据泄露要防的是评测题出现在训练/微调语料中,做法是从真实流量里切分并保留留出集、对微调数据与评测集做去重。

「离线全绿、线上出错」这类题,根因分析有一条标准路径。 先确认现象:线上错误 SQL 的样本、频率、是否集中在某些库表或某些问法。然后按「训练/评测分布 vs 线上分布」的差异查四件事:① 评测集覆盖不到(题型、表结构复杂度、口语化程度、多轮上下文、时间相关问法);② 数据漂移(线上库表加了字段/改了枚举值,评测集还是旧 schema);③ 上下文不同(线上带历史对话与用户术语,评测是单轮干净输入);④ 非确定性(离线跑一次通过不代表稳定通过,要重复跑看方差)。改进方向:把线上失败样本回流进评测集并分层(按表数量、join 深度、聚合复杂度),加结构断言(SQL 是否只读、是否命中允许的表、是否带 limit)而不只比结果集,引入影子执行/双跑对比来提前发现问题,以及上线前用「留出集 + 对抗集」双门禁。

RAG 系统的自动化测试套件可以按「数据、检索、生成、性能、安全」五层设计。 数据层:多格式解析正确性、切片边界、元信息完整性、幂等重建;检索层:召回率/排序指标回归、权限过滤(越权用例必须有)、TopK 与阈值的敏感度;生成层:答案正确性与有依据率、引用可溯源、拒答行为、对冲突证据的处理;性能层:端到端 P50/P95、并发下的瓶颈定位(要能分辨是检索还是模型调用拖慢——按阶段埋点分段计时,再做压测分别施压);安全与鲁棒层:提示词注入、超长输入、敏感信息泄露、脏向量(用错误 embedding 或未清洗文本注入,看系统是否给出无依据答案并建立脏数据检测任务——比如定期跑「答案与证据一致性」抽样审计)。权限漏洞这一问要主动补:仅靠知识库 ID 过滤不够,还要防「同一知识库内部的文档级权限」(部门/密级)、向量与原文的权限一致性(改了原文权限要同步重建索引)、以及检索接口的越权访问(用户可伪造 kb_id 参数);正确做法是在检索前用服务端可信身份拼过滤条件,而不是信任客户端传参。

AI 应用的评测平台核心模块可以答成六块:① 数据集管理(版本化、分层、留出集);② 被测系统接入(统一的调用适配层,支持模型/prompt/工具集切换);③ 评测执行(批量跑、并发控制、重试与超时、成本统计);④ 判定层(确定性断言 + 模型裁判 + 人工抽检三档,并记录判定置信度);⑤ 指标与报表(按题型/业务线/版本对比,带置信区间与失败样本下钻);⑥ 回归门禁与告警(接 CI,指标退化即阻断发布,线上灰度对比)。要强调的判据:模型裁判必须抽查校准(人评一致性低于阈值就不能当发布门),以及评测要版本化,否则「上次是多少」都说不清。Python 那几问的要点:装饰器是「接收函数返回函数」的高阶函数,带参数的装饰器多一层闭包(def deco(arg): def wrapper(f): ...),要配 functools.wraps 保留元信息;__new__ 创建实例(在 __init__ 之前,必须返回实例),__init__ 初始化,super() 按 MRO 顺序查找下一个类,在 __init__ 里用 super() 能保证父类只被初始化一次;生成器是「函数里带 yield」的惰性序列(用 send/throw/close 与调用方双向交互),迭代器是实现 __iter__/__next__ 的对象,需要惰性求值、处理大文件或无限序列时优先用生成器,因为它是边算边产出、不占内存。