这篇文章解决什么问题
很多同学准备 AI 方向面试时,容易停在“概念背诵”。
真正拉开差距的,通常是三层表达:
- 你知道这个概念是什么
- 你知道它在系统里放在哪
- 你知道它在工程里会遇到什么坑、怎么解
这篇就按这个结构,把常见追问一次串起来:
- RAG、Skills、Tools、MCP 到底怎么区分
git rebase和git merge的区别是什么- 想把 3 次 commit 合成 1 次,应该用什么命令
git reset和git revert的差异- 为什么要了解 Monorepo + pnpm
- 什么是幽灵依赖,怎么治理
一、先把基础概念讲顺
1)RAG 是什么
一句话:RAG = 检索 + 生成。
先从外部知识源拿“相关上下文”,再让 LLM 基于这些上下文回答,减少胡编。
适用场景:
- 企业知识库问答
- 文档助手
- 客服 FAQ
面试表达重点:
- 不是“让模型变聪明”,而是“给模型补上下文”
- 价值在可更新、可控、可追溯
2)Tools / Function Calling 是什么
Tools 可以理解为:LLM 感知和影响外部世界的能力接口。
比如:
- 搜索
- 数据库查询
- 发邮件
- 调业务 API
Function Calling 是“让模型按结构化参数调用工具”的机制。
核心是 schema 要稳定,否则最常见问题就是参数对不上、调用失败。
3)MCP 是什么
MCP(Model Context Protocol)可以理解为:标准化的工具接入协议。
它像 AI 时代的一层“通用适配规范”,让 Agent 能用统一方式接多种工具与资源。
面试别只说“这是个协议”,更好的说法是:
- 它解决的是“模型如何安全、稳定、可扩展地调用外部能力”
- 它把工具、资源、提示模板等对象统一组织
4)Skills 是什么
Skills 本质上是 Agent 可复用能力模块。
可以把它理解成“针对某类任务封装好的能力包”。
一个 Skill 往往包含:
- 任务指令模板(Prompt)
- 输入输出约束(Schema)
- 工具编排策略(什么时候调哪个工具)
- 结果整理逻辑(Formatter)
二、面试官真正想听的:你怎么在系统里用它
一个简化但实用的 AI 系统链路:
- 用户提问
- Agent 判断是否需要检索和工具调用
- 触发 RAG 检索 / Tool 调用
- 汇总结果并生成最终回答
- 前端做流式渲染和状态反馈
前端常见职责:
- 展示 Agent 的思考阶段和调用状态
- 处理 streaming 输出(增量渲染、回滚、重试)
- 处理超时、失败、降级体验
三、真实工程问题:不只会背概念
1)token 太多导致频繁重排
常见做法:
requestAnimationFrame + buffer合并刷新- 分块渲染(batch)降低重排频率
2)工具调用延迟高
常见做法:
- optimistic UI
- loading placeholder
- 把可并行调用的工具并行化
3)工具循环调用
常见做法:
- step limit(最大调用步数)
- cooldown / 防重入策略
- 为工具调用链路打可观测日志
四、Git 追问:高频且容易答虚
1)git rebase vs git merge
merge:
- 保留分叉历史
- 会产生 merge commit
- 历史更真实,协作语义清晰
rebase:
- 把当前分支提交“搬到”目标分支后面
- 历史更线性
- 会改写提交历史(公共分支慎用)
一句话选型:
- 团队协作与可追溯优先:偏
merge - 个人分支整理提交历史:偏
rebase
2)想把 3 次 commit 合并成 1 次,用什么
用 交互式 rebase:
1 | git rebase -i HEAD~3 |
把后两个提交标记为 squash(或 fixup)即可。
squash 会保留并编辑提交信息,fixup 会直接丢弃被合并提交的信息。
3)git reset vs git revert
reset:
- 回退分支指针,可配合
--soft/--mixed/--hard - 会改写历史
- 更适合本地未共享提交的整理
revert:
- 生成一个“反向提交”来撤销某次改动
- 不改写已有历史
- 更适合已经推到远端的公共分支
一句话:
- 撤销公共历史,用 revert
- 重写本地历史,用 reset
五、Monorepo 和 pnpm:为什么面试会问
1)了解 Monorepo 的作用
Monorepo 把多个相关包放在一个仓库统一管理,价值通常在:
- 统一依赖和工具链
- 跨包改动原子提交,减少版本漂移
- 共享组件与类型更顺滑
- CI/CD 可以按变更包做增量构建
2)了解 pnpm 的作用
pnpm 常被选中不是因为“新”,而是因为它在工程治理上很实用:
- 安装更快、磁盘占用更省(内容寻址存储 + hard link)
- 依赖关系更严格,减少“侥幸可用”
- workspace 能更清晰地管理多包依赖
六、幽灵依赖是什么,怎么解决
幽灵依赖(phantom dependency)指:
代码里用了某个包,但这个包并没有在当前包的 dependencies / devDependencies 显式声明。
它在某些扁平安装模式下可能“刚好能跑”,换环境就炸。
治理方式(从高收益到低成本):
- 每个 package 显式声明自己使用的依赖
- 使用 pnpm workspace,坚持依赖边界
- 在 CI 做依赖一致性检查,避免“本地能跑、线上失败”
- 评审时把“是否新增未声明依赖”作为检查项
七、可以直接复述的回答模板
如果面试官问:“你怎么看 AI + 工程化这块?”
你可以用这个结构回答:
- 概念:RAG、MCP、Tools、Skills 的定义与边界
- 系统:它们在 Agent 调度链路里的位置
- 工程:真实问题(延迟、循环调用、渲染抖动)和解决方案
- 协作:Git 历史治理(rebase/merge/reset/revert)
- 工程化:Monorepo + pnpm 的价值与幽灵依赖治理
这个回答方式的核心不是“背名词”,而是证明你能把概念落到系统和工程实践里。