互联网大厂产品工程师一面面经
《面试题目》
- 请做自我介绍,并介绍简历中的相关项目。
- 谈谈对 RAG 的理解及其完整工作流程。
- RAG 进行 Chunk 切分时,Top-K 应该如何选择?
- 如何定位一次检索失败的案例?
- 为什么 Top-K 不能设置得过大?
- 介绍一个项目中遇到的问题及解决过程。
- 阅读两段 Python 代码,判断输出并说明修改方式。
- 阅读一段模型训练代码,指出可改进之处并说明原因。
- 手写 LeetCode 146:LRU 缓存。
《参考解析》
- RAG 工作流:先对文档清洗和分块,再生成向量并建立索引;查询时完成意图处理、召回、重排和上下文拼装,最后由大模型生成答案,并通过引用或评测验证结果。
- Top-K 选择:应在召回率、上下文噪声、延迟和 Token 成本之间权衡,通过离线评测集比较 Recall@K、答案正确率与延迟,再结合线上反馈确定,而不是凭经验固定一个值。
- 检索失败定位:依次检查原始资料是否包含答案、切分是否破坏语义、Query 是否需要改写、Embedding 是否召回、Rerank 是否误排,以及最终提示词是否正确使用上下文。
- Top-K 过大的问题:会引入无关或互相冲突的片段,稀释关键信息,同时增加推理成本和延迟,严重时还会造成“上下文中间信息被忽略”。
- LRU 缓存:使用哈希表实现 O(1) 查找,双向链表维护最近使用顺序;访问或更新节点时移到链表头部,容量超限时删除尾部节点。