大模型

微调

大模型微调(Fine-tuning),就是在一个已经训练好的大模型基础上,用特定领域或特定任务的数据继续训练,让模型更擅长某一类任务

一个通用大模型在预训练的过程中其实学到了很多通用知识,但是如果要适应业务场景需要用大量高质量的业务数据进行调整,经过微调之后,模型的参数会发生调整,从而更符合这个领域的表达方式和任务要求。

微调可以分为全量微调和参数高效微调,全量微调会更新模型的大部分甚至全部参数,成本比较高;现在更常见的是 LoRA 这类参数高效微调方法,只训练少量新增参数,显存和训练成本都会低很多。

SFT

SFT(监督微调)是在预训练模型的基础上,使用人工标注或者高质量构造的“指令-答案”数据继续训练模型,本质上来说还是 Next Token Prediction,通过交叉熵损失让模型生成的答案接近标准答案。

主要作用是让预训练模型从单纯的文本续写能力,变成更擅长遵循指令、回答问题和完成具体任务的模型。

比如说自我认知微调。

RL

RL强化学习,是一种机器学习方法,训练的目标就是让高奖励回答出现的概率更高,低奖励回答出现的概率更低,从而让模型逐渐学会更符合人类偏好或者业务目标的行为。

比如同一个问题模型生成两个答案,如果答案 A 更准确、更安全、更符合用户意图,就给它更高奖励,经过多轮训练之后,模型就会更倾向于生成类似 A 的回答。

与 SFT 的区别:SFT 是“照着标准答案学”,本质是模仿数据;RL 是“根据奖励学”,用reward优化偏好;

GRPO 是一种用于大模型强化学习的算法,和 PPO 很像,但最大的区别是,GRPO 不需要额外训练一个 Value Model,也就是 Critic,因此可以降低训练成本,特别适合数学、代码等 Reward 容易验证的推理任务。

COT

CoT 全称是 Chain of Thought,也就是思维链,是一种 Prompt Engineering 技术。通过在输入中加入分步骤的推理示例,引导大模型在回答时也分步骤输出推理过程,而不是直接给出最终答案。

目的是提升大模型在复杂推理、数学计算、多步推断等任务上的准确率和可解释性,现在很多较新的推理模型本身就具备内部推理机制,不需要额外的提示词。

追问:CoT 和 ReAct 的区别

CoT 和 ReAct 都是提升大模型复杂任务处理能力的方法,但区别在于是否和外部环境交互。

CoT 主要强调分步推理,也就是模型基于已有上下文一步一步分析,最后得到答案。

ReAct 把推理和行动结合起来。模型在推理过程中发现自己缺少信息时,可以调用搜索、数据库或者 API 等工具,再根据工具返回的 Observation 继续推理。

ReAct 在推理部分使用类似 CoT 的思路,但额外加入了 Action 和 Observation。

RAG

RAG(Retrieval-Augmented Generation,检索增强生成),核心思想是让大模型在回答问题之前,先从外部知识库中检索与用户问题相关的内容,然后把检索结果和用户问题一起放到 Prompt 中,让大模型基于这些资料生成答案。

一个典型的 RAG 流程包括文档切块、Embedding 向量化、存入向量数据库;用户提问后,也把问题转换成向量,然后做相似度检索,必要时再经过 Rerank 重排,最后把最相关的文档交给大模型生成答案。

RAG 的优势是不用重新训练模型,就可以接入企业内部知识和最新数据,同时还能减少模型幻觉。


追问:近些年有哪些RAG改进技术,它们都是解决什么问题的?

第一是查询优化,比如 Query Rewrite 和 HyDE,主要解决用户问题和知识库表达不一致的问题。HyDE 先让 LLM 根据 Query 生成一个假设性的答案文档,再对这个文档做 Embedding,用它去向量库检索真实文档。缺点是会带来延迟和成本,而且错误的假设文档也可能造成检索方向偏移。

第二是检索优化,比如 Hybrid Search 和 Rerank。Hybrid Search 同时利用关键词检索和向量检索提高召回率,Rerank 再对召回结果进行精排。

第三是知识组织方式的优化,比如 RAPTOR 和 GraphRAG。

RAPTOR 根据 chunk 的语义进行聚类,对每个 Cluster 用 LLM 生成摘要,再对这些摘要继续聚类和摘要,递归地构建一棵树。检索时可以同时从不同层级查找相关内容,更适合长文档和层级信息。缺点是建索引成本更高,而且摘要过程可能带来信息损失。

GraphRAG 先从文档中抽取实体和实体之间的关系,构建知识图谱,在查询时通过实体和关系检索相关子图,再结合原始文本交给 LLM 生成答案。缺点是建图成本高,而且图谱维护比普通向量库更复杂。

第四是动态检索和纠错,比如 Self-RAG 和 Adaptive-RAG。

Self-RAG 会让模型自己判断当前问题是否需要检索,并对检索结果的相关性以及生成答案是否被证据支持进行评价。核心可以概括为自适应检索加自我反思。

Adaptive-RAG 根据问题复杂度选择检索策略,比如简单问题不检索,中等问题单次检索,复杂问题采用多步迭代检索。

这两年主要是把RAG融合到Agent的过程中

MOE

MOE 全称是 Mixture of Experts,也就是混合专家模型

核心思想是在模型中设置多个 Expert,并通过一个 Router,根据输入 Token 动态选择少数几个 Expert 参与计算。

例如一个 MoE 层可能有 8 个 Expert,但是每个 Token 只选择其中 Top-2 个进行计算,所以虽然模型总参数量很大,实际一次前向计算只激活其中一部分参数。

MoE 最大的优势就是可以在不同比例增加计算量的情况下扩大模型容量,因此现在很多大模型都会使用,主要用于替换 Transformer 中的 FFN 层。

它的主要挑战包括负载均衡、专家分布不均,以及分布式训练中的通信开销。

Scaling

Scaling(扩展规律 / Scaling Laws):指大模型的性能和模型参数量、训练数据量以及计算量之间存在比较稳定的扩展规律。

通常随着模型变大、数据增加、训练计算量增加,模型的 Loss 会持续下降,能力会增强,但这种提升一般不是线性的,而是存在边际收益递减。

所以 Scaling Law 的实际意义是帮助我们判断,在固定算力预算下,到底应该把资源用在扩大模型、增加数据还是增加训练计算上。

温度

Temperature 是大模型生成阶段的一个采样参数,它会影响下一个 Token 的概率分布

温度越低,模型会更倾向于选择概率最高的 Token,所以输出更稳定、更确定;温度越高,概率分布会更平缓,一些原本概率较低的 Token 也更容易被选中,因此输出会更加随机和多样。

在业务里,比如知识库问答、信息抽取这类强调准确性的任务,通常会用较低的 Temperature;而文案创作、头脑风暴这类需要多样性的任务,可以适当提高 Temperature。

$$ p_i = \frac{\exp(z_i/T)} {\sum_j \exp(z_j/T)} $$

上下文窗口

上下文窗口是指大模型一次推理过程中能够处理的最大 Token 数量。

包括用户当前的问题,还包括历史对话、System Prompt、文档以及模型已经生成的内容。

上下文窗口越大,模型理论上可以处理更长的文档和更多历史信息,但也会增加推理成本,而且上下文太长时,模型不一定能够有效利用所有信息。

所以实际业务中,不是简单把所有资料都塞进 Context,而是会通过 RAG、Rerank、摘要或者上下文压缩,把最重要的信息放进去。

上下文超过窗口以后,一般有两类处理方式:截断和压缩

截断比较简单,比如直接删除最早的历史内容、只保留最近 N 轮对话,或者使用 Sliding Window。

压缩则有几种常见方式

第一种是摘要压缩,把较早的对话或长文档总结成较短的 Summary;

第二种是检索式压缩,也就是把历史信息存起来,根据当前 Query 只检索相关部分;

第三种是抽取式压缩,只保留原文中的关键句或关键段落;

实际业务一般会组合使用,例如长期对话 Agent 可以保留最近几轮完整对话,把更早的内容做摘要,同时把长期历史放到向量库,在需要的时候通过 RAG 检索回来

记忆

Claude Code:

采用的是分层记忆 + 上下文压缩机制

当 Context 接近上限时,主要做两类处理:

  1. 清理较旧、价值较低的 Tool Output,减少无效 Token 占用;
  2. 如果仍然过长,就通过 Compaction 把较早的 Conversation 压缩成 Summary,用摘要替代部分历史内容。

当前 Conversation 属于短期工作记忆,适合被压缩;而 CLAUDE.md、Auto Memory 这类长期重要信息不会只依赖 Summary 保存,在压缩后可以重新注入 Context。

1
2
3
4
5
6
7
8
9
10
11
                ┌──────── System Prompt ────────┐
│ │
├──────── CLAUDE.md ────────────┤
│ │
├──────── Auto Memory ──────────┤
│ │
├──────── Skills ───────────────┤
│ │
旧 Conversation ── Compaction / Summary ────────┤

New Context

Codex:

把之前比较长的执行过程压缩成一个任务状态或者 checkpoint

压缩后通常重点保留:

  • 用户目标;
  • 约束条件;
  • 已经做出的技术决策;
  • 修改过哪些文件;
  • 当前测试结果;
  • 剩余任务和下一步。

像之前读取的大段代码、完整日志、Tool Output 这类占 Token 很多、同时又可以重新获取的信息,就没必要一直保留在 Context 里。

后续如果再次需要某个文件的具体内容,Codex 可以直接从文件系统重新读取。


Deepseek Harness:

采用的是比较明确的分层压缩策略

当上下文使用量达到窗口大约 80% 时,会开始考虑压缩

先裁剪 Tool Output,如果这样已经能释放足够空间,就不需要额外调用模型

如果仍然太长,就会把较老的 Conversation 交给模型压缩成一个结构化 checkpoint

同时,它不会把所有历史都压掉,而是会保留最近一段上下文原文

和CC不一样的是,不把 Summary 追加进去,而是用 checkpoint 替换掉旧历史。另外项目级的 AGENTS.mdCLAUDE.md 如果因为压缩离开当前上下文,也可以重新注入;

Agent 最好记的一句话
Claude Code 短期历史做摘要,长期规则放磁盘再注入
Codex 执行历史做 checkpoint,代码事实按需重读
DeepSeek Harness Tool 先裁剪,旧历史做 checkpoint,近期原文保留,规则按需重注入

与传统机器学习的区别

大模型和传统机器学习模型最大的区别,是大模型更强调大规模预训练和通用能力,而传统机器学习通常针对某一个明确任务进行训练。

比如传统机器学习做分类任务,会先人工设计特征,再用 XGBoost、逻辑回归之类的模型训练,模型训练完主要就解决这个任务。

大模型则会先在海量文本或多模态数据上进行预训练,学习语言、知识和一定的推理能力,之后可以通过 Prompt、RAG、SFT 等方式适配问答、摘要、代码、信息抽取等不同任务。

另外,大模型的参数量、数据量和计算成本都更大,能力更通用,但推理成本高、结果存在一定随机性和幻觉;传统机器学习模型通常更轻量、更稳定,在结构化数据和明确预测任务上仍然非常有优势。

Transformer

Transformer 是一种以注意力机制为核心的深度学习架构。

首先把输入 Token 转换成 Embedding,并加入位置信息,然后通过 Self-Attention 计算不同 Token 之间的相关性,让每个 Token 能够根据上下文动态获取其他 Token 的信息。

Attention 后面接前馈神经网络 FFN,同时配合残差连接和 LayerNorm。

Attention负责 Token 之间的信息交互

FFN 负责对每个 Token 的信息进一步加工

多个这样的 Transformer Block 堆叠起来,就形成了现在大模型的主体结构。

取代 RNN

RNN 的问题在于它必须按照时间顺序逐 Token 计算,前一个状态算完才能算下一个,所以训练很难并行,而且序列很长时,前面的信息需要经过很多步才能传到后面,容易出现长距离依赖问题。

Transformer 使用 Self-Attention,可以让一个 Token 直接关注序列中的其他 Token,而且训练阶段整个序列可以并行计算,所以 GPU 利用率更高,也更适合大规模数据和大参数模型训练。

在并行效率、长距离依赖和 Scaling 能力上都明显优于 RNN

位置编码

位置编码是用来给 Transformer 提供 Token 顺序信息的。因为 Self-Attention 本身主要根据 Token 之间的相关性做计算,如果不额外加入位置信息,它并不能很好地区分“我打你”和“你打我”这种顺序不同但 Token 集合相同的句子。

早期 Transformer 使用正弦余弦位置编码,后来很多大模型会使用 RoPE,更适合表达相对位置关系,也更适合长上下文。

Attention 机制

Attention 是一种让模型动态关注输入中重要信息的机制

在 Transformer 中,每个 Token 会生成 Query、Key 和 Value。

模型会用 Query 和其他 Token 的 Key 计算相似度,得到 Attention Score,再通过 Softmax 转成权重,最后对对应的 Value 做加权求和。

$$ \text{Attention}(Q,K,V)= \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V $$

Scaling 是为了防止点积过大,让 Softmax 和训练更稳定

这样,每个 Token 都可以根据当前上下文选择重点关注哪些 Token,而不需要像 RNN 一样逐步传递信息,因此更适合处理长距离依赖。


为什么需要多头?

使用 Multi-head Attention,主要是因为单个 Attention Head 的表达能力比较有限,它只能在一个表示子空间里计算 Token 之间的关系

多头注意力会把 Q、K、V 投影到多个不同的子空间,每个 Head 独立计算 Attention,因此不同 Head 可以学习不同类型的关系。

最后再把多个 Head 的输出拼接起来并做一次线性变换,从而得到更丰富的上下文表示。

FFN 的作用

FFN 是 Transformer Block 中 Attention 后面的前馈神经网络

Attention 主要负责不同 Token 之间的信息交互,而FFN 通常会先把隐藏维度升高,再经过激活函数,然后映射回原来的维度,这样可以提升模型的非线性表达能力。

此外,Transformer 中相当大一部分参数都集中在 FFN,因此很多 MoE 模型本质上就是把普通 FFN 替换成多个 Expert FFN,再通过 Router 选择部分专家参与计算。

残差连接

残差连接就是把某一层的输入直接加到经过网络变换后的输出上

网络不需要每一层都重新学习完整映射,而只需要学习相对于原输入需要补充的部分

同时,它给信息和梯度提供了一条直接传播的路径,因此可以缓解深层网络中的梯度消失和退化问题,让更深的网络更容易训练。

Loss

损失函数就是用来衡量模型预测结果和真实标签之间差异的函数。训练模型时,先通过前向传播得到预测结果,再计算 Loss,然后通过反向传播计算梯度,并使用优化器更新模型参数,让 Loss 逐渐减小。

不同任务会使用不同的损失函数

回归任务常用均方误差 MSE

$$ L=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2 $$
分类任务常用交叉熵 Cross Entropy
$$ L=-[y\log p+(1-y)\log(1-p)] $$

对于 MSE

$$ \frac{\partial L}{\partial p}=p-y $$
对于二分类,Sigmoid 的导数
$$ \frac{\partial p}{\partial z}=p(1-p) \rightarrow \frac{\partial L_{\text{MSE}}}{\partial z} =(p-y)p(1-p) $$
当 p 接近 0 或 1 时会导致梯度消失

二分类交叉熵

$$ \frac{\partial L_{\text{CE}}}{\partial z} =p-y $$
当模型非常自信地预测错误时,交叉熵仍然能提供比较大的梯度,这也是分类任务通常使用交叉熵而不是 MSE 的重要原因

优化器

模型训练中常见的优化器有 SGD、Momentum、Adam 和 AdamW

  • SGD 是最基础的梯度下降方法,直接根据当前梯度更新参数
  • Momentum 在 SGD 基础上加入动量,可以减少震荡、加快收敛
  • Adam 会同时维护梯度的一阶矩和二阶矩,相当于结合了 Momentum 和自适应学习率,因此收敛速度快、使用方便
  • AdamW 是 Adam 的改进版,它把 Weight Decay 和梯度更新解耦,正则化效果更合理,所以目前 Transformer 和大模型训练中非常常见

传统 Adam 如果直接使用 L2 正则,会把 $\lambda w$ 加到梯度里,然后这个正则项也会一起经过 Adam 的一阶矩、二阶矩以及自适应学习率缩放,因此实际的权重衰减强度会受到每个参数历史梯度的影响

AdamW 则只让 Adam 处理真正的 loss gradient,然后单独执行 $w\leftarrow w-\eta \lambda w$,这样 Weight Decay 不受 Adam 自适应缩放影响,更符合“直接限制参数大小”的原始目的

参数量

参数量就是模型内部所有可学习参数的数量,比如权重矩阵和偏置。模型训练的过程,本质上就是不断调整这些参数,让模型更好地预测下一个 Token。

例如 7B 表示大约 70 亿个参数,13B 表示大约 130 亿个参数。一般来说,参数量越大,模型容量越强,可以学习更复杂的模式,但同时训练和推理需要的显存、算力和成本也会更高。

不过参数量并不直接等于模型能力,数据质量、训练 Token 数、模型架构、后训练方式等都会影响最终效果。

混合精度训练

混合精度训练是在训练过程中同时使用 FP32 和 FP16/BF16 等不同精度

但低精度计算可能带来数值溢出或者下溢,所以实际训练时通常会把大部分矩阵计算放到 FP16 或 BF16,关键参数或者累加过程保留更高精度。

FP16 精度较高但动态范围较小,因此经常需要 Loss Scaling;BF16 的指数位和 FP32 一样,动态范围更大,所以大模型训练中通常更加稳定

类型 位数 显存 数值范围 精度
FP32 32 bit 4 Byte
FP16 16 bit 2 Byte 较小 较高
BF16 16 bit 2 Byte 比 FP16 粗

Prompt

Prompt 是提供给大模型的指令和上下文,包括任务、背景、约束和示例等。

Prompt 能影响模型回答,是因为大语言模型本质上是在给定当前上下文的条件下预测下一个 Token。Prompt 不同,会改变模型对当前上下文的理解以及后续 Token 的概率分布,所以最终生成的内容也会不同。

实际业务中可以通过 prompt 控制模型输出

Embedding

Embedding 是把文本、图片或者其他对象映射成一个高维向量,用这个向量表示对象的语义特征。

它的核心特点是,语义相近的内容在向量空间中的距离通常也比较近,所以可以通过余弦相似度等方法计算两个文本在语义上是否相似。

One-hot 只表示 Token 的身份,存在维度高、非常稀疏,而且无法表达语义关系,Embedding 能用更短的向量表达更多信息,节省存储和计算资源。