Agent Engineering
Agent EngineeringAI 工程面试16 min

AI 开发经验面试:你是真的每天在用 AI 吗

2026 年以后的 AI 开发面试,越来越少考公式,越来越多考真实使用经验:怎么用 Agent、MCP、Skills、Vibe Coding、RAG 和 Coding Agent。

10 / 10

100%
AI InterviewSkillsMCPVibe CodingCoding Agent

现在面 AI 开发者,我不会一上来问 Attention 公式。

我更想知道一件事:

你是真的每天在用 AI 做项目,还是只是在看新闻、刷榜单、背概念?

所以这篇不是“标准答案大全”。它更像一套面试时可以直接说出口的回答稿。

回答时有个简单原则:

先说人话
再说概念
最后说自己怎么用、怎么踩坑

如果一个人只会说“Agent 是未来”“MCP 很重要”,但说不出自己怎么限制 AI 改代码、怎么处理工具失败、怎么判断 RAG 召回质量,那大概率还停留在看热闹。

第一部分:概念理解

1. 什么是 Skills?和 MCP 有什么区别?

可以这么说:

Skills 我理解成“给 AI 准备的一包专门能力”。

比如我希望 AI 更会做 PPT,我就给它一套做 PPT 的说明、模板、脚本、注意事项。下次它遇到做 PPT 的任务,就不用从零猜。

所以 Skills 更像:

一包能力
一套做法
一份操作手册

MCP 不太一样。MCP 更像“统一插口”。

以前每个 AI 工具要接数据库、浏览器、GitHub、飞书、Notion,都要自己写一遍连接方式。MCP 想解决的是:能不能大家都按一个标准接?

我会这样比喻:

Skills:我会做 PDF 总结。
MCP:我提供一个标准接口,PDF 工具、数据库工具、浏览器工具都能接进来。

所以一句话区分:

  • Skills 关心 AI 会不会做某类事
  • MCP 关心 AI 怎么连接外部工具

为什么现在 MCP 声量更大?因为做真实产品时,最麻烦的往往不是“模型会不会总结”,而是“它怎么安全、稳定地接入一堆外部系统”。

2. MCP 和 Tool Calling 有什么区别?

可以先说一句:

它们都和“调用工具”有关,但层级不一样。

Tool Calling 更像模型的一种能力。模型看到你给它的工具列表,然后生成一段 JSON,告诉程序“我要调用这个工具,参数是这些”。

模型
-> 生成工具调用参数
-> 应用执行工具
-> 把结果返回给模型

MCP 更像一整套接工具的方式。

AI 客户端
-> MCP Server
-> 外部工具或数据源

也就是说,Tool Calling 解决的是“模型怎么叫工具”。MCP 解决的是“工具怎么标准化地被 AI 应用发现和接入”。

我的理解是:

Tool Calling 是发动机里的一个能力,MCP 是让各种外部设备能接进来的接口规范。

3. Function Calling 和 Tool Calling 有区别吗?

可以这么答:

早期大家更常说 Function Calling,因为那时候想象的场景很简单:模型调用一个函数。

比如:

getWeather({ city: "Shanghai" })

后来场景变复杂了。模型调用的不只是函数,还可能是浏览器、数据库、Git、代码执行器、文件系统、搜索工具。

所以大家越来越常说 Tool Calling。

我的理解是:

  • Function Calling 是早期说法,范围窄一点
  • Tool Calling 是现在更常用的说法,范围更大

底层思路很像,都是让模型用结构化参数去调用外部能力。

第二部分:Agent

4. Agent 和 Workflow 最大区别是什么?

我会先说结论:

Workflow 是固定路线,Agent 是边走边判断。

Workflow 像流水线:

A
-> B
-> C
-> 结束

每一步都提前写好了。

Agent 更像一个人做任务:

先看情况
-> 决定用哪个工具
-> 看结果
-> 再决定下一步

所以区别不是“Agent 会思考”这么简单,而是路径是不是固定。

如果任务很稳定,比如审批流、付款流、固定报表,我更愿意用 Workflow。因为它便宜、稳定、好测试。

如果任务路径不确定,比如修 bug、查资料、分析一个陌生仓库,这时候 Agent 更合适。

5. 为什么 LangGraph 火?

可以这么说:

因为大家发现两个极端都不好。

普通 Workflow 太死,路径写死了,遇到复杂情况不灵活。

纯 Agent 又太自由,模型想干嘛就干嘛,容易循环、乱调工具、成本失控。

LangGraph 做的是中间方案:用图来管住 Agent。

State:当前任务状态
Node:每一步做什么
Edge:下一步去哪
Conditional Edge:根据结果决定去哪

它的价值不是“看起来高级”,而是让 Agent 变得可控。

你可以让模型参与判断,但又不是完全放飞。出了问题,也能看清楚卡在哪个节点、哪个状态错了。

6. Reflection 是什么?

Reflection 说白了就是:AI 做完一步以后,回头检查自己。

写代码时特别好理解:

AI 写代码
-> 跑测试
-> 报错
-> AI 看错误
-> 再改
-> 再跑

这就是 Reflection。

它不是玄学,也不是“模型突然觉醒”。就是让 AI 根据执行结果修正自己。

但这里有坑。AI 有时会误读错误,然后越改越乱。

所以我一般会限制它:

  • 先解释错误原因
  • 每次只改一小块
  • 连续失败几次就停
  • 高风险文件人工确认
  • 每次修改后看 diff

Reflection 有用,但不能无边界地让它自己循环。

第三部分:Context Engineering

7. Prompt Engineering 为什么没以前重要?

我不会说 Prompt 不重要。

更准确是:只靠一句 Prompt 越来越不够了。

以前大家很关注:

这句话怎么写,模型才听话?

现在更重要的是:

模型到底看到了什么信息?
这些信息准不准?
有没有过期?
有没有权限问题?

真正影响效果的东西包括:

  • 项目规则
  • 历史对话
  • 用户偏好
  • 检索到的知识
  • 工具返回结果
  • 当前任务状态
  • 相关文件内容

Prompt 只是最后一句话。Context Engineering 是把这些信息组织好。

我会这样理解:

Prompt 是一句话怎么说;Context Engineering 是让模型在正确时间看到正确材料。

8. 什么叫 Context Window?为什么 100 万 context 也要做 RAG?

Context Window 就是模型一次能看到多少内容。

比如 128K、200K、100 万 token,说的都是这个窗口有多大。

但窗口大,不代表什么都应该塞进去。

原因很简单:

  • 塞太多,贵
  • 塞太多,慢
  • 塞太多,模型也会抓不住重点
  • 很多内容和当前问题无关
  • 企业文档还有权限问题

所以就算有 100 万 context,RAG 还是有价值。

RAG 的作用不是只为了“塞不下”。它还负责:

  • 找最相关的内容
  • 过滤权限
  • 保持知识更新
  • 给答案加引用
  • 减少无关噪音

我的判断是:长上下文会让一些简单 RAG 变少,但不会替代企业级 RAG。

第四部分:Vibe Coding

9. 什么叫 Vibe Coding?

我不会把 Vibe Coding 理解成“一句话生成网站”。

更准确地说,它是人和 AI 一起写项目:

人定方向
AI 写实现
人 review
AI 再改
人再验收

人不是甩手掌柜。人要负责判断方向、控制边界、验收结果。

AI 负责把很多具体实现跑出来。

所以真正的 Vibe Coding 不是一次生成,而是不断对齐。

你要不停告诉它:

  • 这里不对
  • 这个风格太模板
  • 这个逻辑别改
  • 这个文件不要碰
  • 这一步先跑起来

这才是能落地的 Vibe Coding。

10. 平时怎么用 Vibe Coding?

我的做法一般不会让 AI 一次写一大坨。

我会这样做:

先讲目标
-> 让 AI 看项目结构
-> 确认技术栈和边界
-> 先做最小版本
-> 一个模块一个模块改
-> 每一步跑起来
-> 看 diff
-> 再继续

比如做一个新页面,我不会说“帮我做完整系统”。

我会先让它看现有页面怎么写,再让它只改一个页面。跑通以后,再补交互、补样式、补 SEO。

我的经验是:AI 最怕任务太大、边界太模糊。

边界越清楚,它越好用。

11. Claude Code 为什么体验好?

我不会只说“因为 Claude 模型强”。

模型强当然重要,但 Claude Code 体验好,更关键是它的工作循环像工程师。

读文件
-> 想方案
-> 改代码
-> 跑命令
-> 看结果
-> 继续修

它不是只给你一段代码,而是能围绕一个任务往前推进。

这也是 Coding Agent 和普通代码生成器的区别:

  • 普通代码生成器:给你一段代码
  • Coding Agent:读项目、改文件、跑检查、看失败、继续改

这个闭环才是体验好的核心。

12. Cursor 和 Claude Code 最大区别是什么?

我会这么说:

Cursor 更像“带 AI 的 IDE”。

Claude Code 更像“在终端里干活的 Agent”。

Cursor 适合你一边看代码一边改。它和编辑器贴得很近,适合日常写前端、改组件、补局部逻辑。

Claude Code 更适合把一个任务交给它推进。它会读文件、跑命令、看日志、改项目,系统权限和执行感更强。

简单讲:

  • Cursor 更适合一起编辑
  • Claude Code 更适合推进任务

当然边界不是绝对的,但使用感是这样。

第五部分:Coding Agent

13. AI 写代码最大的坑是什么?

最大的问题不是它写得丑。

最大的问题是:它会很自信地写错。

我见过的坑包括:

  • 删了没让它删的代码
  • 覆盖了用户已有改动
  • 为了修一个 bug 改一大片
  • 用了旧版本 API
  • 编了一个不存在的方法
  • 为了过类型检查绕开业务逻辑
  • 没看项目结构,自己发明一套结构

所以我现在不会直接说:

Fix this

我更常说:

先别改代码。
先看相关文件和日志。
告诉我根因是什么。
再给最小修改方案。

这能少踩很多坑。

14. 什么时候不会相信 AI?

涉及钱、权限、数据、不可逆操作的时候,我不会直接信。

比如:

  • 数据库迁移
  • 删除数据
  • 支付逻辑
  • 登录鉴权
  • 权限判断
  • 生产部署
  • 用户隐私
  • 安全策略

这些地方 AI 可以帮我分析,也可以写草稿,但不能直接替我拍板。

我的原则很简单:

AI 可以帮我加速,但责任还是我承担。

所以高风险代码一定要自己 review。

15. AI 写 Bug 怎么定位?

我会先让 AI 进入诊断模式,不让它马上修。

我一般会这样说:

先不要改代码。
先读错误日志、相关文件和调用链。
请告诉我最可能的根因、证据、影响范围。
确认后再改。

为什么?

因为很多 AI 一看到 bug 就想动手改,结果越改越乱。

靠谱流程应该是:

复现
-> 看日志
-> 找调用链
-> 提假设
-> 验证假设
-> 最小修改
-> 跑测试

如果它连根因都说不清楚,我不会让它改代码。

第六部分:RAG

16. 企业有 500G 文档怎么办?

第一句我会说:不要全塞进模型。

500G 文档不是“塞进去”就完事了。真正要解决的是:用户问问题时,能不能找到最相关、最可信、他有权限看的那几段。

大致流程是:

整理数据源
-> 解析文档
-> 按结构切块
-> 做 Embedding
-> 存向量库
-> 混合检索
-> Rerank
-> 拼上下文
-> 让模型回答
-> 给引用
-> 做评估

这里最容易翻车的不是向量库,而是前面几步:

  • PDF 解析乱
  • 表格丢结构
  • chunk 切错
  • 权限没过滤
  • 召回不准
  • 答案没有引用
  • 文档更新后索引没更新

如果候选人只说“Embedding + VectorDB”,我会觉得还停留在 demo。

17. Chunk 越大越好吗?

不是。

Chunk 太小,信息容易断。模型拿到一小段,可能不知道上下文。

Chunk 太大,检索又不准。命中了一个大块,里面大部分内容可能和问题没关系。

所以 chunk 不是越大越好,也不是越小越好,要看业务。

我会看几个东西:

  • 文档本身有没有标题层级
  • 用户一般问事实还是问流程
  • 答案要不要精确引用
  • rerank 能不能兜底
  • 权限边界能不能切干净

一句话:

Chunk 的目标不是切得漂亮,而是让检索更容易找对答案。

第七部分:模型选择

18. 怎么选模型?

我不会说某个模型永远最强。

我会按任务选。

比如:

  • 写代码,看仓库理解和改代码稳定性
  • 做推理,看复杂问题能力和成本
  • 看图片,看多模态能力
  • 做 RAG,看引用、拒答和长上下文
  • 做低成本任务,看价格、速度和稳定性
  • 做企业项目,看合规、私有化和供应商风险

所以我更关心模型路由,而不是信仰某一家。

简单总结 -> 便宜快模型
复杂代码 -> 代码强模型
深度分析 -> 推理模型
截图理解 -> 多模态模型
企业私有数据 -> 合规和部署优先

真正做工程,模型选择是成本、质量、速度、风险一起算。

19. 怎么看 OpenRouter?

OpenRouter 的好处很直接:接一个入口,就能试很多模型。

适合这些场景:

  • 快速原型
  • 比较模型效果
  • 做多模型 fallback
  • 统一 billing
  • 少写一堆供应商接入代码

但也不能只看优点。

如果是生产系统,我会注意:

  • 稳定性是不是够
  • 限流会不会变
  • 路由是不是透明
  • 模型版本是不是一致
  • 数据合规能不能接受
  • 出问题怎么 fallback

所以我的态度是:原型和评估很好用,生产要谨慎设计。

第八部分:最能看深度的一题

20. 请把 Prompt、Function Calling、Tool Calling、Skills、Workflow、MCP、Agent、Memory、Context Engineering 串起来

如果只能问一个问题,我会问这个。

因为它能看出候选人是不是只在背名词。

我希望他不要一个个解释定义,而是站在“我要开发一个 AI 应用”的角度,把整条链路讲清楚。

可以这么答:

假设用户说:

帮我分析这个客户最近的合同风险,并生成一份给销售看的摘要。

这个时候,最外层不是 Prompt,而是一个 AI 应用。应用先拿到用户请求,然后决定这件事要不要交给 Agent。

Agent 的作用是:围绕这个目标往前推进,而不是只回答一句话。

它大概会这样工作:

用户请求
-> Agent 理解目标
-> 构建 Context
-> 读取 Memory
-> 判断走 Workflow 还是动态决策
-> 调用工具
-> 观察结果
-> Reflection 检查
-> 返回结果

这里面每个概念都有位置。

Prompt 是最后给模型看的指令,但它不是全部。真正重要的是 Context Engineering。

Context Engineering 做的是:把模型这一步该看的东西准备好。比如用户的问题、当前业务规则、合同内容、历史对话、检索结果、工具返回结果、输出格式要求。

Memory 是其中一类上下文。它记录长期有用的信息,比如这个销售团队喜欢什么格式、这个客户以前有什么风险、公司内部对合同风险怎么分类。

Skills 更像能力包。比如“合同风险分析”“生成销售摘要”“导出 PDF”,这些都可以做成 Skill。它让 Agent 做某类任务时更稳,不用每次从零猜。

Workflow 是固定流程。如果合同风险分析每次都必须按:

读合同
-> 提取条款
-> 查风险规则
-> 生成摘要
-> 人工确认

那它就适合做成 Workflow。流程稳定,成本低,也好审计。

但如果中间情况不确定,比如合同里缺附件、客户历史资料不完整、需要临时查 CRM、还要判断要不要提醒法务,这时候就需要 Agent 动态决策。

Function Calling 和 Tool Calling 是模型调用外部能力的方式。

以前大家常说 Function Calling,因为看起来像调用一个函数。

现在说 Tool Calling 更多,因为工具不只是函数,还可能是数据库、浏览器、Git、文件系统、CRM、飞书、Notion。

MCP 则更像工具接入标准。Tool Calling 解决“模型怎么叫工具”,MCP 解决“这些工具怎么统一接进 AI 应用”。

所以在这个例子里,Agent 可能会通过 MCP 调一个合同库工具,再调一个 CRM 工具,再调一个文档生成工具。

调用完工具以后,Agent 不能直接把结果丢给用户。它还要做 Reflection。

Reflection 就是自己检查一遍:

  • 有没有回答用户真正的问题?
  • 引用的合同条款对不对?
  • 有没有缺少关键风险?
  • 结果能不能给销售直接看?
  • 要不要让人确认?

最后,Agent 才把结果返回给用户。

所以我会把它们的关系总结成一句话:

Prompt 是指令,Context 是材料,Memory 是长期记忆,Skills 是能力包,Workflow 是固定流程,Agent 是动态执行者,Tool Calling 是调用工具的动作,MCP 是工具接入标准,Reflection 是做完以后回头检查。

如果一个候选人能这样串起来,我会觉得他是真的理解 AI 应用架构。

因为真实系统不是一堆概念堆在一起,而是一条任务链路:

用户要什么
-> AI 看到什么
-> AI 记得什么
-> AI 决定怎么做
-> AI 调什么工具
-> AI 怎么检查
-> AI 怎么交付结果

这比背十个定义有用得多。

第九部分:最有价值的经验题

21. 请讲一个你用 AI 提高开发效率的真实案例

这个问题不要空讲“AI 让我效率提升很多”。

可以按这个结构说:

我做了什么项目
原来哪里慢
AI 帮了哪一步
我怎么控制风险
最后怎么验证

比如我会这样讲:

我做一个旧项目页面改版时,不会让 AI 直接重写整个页面。我会先让它读现有组件和样式,再给我一个最小改动方案。确认以后,只让它改一个页面和少数相关组件。

每改一步,我会看 diff,跑 lint 或 build,再看页面效果。

AI 真正帮我省时间的地方不是“打字”,而是:

  • 快速读旧代码
  • 快速出第一版
  • 快速补状态
  • 快速找构建错误
  • 快速整理说明

但最终的产品判断和验收,还是我来做。

22. AI 有没有坑过你?

这个问题一定要敢说“坑过”。

如果一个人说 AI 从来没坑过他,要么用得少,要么没认真 review。

我见过的坑包括:

  • 它重构时删掉了不该删的代码
  • 修一个功能时影响了别的模块
  • 一本正经引用不存在的 API
  • 按旧文档写了错误实现
  • 一次改太多,后来定位不了问题
  • 为了类型通过,牺牲了业务逻辑

所以我现在会这样用:

  • 限制每次改动范围
  • 先分析再修改
  • 高风险文件单独确认
  • 每一步看 diff
  • 跑测试和构建
  • 用 Git 小步保存

AI 会错很正常。关键是流程要能及时发现它错了。

23. 如果今天让你不用 AI 开发,你还能开发吗?

我不会回答“不能写代码”。

更成熟的回答是:

能开发,但我不会主动回到不用 AI 的低效率方式。

没有 AI,我还是能做需求拆解、架构设计、编码、调试、部署。

但效率会明显下降,尤其是:

  • 读陌生代码
  • 查冷门 API
  • 写样板代码
  • 补测试
  • 整理文档
  • 定位低级错误

所以 AI 不是替代我的基础能力,而是放大我的工程效率。

关键是我不能把判断权交出去。AI 可以帮我干活,但最后谁负责,还是我。

我怎么判断候选人是不是真用过 AI

真用过的人,回答里会自然出现这些东西:

  • diff
  • 小步修改
  • 跑测试
  • 看日志
  • 读调用链
  • 权限边界
  • 上下文污染
  • 工具失败
  • 版本差异
  • 幻觉 API
  • 回滚
  • 成本和延迟

只看新闻的人,通常只会说:

  • 某模型很强
  • 某工具很好用
  • Agent 是未来
  • MCP 是 USB-C
  • Vibe Coding 很火

这些话没错,但太轻了。

真正的 AI 开发能力,是把一个不稳定但很强的东西,用流程、工具、验证和边界,变成可靠生产力。

参考来源

这些来源用于校准概念边界,不代表文章只是在复述文档: