蔚来汽车 自动驾驶-C++ 一面

1. 你怎么理解 AI、LLM、大模型工作流、MCP、Agent、Prompt

AI 是一个更大的集合,机器学习、深度学习、计算机视觉、推荐系统、语音识别都算 AI。LLM 指的是大语言模型,是 AI 里专门处理自然语言、代码、推理、问答这类任务的一类基础模型。Prompt 就是给模型的输入指令设计,它决定模型如何理解任务、输出什么格式、遵循什么约束。Prompt 不是简单“提问”,更像是在给模型编排上下文和行为边界。工作流一般是把多个步骤串起来,比如意图识别、知识检索、工具调用、结果校验、格式化输出,它强调流程编排和稳定交付。Agent 比工作流再往前一步,它通常带有目标、自主决策、记忆、规划、工具使用能力,不再只是固定流程跑一遍,而是会根据环境反馈动态决定下一步做什么。MCP 可以理解为一种让模型更规范地接入外部工具、数据源、上下文能力的协议化方式,它的价值在于把“模型如何拿到外部能力”标准化,而不是每个系统都自己手搓一套工具接入逻辑。如果一句话概括,就是:LLM 是大脑,Prompt 是输入约束,工作流是流水线,Agent 是会做决策的执行体,MCP 是它接外部世界的标准接口。

2. 大模型的原理是什么

大模型的核心仍然是“根据已有上下文预测下一个 token 的概率分布”。它之所以强,不是因为原理突然变成了某种完全不同的东西,而是因为模型规模、训练数据、训练算力和架构设计一起把这个预测能力推到了很高的水平。目前主流 LLM 基本都建立在 Transformer 架构上,关键机制是自注意力。自注意力可以让模型在处理当前 token 时,同时关注上下文里哪些位置更重要,从而学到长距离依赖关系。训练阶段通常分预训练和后训练。预训练让模型在海量文本上学习语言规律、知识分布和模式;后训练再通过指令微调、偏好对齐、RLHF 或 DPO 之类方法让输出更符合人类期望。推理阶段本质上是不断把前面已经生成的内容重新送回模型,接着预测下一个 token。为了提升速度,工程上会引入 KV Cache、量化、并行推理、投机采样等优化手段。所以从原理上看,大模型是“概率建模 + Transformer + 大规模训练”;从工程上看,它又是一整套数据、训练、对齐和高性能推理系统。

3. 如果让你设计一个企业知识库问答 Agent,你会怎么做

如果让我设计,我不会直接把文档全塞进 Prompt,而是会做 RAG 架构。先把企业文档做清洗、切分、向量化和索引构建,查询时先检索相关片段,再把检索结果和用户问题一起送进模型生成答案。如果要做成 Agent,而不是普通问答机器人,我会再加工具层,比如数据库查询、工单系统、代码仓库搜索、权限校验、网页抓取、结构化 API 调用。模型负责决定什么时候调用什么工具,工作流负责兜底控制。系统层面还要考虑几个问题:多轮对话记忆怎么存、检索召回和重排怎么做、答案引用来源怎么展示、敏感信息怎么脱敏、幻觉怎么降低、用户问题失败时怎么回退到关键词检索。如果是企业场景,真正难点常常不是“模型会不会答”,而是“答得稳不稳、准不准、能不能审计、权限是否隔离”。

4. 说一下 Prompt 提示词设计时你会注意什么

Prompt 设计我会优先关注目标明确、上下文充分、约束清晰和输出可控。如果任务是结构化输出,就要把格式约束写清楚,比如要求返回 JSON、Markdown、字段名固定、不要额外解释。如果任务依赖背景知识,就要补上下文,而不是让模型自己猜。如果任务容易发散,就要告诉模型身份、目标、边界、禁止项和优先级。在工程里,Prompt 还要考虑鲁棒性,不能只在理想输入下表现好,要能面对脏数据、模糊问题、恶意输入和超长上下文。另外 Prompt 只是系统的一部分,不要把所有问题都压到提示词上。该靠检索解决的就别硬塞上下文,该靠工具调用解决的就别让模型瞎编,该靠规则校验的就别完全放给模型自由发挥。

5. 讲一下 Agent 和传统工作流的区别

答案:传统工作流更像预先画好的流程图,节点和路径大多是固定的,用户输入进来之后,系统按既定规则执行。它的优势是稳定、可控、易审计。Agent 则更强调自主决策。它通常会根据目标、上下文和工具反馈动态决定下一步行动,比如是否继续检索、是否改写查询、是否调用数据库、是否拆分子任务。所以工作流适合规则明确、流程固定的业务,比如审批、分类、标准化抽取;Agent 更适合任务路径不确定、需要多步思考和工具协作的场景。但在真实系统里,两者往往不是二选一。更常见的是外层用工作流兜住边界和状态,局部节点再让 Agent 做更灵活的决策。这样既保留了稳定性,也有一定智能性。

6. 对于 vector 交换资源,swap 和 move 的区别是什么

答案:move 的核心是把一个对象的资源转移给另一个对象,让源对象进入一种“有效但未指定”的状态。swap 的核心是两个对象互换内部资源,交换完成后双方都仍然是完整对象,只是内容互换了。放到 vector 上理解,移动构造一般发生在“用一个已有 vector 初始化另一个 vector”时,新对象接管旧对象的 buffer;而 swap 是两个已存在的 vector 直接交换内部指针、大小和容量等元数据。复杂度上,标准实现里 vector::swap 通常是常数复杂度,因为它主要交换内部指针和状态;移动构造也通常很轻量,但语义不同。如果问实际使用场景,swap 常用于快速交换内容、缩容技巧或者异常安全写法;move 更常见于返回值传递、容器扩容、所有权转移。

代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> a = {1, 2, 3};
    vector<int> b = {4, 5};

    a.swap(b); // 资源互换

    vector<int> c = std::move(a); // a 的资源转移给 c
    cout << "b size = " << b.size() << endl;
    cout << "c size = " << c.size() << endl;
    cout << "a size = " << a.size() << endl;
    return 0;
}

7. RVO 了解吗,返回值优化策略

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务