AI-Agent 面试题汇总 - 大模型微调面

1. 如果想要在某个模型基础上做全参数微调,究竟需要多少显存?

这个问题不能只看模型参数量,还得把训练时真正占显存的几部分一起算进去。全参数微调时,显存通常会被下面这些东西吃掉:

  • 模型参数本身
  • 梯度
  • 优化器状态
  • 前向传播保存的激活值
  • CUDA 运行时和框架缓存

如果用的是 AdamW 这类优化器,除了参数之外,还要额外维护一阶矩和二阶矩,所以训练显存会明显高于推理显存。一个比较粗糙但实用的经验是:全参数微调的显存,往往是模型权重显存的 6 到 12 倍左右,具体还得看序列长度、batch size、是否开 gradient checkpointing、是否做 ZeRO/FSDP 分片。

拿 7B 模型举例,FP16 权重大概在 14GB 左右,但真正全参训练时,经常不是 14GB、20GB 这种量级,而是会奔着 40GB、60GB 甚至更高去。所以工业界真正落地时,除非资源很充足,否则一般不会优先上全参数微调,而是先用 LoRA、QLoRA 这类方案。

2. 为什么 SFT 之后感觉 LLM 傻了?

这其实是很典型的现象,本质上就是模型被“拉偏了”。预训练阶段,模型是在海量开放语料上学到通用知识和语言模式的;到了 SFT 阶段,如果你喂进去的数据很窄、风格很单一、模板味很重,它就会越来越往这套分布靠,最后通用能力就可能下降。

实际表现通常是这些:

  • 回答变得死板
  • 生成风格明显单一
  • 爱套模板
  • 原本会发散思考的题,变得只会机械回答
  • 拒答变多,或者变得特别保守

还有一种常见情况是,SFT 数据量不算特别大,但监督信号很强。模型会被强行训练成“按这类答案说话”,久而久之就容易把原来的灵活性压掉。如果这时候学习率还偏大、训练轮数还偏多,那就更容易出现所谓“训傻了”的感觉。

想缓解这个问题,最有效的思路一般不是乱调参,而是回到数据和训练策略本身:

  • SFT 数据不要太窄
  • 混入一部分高质量通用指令数据
  • 学习率别太大
  • 不要训太久
  • 尽量用 PEFT,少动底座参数
  • 训练时同步盯通用评测,不要只看领域指标

3. SFT 指令微调数据如何构建?

SFT 数据的核心不是“做成 json 就行”,而是要让模型学会:用户这样问时,我应该怎样稳定、自然、符合预期地回答。

最常见的数据格式无非两种,一种是 instruction/input/output,另一种是 chat messages。前者比较适合传统单轮任务,后者更适合多轮对话和助手型模型。

像这样就很常见:

{
  "instruction": "请解释什么是过拟合",
  "input": "",
  "output": "过拟合是指模型在训练集表现很好,但在测试集泛化能力较差。"
}

或者:

{
  "messages": [
    {"role": "system", "content": "你是一名AI助手"},
    {"role": "user", "content": "请解释什么是过拟合"},
    {"role": "assistant", "content": "过拟合是指模型在训练集表现很好,但在测试集泛化能力较差。"}
  ]
}

真正难的不是格式,而是样本质量。一份好的 SFT 数据集,通常要满足几个条件:任务覆盖够广、答案风格统一、事实正确、拒答逻辑清楚,而且不能全是那种“客服八股文”。

如果数据里全是特别短、特别模板化的答案,模型最后大概率就会学成“看起来很标准,但一点都不好用”的样子。如果数据里错误很多,那模型也会很老实地把错误学进去。

实际构建时,一般会先做数据采集,再做清洗、去重、统一模板,之后再人工审核,最后划分训练集和验证集。

def build_sft_sample(instruction, output, input_text=""):
    return {
        "instruction": instruction.strip(),
        "input": input_text.strip(),
        "output": output.strip()
    }

sample = build_sft_sample(
    "请将下面文本总结为一句话",
    "该文本主要介绍了大模型微调中的常见问题。",
    "大模型微调通常包括继续预训练、SFT、偏好优化等阶段。"
)
print(sample)

4. 领域模型 Continue PreTrain 数据选取?

继续预训练的目标,不是教模型“怎么回答”,而是给模型补领域知识。所以选数据的时候,最重要的不是格式多漂亮,而是这批数据能不能真正代表这个行业。

比如你做医疗模型,那就应该重点找:

  • 医疗教材
  • 临床指南
  • 药品说明书
  • 医学论文
  • 标准化问诊文本
  • 医保和诊疗规范

如果做金融,就应该尽量覆盖:

  • 财报
  • 公告
  • 法规
  • 风控规则
  • 基金和证券材料
  • 客服知识库

很多人容易踩的坑是,觉得“领域语料越多越好”,于是把一堆爬虫网页、低质量论坛、OCR 乱码也丢进去。这样看起来语料量很大,实际上有效知识密度非常低,甚至会把模型训坏。

所以 continue pretrain 的数据挑选标准,通常就围绕这几件事:

  • 和业务强相关
  • 质量高
  • 覆盖面足够
  • 重复少
  • 不要全是碎片化短文本
  • 最好混一点通用语料,防止模型只会说行业黑话

5. 领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?

这是继续预训练很常见的副作用。因为你不断拿领域数据去更新参数,模型自然会越来越适应这个分布,原来在开放域上学到的一些能力就容易被覆盖掉。

最直接的办法其实就是别把门关死。也就是说,领域数据不要“独占训练集”,最好混入一部分通用语料。很多团队会用类似 7:3、8:2 这样的比例,把领域语料和通用语料混着训,效果通常比纯领域数据稳定很多。

另外,学习率也不能太大。继续预训练不是从零开始,模型已经有很强的能力底子了,这时候如果更新太猛,就容易把老能力冲掉。训练轮数同样不能贪多,很多时候不是“再训一点会更好”,而是“再训一点就开始坏”。

如果资源允许,也可以引入一些正则约束,比如约束新模型输出不要偏离原模型太多。但在大多数业务场景里,最实用的还是这几件事:

  • 通用语料混训
  • 学习率调小
  • 控制训练轮数
  • 训练中持续做通用评测
  • 发现能力明显漂移时尽早停

6. 领域模型 Continue PreTrain,如何让模型在预训练过程中就学到更多的知识?

这个问题本质上不是“怎么把更多文本喂进去”,而是“怎么让模型更有效地吸收知识”。

真正有用的做法,通常都围绕“语料质量”和“知识组织方式”。

首先,语料一定得干净。如果一份文本里全是重复段落、乱码、无意义标点、错误抽取内容,那模型学到的不会是知识,而是噪声。所以去重、去脏、去模板污染,这些前处理工作非常重要。

其次,文本最好有完整结构。如果切分得太碎,章节被切断,定义、解释、结论分散在不同片段里,模型其实很难学到成体系的知识。所以在切 chunk 时,不要只盯着固定长度,也要考虑段落、标题、章节边界。

再一个是采样策略。知识密度高的文本,比如标准文档、教程、术语解释、FAQ 问答、操作规范,这些语料的价值往往远高于大量闲聊和低信息网页。如果能把结构化知识转成自然语言再混进去,效果通常也会更好。

7. 进行 SFT 操作的时候,基座模型选用 Chat 还是 Base?

这个问题没有绝对答案,关键看你要做什么。

如果你的目标是快速做出一个可用的助手,尤其是客服、问答机器人、多轮对话这种场景,那一般优先选 Chat 模型。因为它已经具备基本的指令跟随和对话风格,你只要拿业务数据去做进一步对齐,往往比较快就能出效果。

但如果你要做的是很深的行业定制,比如:

  • 特定输出模板
  • 很强的风格控制
  • 特殊安全边界
  • 特定任务链路

Base 模型 反而更有可塑性。它不像 Chat 模型那样已经被强烈对齐过,所以更容易被你重新塑造成你想要的样子。

缺点也很明显。Base 起步更难,需要更多高质量 SFT 数据去教它“怎么说话”;Chat 则起步快,但继续微调时可能会和它原有的对齐风格打架。

一句话说就是:想快,优先 Chat;想深度定制,Base 往往更合适。

8. 领域模型微调指令和数据输入格式有什么要求?

格式统一这件事,看起来像小事,实际上非常重要。因为模型学到的不只是内容本身,还会把“这个任务一般长什么样、角色怎么分、答案怎么收尾”一起学进去。

所以领域微调数据最好做到这些:

  • 用户输入和模型输出边界清楚
  • system、user、assistant 角色定义明确
  • 同一类任务的风格尽量统一
  • 长文本任务有明确截断规则
  • 标签表达保持一致,不要一会儿“是/否”,一会儿“正确/错误”,一会儿“1/0”

如果是企业内部助手,语言风格最好贴近真实业务场景,别全是互联网通用问答那种味道。因为你最后想训练出来的模型,不是会“标准回答”,而是会“像你们业务系统里的助手那样回答”。

{
  "messages": [
    {"role": "system", "content": "你是一名医疗问答助手,请基于已知资料回答,不知道就明确说明。"},
    {"role": "user", "content": "糖尿病患者能否长期空腹?"},
    {"role": "assistant", "content": "一般不建议长期空腹,具体需要根据血糖控制情况和医生建议决定。"}
  ]
}

9. 领域模型微调领域评测集怎么构建?

没有评测集,微调基本就是靠感觉做事。而大模型项目最怕的就是“训练看起来挺顺,线上一用全是问题”。

领域评测集要做的,不是证明模型答对了几道题,而是验证它在真实业务里到底有没有学会。

所以评测集最好覆盖业务核心任务。比如医疗场景,就不能只测简单问答,还要测:

  • 症状解释
  • 检验指标解读
  • 药品和禁忌相关问答
  • 长文本病历摘要
  • 模糊问题澄清
  • 不确定场景下的合理拒答

评测集里的题目最好也有层次:简单事实题要有,多跳推理题也要有;短问题要有,长文本任务也要有;安全和合规相关的题更不能少。

还有一个很重要的点是,评测集必须和训练集严格隔离。不然测出来的不是能力,是记忆。

10. 领域模型词表扩增是不是有必要?

大多数情况下,不是必须的。现在主流 tokenizer 的子词切分能力已经比较强,很多专业术语即使被切成多个 token,也不代表模型就一定学不会。

词表扩增真正适合的场景,一般是这种:

  • 专业术语被切得特别碎
  • 大量缩写、编号、公式、基因序列之类结构很特殊
  • 特定领域有非常高频、非常稳定的专用 token

否则的话,轻易扩词表的收益不一定有想象中大,反而会带来额外问题。因为你一旦改词表,embedding 层就得跟着改,新 token 还要重新学,模型兼容性、部署链路、推理服务都可能受影响。

很多时候,不扩词表也能解决问题。比如用 continue pretrain 让模型适应领域表达,用 prompt 约束格式,用后处理把术语统一规范,这些往往更实用。

11. 如何训练自己的大模型?

这个问题得先分清楚“训练自己的大模型”到底是哪种训练。

如果是从头预训练,那是另一回事。你需要的不只是几张卡,而是完整的数据工程、分布式训练能力、长周期资源投入和评测体系。这通常不是普通团队的主战场。

大多数公司说“训练自己的大模型”,实际做的都是下面几种事:

  • 在开源基座上继续预训练
  • 做 SFT
  • 做 DPO 或 RLHF
  • 做某个垂类任务的适配

典型流程通常是这样的:先选一个

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

AI-Agent面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论

相关推荐

03-11 20:19
已编辑
门头沟学院 Java
太压力了,面了2个多小时,本菜比已经被拷打的瑟瑟发抖面完两个小时后通知过了1.算法题三道(1)leetcode124 二叉树中最大路径和hard题 因为不久前才刷过撕出来了,又来了一道(2)leetcode 300 最长递增子序列变种除了递增之外还加了一个权重因素,但是思路没变,dp就行(3)寻找词汇库里符合固定长度前缀的匹配单词应该是他们自己题库的题。给了一串单词列表,然后又给了一个单词,一个下标,根据这个下标的前缀去单词列表里面找到所有匹配的单词再返回思路是创建一个单词前缀树,然后根据树找,但是可能是构件树数有问题没撕出来2.全方位项目拷打基本没有问八股,全部都是项目企业场景题,哎哟我操,完全不会。我就纯八股战士,结果没想到一道八股都没问反正尽可能把企业场景往八股上引吧。。1. 微服务多点部署其中一个宕机了怎么办2. 要是mq占据大量CPU该怎么排查?MySQL占据大量CPU该怎么排查?3. 假如说让你实现视频点赞功能,你打算怎么设计?讲讲思路(我知道多级缓存,但是碰巧没背……寄)4. Redis延迟双删是什么,分布式锁,哨兵模式5. MySQL到es同步的延迟该怎么优化6. Rabbit mq的队列是怎么实现的?(这个完全没整明白,可能是队列的底层结构? 反正我硬扯的讲了一下rabbit mq的架构)还扯了很多,但是往后完全就慌了),记住的是这些
不知道怎么取名字_:2小时确实有压力,持续性的脑力劳动啊
查看9道真题和解析
点赞 评论 收藏
分享
发一下问题给大家参考,攒攒人品!有面试过同岗的朋友欢迎评论区交流1.实习拷打2.项目拷打3.处理查询文档里的异构数据(如图片)时,具体的处理流程是什么?解析成纯文字后如何进一步加工?这样只返回文字给用户,图片信息不会丢失吗?4.你们是通过人工打标建立图片和文本的对应关系吗?文档量很大的情况下,打标工作能完成吗?5.如何保证大部分图片异构数据解析后回答的正确性?若回答错误,怎么识别问题?后续要验证回答准确性,你有什么方案?6.用于评测的另一个大模型,如何构造问题、分析文字并进行对比?这个大模型的正确率以及模型自我一致性怎么确定?7.你们的模型基于哪些异构图像做增强?模型会不会产生幻觉,生成文档外的内容?8.若用户的问题不在文档里,你们会怎么处理?是调用其他模型吗?大模型回答不了时,会提示用户补充问题吗?用户补充后仍无法解决该怎么办?模型如何判断何时需要让用户补充提问?9.你们有框架编排这些流程吗?用的是什么框架?10.怎么理解检索召回率?这些指标具体包含哪些评价项?什么是忠实度?召回率的分子分母是怎么定义的?11.你之前那段实习的具体工作内容是什么?针对设备故障叙述报告这类复杂文本,模型如何理解?是做了相关检测吗?大模型是怎么实现术语解释的?12.请讲一下LoRA技术,除了减少参数量,它还有什么优点?你做的LoRA相关工作,后续有落地应用吗?13.你写代码主要用Python吗?会不会用Java?了解Java的多线程、双亲委派模型以及消息中间件吗?有没有做过Java相关项目?
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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