orion_intervew
🟢 一、后端(NestJS + MongoDB + Redis)
NestJS 基础
NestJS 中的依赖注入(DI)是如何实现的?和传统的 Express 框架相比有什么优势? NestJS 基于 TypeScript 的 reflect-metadata 实现 IOC 容器,通过 @Injectable 装饰器注册 provider,自动管理实例生命周期。相比 Express,它解耦了业务逻辑,利于测试和模块化。
请解释一下 Guard、Interceptor、Middleware 的区别和适用场景。 Middleware:在路由前执行,处理日志、请求解析等。 Guard:决定请求是否被处理(权限、认证)。 Interceptor:在路由调用前后执行,适合统一响应、缓存、数据转换。
在 NestJS 中如何优雅地处理全局异常?
数据库(MongoDB)
MongoDB 与关系型数据库相比,适合什么业务场景?
在房产类应用中,如果要支持“按地理位置范围搜索房源”,MongoDB 提供了哪些功能?
如何在 MongoDB 中设计一个房源集合,以便快速支持多条件检索(如价格区间 + 面积 + 标签)?
利用 2dsphere 索引,可以用 $near、$geoWithin 实现范围查询,适合房源按地铁口、区域等条件检索。
缓存(Redis)
Redis 的常见数据结构及其使用场景? 数据结构:String(缓存 token)、Hash(用户对象)、Set(去重)、SortedSet(排行榜)。 分布式锁:SETNX + EXPIRE,避免重复任务;高级场景用 RedLock 算法。
如何使用 Redis 来优化 RAG 检索或 LLM 请求的性能?
解释一下 Redis 中的 分布式锁,在什么情况下会用到?
🟢 二、PC 前端(React + Radix-UI)
React 基础
react hooks? Hooks 是 React 16.8 引入的特性,本质是一系列用于在函数组件中 “钩入” React 状态和生命周期等特性的函数。它的设计目的是解决类组件的缺陷(如逻辑复用复杂、生命周期函数混杂多种逻辑等),让函数组件也能拥有状态管理、副作用处理等能力。 常见的 Hooks 包括: useState:管理组件状态 useEffect:处理副作用(如数据请求、DOM 操作) useCallback:缓存函数引用 useMemo:缓存计算结果 useContext:获取上下文数据 以及自定义 Hooks(基于内置 Hooks 封装的复用逻辑)
React 18 中的并发特性(Concurrent Features)解决了什么问题? 支持可中断渲染(Concurrent Rendering),结合 useTransition、Suspense,提升大规模渲染场景下的响应性。
useEffect 与 useLayoutEffect 的区别是什么? useEffect:异步执行,不阻塞绘制,用于副作用。 useLayoutEffect:同步执行,在 DOM 更新后、绘制前运行,用于测量布局。
React useCallback 与普通函数有哪些区别,主要解决哪些问题? useCallback 是 专门用于缓存函数引用的 Hooks,它的核心作用是避免函数在组件重新渲染时被频繁创建新的引用,从而优化依赖该函数的子组件或副作用的性能。 (1)优化子组件渲染 (2)稳定 useEffect 的依赖项 useCallback 的设计基于 React 的渲染机制和性能优化原则: React 函数组件每次状态更新都会重新执行,函数内部定义的变量 / 函数会被重新创建(引用变化)。 对于不依赖组件状态的函数,其引用变化是无意义的,但会触发依赖它的逻辑(如子组件渲染、副作用执行)。 useCallback 通过依赖项数组跟踪函数内部使用的变量,仅当依赖变化时才更新函数引用,否则返回缓存的旧引用,从而减少不必要的计算和渲染。
在 react 中,虚拟 DOM 更新和 Diff 算法是怎么工作的?
UI 框架(Radix-UI)
Radix-UI 和 antd/mui 等传统组件库有什么区别? Radix-UI 提供无样式、可访问性良好的基础组件,更适合与 TailwindCSS 配合构建定制化 UI,不像 antd 强耦合样式。
Radix-UI 提供的无样式基础组件如何结合 TailwindCSS 来构建一致的 UI 体系?
如果要实现一个级联选择器(行政区级联),Radix-UI 能否直接支持?如果不能,你会怎么扩展?
🟢 三、移动端(React Native Expo + 高德地图)
React Native Expo
Expo 与纯 RN 有什么区别?在生产环境中有哪些利弊? Expo 提供打包、OTA、内置 API,降低门槛。但限制原生扩展,复杂场景需要 Eject。适合快速 MVP 开发。
如何在 Expo 项目中处理权限申请(例如定位权限)? expo-permissions(旧)或 expo-location 提供 API,Android 需在 AndroidManifest.xml 配置,iOS 需在 Info.plist 写描述。
Expo 中如何优化启动速度和 bundle 体积?
高德地图 SDK
如何在 React Native 中集成高德地图并实现路线规划? 通过高德 URI Scheme(amapuri://route/plan?...),传递起点/终点经纬度 + 名称,支持驾车、公交、步行等模式。
高德地图 WebView 和 Native SDK 方案的优劣?
如果用户规划路线后,要一键跳转到高德地图 App 并加载该路线,你会怎么实现?
🟢 四、AI 找房业务(RAG + LLM)
向量检索(RAG)
RAG 的基本流程是什么? 用户输入 → 向量化(embedding) 在向量库(如 Milvus/Redis/MongoDB Atlas Vector Search)检索 Top-K 召回结果拼接 Prompt → LLM LLM 输出优化后的答案
如果用户查询“靠近地铁口的两居室”,你如何设计向量存储中的 metadata,以便快速过滤? metadata 存房源价格、面积、坐标、交通标签;在向量检索时用 过滤条件(如 price < 20000)减少无关数据。
在 MongoDB / Redis 中存储向量时,各自的优缺点是什么?
LLM 调用
你如何将检索到的 10 条候选房源输入到 LLM,并让它挑选最佳的 3 个?
在生成结果时,如何避免模型产生虚构房源(hallucination)? 提示工程(明确只从候选数据选择) 在 Prompt 中加入原始数据片段 引用结果时带 source 进行验证
如果 LLM 输出过慢,你会采取哪些优化策略?(提示:流式输出、分块检索、多模型路由) 流式输出(逐字返回) 召回结果先筛选(Top 10 → Top 3) 分块检索,减少上下文长度 小模型路由(简单问题走轻量模型)
系统架构场景题
用户高并发请求时,如何保证 Redis/MongoDB 不被打爆? Redis 缓存热数据 MongoDB 建索引(compound index + geospatial) 请求限流(如 NestJS Guard + Redis 计数) 异步任务队列(BullMQ)削峰
如果 RAG 召回了几百条结果,你如何筛选并控制在 10 条以内?
设计一个“用户语音找房 → AI 结果推荐”的完整调用链路。
🟢 五、思维题
如果 LLM 推荐的房源结果与用户真实意图差距较大,你认为可能出现在哪些环节?怎么改进? 向量检索召回不足 → 语义 embedding 不够好 Prompt 设计不严谨 → LLM 胡编乱造 用户 query 太模糊 → 需要澄清意图
前端如何处理从 LLM 返回的多模态数据(文字、图片、地图链接)? 文字 → 普通渲染 图片 →
或懒加载 地图 → 高德地图 SDK 渲染标记点
假如 MongoDB 出现单点故障,你会如何保证服务可用性? 部署 Replica Set(副本集) 配合 Arbiter 节点选举 使用 Sharding 提升扩展性
Page Source