这几个问题跨度很大,从 AI 架构设计到 Java 底层原理都有。别慌,我帮你把这些概念拆解成面试中容易得分的“逻辑块”。

特别是前三个关于 AI 的问题(Function Calling、MCP、Skill 等),是目前大模型应用开发中最热门的概念,搞清楚它们的层级关系是回答的关键。


🤖 24. Function Calling、MCP、Skill:概念、场景与解决的问题

这三个概念其实代表了 AI 智能体(Agent)与工具交互的三个不同层级:底层协议通信标准业务封装

1. Function Calling (函数调用)
  • 概念:这是大模型的一种底层能力。它让模型不仅能输出文本,还能输出结构化的数据(如 JSON),告诉程序“我要调用哪个函数,参数是什么”。
  • 解决的问题:解决了**“模型说不清楚,程序读不懂”**的问题。它打破了模型只能聊天的限制,让模型有了“手”,能触发外部动作
  • 场景
    • 简单的工具调用:查天气、计算器、查询数据库。
    • 提取结构化信息:把用户的一段话转换成 JSON 对象。
2. MCP (Model Context Protocol,模型上下文协议)
  • 概念:由 Anthropic 提出的标准化通信协议。你可以把它理解为 AI 界的 USB-C 接口。它定义了一套标准,让 AI 应用(Client)能统一地连接到各种数据源和工具(Server)。
  • 解决的问题:解决了**“连接碎片化”“上下文孤岛”**的问题。以前每接一个工具都要写一套适配代码,现在只要工具支持 MCP 协议,AI 就能直接连,不用重复造轮子。
  • 场景
    • 企业级应用集成:统一连接本地文件、Google Drive、Slack、GitHub 等。
    • 跨平台工具共享:开发者开发一个 MCP Server,所有支持 MCP 的 AI 客户端都能用。
3. Skill (技能)
  • 概念这是面向业务的能力封装它通常是一个包含指令、脚本、资源和提示词的“文件夹”或集合。Skill 往往基于 Function Calling 构建,但更复杂。
  • 解决的问题:解决了**“工具零散,无法完成复杂业务”**的问题。它把一个个原子化的函数(如“查航班”、“查酒店”)组合成一个有意义的业务能力(如“订机酒套餐”)。
  • 场景
    • 复杂任务处理:比如“帮我策划一次旅行”,Skill 会自动规划步骤,依次调用查天气、订机票、订酒店的函数。
    • 垂直领域专家:比如“法律助手 Skill”,里面封装了查法条、写文书的特定流程和提示词。
📌 总结对比表
概念 本质定位 核心解决问题 形象比喻
Function Calling 底层交互协议 模型输出结构化指令 神经信号(告诉手要动)
MCP 通信与调度层 统一连接标准,避免重复开发 USB 接口(通用插头)
Skill 业务能力层 复杂任务编排与封装 操作手册(怎么做菜)

🧠 25. Prompt Engineering、Context Engineering、Harness Engineering

这三个概念代表了 AI 应用开发从“手工作坊”到“系统工程”的进化过程。

1. Prompt Engineering (提示词工程)
  • 解释:这是最早期的阶段。核心是**“写咒语”**。通过精心设计自然语言指令(如“你是一个专家,请一步步思考...”),引导模型输出更好的结果。
  • 局限:它是一次性的、静态的。如果任务太复杂,光靠一段话很难控制模型。
2. Context Engineering (上下文工程)
  • 解释:这是目前的主流趋势。核心是**“构建信息流水线”**。
    • 它不再只关注那一句提示词,而是关注何把最有效的信息(知识、历史、工具描述)在恰当的时机喂给模型
    • 它包括 RAG(检索增强)、记忆管理、摘要压缩等技术。
  • 解决问题:解决了模型“记性差”、“知识过时”和“幻觉”问题。它把模型从一个“聊天机器人”变成了一个“拥有外部知识库的专家”。
3. Harness Engineering (编排工程/智能体工程)
  • 注:Harness 在这里通常指“智具编排”或“系统 harness”,类似于 LangChain 或 AutoGen 这类框架所做的工作。
  • 解释:这是最高阶的阶段。核心是**“系统级管控”**。
    • 它不仅仅是给信息,而是设计一个工作流。比如:先让模型 A 写代码,再让模型 B 审查代码,如果报错再让模型 A 修改。
    • 它涉及多智能体协作、循环反馈、工具调用的逻辑编排。
  • 解决问题:解决了复杂任务的自动化执行可靠性问题。
📌 一句话总结进化史
  • Prompt Engineering:教模型“怎么说话”。
  • Context Engineering:给模型“参考资料和记忆”。
  • Harness Engineering:给模型“ teammates(队友)和工作流程”。

☕ 26. 抽象类和接口的区别

这是 Java 面试的经典题,回答时要从设计层面底层实现两个角度切入。

设计层面的区别(核心)
  • 抽象类 (Abstract Class):是对**“本质”**的抽象。它代表“是什么 (Is-a)”的关系。
    • 例子CatDog 都是 AnimalAnimal 就是一个抽象类,它定义了大家都有“吃”和“睡”的能力。
  • 接口 (Interface):是对**“行为”**的抽象。它代表“能做什么 (Can-do)”的关系。
    • 例子CatAirplane 都可以 FlyFly 就是一个接口。猫不是飞机,但它们都能飞。
技术层面的区别(Java 8+)
特性 抽象类 接口
继承/实现 单继承 (一个类只能有一个父类) 多实现 (一个类可以实现多个接口)
成员变量 可以有各种类型的变量 (static, final, 普通) 只能是 public static final 常量
构造方法 有构造方法 (供子类调用) 没有构造方法
方法实现 可以有抽象方法,也可以有具体实现的方法 Java 8 之前只能有抽象方法;Java 8+ 可以有 defaultstatic 方法
✅ 什么时候用哪个?
  • 如果你想复用代码(比如几个子类有共同的代码逻辑),用抽象类
  • 如果你想定义一种规范,让不相关的类都能具备某种能力,用接口

♻️ 27. JVM 内存回收:标记清除 vs 标记整理

这两个算法主要用在老年代(因为新生代通常是复制算法)。

1. 标记-清除 (Mark-Sweep)
  • 原理
    1. 标记:遍历对象图,标记出所有还活着的对象。
    2. 清除:直接回收掉没被标记的对象。
  • 适合场景
    • 对象存活率较高,且不需要频繁分配大对象的场景。
    • CMS 收集器(虽然已废弃,但经典)的并发清理阶段用的就是这个变种。
  • 缺点:会产生内存碎片。碎片太多会导致无法分配大对象,不得不提前触发 Full GC。
2. 标记-整理 (Mark-Compact)
  • 原理
    1. 标记:同上,标记存活对象。
    2. 整理:让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。
  • 适合场景
    • 对象存活率高的场景(老年代典型特征)。
    • 需要分配大对象的场景(因为没有碎片)。
    • Serial OldParallel Old 收集器使用的算法。
  • 缺点:移动对象需要暂停用户线程 (Stop-The-World),且成本较高(需要更新引用地址),所以比“标记-清除”慢。
✅ 总结回答

标记-清除适合对停顿敏感、且内存碎片问题不严重的场景(或者作为 CMS 的并发清理阶段);而标记-整理适合老年代这种对象存活率高、且为了避免碎片化导致无法分配大对象的场景。G1 收集器在 Region 级别上其实也借鉴了整理的思想。”


⏳ 28. 存活时间怎么定义?

这个问题通常指 JVM 中**对象的年龄(Age)**是如何定义的,以及它如何影响 GC。

1. 年龄计数器

在 HotSpot 虚拟机中,每个对象头(Object Header)里都有一个 Age 字段。

2. 年龄增长规则
  • 初始年龄:对象在 Eden 区诞生时,年龄为 0。
  • 熬过 Minor GC:如果对象在 Minor GC 后存活下来,并被移动到 Survivor 区,它的年龄就 +1
  • 动态年龄判断:在 Survivor 区中,如果同年龄的所有对象大小总和,超过了 Survivor 空间的一半,那么大于等于该年龄的对象就可以直接进入老年代,而不需要等到年龄达到 15。
3. 进入老年代的阈值
  • 默认阈值:年龄达到 15(可以通过 -XX:MaxTenuringThreshold 参数调整)。
  • 一旦达到这个年龄,下一次 GC 时,对象就会被晋升到老年代。
✅ 回答要点

“存活时间是通过对象头里的年龄计数器定义的。对象每熬过一次 Minor GC 并在 Survivor 区存活,年龄就加 1。默认情况下,年龄达到 15 就会进入老年代。另外,JVM 还有一个动态机制:如果 Survivor 区里同年龄的对象总大小超过空间的一半,那么该年龄及以上的对象会提前晋升到老年代。”

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐