公司动态
招行信用卡中心AI方向笔试复盘:从算法基础到金融场景
2019年秋招那阵子我前后投了十几家银行的科技岗招商银行信用卡中心是其中我比较上心的一家毕竟信用卡业务在零售金融里离数据最近AI方向的技术氛围在传统银行里也算拔尖的。第二批IT笔试AI方向我完整参加了从收到笔试通知到线上答题整个过程大概一周题目风格和互联网大厂差别挺大——更务实也更贴近业务。这篇就结合我当时的答题回忆和考后复盘把笔试的结构、考点、典型题目以及备考思路完整梳理一遍给以后想走银行AI方向的同学做个参考。1. 笔试全流程回顾线上答题两个半小时节奏比想象中紧凑1.1 笔试通知与考试形式招行信用卡中心的秋招笔试是统一通过邮件发送的在线测评链接用的第三方考试平台支持在本地 IDE 里写代码再粘贴到答题框这点比很多只允许在线编辑器的银行要友好。AI方向第二批的笔试时间安排在晚上 19:00 到 21:30共两个半小时。题型分为三部分第一部分是行测风格的逻辑/数学选择题第二部分是计算机基础选择题第三部分是编程题和AI算法问答题。整体题量不小我印象里选择题大概 40 道编程题 2 道AI问答题 3 道最后还有一个开放性的业务场景设计题。这里有个很容易忽略的点线上笔试的摄像头监考是全程开启的切屏超过三次会被系统警告所以考试前一定要把电脑里的弹窗、消息通知全部关掉。我当时把浏览器调成专注模式手机放到另一个房间避免中途被干扰。另外考试平台支持但不建议使用自动补全功能过强的 IDE因为代码提交后会做查重和运行环境校验粘贴代码时要注意缩进格式不要被破坏。1.2 第二批与第一批的差异银行笔试经常分批进行题目会略有不同但总体难度和侧重点是一致的。第二批给我的感觉是AI方向的占比比第一批更高尤其是机器学习基础概念的考察明显增多。身边有同学参加的是第一批他说第一批更偏 Java 和数据库而第二批似乎更偏向 Python 和算法推导。如果你投的是AI方向第二批反而更对口。不过具体题目属于题库抽选两个人遇到的题目顺序不同所以不存在所谓第二批更简单的说法。1.3 考试环境的意外处理我考试那天网络不稳定中途掉线了一次当时瞬间很慌。后来发现考试平台有断点续答机制重新连接后进度并未丢失只是需要再次人脸识别验证。这点提醒大家如果遇到掉线不要反复刷新页面应该先检查网络再重新进入考试链接系统会自动恢复之前的答题状态。但如果长时间无法连接要立刻给招聘组发邮件说明情况一般都会安排补考。2. 计算机基础与编程能力看似常规实则暗藏杀机2.1 数据结构与算法高频题这一部分选择题考得很细比如给定一个完全二叉树的层序遍历结果求某个节点的父节点下标又比如快速排序在最坏情况下的时间复杂度以及如何通过随机化主元来优化。总体来说没有特别偏门的冷知识但需要你对基础数据结构有扎实的理解不能只背结论。我记得有一道题很典型有一个单向链表要求判断是否存在环并给出快慢指针的证明思路。选择题给出的选项有哈希表法、快慢指针法、反转链表法、递归法。正确答案是快慢指针和哈希表都能实现但题目问的是在不使用额外空间的前提下所以只能选快慢指针。这种题在银行笔试里属于基础送分题但如果你平时只刷力扣不关注空间复杂度很容易选错。还有一道动态规划题描述是有一个 m x n 的网格左上角到右下角每次只能向下或向右走问有多少条不同路径。这题太经典了组合数公式 C(mn-2, m-1) 可以秒出但选项里故意放了一个 C(mn, m) 的干扰项。我估计不少同学直接套组合数公式没注意边界。2.2 操作系统、网络、数据库的偏门考点银行系统非常看重数据库能力选择题里出现了不少关于事务隔离级别和索引失效的场景题。有一题印象很深如果一个 SQL 查询条件中对索引列使用了函数比如where DATE(create_time) 2019-10-01这个查询会不会走索引答案是不会因为对索引列做函数运算会破坏索引的有序性。这类题目在互联网公司笔试里越来越少但银行好像特别爱考因为银行核心系统离不开数据库优化。操作系统部分考了进程线程区别、死锁的四个必要条件、虚拟内存页面置换算法都是常规。但有一道题问的是银行家算法属于哪种死锁避免策略选项有预防、避免、检测、恢复。这道题其实是在考你是否区分了死锁的预防和避免银行家算法是典型的避免策略通过判断系统是否处于安全状态来决定资源分配。网络部分考了 TCP 三次握手和四次挥手其中一问是TIME_WAIT 状态出现在哪一端为什么要等待 2MSL。这个知识点要理解透彻不是简单背状态名。因为在银行的长连接场景里TIME_WAIT 过多会导致端口不足所以一些银行会调整内核参数缩短 MSL但 TCP 规范上又不能太短这就非常看经验了。2.3 编程题实战题目描述里的坑编程题一共两道第一道比较简单给定一个字符串输出出现次数最多的字符如果多个字符次数相同输出字典序最小的那个。这题用 Counter 加排序就能解决但有一个小坑——输入字符串可能包含空格所以不能用input().split()直接处理应该用sys.stdin.readline().strip()然后遍历所有字符。我估计有同学直接按单词分割了导致结果错误。第二道编程题稍微复杂是银行场景下的最大连续子数组和变体给定一个长度为 n 的整数数组数组元素代表每天的信用卡消费金额正数代表消费负数代表还款求某一段连续时间内累计消费金额的最大值并输出对应的起始日期下标和结束日期下标。这题本质上就是带索引的 Kadane 算法需要同时记录最大子数组的起始位置。如果最终最大和小于 0要返回空区间且和设为 0。这个边界条件题目描述里写得很隐蔽很多人只顾着求最大和忽略了输出区间。Kadane 算法的核心思路是维护两个变量current_sum表示以当前元素为结尾的最大子数组和max_sum表示全局最大值。每次遍历元素时current_sum max(num, current_sum num)意思是如果当前元素 之前的累加和还不如当前元素自己大那就从当前元素重新开始累加。同时当更新max_sum时记录对应的区间端点。这里要注意的是如果数组元素全为负数Kadane 算法的结果会是最大的那个负数但按照题目要求应该返回 0 和空区间所以需要额外判断。我当时的实现如下Pythonimport sys def max_subarray_with_index(nums): max_sum 0 current_sum 0 start 0 temp_start 0 end -1 for i, num in enumerate(nums): if current_sum num num: current_sum num else: current_sum num temp_start i if current_sum max_sum: max_sum current_sum start temp_start end i if max_sum 0: return 0, -1, -1 return max_sum, start, end if __name__ __main__: nums list(map(int, sys.stdin.readline().strip().split())) s, l, r max_subarray_with_index(nums) print(s, l, r)如果输入一行数字之间用空格分隔这个代码可以直接跑通。要注意的是银行笔试的在线判题通常不会给全部测试用例所以边界条件必须自己在脑子里验证一遍比如数组长度为 1 且为正数或者长度为 1 且为负数。3. AI算法核心机器学习与深度学习的笔试重点3.1 机器学习理论基础模型评估、过拟合、特征工程这部分是我觉得整张卷子里最有含金量的地方。选择题问到了 ROC 曲线和 AUC 的好处以及为什么不使用准确率作为不平衡样本的主要评价指标。题目的背景是信用卡欺诈检测正样本欺诈占比可能不到 1%如果直接用准确率评估模型把所有样本都预测为正常准确率也有 99%但没有任何意义。所以要用 AUC、F1-score、Precision-Recall 曲线等。这道题一出来说明招行确实在考察候选人是否理解真实业务场景中的模型评估。还有一道问特征工程里共线性问题的具体是当特征之间存在严重的多重共线性时以下哪个模型更稳定选项包括线性回归、岭回归、Lasso、决策树。这个题需要你知道岭回归通过 L2 正则化压缩系数对共线性更鲁棒Lasso 可能随机选择其中一个相关特征导致不稳定决策树则不受共线性太大影响。所以答案应该是岭回归但如果题目把选项改成随机森林那决策树也是合适的。这种题没有标准死答案必须理解模型原理。特征工程里还考了缺失值处理。有一题问对于缺失率超过 70% 的特征最合理的处理方式是什么选项有删除该特征、用均值填充、用中位数填充、构建指示变量保留。在银行风控场景缺失率过高意味着这个数据源本身质量不可靠如果强行用均值填充会引入大量噪声所以一般倾向于删除。但如果这个特征在业务逻辑上特别重要可以考虑保留并构建一个是否缺失的指示变量。我当时选的是删除该特征因为题目没有强调特征的重要性。3.2 深度学习必考知识点CNN/RNN、激活函数、梯度消失深度学习题量不少但难度停留在概念层面。比如问 ReLU 相比 Sigmoid 的优点选项包括缓解梯度消失、计算简单、输出非负、梯度无上界。正确答案是缓解梯度消失和计算简单但输出非负是 ReLU 的实际特性不是优点所以不能选。这种题目很奸诈它把数学性质和应用优点混在一起你不清楚基本概念就会选错。还有一个卷积神经网络感受野的计算题输入 32x32 的图像经过一个 5x5 卷积核步长1无填充再经过一个 2x2 最大池化步长2问最后一层特征图的尺寸。计算过程32x32 - 28x28卷积后 - 14x14池化后。但是如果问的是感受野那就需要从最后一层反向推导每一层的感受野等于当前感受野加上卷积核大小-1乘以前面所有步长的乘积。这个题在选择题里出现了选项有 6、7、14、28正确答案应该是 7因为 2x2 池化的感受野叠加上了 5x5 卷积的感受野。这种题光记住公式不够需要自己推导一遍。RNN 也考了一题关于 LSTM 中遗忘门的作用。题目描述是在语言模型中遗忘门主要控制什么选项有记忆保留、梯度截断、参数更新、正则化。正确选项是记忆保留即决定上一时刻的细胞状态有多少被保留到当前时刻。这里的难点在于区分遗忘门和输出门如果对 LSTM 的结构不熟悉很容易混淆。3.3 典型算法推导题逻辑回归损失函数求导AI问答题里有一道很经典的推导题请写出逻辑回归的损失函数并推导其对参数的梯度更新公式。这道题可以说刷一遍《统计学习方法》就能答上来但要在有限时间内寫得完整、规范还是需要平时多练笔。逻辑回归的损失函数通常使用交叉熵[ J(\theta) -\frac{1}{m} \sum_{i1}^{m} \left[ y^{(i)} \log h_\theta(x^{(i)}) (1-y^{(i)}) \log (1 - h_\theta(x^{(i)})) \right] ]其中 ( h_\theta(x) \frac{1}{1 e^{-\theta^T x}} )。求导过程的关键是利用 sigmoid 函数的导数性质 ( \sigma(z) \sigma(z)(1-\sigma(z)) )。对单个样本求梯度[ \frac{\partial J_i}{\partial \theta_j} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} ]所以批量梯度下降的更新公式为[ \theta_j : \theta_j - \alpha \frac{1}{m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} ]写这道题时我建议先写清模型定义、损失函数定义再写 sigmoid 导数性质最后推导梯度。分步写不要跳步。阅卷时可能不会真的看你最后的答案对不对而是看你推导过程是否严谨。这里的常见错误是直接给出最终梯度公式没有展示中间步骤或者损失函数漏掉负号和均值符号。另外要注意是不是要加正则化项如果题目中没有明确要求可以不写但可以在最后提一句若有 L2 正则梯度更新需额外减去 (\frac{\lambda}{m}\theta_j)这样能体现你考虑得更完备。3.4 手推反向传播一个两层的MLP除了逻辑回归还有一道题要求手动推导一个两层神经网络的反向传播过程。输入 x 是一个标量隐藏层有一个神经元激活函数是 sigmoid输出层有一个神经元损失函数是均方误差。让你推导更新参数 (w_1, w_2, b_1, b_2) 的梯度表达式。这种题的解法很固定。设前向传播为[ z_1 w_1 x b_1, \quad a_1 \sigma(z_1), \quad z_2 w_2 a_1 b_2, \quad \hat{y} \sigma(z_2) ]损失 ( L \frac{1}{2}(y - \hat{y})^2 )。反向传播时先算输出层的误差项[ \delta_2 \frac{\partial L}{\partial z_2} (\hat{y} - y) \cdot \sigma(z_2) (\hat{y} - y) \cdot \hat{y}(1-\hat{y}) ]然后[ \frac{\partial L}{\partial w_2} \delta_2 \cdot a_1, \quad \frac{\partial L}{\partial b_2} \delta_2 ]再往前传播[ \frac{\partial L}{\partial a_1} \delta_2 \cdot w_2, \quad \delta_1 \frac{\partial L}{\partial z_1} \delta_2 w_2 \cdot \sigma(z_1) ]最后[ \frac{\partial L}{\partial w_1} \delta_1 \cdot x, \quad \frac{\partial L}{\partial b_1} \delta_1 ]这道题考察的是链式法则和计算图的理解。我建议在答题时把计算图画出来用文字说明每个箭头传播的是什么这样即使数值算错阅卷老师也能看到思路。另外要注意梯度方向误差是从输出层往输入层传播的所以变量名用 (\delta_1) 对应隐藏层而不是输入层别搞混。4. 金融科技特色题银行信用卡业务中的AI落地4.1 风控反欺诈样本不平衡与模型可解释性银行笔试中最有区分度的是一道开放设计题请设计一个信用卡交易反欺诈模型描述你的技术方案及落地步骤。这道题非常考察实战能力因为它在答题纸上没法暴力搜索必须靠平时的行业积累。我当时的答题思路是先明确目标实时拦截可疑交易减少欺诈损失同时降低误报率。然后分数据、特征、模型、部署四个层次展开数据层面使用历史交易流水、商户类别码MCC、交易时间、地理位置、设备指纹等作为输入同时获取交易后的结果标签如是否确认为欺诈。特征工程构建滑动窗口统计特征比如过去 1 小时交易金额均值、过去 24 小时交易次数、与常用交易城市的距离等同时构建时间序列类特征比如距离上次交易时间间隔。这里有个强特征持卡人历史交易行为基线通过相对偏差编码比如当前交易金额/过去30天平均交易金额这个比值在欺诈检测中非常有区分度。模型选择考虑到银行对可解释性要求很高我当时方案里选择了基于 LightGBM 的树模型作为主模型同时用逻辑回归生成一个可解释的评分卡模型。树模型用于提升效果评分卡用于业务人员理解和向监管部门解释。对于实时性要求高的场景还会考虑用规则引擎先过滤掉明显正常的交易再用模型对剩余交易打分。部署与监控模型部署在实时交易链路中使用 Kafka 接入交易流通过 Flink 做特征计算和模型推理整体响应时间要控制在几十毫秒以内。监控方面关注 PSI群体稳定性指数来检测特征分布偏移同时记录模型预测分数分布如果分数分布发生明显变化需要触发预警并准备模型重训练。这题的加分点在于你能提到冷启动问题新卡用户没有历史交易行为如何建模我的应对策略是使用同类用户群体的统计特征比如相同年龄段、相同收入层级用户的前 30 天平均消费行为作为填充。这种细节能让阅卷官觉得你真的考虑过落地难题。4.2 精准营销用户画像与推荐系统的基本思路另一道问答题是关于信用卡消费分期推荐的。题目描述大概是如何利用用户的历史消费数据判断哪些用户更有可能响应分期营销设计一个预估模型并说明评估指标。这道题的核心在于理解目标函数响应分期的用户比例通常很低因此负样本远多于正样本。同样面临不平衡问题。我的思路是先做用户画像用 RFM 模型最近消费时间 Recency、消费频率 Frequency、消费金额 Monetary作为基础特征再结合用户持有的卡级别、账单金额、还款行为等构建特征。模型可以选择 XGBoost 或 LRFTRL在线学习。关键点是选择评估指标不能用准确率应该用 AUC、Gini 系数、提升度Lift以及业务上更关心的营销响应率提升倍数。另外这类题目往往还会延伸问营销预算有限如何在用户和渠道之间分配这时候需要做因果关系推断不能单纯看响应概率最高的用户因为高响应概率用户可能是本来就会购买的群体无增量效果。真正要选出的是被营销后响应概率提升最大的用户也就是 uplift model 要做的事。我在答题时提到可以用 meta-learner如单独建模控制组和实验组的响应概率差这是一个不错的拔高点。不过要注意如果对 uplift 不熟悉不要随意展开否则容易露怯。4.3 智能客服/OCRNLP与CV在业务中的实际落地有一道选择题和一道问答都涉及了自然语言处理。选择题问意图识别任务中客户说我信用卡账单怎么还没出这句话的意图是什么选项包括查询账单、申请卡片、修改手机号、分期付款。这种业务语义理解题对模型没太大难度但考察的是你是否理解银行客服场景的意图分类体系。我当时学到的经验是客服意图分类要建立层级体系第一层级是业务域如信用卡申请、账单管理、还款、积分第二层级才是具体意图如查询账单、投诉账单金额错误。这样分层可以降低模型复杂度也便于后期维护。问答部分有一题是关于 OCR 识别身份证件的。题目要求简要说明身份证识别中常用的技术路线以及如何应对图像倾斜、光照不均等问题。我答的思路是传统方式使用图像预处理灰度化、二值化、仿射变换校正加 OCR 引擎如 Tesseract现在主流方案是直接使用基于深度学习的端到端 OCR如检测模型CTPN、DBNet加识别模型CRNNCTC。针对倾斜问题可以加一个基于 Hough 变换或分类网络的角度预测分支把图像旋转校正到水平。光照不均可以用自适应阈值或图像增强网络处理。这个题本身不深但需要你有过真实项目经验才能把步骤写清楚。4.4 银行AI的特殊性合规与隐私保护这部分虽然不是单独的考题但在多个场景题里都埋了潜台词。比如设计反欺诈模型时会涉及用户隐私数据的使用题目不会直接问你如何处理用户隐私但你在方案里应该主动提及数据需要先做脱敏处理特征编码时避免使用手机号、身份证号等个人敏感信息模型上线时要通过合规评审并定期做算法公平性检测。这样写能体现你有工程伦理意识银行特别看重这点。5. 复盘与建议我是怎么准备和踩坑的5.1 资料与复习路线不迷信刷题数量我准备银行 AI 笔试的思路和准备互联网大厂完全不一样。大厂更看重手撕算法和模型细节银行则更看重基础是否扎实、业务理解是否到位。所以我的复习路线大致是算法与数据结构每天 2 道力扣中等题重点复习数组、链表、树、动态规划、滑动窗口、和哈希表。但没有刷难题实际上银行编程题难度不会超过力扣中等。机器学习熟读《统计学习方法》前七章重点是逻辑回归、SVM、决策树、集成学习。课后习题要认真做尤其是推导题。深度学习看了一点吴恩达的深度学习课程重点复习反向传播、CNN、RNN、LSTM、激活函数、常见优化器。数据库与 Linux刷了牛客网 SQL 入门题同时复习了索引原理、事务隔离级别、常用 Linux 命令grep、awk、top、ps。银行一般不会考太深的 Linux 运维但基础命令要熟悉。业务知识阅读了招行信用卡 App 的功能结构以及一些消费金融风控的公开资料比如常见反欺诈规则。这里我想强调一点不要只刷题不总结。我在准备时每做完一道题会在笔记本上写一段本题考点 我的思路 最优解法 容易忽略的边界条件考前集中翻看。这种方式的效率比盲目刷一百道题高得多因为在笔试中遇到原题的概率不高但考点是反复出现的。5.2 时间分配策略给选择题限时给编程题留余量我的考试时间分配大概是行测逻辑题 20 分钟计算机基础选择题 30 分钟AI算法问答题 40 分钟编程题 40 分钟业务场景设计题 20 分钟最后留 10 分钟检查。实际执行时选择题比预想中要难花了将近 40 分钟导致编程题时间被压缩第二道编程题差点没写完。事后复盘应该在行测逻辑题上更快因为行测题认真算和蒙的正确率差距没那么大而编程题和算法题才是拉分项。给大家的一个建议是如果遇到特别纠结的题先标记待定超过 90 秒就跳过。考试平台的选题页面允许你跨题跳转所以不要在一道选择题上恋战。我在这点上做得不好有一道关于 TCP 状态机的题我反复推演了很久感觉花了两分钟最后也不确定是否正确。这种时间成本应该花在编程题上。5.3 答题技巧如何让阅卷官觉得你专业问答题的答题量不能太少但也不能像写论文一样长篇大论。我总结了一个三段式结构第一段给出总体方案或结论第二段分点描述具体步骤或技术细节第三段说明可能出现的问题和应对方案。例如设计反欺诈模型时第一段写方案分为数据清洗、特征工程、模型训练、上线监控四部分第二段每部分展开讲第三段写冷启动问题和策略漂移问题。这种结构能让阅卷官在几秒钟内抓住你的逻辑。另外所有专有名词要用准确的中文和英文对照。比如群体稳定性指数PSI、卷积神经网络CNN、长短期记忆网络LSTM等。不要只写缩写不写中文因为银行的工程师团队很多来自传统金融背景对英文缩写不如互联网团队那么敏感你写全了反而显得更细致。5.4 踩坑实录那些让我后悔没早知道的事先说代码题的一个坑考试平台的 Python 版本是 3.6不是最新版所以我在本地用了 f-string 的代码在在线判题机上可以直接运行但如果用了 dataclass 之类的 Python 3.7 特性就会报语法错误。我在准备时不知道环境版本后来没有使用任何高版本语法老老实实写基本语法才没有出问题。建议笔试前写几道可以在线提交的题测试一下平台的环境。还有一个坑选择题是多选的但通过界面看不出来是单选还是多选因为选项前面是方框而不是圆框。我很自然地以为方框就是多选题结果连续几道都按多选来答最后发现很多题其实是单选。这道题让我在考后心态有点崩。建议在答选择题时先做一道试探性题目观察选一个选项后是否还能选其他选项如果是单选的话再次点击另一个选项会取消之前的选择。最后是关于心态的坑银行笔试题量很大做完最后一分钟才发现有一道业务场景题完全空着但来不及写。所以时间分配上一定要给开放题型留至少 15 分钟即使写不出完整方案也要把框架放上去比如1. 数据获取 2. 特征构建 3. 模型选择 4. 评估指标能拿框架分。6. 写在最后银行AI笔试到底在筛选什么样的人经历过这次笔试后我的最大体会是银行AI笔试不像互联网大厂那样追求智商压制它更看重你有没有能力把AI技术落地到真实的金融业务中。在这个筛选逻辑里基础扎实比炫技重要业务理解比刷题数量重要工程规范比标新立异重要。如果你接下来要准备类似的银行AI岗位笔试我个人有两个建议。第一个建议是认真研究目标银行的年报和官方App看看他们最近在推什么业务。比如招行信用卡中心当年大力推掌上生活App的智能客服和分期推荐那笔试里出现营销响应模型设计题就顺理成章。第二个建议是在回答开放题时尽量不要停留在用XGBoost训练一个分类器这种套话层面而是往上下游延伸。比如提到特征上线后如何监控数据质量模型如何做快速回退线上推理延迟如何优化。这些细节才是让你在众多候选者中显得不同的关键。笔试只是秋招的第一关后来我虽然没有最终入职招行信用卡中心但这次笔试的很多考点和思维方式倒是让我在后续几家银行面试中受益不少。尤其是手推反向传播和风控模型设计这两个问题几乎在每一场银行技术面里都会以不同的形式出现。所以即使你目标不是招行这份备考思路也可以通用。希望这篇复盘能帮你少走一些弯路。