小红书搜索算法面试经历:倒排索引+排序模型+相关性优化全考察
2年搜索算法经验面小红书搜索算法岗,一面信息检索基础+倒排索引,二面排序模型+相关性优化,三面项目深挖+AB实验,附真题汇总和备考建议。
背景介绍
先说我的情况:2年搜索算法经验,之前在一家中型互联网公司做搜索,主要负责排序模型和相关性优化。说实话,去面小红书搜索之前我心里是有点虚的——小红书搜索是社区搜索,和传统电商搜索完全不是一个路子,用户搜的不是商品而是内容和笔记,这对搜索算法的要求完全不同。但面试走下来发现,搜索的核心技术是相通的,关键是理解不同场景下的侧重点。
我投的是小红书搜索算法岗,base上海。内推渠道,从投递到一面大概等了5天。整个流程是一面+二面+三面+HR面,前后大概3周。下面详细复盘。
面试流程复盘
一面:信息检索基础+倒排索引
一面的面试官是个看起来很学术范的男生,开场先让我自我介绍,然后直接进入技术问题。他说"我们一面主要考察信息检索基础,特别是倒排索引和检索模型"。
第一个问题就直奔核心:"倒排索引的结构是什么?怎么构建的?"这个我准备过,说了倒排索引由词典和倒排列表组成——词典记录所有词项,倒排列表记录包含该词项的文档ID、词频、位置信息。构建过程是:分词→建立词项到文档的映射→排序→压缩存储。面试官追问"倒排列表怎么压缩?"我说常用压缩方法有VB编码、Gamma编码和Simple9编码。VB编码用可变字节表示文档ID间隔,Gamma编码用一元编码和二进制编码的组合。他又问"跳表在倒排索引中的作用?"我说跳表用于加速倒排列表的合并操作,通过在倒排列表上建立多级索引,可以将合并时间从O(n)降到O(logn)。
接下来是检索模型的问题。"BM25的原理了解吗?和TF-IDF有什么区别?"我说BM25是在TF-IDF基础上的改进,主要区别在于:1)BM25对词频做了饱和处理——词频增加到一定程度后,BM25分数不再显著增加;2)BM25考虑了文档长度归一化——长文档的词频天然偏高,BM25通过文档长度因子进行修正。面试官追问"BM25的参数怎么调?"我说k1控制词频饱和度,b控制文档长度归一化强度。k1通常设为1.2-2.0,b通常设为0.75。他又问"BM25有什么缺点?"我说BM25只考虑词频和文档长度,没有考虑词项的语义信息,无法处理同义词和上下位词的问题。
然后问了一个和社区搜索相关的问题:"小红书的搜索和电商搜索有什么区别?"我说最大的区别是搜索对象不同——电商搜索搜商品,结果有明确的好坏标准(销量、评价);社区搜索搜内容,结果的好坏更主观,依赖用户偏好。所以社区搜索更看重个性化,电商搜索更看重相关性。面试官追问"社区搜索的难点是什么?"我说难点在于:1)内容理解难——笔记是图文混合的,需要同时理解文本和图像;2)意图识别难——用户的搜索词很短,意图模糊;3)评价标准难——内容质量没有客观标准,依赖用户行为信号。
一面还问了一些信息检索基础的问题:"查询扩展了解吗?怎么做?"我说查询扩展是为了解决词汇不匹配问题——用户用的词和文档里的词不一致。方法包括:同义词扩展、相关词扩展、基于用户行为的扩展。面试官追问"同义词扩展的词表怎么来?"我说可以从知识图谱获取,也可以从搜索日志中挖掘——如果两个词经常出现在同一会话中,可能是同义词。他又问"查询扩展会不会引入噪声?"我说会的,所以需要做扩展词的权重衰减——原始查询词权重高,扩展词权重低。
一面最后出了一道编程题:实现一个简单的倒排索引,支持构建和查询。我花了大概20分钟写了一个基础版本,面试官看了说"基本功能没问题,但如果要支持短语查询你会怎么做?"我说需要存储词项的位置信息,查询时检查位置是否连续。他说"思路可以"。
一面大概1小时,面试官说"基础还可以,等二面通知"。
二面:排序模型+相关性优化
二面的面试官是个资深的算法专家,上来就问项目。他说"我看你简历上写了排序模型和相关性优化,详细说说"。
我先讲了我们的排序模型。"你们的排序模型是什么?怎么做的?"我说我们用双塔模型做召回,用精排模型做排序。精排模型是DIN(Deep Interest Network)的变体,输入包括用户特征、文档特征和交叉特征。面试官追问"双塔模型和交叉模型各有什么优缺点?"我说双塔模型的优点是可以离线预计算向量,线上只需要做向量检索,速度快;缺点是用户和文档没有交叉,表达能力弱。交叉模型表达能力更强,但线上计算量大。他又问"你们怎么平衡召回率和精度?"我说我们用多路召回——向量召回、倒排召回、热门召回,每路召回不同的候选集,然后合并去重。
相关性优化是二面的核心。"你们怎么优化搜索相关性的?"我说我们从三个层面优化:1)召回层面——优化查询理解和查询扩展,提高召回的相关性;2)排序层面——优化排序模型的特征和目标,提高排序的准确性;3)后处理层面——做多样性和去重,避免结果同质化。面试官追问"排序模型的特征有哪些?"我说特征分为三类——用户特征(历史行为、偏好标签)、文档特征(质量分、时效性、互动数据)、交叉特征(用户-文档匹配度、查询-文档相关性)。他又问"排序模型的目标函数是什么?"我说我们用多目标优化——同时优化点击率、点赞率和停留时长,用加权和作为最终目标。
然后问了一个让我印象很深的问题:"搜索结果的相关性和多样性怎么平衡?"我说这是一个经典的trade-off问题。如果只优化相关性,结果会非常同质化——搜"旅游"出来的全是旅游攻略;如果过度追求多样性,又会降低相关性。我们的做法是在排序后做MMR(Maximal Marginal Relevance)重排——在保证相关性的前提下,选择与已选结果差异最大的文档。面试官追问"MMR的具体公式了解吗?"我说了解——MMR = λ * rel(d) - (1-λ) * max_sim(d, S),其中rel(d)是文档d的相关性,max_sim(d, S)是d和已选集合S的最大相似度,λ控制相关性和多样性的权衡。
二面还问了一些和AB实验相关的问题:"你们怎么做搜索算法的AB实验的?指标有哪些?"我说我们用用户ID做分桶实验,实验组和对照组各50%流量。指标分为三类:1)相关性指标——NDCG、MRR、点击率;2)用户体验指标——搜索满意度、零结果率、翻页率;3)业务指标——DAU、留存、互动率。面试官追问"NDCG怎么计算的?"我说NDCG = DCG / IDCG,DCG = Σ(rel_i / log2(i+1)),IDCG是理想排序的DCG。他又问"AB实验的显著性怎么判断?"我说用t检验或卡方检验,p值小于0.05认为显著。但要注意新奇效应——新算法上线初期用户可能因为新鲜感而表现不同,需要观察更长时间。
二面大概1.5小时,面试官说"你的搜索算法经验不错,但对社区搜索的理解还需要加深"。
三面:项目深挖+AB实验
三面是部门负责人面的,氛围比较正式。他先问了我对小红书搜索的理解,我说"小红书搜索的核心是理解用户的真实意图,在大量UGC内容中找到最匹配的结果,这需要同时做好内容理解、意图识别和个性化排序"。他点了点头,然后开始深挖项目。
"你做过的最有技术挑战的搜索项目是什么?"我讲了之前做的一个长尾查询优化项目——长尾查询(搜索频次很低的查询)占了总查询量的60%,但因为训练数据少,排序效果很差。我们的解决方案是:1)查询聚类——将语义相似的查询聚成一类,共享训练数据;2)迁移学习——用高频查询的模型做预训练,再在长尾查询上微调;3)零样本学习——对于完全没有训练数据的查询,用语义相似度直接排序。面试官追问"查询聚类怎么做的?"我说我们用BERT对查询做embedding,然后用K-Means聚类。他又问"聚类数怎么确定?"我说我们用轮廓系数和肘部法则确定最优聚类数,最终选了500个聚类。
接着问了一个开放性的问题:"如果让你从零搭建小红书的搜索系统,你会怎么做?"我说我会分三步走:1)基础搜索——先搭倒排索引+BM25排序,保证基本可用;2)个性化搜索——加入用户画像和行为特征,用学习排序模型优化排序;3)智能搜索——加入意图识别、查询改写、多模态检索,提升搜索体验。面试官问"多模态检索怎么做?"我说用CLIP模型将文本和图像映射到同一向量空间,实现文搜图和图搜图。他又问"CLIP的向量维度怎么选?"我说我们试过128、256、512,最终选了256——128太小信息损失多,512太大检索速度慢。
最后问了我对小红书搜索的看法和职业规划。我说小红书搜索是社区搜索的标杆,技术挑战和业务价值都很高,我希望能在这里深耕搜索算法领域。面试官说"欢迎加入"。
HR面就是常规的薪资和入职时间沟通,没什么特别的。
真题汇总
一面真题
1. 倒排索引的结构?怎么构建?
2. 倒排列表的压缩方法?
3. 跳表在倒排索引中的作用?
4. BM25的原理?和TF-IDF的区别?
5. BM25的参数怎么调?有什么缺点?
6. 社区搜索和电商搜索的区别?
7. 查询扩展怎么做?
8. 实现一个简单的倒排索引
9. 分词算法了解哪些?
10. 搜索引擎的架构了解吗?
二面真题
1. 排序模型是什么?怎么做的?
2. 双塔模型和交叉模型的优缺点?
3. 怎么优化搜索相关性?
4. 排序模型的特征有哪些?目标函数?
5. 相关性和多样性怎么平衡?MMR?
6. AB实验怎么做?指标有哪些?
7. NDCG怎么计算?
8. 多目标优化怎么做?
9. 向量检索怎么实现?
10. 搜索的召回策略有哪些?
三面真题
1. 最有技术挑战的搜索项目
2. 长尾查询优化方案
3. 查询聚类怎么做的?
4. 从零搭建搜索系统
5. 多模态检索怎么做?
6. CLIP模型的向量维度怎么选?
7. 你对小红书搜索的理解
8. 搜索算法的发展趋势
9. 怎么处理搜索作弊?
10. 职业规划
心得建议
第一,信息检索基础必须扎实。倒排索引、BM25、查询扩展这些是搜索算法的基本功,面试必考。建议看《信息检索导论》这本书,把核心概念搞清楚。
第二,排序模型要有实战经验。不是只会调API就行的,要理解模型的输入输出、特征工程、目标函数。建议自己做一个搜索排序项目,从数据到模型到评估全流程走一遍。
第三,相关性优化要理解全链路。不只是知道怎么调BM25参数,还要理解从召回→排序→后处理的完整链路,每个环节怎么优化相关性。建议做一个端到端的搜索优化项目。
第四,AB实验是搜索算法面试的必考点。怎么设计实验、怎么选指标、怎么判断显著性,这些都要能讲清楚。建议在自己项目中实践AB实验,积累经验。
第五,理解社区搜索的特殊性。小红书搜索和电商搜索不同,更看重内容理解、意图识别和个性化。面试前建议多体验小红书的搜索,理解用户场景。
FAQ
Q1:小红书搜索面试对算法要求高吗?
要求很高。不是会用sklearn就行的层面,要理解排序模型的原理、特征工程的方法、AB实验的设计。建议看《Learning to Rank》和相关的论文。
Q2:没有搜索算法经验怎么办?
可以自己做一个搜索项目练手。用Elasticsearch搭一个搜索引擎,然后做排序优化——从BM25开始,逐步加入学习排序模型。关键是理解搜索系统的全链路,不是只会用工具。
Q3:排序模型要学哪些?
建议从经典模型学起——LR→GBDT→DNN→DIN。重点理解DIN的注意力机制和多目标优化。然后学习向量检索——双塔模型→ANN检索。面试中最常问的是双塔模型和精排模型。
Q4:AB实验怎么学?
建议从基础的假设检验学起,理解t检验和卡方检验的原理。然后学习AB实验的设计——分桶、分流、指标选择、显著性判断。推荐看《Trustworthy Online Controlled Experiments》这本书。
Q5:小红书搜索的工作强度怎么样?
搜索团队的技术氛围很好,节奏适中。搜索算法的迭代周期比较长,不像业务开发那样赶进度。但模型上线后需要持续监控效果,AB实验需要耐心等待结果。对搜索算法工程师的成长很有帮助。