大模型基础概念:从LLM原理到工程实践

本文系统介绍大语言模型(LLM)的核心概念,包括Temperature、Top-P、自回归、上下文长度、BPE分词、BGE Embedding、过拟合等关键知识点,帮助你建立对LLM的全面理解。


📑 目录

1. 本质:LLM 是一个"概率预测机"

核心启示: LLM 实际上并不"知道"事实,它只是在模仿训练数据中词语出现的统计规律。这就是"幻觉"(Hallucination)的根源——它可能自信地输出了一个概率很高但逻辑错误的词。


2. 关键参数:控制"创造性" (Hyperparameters)

A. Temperature (温度)

在 LLM 中,Temperature 是用来控制"下一个 Token"概率分布平滑程度的参数。

底层原理:Softmax 的缩放 (Math)

模型输出的原始分数叫做 Logits (x_i)。将 Logits 转化为概率 Pi 使用的是 Softmax 函数。Temperature (T) 是这个公式中的一个除数:

P i = exp ⁡ ( x i / T ) ∑ exp ⁡ ( x j / T ) P_i = \frac{\exp(x_i / T)}{\sum \exp(x_j / T)} Pi=exp(xj/T)exp(xi/T)

参数范围作用
Temperature0.0 ~ 1.0 (部分模型可更高)改变概率分布的平滑程度

参数效果

Temperature采样方式特点适用场景
Temp = 0贪婪采样 (Greedy Sampling)永远选概率最大的词,输出确定写代码、JSON 提取
Temp = 1依概率随机采样增加低概率词被选中的机会创意写作

在这里插入图片描述

B. Top-P (核采样)

Top-P (核采样) 进行"末位淘汰"。

核心直觉:VIP 俱乐部机制

想象 LLM 面前有一张包含几万个单词的"候选名单"。

方法策略优点缺点
Top-K (旧方法)只准在前 K 名里选简单直接死板,可能错过好词或选到垃圾词
Top-P (新方法)累积概率达到 P 就停止动态调整候选池大小需要调参

建议: 通常只调 Temperature 或只调 Top-P,不要同时调。

动态调整的"候选池"

Top-P 最厉害的地方在于它能根据语境的确定性,动态调整候选词的数量。

我们对比两个场景,假设 Top-P 设置为 0.9:

场景 A:确定性高 (如"我要去北京天安…")

这时候模型非常确定下一个字是"门"。

  • 门 (0.85) -> 累积 0.85 (未满 0.9)
  • 也就是 (0.06) -> 累积 0.91 (停!)
  • 结果: 候选池里只有 2 个词。模型绝不会选到莫名其妙的词。

场景 B:确定性低 (如"今天中午我想吃…")

这时候能接的词太多了。

  • 米饭 (0.15)
  • 面条 (0.14)
  • 饺子 (0.13)
  • … (很多个 0.1 左右的词)
  • 结果: 可能要加到第 15 个词,累积概率才凑够 0.9。

Top-P 的智慧: 它自动扩大了选择范围,允许更多的多样性。

一句话总结: Top-P 在你"不知道说什么"时给你更多选择,在你"必须这么说"时强行收敛。


3. 自回归

自回归 (Autoregression) 的字面意思是:“用自己(Auto)过去的值来预测/回归(Regression)未来的值”。

在 LLM 的语境下,就是 Next Token Prediction(预测下一个词)。

# 伪代码演示:自回归生成
def generate(model, prompt, max_tokens):
    tokens = tokenize(prompt)
    for _ in range(max_tokens):
        next_token = model.predict(tokens)  # 预测下一个词
        tokens.append(next_token)
    return detokenize(tokens)

在这里插入图片描述
在这里插入图片描述


4. 上下文长度

核心定义:Input + Output 的总和

上下文长度是指模型在一次推理中能够处理的 Token 总数量上限。

这个公式非常重要:

C o n t e x t   W i n d o w ≥ ( P r o m p t   I n p u t + G e n e r a t e d   O u t p u t ) Context\ Window \ge (Prompt\ Input + Generated\ Output) Context Window(Prompt Input+Generated Output)

组成部分说明
Prompt Input系统提示词 (System Prompt)、历史对话 (History)、RAG 检索到的文档 (Context)
Generated Output模型生成的回答

为什么会有上下文限制?(底层原理)

主要原因在于 Attention 机制的计算复杂度。

输入翻倍 (2x) → 计算量翻四倍 (4x) → 显存占用翻四倍

当 Context 从 4K 增加到 128K 时,如果不加优化(如 Ring Attention),计算量和显存需求是天文数字。

应对策略:滑动窗口 (Sliding Window)

当对话越来越长,超过 Context 限制时,Agent 必须学会"遗忘"。最常见的策略是 FIFO (先进先出)。

在这里插入图片描述


5. 移动步幅(stride)

核心定义:窗口滑动的"跨度"

假设你有一个固定大小的"视窗"(Window),你要扫描一长串数据(文本或像素)。

Stride 值行为数据利用率计算量
Stride = 1地毯式搜索,每一步只挪动一格最高最大
Stride = Window Size互不重叠,切蛋糕一样整齐切开最低最小
Stride < Window Size重叠 (Overlap)中等中等

💡 RAG中最常用的模式: Stride < Window Size,产生重叠以避免语义撕裂

图解:Stride 对数据读取的影响

让我们用图解来看看 Stride 如何决定我们看到的数据。假设数据序列是:[A, B, C, D, E, F],窗口大小是 3。

情况 A:Stride = 1 (高重叠,信息最丰富)

每次只挪 1 格。B 和 C 被多次反复"看到"。

在这里插入图片描述

情况 B:Stride = 3 (无重叠,标准切分)

每次挪动距离等于窗口大小。数据被切断,互不相关。

在这里插入图片描述

问:如何避免语义撕裂?

如果你设置 Stride = Window Size(无重叠),可能会出现这种情况:

Chunk 1 结尾: "Agent 的核心原理是..." (切断)
Chunk 2 开头: "...基于大模型的推理。"

当用户搜 “Agent 的核心原理是什么?” 时,可能两个 Chunk 都因为语义不完整而没被检索到。

解决方案:Overlap (重叠)

我们通常会让 Stride < Window Size,从而产生 Overlap。

O v e r l a p = W i n d o w   S i z e − S t r i d e Overlap = Window\ Size - Stride Overlap=Window SizeStride


6. Batch Size

核心定义:并行处理的"打包"数量

在深度学习中,无论是训练(Training)还是推理(Inference),我们通常不会一条一条地处理数据,而是把多条数据打包成一个 Batch 一起送入 GPU 计算。

Batch Size比喻特点
Batch Size = 1单人过独木桥来一个处理一个
Batch Size = NN 个人坐一辆大巴车一次过 N 个

训练场景:梯度下降的"步伐"

在训练模型时,Batch Size 决定了我们根据多少数据来更新一次模型参数。

策略Batch Size名称特点
小批量1SGD (随机梯度下降)走位风骚,震荡大,难收敛,但能跳出局部最优
大批量1024Mini-batch GD走位稳健,GPU效率高,但显存占用大

在这里插入图片描述
在这里插入图片描述


7. BPE分词

核心痛点:如何在"查字典"和"读字母"之间找平衡?

在 NLP(自然语言处理)早期,有两种极端的分词方式:

分词方式示例优点缺点
Word-level (按词分)[“I”, “love”, “coding”]语义完整词汇表无限大,OOV问题严重
Character-level (按字/字母分)[“I”, " ", “l”, “o”, “v”, “e”, …]词汇表小序列太长,单字母无语义
BPE (Subword)[“I”, “love”, “cod”, “ing”]折中方案平衡词汇表大小和语义完整性

BPE (Subword 粒度) 是这与两者的折中方案。它把常见的词保留(如 apple),把不常见的词拆开(如 unfriendly -> un + friend + ly)。

算法流程:高频合并 (Merge)

BPE 的核心逻辑非常简单:统计语料中相邻字符对的出现频率,把最频繁的一对"合并"成一个新 Token,重复 N 次。

演练:从"字母"进化到"词根"

假设我们的训练语料只有这几个词(括号内是词频):

  • hug (10次)
  • pug (5次)
  • pun (12次)
  • bun (4次)

Step 0: 初始化 (拆成单字符)

当前词汇表:[b, g, h, n, p, u]

序列状态:
h u g
p u g
p u n
b u n

Step 1: 统计相邻对 (Pair Counting)

  • h+u: 10
  • u+g: 10 + 5 = 15 (最高!) 🏆
  • p+u: 5 + 12 = 17
  • u+n: 12 + 4 = 16

(注:这里为了简化演示,假设 u+g 是最高的)

Step 2: 合并 (Merge)

我们将 u 和 g 合并成新 Token ug。

当前词汇表:[b, g, h, n, p, u, ug]

序列状态变了:
h ug (h 和 ug)
p ug
p u n (un 还没合并)
b u n

Step 3: 继续循环

下一轮可能 u+n 频率最高,合并成 un。

  • p un
  • b un

最终结果:词汇表里有了 ug 和 un 这样的子词 (Subword)。如果来了个新词 bug(以前没见过),模型可以把它拆成 b + ug。因为 b 和 ug 它都认识!

在这里插入图片描述
在这里插入图片描述

关键特性与影响

A. Token 压缩率 (Cost & Speed)

语言压缩效果说明
英文高效一个单词通常就是一个 Token
中文 (早期GPT)低效一个汉字可能被拆成 2-3 个 Unicode 字节 Token
中文 (GPT-4, Qwen)高效针对多语言优化,大部分常用汉字都是单个 Token

B. 处理 OOV (Out Of Vocabulary)

这是 BPE 最大的魔法。

遇到单词 “uninstagrammable” (无法发到 Instagram 的):

  • Word-level 模型:直接报错或 [UNK]
  • BPE 模型:拆解为 un + instagram + mable (词根)
  • 模型虽然没见过这个词,但它懂这三个部分的含义,所以能"猜"出意思

C. 数字与代码的坑

BPE 对数字的处理有时很笨。

  • 数字 1000 可能会被切成 10 + 00
  • 数字 1001 可能会被切成 10 + 01

这导致模型在做数学运算时,无法像人类一样按位对齐,容易算错。

💡 Agent 启示:涉及复杂数学计算时,不要让 LLM 心算,让它写 Python 代码(Code Agent)去算,或者使用 Tool Call。


8. BGE

在这里插入图片描述

它是谁?

BGE 是由 BAAI (北京智源人工智能研究院) 发布的通用 Embedding 模型系列。

核心黑科技:指令微调 (Instruction Tuning)

普通的 Embedding 模型很"木",你给它一句话,它就给你一个向量。但 BGE 引入了 “指令” 的概念。

它不仅看你的文本,还看你的意图。

模型类型输入输出特点
普通模型“苹果”水果/手机的混合向量语义模糊
BGE (带指令)“为这个句子生成用于搜索的表示:” + “苹果”侧重搜索语义的向量意图明确

这解决了 RAG 中一个经典问题:Query(问题)通常很短(如"怎么请假?“),而 Document(文档)通常很长(如"员工考勤管理办法…”)。如果直接算距离,它们在空间中可能并不近。通过指令,BGE 能够让 Query 的向量主动向 Document 的向量空间"靠拢"。

在这里插入图片描述

⚠️ 工程实战 Note:在调用 BGE 时,如果你是在做 RAG 的检索端 (Query),必须加上特定前缀(如 query_instruction_for_retrieval)。如果你是在建立索引库 (Passage),通常不需要加。

BGE-M3:全能选手 (当前最强版本)

你现在的学习阶段(Stage 1)强烈建议直接上手 BGE-M3。 “M3” 代表了三个 “M”:

特性说明优势
Multi-linguality (多语言)支持 100+ 种语言理解 Apple 和 苹果 是同一个东西
Multi-granularity (多粒度)支持最高 8192 的上下文长度一口气能吃下一篇长论文,减少语义破碎
Multi-functionality (多功能)一次推理输出三种结果混合检索能力

BGE-M3 的三种输出

  • Dense Vector (稠密向量):常规 Embedding,看重语义
  • Sparse Vector (稀疏向量):类似于关键词权重(BM25),看重精确匹配(比如你要搜特定的错误码 “Error 502”)
  • ColBERT (多向量):重排序使用

关键特性:套娃表示 (Matryoshka Representation Learning)

BGE 还支持一种叫 MRL 的技术。

通常,Embedding 的向量维度是固定的(比如 1024 维)。

问题:1024 个 float32 存入向量库,假如你有 1 亿条数据,内存和显存开销巨大。

BGE 的解法:像俄罗斯套娃一样。它训练出的向量,前 256 维包含了主要信息,前 512 维包含了更多细节…

效果:你可以根据你的硬件资源,自由"截断"向量。显存不够?我就只取前 256 维用,精度损失很小!


9. 过拟合

核心定义:死记硬背 vs. 举一反三

模型类型表现特点
理想的模型 (泛化能力强)学习到了数据背后的规律举一反三
过拟合的模型死记硬背了训练数据中的每一个细节面对新数据完全歇菜

图解:Loss 曲线的背离

在训练过程中,我们通过观察 Loss 曲线来判断是否过拟合。

在这里插入图片描述

训练过程的时间轴 (Epochs)

在这里插入图片描述

⚠️ 警报点:在第 5 轮左右,红色线(验证集)开始反弹,而绿色线(训练集)还在下降。这意味着模型开始钻牛角尖,去学习数据里的噪音(比如标注错误、采样误差),而不是学习通用规律。这时候必须立刻停止训练!

为什么会发生?(容量过剩)

原因:模型太强,数据太少。

想象一下,你让一个核物理学家(巨大的神经网络,参数量极大)去学小学数学(简单的数据集)。他会觉得"这题太简单了,肯定有诈",于是他开始分析卷子上的墨迹深浅、纸张纹理(噪音),并认为这也是规律的一部分。

参数量 (Parameters) >> 数据量 (Data):模型有足够的"脑容量"去记住每一个样本,而不是被迫去总结规律。

解决方案:给模型"上强度"

为了防止过拟合,我们需要限制模型的能力,这在深度学习中叫 正则化 (Regularization)

A. Dropout (丢弃法) —— 类似于 Chaos Engineering

在训练时,随机把一部分神经元"关掉"(置零)。

在这里插入图片描述

概念DropoutGo 类比 (Chaos Engineering)
原理模型不能依赖某一个特定的神经元,被迫学会利用所有神经元协同工作Netflix 故意随机杀掉生产环境的微服务实例,迫使系统架构必须健壮
目的学习更鲁棒的特征消除单点故障

B. Early Stopping (早停)

监控验证集的 Loss,一旦发现它不降反升(比如连续 3 轮没变好),就强制中断 for 循环,保存之前的最佳模型权重。

  • Go 类比context.WithTimeout。如果一个请求处理太久且没结果,直接断开,防止资源浪费和错误蔓延

C. 数据增强 (Data Augmentation)

既然数据太少,那就造假数据。

数据类型增强方法
图片旋转、裁剪、调色
文本回译(中文 -> 英文 -> 中文,意思没变但字变了)

📝 总结

概念核心要点
LLM 本质概率预测机,不真正"知道"事实
Temperature控制输出的随机性,0=确定,1=创意
Top-P动态调整候选池大小,避免长尾垃圾词
自回归用过去的值预测未来的值,即 Next Token Prediction
上下文长度Input + Output 的总和,受 Attention 计算复杂度限制
Stride窗口滑动的跨度,影响数据重叠程度
Batch Size并行处理的数据量,影响训练稳定性和效率
BPESubword 分词,平衡词汇表大小和语义完整性
BGE带指令的 Embedding,支持多语言、多粒度、多功能
过拟合死记硬背,解决方案:更多数据、Dropout、Early Stopping

💬 互动话题

  1. 你在实际项目中遇到过哪些 LLM 的"幻觉"问题?
  2. 你是如何调整 Temperature 和 Top-P 来优化生成效果的?
  3. 在 RAG 系统中,你使用哪种 Embedding 模型?效果如何?

如果这篇文章对你有帮助,欢迎点赞、收藏、关注! 🎯

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐