GoClub Go 后端 · 面试准备
GitHub

卡Q因字节AI应用开发一面

根据口述整理,岗位为 AI 应用开发实习生。面试包含自我介绍与项目拷打环节,以下为一面题目与参考答案。

计算机基础#

计算机网络#

  1. TCP/UDP 属于哪一层的协议?区别是什么
  2. TCP 如何实现可靠传输
  3. IP 协议的作用

操作系统#

  1. 用户区、内核区的区别
  2. 进程线程区别
  3. 讲讲进程的上下文切换

数据库#

  1. 如何查看一条 SQL 的执行情况
  2. 事务特性是什么
  3. 事务隔离级别
  4. 讲讲 redo log 和 undo log

AI 方面#

  1. 什么是 prompt,如何写好 prompt
  2. RAG 是什么?讲讲 RAG 的流程
  3. 模型上下文窗口是什么
  4. 如何解决上下文窗口过长的问题
  5. 讲讲模型的幻觉和漂移
  6. 模型胡乱编造回答怎么解决

算法题#

  1. 二叉搜索树转为有向链表 链接:https://leetcode.cn/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/description/

参考答案(AI 生成)#

以下答案由 AI 生成,仅供面试复盘参考。

1. TCP/UDP 属于哪一层的协议?区别是什么#

答:TCP 和 UDP 都工作在 OSI 模型的传输层,负责端到端的数据传输。TCP 是面向连接的协议,通信前需要通过三次握手建立连接,传输完成后通过四次挥手释放连接,具备确认应答、重传、流量控制和拥塞控制机制,可以保证数据可靠有序地送达,但是协议头部开销更大,传输效率会受到一定影响,适合对可靠性要求高的场景;UDP 是无连接协议,不需要建立和断开连接,头部开销很小,传输速度快,但是不提供可靠性保障,不会重传丢失报文,也没有拥塞控制,可能出现丢包、乱序,适合直播、游戏这类容忍少量丢包、追求实时性的业务。

2. TCP 如何实现可靠传输#

答:TCP 依靠多项机制共同实现可靠传输,首先为传输的每一个字节分配序列号,接收方依据序列号完成报文排序,解决乱序问题;接收方收到数据之后会返回 ACK 确认应答报文,告知发送方已经成功接收的数据位置;发送方发送报文后开启超时计时器,如果超时没有收到对应的 ACK,就会触发超时重传重新发送报文。除此之外滑动窗口实现流量控制,根据接收方缓冲区大小限制发送速率,避免接收端被打垮;拥塞控制通过慢启动、拥塞避免、快重传、快恢复策略感知网络状态,防止网络过载造成丢包,整套机制共同保障数据完整有序交付。

3. IP 协议的作用#

答:IP 协议处于网络层,核心作用是实现跨主机、跨网络的数据投递。它会为数据包封装源 IP 地址和目的 IP 地址,依靠 IP 地址完成主机寻址,路由器读取目的 IP 查找路由表完成数据包的路由转发;当数据包大小超过链路 MTU 最大传输单元时,IP 会对数据包进行分片,数据包到达目标主机之后再完成分片重组。IP 本身是无连接不可靠协议,不保证数据包一定送达,差错校验、重传等可靠性能力交由上层 TCP 协议实现。

4. 用户区、内核区的区别#

答:操作系统将内存划分为用户区和内核区两个部分,内核区运行操作系统内核代码,拥有最高权限,可以直接访问全部硬件资源,负责管理进程、内存、磁盘、网络等底层资源;用户区运行普通应用程序代码,权限受到严格限制,程序不能直接操作硬件,当程序需要读写磁盘、申请内存等操作系统能力的时候,必须触发系统调用,从用户态切换进入内核态,由内核完成对应操作之后再切回用户态继续执行应用程序逻辑。

5. 进程线程区别#

答:进程是操作系统资源分配的最小单位,每一个进程拥有独立虚拟地址空间,进程之间资源相互隔离,进程切换的时候需要刷新页表,开销比较大,进程之间通信需要依靠管道、共享内存等 IPC 机制;线程是 CPU 调度执行的最小单位,线程依附于进程存在,同一个进程内部所有线程共享进程的内存、文件句柄等大部分资源,线程上下文切换只需要保存少量寄存器信息,切换开销更小,线程之间可以直接读写共享变量完成通信,但需要加锁保证线程安全;一个进程崩溃不会干扰其他进程,而其中任意一个线程崩溃,会导致整个所属进程直接退出。

6. 讲讲进程的上下文切换#

答:进程上下文保存了进程运行的全部状态,包含寄存器数值、程序计数器、虚拟内存页表、文件状态等信息,存放在进程控制块 PCB 当中。当出现时间片耗尽、中断、系统调用等事件时就会触发进程上下文切换,操作系统首先保存当前正在 CPU 运行进程的上下文信息到它的 PCB,之后操作系统调度器从就绪队列选出下一个待运行进程,把新进程 PCB 当中保存的上下文加载到 CPU 寄存器,CPU 便开始执行新进程的指令。上下文切换会带来一定 CPU 开销,业务当中要避免产生过于频繁的大量上下文切换。

7. 如何查看一条 SQL 的执行情况#

答:在 MySQL 当中可以在待执行 SQL 语句前面加上 explain 关键字,执行后输出这条 SQL 的执行计划,通过执行计划分析 SQL 实际执行情况。可以查看查询 id、查询类型 type、实际命中的索引 key、预估扫描行数 rows,以及 Extra 列的额外提示信息;type 列代表访问数据的方式,如果出现 ALL 代表发生全表扫描需要重点优化,Extra 出现 Using filesort、Using temporary 代表出现文件排序、临时表,通常代表 SQL 存在性能问题;除此之外还可以开启 profile,查看 SQL 执行各个阶段具体耗时,进一步定位性能瓶颈。

8. 事务特性是什么#

答:事务拥有 ACID 四大特性,A 代表原子性,指事务当中的一系列操作要么全部执行成功,要么全部回滚,不会出现部分成功部分失败的情况,依靠 undo log 实现;C 代表一致性,事务执行前后数据库数据始终满足业务约束,数据状态保持合法,是事务最终追求的目标;I 代表隔离性,多个事务并发执行的时候,事务之间互相隔离,避免并发带来的数据问题,依靠锁和 MVCC 机制实现;D 代表持久性,事务一旦提交成功,对数据库的数据修改就永久生效。

9. 事务隔离级别#

答:MySQL 一共定义四种事务隔离级别,读未提交隔离级别下事务可以读取其他事务还没有提交的数据,会出现脏读、不可重复读、幻读;读已提交级别只能读取其他事务已经提交的数据,解决脏读,但仍然会出现不可重复读和幻读;可重复读是 MySQL InnoDB 引擎的默认隔离级别,依靠 MVCC 实现同一个事务内多次读取同一数据结果保持一致,解决脏读和不可重复读,快照读下规避大部分幻读场景,但当前读下幻读依旧存在;最高级别串行化,完全串行执行事务,所有并发问题全部解决,但是并发性能大幅下降。其中脏读指读到别的事务未提交数据,不可重复读是同一事务两次读取同一行数据结果不一致,幻读是范围查询时前后返回的数据行数不一致。

10. 讲讲 redo log 和 undo log#

答:redo log 叫做重做日志,服务于事务的持久性,是 WAL 预写日志机制的核心,事务提交的时候会优先把修改写入 redo log,再异步刷写磁盘数据页,当数据库发生宕机重启,会回放 redo log 当中已经提交事务的修改,把数据恢复到提交完成的状态,保证提交后数据不丢失。undo log 叫回滚日志,用来保障事务原子性,记录数据修改之前的旧版本,事务执行回滚的时候,依靠 undo log 恢复修改前的数据;同时 undo log 也参与 MVCC 多版本控制,用来生成数据历史快照版本,实现不加锁的快照读。

11. 什么是 prompt,如何写好 prompt#

答:prompt 就是输入到大模型的提示词,包含指令、背景、约束、示例等信息,用来引导大模型输出符合预期的回答。写好 prompt 首先需要清晰设定角色,告诉模型需要扮演的身份;其次把任务描述写的明确具体,避免模糊的描述,同时补齐任务所需要的背景上下文;可以指定输出格式,例如要求输出 JSON、markdown 格式;采用少样本提示,提供少量输入输出示例引导模型;同时增加约束条件,限定输出范围,禁止模型输出无关内容,以此提升输出质量。

12. RAG 是什么?讲讲 RAG 的流程#

答:RAG 即检索增强生成,用来缓解大模型知识截止时间、幻觉编造的问题,可以接入模型训练之外的私有文档知识。完整流程分为离线处理和在线问答两部分,离线阶段读取各类文档,完成文档清洗、文本分块,调用 Embedding 模型把每一块文本转化为向量,将向量和原始文本存储到向量数据库;在线问答阶段接收用户问题,将用户问题向量化,在向量数据库执行相似度检索,召回和问题高度相关的文档片段,将用户问题和检索得到的参考文档拼接组装成完整 prompt,送入大模型,大模型结合检索回来的参考资料生成最终回答。

13. 模型上下文窗口是什么#

答:模型上下文窗口代表大模型一次性最多能够处理的 token 总数量,输入的提示词、历史对话内容,以及模型生成的输出全部都会占用上下文窗口 token 配额;当输入内容总 token 超过模型上下文窗口上限,模型无法完整处理全部内容,会发生截断或者报错,因此长对话、长文档场景需要时刻关注 token 占用情况。

14. 如何解决上下文窗口过长的问题#

答:解决上下文窗口超限有多种常用方案,可以采用滑动窗口策略,只保留最近若干轮对话,舍弃时间久远的历史内容;也可以对较早的历史对话做摘要压缩,用简短摘要替代完整原始对话,减少 token 占用;使用 RAG 检索的方案,不需要把全部文档塞进 prompt,只检索和当前问题相关片段放入上下文;也可以做文本重要度筛选,过滤不重要文本只保留关键信息;还可以直接选用支持更大上下文窗口的模型。

15. 讲讲模型的幻觉和漂移#

答:模型幻觉指大模型生成内容看起来通顺合理,但是事实错误,输出大量编造出来的虚假信息,根源在于大模型基于概率生成文本,优先保障语句通顺,不一定严格忠于客观事实。

模型漂移多指长多轮对话场景,随着对话轮次不断增加,模型会遗忘最开始设定的角色、约束指令,回答内容慢慢偏离原本任务目标,出现跑题,长上下文下更容易出现漂移现象。

16. 模型胡乱编造回答怎么解决#

答:想要解决模型胡乱编造,最常用的手段是引入 RAG 检索增强,给模型提供真实参考资料,同时在 prompt 增加强制约束,告知模型只能依据给定参考资料回答,资料不存在就直接说明不知道,禁止编造;调整模型生成参数,降低 temperature 温度,减少生成随机性;优化 prompt 指令减少模糊描述;模型输出完成后增加事实校验环节,对回答内容做二次核查;也可以让模型输出回答时附带引用来源片段,方便核验内容真实性。

17. 二叉搜索树转为有向链表#

答:这题对应 LeetCode 426「将二叉搜索树转化为排序的双向循环链表」。核心思路是采用二叉树中序遍历保证节点值升序,遍历时维护一个前驱指针 prev,把当前节点与 prev 双向串联;整棵树遍历结束后,再把链表头节点和尾节点互相连接成环。需要注意的边界:空树直接返回空;单节点树时头尾是同一个节点,自身成环即可。