互联网大厂产品工程师一面面经

《面试题目》

  1. 请做自我介绍,并介绍简历中的相关项目。
  2. 谈谈对 RAG 的理解及其完整工作流程。
  3. RAG 进行 Chunk 切分时,Top-K 应该如何选择?
  4. 如何定位一次检索失败的案例?
  5. 为什么 Top-K 不能设置得过大?
  6. 介绍一个项目中遇到的问题及解决过程。
  7. 阅读两段 Python 代码,判断输出并说明修改方式。
  8. 阅读一段模型训练代码,指出可改进之处并说明原因。
  9. 手写 LeetCode 146:LRU 缓存。

《参考解析》

  1. RAG 工作流:先对文档清洗和分块,再生成向量并建立索引;查询时完成意图处理、召回、重排和上下文拼装,最后由大模型生成答案,并通过引用或评测验证结果。
  2. Top-K 选择:应在召回率、上下文噪声、延迟和 Token 成本之间权衡,通过离线评测集比较 Recall@K、答案正确率与延迟,再结合线上反馈确定,而不是凭经验固定一个值。
  3. 检索失败定位:依次检查原始资料是否包含答案、切分是否破坏语义、Query 是否需要改写、Embedding 是否召回、Rerank 是否误排,以及最终提示词是否正确使用上下文。
  4. Top-K 过大的问题:会引入无关或互相冲突的片段,稀释关键信息,同时增加推理成本和延迟,严重时还会造成“上下文中间信息被忽略”。
  5. LRU 缓存:使用哈希表实现 O(1) 查找,双向链表维护最近使用顺序;访问或更新节点时移到链表头部,容量超限时删除尾部节点。