面灵AI→

百度 AI 全栈(偏前端)一面:React 与 RAG、MCP 到 Agent

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 请做一下自我介绍。
  2. React 与 Vue 有哪些异同点?
  3. 你了解 React 的 Fiber 框架吗?
  4. Agent 与 LLM 有什么区别?
  5. 你了解 MCP 的通信协议是怎么样的吗?
  6. MCP 的 tools 和 skills 有什么区别?
  7. 你觉得 skills 相比 MCP 有什么缺点吗?
  8. 你了解 RAG 吗?
  9. 完整的一个 RAG 流程可以简单说说吗?
  10. 在切割 chunk 时,这个颗粒度是怎么控制的?
  11. 你用过 Claude 吗?了解 Claude 的上下文是怎么做的吗?
  12. 用的什么模型?不同模型之间有什么见解?
  13. 深挖实习经历,逐条追问细节。
  14. 手撕代码(hot100 二选一):最长回文子串 / 无重复字符的最长子串。

《参考解析》

React 与 Vue 的异同:相同点是都走「声明式 UI + 组件化 + 虚拟 DOM + 单向数据流」,都把状态到视图的同步交给框架,都提供响应式更新与生态配套。差别主要在三条线上:更新粒度——Vue 用 Proxy(Vue 2 是 defineProperty)在数据层做依赖收集,改哪个属性就精确通知哪个组件重渲染;React 的状态更新只是标记组件「脏了」,靠 setState 触发从该组件开始的子树重新执行 render,粒度更粗,所以要靠 memo、useMemo 手动优化。写法范式——Vue 用模板(编译期能静态分析、能做编译优化如静态提升),React 用 JSX(本质是 JS,逻辑表达更自由但要自己守规矩)。心智模型——Vue 把响应式数据当普通对象用,改了就更新;React 强调状态的不可变更新与函数式渲染,闭包陷阱、useEffect 依赖数组都是这套模型的产物。面试时最好补一句取舍:Vue 上手快、中小项目效率高,React 在超大团队与跨端(React Native)上生态更厚,但两者都能做同一件事,选型更多取决于团队。

React Fiber:Fiber 是 React 16 起重写的协调引擎,要解决的问题是旧栈协调器一旦开始递归遍历就没法中断,树一大就会长时间占用主线程导致掉帧、输入无响应。Fiber 把递归改写成链表结构的可中断遍历,每个 Fiber 节点保存 child / sibling / return 指针和自身的工作单元,于是「渲染」被拆成两阶段:render 阶段(可中断、可丢弃、可并发,产出 effect list,这一阶段的生命周期可能被重复执行,所以不能有副作用)和 commit 阶段(同步、不可中断,一次性把变更写到 DOM)。调度上按「过期时间」排优先级,高优先级更新(用户输入)可以插队甚至打断低优先级更新(大列表渲染),这也带来了 useTransition、useDeferredValue 这类 API。追问常落在「Fiber 之后时间切片为什么还是可能卡」——因为 commit 阶段和 JS 主线程被长任务占满时依然无法调度,真正的解法是把重计算挪出主线程(Worker)或做虚拟滚动。

MCP、tools 与 skills:MCP(Model Context Protocol)是一套把「模型 ↔ 外部能力」标准化的协议,用 JSON-RPC 2.0 通信,分三种能力:tools(模型可主动调用的函数,有输入输出 schema)、resources(可读取的上下文数据)、prompts(预设的提示模板),传输层支持 stdio(本地进程)和 Streamable HTTP(远程服务),握手阶段双方交换能力清单,之后由客户端把工具描述注入模型上下文,模型返回 tool_use,客户端执行后再把结果回灌。tools 与 skills 的区别在抽象层次:tools 是协议层的函数,一次调用一个动作,输入输出都由 schema 约束;skills 是面向任务的能力包,通常是一个目录,里面装着说明文档、步骤、脚本和资源,模型按需加载文档再决定调用哪些工具,本质是「渐进式披露的提示词 + 资产」而不是一个可调用的函数。skills 相比 MCP 的短板主要有三:一是没有统一的调用契约,效果强依赖模型对文档的理解与遵守,稳定性不如有 schema 的 tool call;二是它本身不解决远程鉴权、并发、超时与错误码这类工程问题,真接外部系统还得靠 MCP 或自建服务;三是版本与权限治理更松散,脚本能碰到什么完全靠沙箱约束。反过来 skills 的优势也明显:把流程知识写进文件、不必为每个业务动作注册一个工具、上下文占用可控,适合「步骤多、规则细、变化快」的任务。

RAG 流程与 chunk 颗粒度:完整流程是「离线建库 + 在线检索生成」两段。离线:文档解析(PDF 要处理双栏、表格、扫描件 OCR)→ 清洗去噪 → 切块 → 向量化(embedding 模型,注意查询与文档要用同一模型)→ 落向量库,同时为每块保留元数据(来源、标题路径、时间、权限)。在线:查询改写(多轮对话要做指代消解、拆解子问题)→ 混合召回(BM25 稀疏 + 向量稠密)→ 融合与粗排 → Cross-Encoder 精排 → 组装上下文(去重、按相关性排序、控制 token 预算)→ 生成并给出引用。切块颗粒度没有万能值,取决三件事:文档结构(Markdown 按标题层级切、代码按函数/类切、结构化表格整表不切)、问题的跨度(问细节要小块以便精确命中,问总结要大块以免上下文缺失)、embedding 模型的窗口。工程上常用折中是「父块—子块」策略:用小块做检索命中,命中后把它所属的父块(或前后邻块)一起送进上下文,两边的好处都拿到;再叠加 10%–20% 的重叠、按语义边界(句号、段落)而不是硬按字数截断,并对超长块做摘要索引。评估时要单独看「检索命中率」和「最终答案质量」两个指标,只盯端到端效果会分不清是切块的问题还是生成的问题。

最长回文子串 / 无重复字符的最长子串:两道都是 hot100 必刷。最长回文子串首选中心扩展:回文中心有 2n-1 个(n 个单字符中心加 n-1 个双字符中心),对每个中心向两侧扩展到不相等为止,记录最长区间,时间 O(n²)、空间 O(1),写起来最短也不容易错;Manacher 能做到 O(n),靠维护当前最右回文边界和对称点,面试写出中心扩展即可,能讲清 Manacher 的 p 数组含义是加分项。无重复字符的最长子串是滑动窗口:右指针扩张并把字符计数加一,一旦某字符计数超过 1 就移动左指针直到它降回 1,过程中用 max 记录窗口长度,时间 O(n);细节上「左指针直接跳到上次出现位置 + 1」的写法更快,但要注意上次出现位置必须落在当前窗口内(max(left, last[c] + 1)),否则会把已经排除的字符算进来。两道题都要主动说明边界:空串、单字符、全相同字符、含空格与 Unicode。