大模型实习模拟面试之快手AI Agent开发实习生一面:RAG、限流算法与MySQL深度追问全解析
大模型实习模拟面试之快手AI Agent开发实习生一面RAG、限流算法与MySQL深度追问全解析摘要本文以高度还原的方式模拟了2026年快手AI Agent开发实习生岗位的一轮技术面试全过程。内容涵盖RAG检索增强生成系统设计、分布式限流算法令牌桶/漏桶/滑动窗口、缓存淘汰策略LRU、布隆过滤器、MySQL索引失效、事务隔离级别、MVCC机制及锁机制等核心知识点并附带一道经典算法题“反转链表”的手撕过程。全文采用“面试官提问 候选人口头回答 连环追问”形式力求真实、深入、结构清晰适合准备大模型/AI工程/后端开发方向实习或校招的同学参考。一、前言为什么这场面试值得复盘随着大模型LLM和AI Agent技术的爆发式发展越来越多头部公司如字节、快手、阿里、腾讯开始招聘具备“AI工程化能力”的实习生——不仅要懂模型更要能构建稳定、高效、可扩展的系统。快手作为短视频领域的巨头其AI Agent团队聚焦于将大模型能力落地到搜索、推荐、客服等实际业务场景中对候选人的系统设计能力 底层原理理解 工程实现细节要求极高。本次模拟面试基于真实面经整理全程约50分钟问题层层递进既有对项目细节的深挖也有对基础组件的原理考察最后还有一道算法题收尾。我们将以第一人称视角还原我在面试中的思考与回答并穿插专业解释和延伸思考帮助读者不仅“知道答案”更“理解为什么”。二、项目深挖RAG系统设计与上下文工程面试官提问“先聊聊你实习期间做的项目吧重点讲一下RAG部分。”我的回答好的我实习期间主要参与了一个基于RAGRetrieval-Augmented Generation的智能问答系统开发目标是让大模型能基于公司内部知识库如产品文档、FAQ、用户手册生成准确、可信的回答。整体流程是用户输入一个问题 → 系统对问题进行向量化 → 在向量数据库中做近似最近邻ANN检索 → 获取Top-K相关文本块 → 将这些文本块拼接到Prompt中 → 送入大模型生成最终答案。但我们在实践中发现单纯依赖向量相似度比如用Sentence-BERT或text-embedding-ada-002存在两个问题语义漂移有些问题虽然语义相近但关键词缺失导致向量检索召回不到关键文档长尾覆盖不足对于专业术语或冷门问题向量模型泛化能力有限。所以我们引入了混合检索策略同时使用稠密向量检索Dense Retrieval和稀疏关键词检索Sparse Retrieval也就是BM25。面试官追问“为什么引入父子索引为什么引入BM25两者的比例是怎么定的具体流程是什么有没有做rerank”我的回答好我一个个回答。首先父子索引Parent-Child Indexing我们知识库的文档结构是有层级的比如一篇“用户协议”可能包含多个章节如“注册条款”、“隐私政策”、“退款规则”。如果直接把整篇文档切块会导致检索粒度太粗返回整篇协议但用户只问“如何退款”上下文冗余大模型输入长度有限塞太多无关内容影响效果。所以我们采用父子结构子块Child Chunk按固定长度比如512 tokens切分用于向量检索父块Parent Chunk对应原始段落或章节保留完整语义。检索时先用子块做ANN/BM25召回然后聚合到父块再从父块中提取最相关的子块组合成上下文。这样既保证检索精度又保留上下文完整性。其次为什么引入BM25BM25是一种经典的基于词频的稀疏检索算法对关键词匹配非常敏感。比如用户问“如何重置密码”即使向量模型没学过“重置”这个词只要文档里有“密码”“重置”“找回”等词BM25就能召回。我们发现在实体类、操作类问题上BM25表现远优于纯向量检索。而向量检索在语义泛化、同义替换上更强。两者互补。比例设定我们做了A/B测试。初始各取Top-20合并去重后取Top-30作为候选集。后来通过线上指标如答案准确率、用户点击率调优最终确定向量:BM25 6:4。这个比例在我们的数据集上效果最好。具体流程用户Query → 同时送入向量编码器和分词器向量检索FAISS/HNSW索引召回Top-20子块BM25检索Elasticsearch或自建倒排索引召回Top-20子块合并去重按父块ID去重得到最多40个候选进入Rerank阶段。是的我们做了Rerank。因为初始召回的Top-K可能存在噪声尤其是BM25可能召回高词频但低相关性的文档比如“密码”出现在“安全白皮书”里但和用户问题无关。所以我们用一个Cross-Encoder模型比如MiniLM-L6-v2对候选块做精细打分重新排序。面试官追问“Rerank后返回几个块有没有做一些验证”我的回答Rerank后我们通常返回Top-5个父块对应的子块集合。但不是简单取前5个子块而是对每个父块取其内部得分最高的1~2个子块总token数控制在2048以内避免超过LLM上下文窗口。关于验证我们做了三方面工作离线评估构建了500条人工标注的Query-Answer-GroundTruth三元组计算Recall5、MRRMean Reciprocal Rank等指标引入Rerank后Recall5从72%提升到86%。在线AB实验对照组无Rerank实验组有Rerank核心指标答案有用率用户是否点击“有用”、会话完成率结果有用率提升12%且bad case减少明显。Bad Case分析发现某些技术术语如“CDN回源”因训练数据少Cross-Encoder打分不准解决方案对高频bad query加入规则兜底或微调Reranker。面试官追问“Rerank后的Top-K截断是怎么做的为什么是这个值有没有其他方案”我的回答我们最终输入给LLM的上下文是动态截断的不是固定K。具体策略先按Rerank分数降序排列所有候选子块依次累加token数直到接近LLM最大上下文比如3072预留1024给prompt和生成如果某个父块跨多个子块优先保留完整父块避免语义断裂。为什么不是固定K5因为不同Query需要的信息量不同。比如“公司成立时间”只需1个句子而“如何配置直播推流参数”可能需要多个步骤说明。固定K要么浪费token要么信息不足。其他方案我们也考虑过基于重要性加权截断用NER识别关键实体优先保留含实体的块层次化摘要对长父块先做摘要再拼接但增加延迟LLM-guided retrieval让LLM自己决定需要哪些信息成本高未上线。最终选择token-based动态截断因其简单、高效、效果稳定。面试官追问“讲一下上下文工程Context Engineering记忆是怎么做的”我的回答“上下文工程”在这里主要指如何构造Prompt中的上下文部分使其既能提供足够信息又不干扰模型生成。我们的做法包括结构化拼接[知识库] 文档1: {chunk1} 文档2: {chunk2} ... [用户问题]: {query} [指令]: 请基于以上文档回答不要编造。明确区分知识来源和用户意图。元信息注入在每个chunk前加上来源如“来自《用户手册》第3章”增强可信度。冲突检测如果多个chunk对同一事实说法矛盾比如版本A说“支持iOS 12”版本B说“仅支持iOS 14”我们会优先取最新版本或在Prompt中提示“存在多个版本请说明差异”。关于记忆Memory我们当前系统是无状态的即每次Query独立处理不保存历史。但在规划中我们考虑引入短期对话记忆用Redis缓存最近3轮对话提取关键实体如“订单ID: 12345”作为上下文通过“记忆压缩”Memory Compression技术用LLM总结历史意图。不过出于隐私和一致性考虑长期记忆暂未启用。三、后端项目与限流算法面试官提问“你提到还做了后端项目能讲讲吗”我的回答是的除了RAG我还参与开发了一个高并发API网关负责鉴权、限流、日志收集等。其中限流模块是我重点负责的。我们面临的问题是大促期间QPS可能突增10倍必须保护后端服务不被压垮。我们实现了三种限流算法并支持动态切换。面试官追问“分布式令牌桶限流讲一下漏桶讲一下滑动窗口算法限流讲一下。”我的回答好的这三种都是经典限流算法各有适用场景。1. 分布式令牌桶Token Bucket原理系统以固定速率r tokens/sec向桶中添加令牌桶容量为b。每次请求需消耗1个令牌若桶空则拒绝。优点允许突发流量只要桶里有令牌适合应对短时高峰。分布式实现用Redis的INCREXPIRE模拟。但要注意原子性需用Lua脚本localratetonumber(ARGV[1])-- 令牌生成速率localcapacitytonumber(ARGV[2])localnowtonumber(ARGV[3])localkeyKEYS[1]redis.call(SET,key,capacity,NX,EX,1)localtokenstonumber(redis.call(GET,key)orcapacity)locallast_timetonumber(redis.call(GET,key..:time)ornow)-- 补充令牌localadd_tokensmath.floor((now-last_time)*rate)tokensmath.min(capacity,tokensadd_tokens)iftokens0thenredis.call(SET,key,tokens-1)redis.call(SET,key..:time,now)return1-- 允许elsereturn0-- 拒绝end2. 漏桶Leaky Bucket原理请求进入固定容量的桶以恒定速率流出。若桶满则丢弃新请求。特点平滑输出不允许突发适合保护下游严格限速的服务。与令牌桶区别令牌桶限制“入口速率”漏桶限制“出口速率”。3. 滑动窗口Sliding Window Log原理记录每个请求的时间戳统计当前窗口内如1秒的请求数。若超限则拒绝。优点比固定窗口如每秒计数更平滑避免“边界效应”如0.9s1.0s有100请求1.0s1.1s又有100实际0.9~1.1共200但固定窗口认为合规。缺点内存占用高需存所有时间戳。面试官追问“如果用滑动窗口结构体会包含什么字段滑动窗口和令牌桶相比有什么缺点用Redis的什么数据结构实现”我的回答滑动窗口结构体伪代码typeSlidingWindowstruct{WindowSizeint64// 窗口大小如1000msMaxCountint// 最大请求数Requests[]int64// 时间戳列表有序Mutex sync.RWMutex}实际工程中Requests可用环形缓冲区优化。滑动窗口 vs 令牌桶的缺点内存开销大需存储每个请求时间戳高并发下内存爆炸清理成本高需定期删除过期时间戳可用后台goroutine无法应对突发严格按窗口计数不像令牌桶可积累令牌应对突发。Redis实现通常用Sorted SetZSetmember 请求ID或随机UUIDscore 时间戳毫秒每次请求ZREMRANGEBYSCORE key 0 (now - window)ZCARD key若 max则ZADD key now uuid但注意ZSet在大量元素时性能下降适合中小规模限流。四、数据结构与缓存面试官提问“你项目里用了LRU讲一下。”我的回答LRULeast Recently Used是一种缓存淘汰策略核心思想是最近最少使用的数据最可能不再被使用。实现方式用哈希表 双向链表哈希表O(1)查找双向链表维护访问顺序头为最新尾为最旧。操作Get(key)若存在移到链表头Put(key, value)若存在更新并移头否则插入头若超容则删尾。在项目中的应用我们用LRU缓存Reranker的输入输出对Query Chunks → Score因为相同Query重复率较高。缓存命中率约65%显著降低Reranker负载。面试官提问“布隆过滤器讲一下。”我的回答布隆过滤器Bloom Filter是一种空间效率极高的概率型数据结构用于判断“一个元素是否在集合中”。原理初始化一个m位的bit数组全0定义k个独立哈希函数插入元素x计算k个hash值将对应bit置1查询元素x若所有k个bit均为1则“可能存在”若任一为0则“一定不存在”。特点无假阴性False Negative存在的元素一定能查到有假阳性False Positive不存在的元素可能误判为存在不可删除标准版因为bit可能被多个元素共享。应用场景缓存穿透防护先查Bloom Filter若不存在则直接返回避免查DB爬虫URL去重垃圾邮件过滤。参数设计假阳性率 p ≈ (1 - e(-kn/m))k给定n元素数和p可计算最优m和k。五、MySQL深度拷问面试官提问“索引失效的情况有哪些LIKE会不会失效”我的回答索引失效常见情况对字段使用函数或表达式WHERE YEAR(create_time) 2025→ 索引失效应改为create_time BETWEEN 2025-01-01 AND 2025-12-31。类型隐式转换user_id是VARCHAR但查询用WHERE user_id 123→ MySQL转为字符串比较索引失效。前导模糊查询WHERE name LIKE %张%→ 索引失效但LIKE 张%可以走索引。OR条件未全覆盖索引WHERE a1 OR b2若只有a有索引则b2部分失效。NOT IN / !通常全表扫描。LIKE会不会失效看情况LIKE 张%可以使用索引最左前缀匹配LIKE %张或LIKE %张%失效因为无法利用B树有序性。例外MySQL 8.0 支持函数索引Functional Index可对REVERSE(name)建索引从而优化后缀匹配但一般不推荐。面试官提问“MySQL事务隔离级别讲一下。”我的回答MySQL InnoDB支持四种隔离级别由低到高隔离级别脏读不可重复读幻读读未提交Read Uncommitted✅✅✅读已提交Read Committed❌✅✅可重复读Repeatable Read❌❌⚠️InnoDB通过MVCCGap Lock解决串行化Serializable❌❌❌默认是RRRepeatable Read。脏读读到未提交的数据不可重复读同一事务内两次读同一行结果不同被UPDATE幻读同一事务内两次范围查询结果集行数不同被INSERT/DELETE。面试官追问“MVCC细说详细追问问你这种情况会创建几个ReadView”我的回答MVCCMulti-Version Concurrency Control是InnoDB实现非阻塞读的核心机制。核心组件隐藏字段DB_TRX_ID最后一次修改该行的事务IDDB_ROLL_PTR指向Undo Log用于构建历史版本。ReadView事务开启时创建的“一致性视图”包含m_ids当前活跃事务ID列表min_trx_idm_ids中最小值max_trx_id下一个将分配的事务IDcreator_trx_id创建该ReadView的事务ID。可见性规则对某行若DB_TRX_ID creator_trx_id→ 自己修改的可见若DB_TRX_ID min_trx_id→ 修改发生在ReadView创建前且已提交可见若DB_TRX_ID max_trx_id→ 修改发生在ReadView创建后不可见若DB_TRX_ID ∈ [min_trx_id, max_trx_id)→ 检查是否在m_ids中在 → 未提交不可见不在 → 已提交可见。关于ReadView创建时机RC级别每次SELECT都创建新ReadViewRR级别事务中第一个SELECT创建ReadView后续复用。举例事务T1trx_id100执行BEGIN;SELECT*FROMt;-- 创建ReadView RV1-- 此时T2trx_id101UPDATE并COMMITSELECT*FROMt;-- 复用RV1仍看不到T2修改可重复读所以整个事务只创建1个ReadView。如果是RC级别则两次SELECT会创建2个ReadView第二次能看到T2的修改。面试官提问“MySQL锁讲一下。”我的回答InnoDB的锁体系复杂按维度可分为1. 按粒度行锁Record Lock锁索引记录间隙锁Gap Lock锁索引记录间的间隙防止幻读临键锁Next-Key Lock行锁 间隙锁是InnoDB默认的锁类型RR级别。2. 按模式共享锁S Lock读锁兼容其他S锁排他锁X Lock写锁不兼容任何锁。3. 意向锁Intention Lock表级锁表示“事务打算在表中加行锁”IS意向共享、IX意向排他作用快速判断表是否可加表锁。4. 自增锁AUTO-INC Lock早期版本用表锁8.0后优化为轻量级互斥量。死锁检测InnoDB有死锁检测机制发现死锁后回滚undo量小的事务。六、算法手撕反转链表面试官“写一个反转链表的函数。”我的回答边写边解释好的我用Python写假设链表节点定义如下classListNode:def__init__(self,val0,nextNone):self.valval self.nextnext方法一迭代法推荐空间O(1)defreverseList(head:ListNode)-ListNode:prevNonecurrheadwhilecurr:next_tempcurr.next# 保存下一个节点curr.nextprev# 反转指针prevcurr# prev前移currnext_temp# curr前移returnprev# 新头节点思路用三个指针prev, curr, next逐步反转。方法二递归法defreverseList(head:ListNode)-ListNode:ifnotheadornothead.next:returnhead new_headreverseList(head.next)head.next.nexthead# 反转当前连接head.nextNone# 防止环returnnew_head注意递归深度可能栈溢出生产环境慎用。测试用例空链表 → 返回None单节点 → 返回自身多节点 → 正常反转。七、总结与建议面试复盘这场面试充分体现了快手AI Agent团队对工程深度的要求RAG不是调包要理解混合检索、rerank、上下文构造的trade-off限流不是配置要能手写分布式算法权衡内存/精度/突发MySQL不是CRUDMVCC、锁、索引失效是必考点算法是基本功反转链表虽简单但考察代码规范与边界处理。给读者的建议项目深挖准备对简历上的每个技术点准备“为什么选它有没有对比方案指标如何”原理 框架面试官更关心你是否理解底层而非是否会用LangChain动手写代码限流、LRU、链表等务必能白板写出关注AI工程化RAG、Agent Memory、Prompt Engineering是当前热点。

相关新闻

CCMusic音乐分析平台:从原理到实战全解析

CCMusic音乐分析平台:从原理到实战全解析

CCMusic音乐分析平台:从原理到实战全解析 你是否好奇,AI是如何“听懂”音乐的?当我们将一首歌上传到音乐平台,它总能精准地推荐相似风格的歌曲,这背后不仅仅是简单的标签匹配。今天,我们将深入解析一个名为…

2026/7/4 19:06:07 阅读更多 →
智慧校园建设中的跨部门协作:如何实现高效组织协调?

智慧校园建设中的跨部门协作:如何实现高效组织协调?

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/7/3 16:50:49 阅读更多 →
kafka下载和安装

kafka下载和安装

kafka下载安装:官网下载二进制压缩包到windows本地:本地上传到linux服务器,解压安装:kafka的运行:kafka目录介绍:

2026/7/4 21:39:25 阅读更多 →

最新新闻

Qwen3.5全面升级:解耦架构与认知蒸馏驱动的企业级AI落地

Qwen3.5全面升级:解耦架构与认知蒸馏驱动的企业级AI落地

1. 项目概述:这不是一次常规迭代,而是一次底层能力的重新校准“Qwen3.5发布:通义千问系列的最新突破与全面升级”——这个标题里藏着一个容易被忽略但极其关键的信号:“全面升级”不是功能点的简单堆叠,而是模型架构、…

2026/7/4 22:22:31 阅读更多 →
LongDocURL:面向长文档理解的大模型多模态推理评测基准

LongDocURL:面向长文档理解的大模型多模态推理评测基准

1. 这不是又一个“刷分”评测集,而是一次对长文档理解能力的硬核压力测试你有没有试过让大模型读一份80页的财报PDF?不是扫一眼目录,而是真正理解其中某张附注表格和前后三页文字描述之间的逻辑关系;不是简单提取“净利润增长12%”…

2026/7/4 22:22:31 阅读更多 →
Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程

Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程

Umi-OCR终极指南:免费离线文字识别软件的完整配置与优化教程 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多…

2026/7/4 22:12:22 阅读更多 →
postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍!

postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍!

postcss-write-svg:革命性CSS SVG编写工具,让图形开发效率提升10倍! 【免费下载链接】postcss-write-svg Write SVGs directly in CSS 项目地址: https://gitcode.com/gh_mirrors/po/postcss-write-svg 你是否厌倦了在CSS和SVG文件之间…

2026/7/4 22:12:21 阅读更多 →
3大架构优化策略:如何构建高可用AI网关服务

3大架构优化策略:如何构建高可用AI网关服务

3大架构优化策略:如何构建高可用AI网关服务 【免费下载链接】new-api A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible formats. A cent…

2026/7/4 22:12:21 阅读更多 →
Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能

Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能

Agent Skills技能发现机制:如何让AI助手智能匹配任务与技能 【免费下载链接】agentskills Specification and documentation for Agent Skills 项目地址: https://gitcode.com/GitHub_Trending/ag/agentskills Agent Skills是GitHub推荐项目精选(…

2026/7/4 22:10:20 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻