百度 AI 全栈(偏前端)一面:React 与 RAG、MCP 到 Agent
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍。
- React 与 Vue 有哪些异同点?
- 你了解 React 的 Fiber 框架吗?
- Agent 与 LLM 有什么区别?
- 你了解 MCP 的通信协议是怎么样的吗?
- MCP 的 tools 和 skills 有什么区别?
- 你觉得 skills 相比 MCP 有什么缺点吗?
- 你了解 RAG 吗?
- 完整的一个 RAG 流程可以简单说说吗?
- 在切割 chunk 时,这个颗粒度是怎么控制的?
- 你用过 Claude 吗?了解 Claude 的上下文是怎么做的吗?
- 用的什么模型?不同模型之间有什么见解?
- 深挖实习经历,逐条追问细节。
- 手撕代码(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。