大模型基础

了解语言模型的概念、发展历程(统计/神经/预训练/大语言模型)、评估指标(BLEU/Rouge/PPL)及通用大模型评估任务。

课程目标

  • 了解大模型发展的几个重要阶段
  • 知道什么是语言模型
  • 知道语言模型的评估指标
  • 知道国内外主流大模型的差异
  • 知道通用大语言模型的评估任务

语言模型

语言模型(Language Model)旨在建模词汇序列的生成概率

通俗理解: 用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率

标准定义:对于某个句子序列, 如 $S = [W_1, W_2, W_3, \cdots, W_n]$, 语言模型就是计算该序列发生的概率, 即P(S). 如果给定的词序列符合语用习惯, 则给出高概率, 否则给出低概率.

$P(S) = P({W_1, W_2, W_3, \cdots, W_n})$

例如计算$P(中国的首都是北京) > P(中国的首都是深圳)$很明显,中国的首都是北京要比中国的首都是深圳概率大很多,那么中国的首都是北京这个句子就更符合人的习惯。


根据概率的链式法则

$P(S) = P(W_1, W_2, ....,W_n) = P(W_1)*P(W_2|W_1)*....*P(W_n|W_1, W_2, ....,W_{n-1})$

于是我们把上面的概率公式 $P({W_1, W_2, W_3, \cdots, W_n})$或者$P(W_n|W_1, W_2, ....,W_{n-1})$ 称为语言模型,简单来说,语言模型就是计算一个句子的概率大小,概率越大越符合自然语言,“越像人话”。

通俗理解,计算一个句子的概率的模型或者预测下一个“词”的模型都是语言模型。


语言模型的发展历程

语言模型发展历程

语言模型发展本质上就是围绕如何计算上面的语言模型的概率公式,先后出现了很多重要计算方法,这里总结为四个阶段

  1. 统计语言模型:使用统计学方法建模语言模型
  2. 神经语言模型:使用简单浅层的神经网络来计算语言模型
  3. 预训练语言模型:使用深层神经网络,加上大量非监督数据训练
  4. 大语言模型:使用更大更深的网络,加上海量数据,预训练加多种后训练的方式

2.1 统计语言模型

由人工设计特征并使用统计方法对固定长度的文本窗口序列进行建模分析,这种建模方式也被称为N-gram语言模型。N-gram语言模型的特点就是 依据前面N个词来预测下一个词 ,**N的不同取值对应了不同的语言模型计算方法。N常见的取值有1、2、3分别对应了1-gram、2-gram、3-gram。

引入马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关。

  • 1-gram (一元语言模型)

如果一个词的出现与它周围的词是独立的,那么我们就称之为unigram也就是一元语言模型.

$P(S) = P(W_1)*P(W_2)*....*P(W_n)$

计算相对简单,只要统计每个词出现的概率就行。$P(W_s) = \frac{C(W_s)}{N}$.

很明显这种一元语言模型假设过于简单,词出现的概率往往是跟上下文词有关系的。

例如到中午了我们去吃[X],
[X]不可能是随机的可能性比较大的是”、“面条”、“汉堡”,而不是篮球”、“衣服这样的词
  • 2-gram( 二元语言模型)

如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram.

$P(S) = P(W_1)*P(W_2|W_1)*P(W_3|W_2)*...*P(W_n|W_{n-1})$

二元语言模型计算也比较简单$P(W_t|W_{t-1}) = \frac{C(W_{t-1}W_t)}{C(W_{t-1})}$

这种情况相对于1元语言模型来说,比较符合实际情况,仍然依赖上文内容太少了。

  • 3-gram(三元语言模型)

如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram.

$P(S) = P(W_1)*P(W_2|W_1)*P(W_3|W_2,W_1)*...*P(W_n|W_{n-1},W_{n-2})$

一般来说,N元模型就是假设当前词的出现概率只与它前面的N-1个词有关,而这些概率参数都是可以通过大规模语料库来计算,比如三元概率:

$P(W_i|W_{i-1},W_{i-2}) = C(W_{i-2}W_{i-1}W_i)/C(W_{i-2}W_{i-1})$

其中$C(W_{i-2}W_{i-1}W_i)$就是统计预料中,这几个词同时出现的次数。

在实践中用的最多的就是bigram和trigram,接下来以bigram语言模型为例,理解其工作原理:

  • 首先我们准备一个语料库(简单理解让模型学习的数据集),为了计算对应的二元模型的参数,即$P(W_i|W_{i-1})$,我们要先计数即$C(W_{i-1},W_i)$,然后计数 $C(W_{i-1})$, 就能得到条件概率。
  • $C(W_{i-1}, W_i) $计数结果如下:

bigram计数结果1

  • $C(W_{i-1}) $的计数结果如下:

bigram计数结果2

  • 那么bigram语言模型针对上述语料的参数计算结果如何实现?假如,我想计算$P(想|我)\approx0.38$ ,计算过程如下显示:(其他参数计算过程类似)

$P(想|我) = \frac{C(我,想)}{C(我)} = \frac{800}{2100}\approx0.38$

有了上面的统计以后,根据二元模型(bigram),就可以计算语言模型了下面分别计算下面的概率

  • “我想去打篮球”的概率$P(我想去打篮球)$

$P(我想去打篮球) = P(想|我)*P(去|想)*P(打|去)*P(篮球|打)=\frac{800}{2100}*\frac{600}{900}*\frac{690}{2000}*\frac{20}{800} \approx0.0022$

  • 预测“我想去打[MASK]”预测下一个词的概率$P([MASK]|我想去打)$

思考:mask = 篮球 或者 mask = 晚饭,原理是依次计算词表中所有的词,选择概率最大的就是下一个词,这里只演示计算两个词。

$P(我想去打篮球) \approx 0.0022$

$P(我想去打晚饭) \approx0.00022$

  • 可以看出P(我想去打篮球) > P(我想去打晚饭),因此mask = 篮球,对比真实语境下,也符合人类习惯。

总结该方法存在两个缺陷:

  • 参数空间过大:概率$P(S) = P({W_1, W_2, W_3, \cdots, W_n})$的可能性太多,无法估算,也不一定有用
  • 数据稀疏严重:许多词对的组合,在语料库中都没有出现,依据最大似然估计得到的概率为0

2.2 神经语言模型

基于N-gram语言模型以上的问题,以及随着神经网络技术的发展,人们开始尝试使用神经网络来建模语言模型

神经语言模型架构

  • 模型的输入:$w_{t-n+1}, …, w_{t-2}, w_{t-1}$就是前n-1个词。现在需要根据这已知的$n-1$个词预测下一个词$w_t$。C(w)表示w所对应的词向量.
  • 网络的第一层(输入层)是将$C(w_{t-n+1}),…,C(w_{t-2}), C(w_{t-1})$这n-1个向量首尾拼接起来形成一个$(n-1)*m$大小的向量,记作x.
  • 网络的第二层(隐藏层)就如同普通的神经网络,直接使用一个全连接层, 通过全连接层后再使用tanh这个激活函数进行处理。
  • 网络的第三层(输出层)一共有V个节点 (V 代表语料的词汇),本质上这个输出层也是一个全连接层。每个输出节点y_i表示下一个词语为 i 的未归一化log 概率。最后使用 softmax 激活函数将输出值y进行归一化。得到最大概率值,就是我们需要预测的结果。

神经网络特点:

  • 优点:利用神经网络去建模当前词出现的概率与其前$ n-1$ 个词之间的约束关系,很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好, 从而很大程度地降低了数据稀疏带来的问题。
  • 缺点:对长序列的建模能力有限,可能会出现长距离遗忘以及训练时的梯度消失等问题,构建的模型难以进行稳定的长文本输出。

2.3 预训练语言模型

Transformer模型由一些编码器和解码器层组成(见图),学习复杂语义信息的能力强,很多主流预训练模型在提取特征时都会选择Transformer结构,并产生了一系列的基于Transformer的预训练模型,包括GPT、BERT、T5等.这些模型能够从大量的通用文本数据中学习的词表示,并将这些知识运用到下游任务中,获得了较好的效果.

预训练语言模型架构

预训练语言模型的使用方式:

  1. 预训练:预训练指构建基础模型(初始化参数),先在一些比较基础的数据集、语料库上进行训练,然后按照特定任务训练,学习数据的普遍特征。这个阶段的特点是无监督数据训练。
  2. 微调:微调指在具体的下游任务中使用预训练好的模型进行迁移学习,以获取更好的泛化效果。

预训练语言模型的特点:

  • 优点:更强大的泛化能力,丰富的语义表示,可以有效防止过拟合。
  • 缺点:计算资源需求大,可解释性差等

2.4 大语言模型

随着对预训练语言模型研究的开展,模型的参数量越来越大,需要的无监督数据量也越多,那么参数量与数据量应该存在某种关联关系,研究人员发现,通过规模扩展(如增加模型参数规模或数据规模)通常会带来下游任务的模型性能提升,这种现象通常被称为**“扩展法则”(Scaling Law)。**即随着预训练模型参数的指数级提升,其语言模型性能也会线性上升。2020年,OpenAI发布了参数量高达1750亿的GPT-3,首次展示了大语言模型的性能。

相较于此前的参数量较小的预训练语言模型,例如,3.3亿参数的Bert-large和17亿参数的GPT-2,GPT-3展现了在Few-shot语言任务能力上的飞跃,并具备了预训练语言模型不具备的一些能力,例如,GPT-3 可以通过“上下文学习”(In-Context Learning, ICL)的方式来利用少样本数据解决下游任务,而GPT-2 则不具备这一能力。这种大模型具有但小模型不具有的能力通常被称为**“涌现能力”。为了区别这一能力上的差异,学术界将这些大型预训练语言模型命名为“大语言模型”。**

大语言模型的特点:

  • 优点:具备了一定的智能,非常好的捕捉到上下的语义信息,并且具备强大的生成能力,包括文字生成以及多模态内容的生成,甚至具备了使用插件进行自动信息检索的能力。
  • 缺点:参数量大,算力要求高、生成部分有害的、有偏见的内容等等

语言模型的评估

相比于分类的评估方法,语言模型评估就复杂多了。分类问题存在确定的答案,而生成内容通常没有确定的答案,需要结合需求来综合判断生成内容的质量,在开放领域,有通用的评测任务和数据集来评估模型的好坏,但是在垂直领域内,可能连评估标准都要自己制定。下面介绍几种生成类问题的评估指标,分别是BLEU,rouge,PPL

3.1 BLEU

BLEU:BLEU (双语评估)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质量”的好坏定义为与人类翻译结果的一致性程度。

BLEU算法实际上就是在判断两个句子的相似程度. BLEU 的分数取值范围是 0~1,分数越接近1,说明翻译的质量越高。

BLEU有许多变种,根据n-gram可以划分成多种评价指标,常见的评价指标有BLEU-1、BLEU-2、BLEU-3、BLEU-4四种,其中n-gram指的是连续的单词个数为n,BLEU-1衡量的是单词级别的准确性,更高阶的BLEU可以衡量句子的流畅性.实践中,通常是取N=1~4,然后对进行加权平均。


下面举例说计算过程:

  • 分别计算candidate句和reference句的N-grams模型,然后统计其匹配的个数
  • 计算匹配度:candidate和reference中匹配的 n−gram 的个数 / candidate中n−gram 的个数

假设机器翻译的译文candidate和一个参考翻译reference如下:

candidate: it is a nice day today
reference: today is a nice day
  • 使用1-gram进行匹配
candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}
结果:    
其中{today, is, a, nice, day}匹配,所以匹配度为5/6
  • 使用2-gram进行匹配
candidate: {it is, is a, a nice, nice day, day today}
reference: {today is, is a, a nice, nice day}
结果:    
其中{is a, a nice, nice day}匹配,所以匹配度为3/5
  • 使用3-gram进行匹配
candidate: {it is a, is a nice, a nice day, nice day today}
reference: {today is a, is a nice, a nice day}
结果:    
其中{is a nice, a nice day}匹配,所以匹配度为2/4
  • 使用4-gram进行匹配
candidate: {it is a nice, is a nice day, a nice day today}
reference: {today is a nice, is a nice day}
结果:    
其中{is a nice day}匹配,所以匹配度为1/3

根据计算出的BLEU1、BLEU2、BLEU3、BLEU4对应的概率值为$p_1,p_2,p_3,p_4$计算出最终的BLEU值为

$BLEU = bp \exp (\sum_{i=1}^4 w_i \log p_i)$

其中bp为长度惩罚系数,$w_i$为对应BLEU值的权重,4个BLUE值默认为0.25

通过上面的例子分析可以发现,匹配的个数越多,BLEU值越大,则说明候选句子更好. 但是也会出现下面的极端情况:

  • 举例说明:
candidate: the the the the
rference: The cat is standing on the ground
如果按照1-gram的方法进行匹配,则匹配度为1,显然是不合理的,所以计算某个词的出现次数进行改进
  • 将计算某个词的出现次数的方法改为计算某个词在译文中出现的最小次数,如下所示的公式:

$count_k=min(c_k,s_k)$

  • 其中k表示在机器译文(candidate)中出现的第k个词语, $c_k$则代表在candidate中这个词语出现的次数,而sk则代表在reference中这个词语出现的次数。

通过上面修正以后,按照1-gram的方法进行匹配,BLUE1结果就是1/4了。

python代码实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author  : Vincent
@Time    : 2026/1/4 09:39
@File    : _01_bleu.py
@Function :
"""
import math

# 第一步安装nltk的包-->pip install nltk
from nltk.translate.bleu_score import sentence_bleu

def cumulative_bleu(reference, candidate):
    bleu_1_gram = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))
    bleu_2_gram = sentence_bleu(reference, candidate, weights=(0, 1, 0, 0))
    bleu_3_gram = sentence_bleu(reference, candidate, weights=(0, 0, 1, 0))
    bleu_4_gram = sentence_bleu(reference, candidate, weights=(0, 0, 0, 1))

    # print('bleu 1-gram: %f' % bleu_1_gram)
    # print('bleu 2-gram: %f' % bleu_2_gram)
    # print('bleu 3-gram: %f' % bleu_3_gram)
    # print('bleu 4-gram: %f' % bleu_4_gram)

    return bleu_1_gram, bleu_2_gram, bleu_3_gram, bleu_4_gram

# 生成文本
generated_text = "it is a nice day today".split(" ")

# 参考文本列表
reference_texts = ["today is a nice day".split(" ")]

# 计算 Bleu 指标
c_bleu = cumulative_bleu(reference_texts, generated_text)

# 打印结果

print("The Bleu score is:", c_bleu)
# The Bleu score is: (0.8333333333333334, 0.7071067811865476, 0.63287829698514, 0.537284965911771)
bleu = sentence_bleu(reference_texts, generated_text, weights=(0.25, 0.25, 0.25, 0.25))
print("接口返回结果:", bleu)

print("手动计算结果:",
      math.exp(sum([0.25 * math.log(p) for p in c_bleu]))
      )
      

输出结果为:

The Bleu score is: (0.8333333333333334, 0.6, 0.5, 0.3333333333333333)
接口返回结果 0.537284965911771
手动计算结果 0.537284965911771

3.2 Rouge

ROUGE指标是在机器翻译、自动摘要、问答生成等领域常见的评估指标。ROUGE通过将模型生成的摘要或者回答与参考答案(一般是人工生成的)进行比较计算,得到对应的得分。ROUGE分为四种方法:ROUGE-N, ROUGE-L, ROUGE-W, ROUGE-S.

3.2.1 Rogue-N

ROUGE指标与BLEU指标非常类似,均可用来衡量生成结果和标准结果的匹配程度,不同的是ROUGE基于召回率,BLEU更看重精确率

下面举例说计算过程,这里只介绍ROUGE-N基本步骤:

  • Rouge-N实际上是将模型生成的结果和标准结果按N-gram拆分后
  • 计算匹配度:candidate和reference中匹配的 n−gram 的个数 / reference中n−gram 的个数

假设模型生成的文本candidate和一个参考文本reference如下:

candidate: it is a nice day today
reference: today is a nice day

使用ROUGE-1进行匹配

candidate: {it, is, a, nice, day, today}
reference: {today, is, a, nice, day}
结果:
其中{today, is, a, nice, day}匹配所以匹配度为5/5=1,这说明生成的内容完全覆盖了参考文本中的所有单词质量较高

同样的方法可以计算出rouge-2的结果。

python代码实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author  : Vincent
@Time    : 2026/1/4 09:41
@File    : _02_rouge.py
@Function :
"""
# 第一步:安装rouge-->pip install rouge
from rouge import Rouge

# 生成文本
generated_text = "it is a nice day today"

# 参考文本列表
reference_texts = ["today is a nice day"]

# 计算 ROUGE 指标
rouge = Rouge()
scores = rouge.get_scores(generated_text, reference_texts[0])

# 打印结果
print("ROUGE-1 precision:", scores[0]["rouge-1"]["p"])
print("ROUGE-1 recall:", scores[0]["rouge-1"]["r"])
print("ROUGE-1 F1 score:", scores[0]["rouge-1"]["f"])
# ROUGE-1 precision: 0.8
# ROUGE-1 recall: 0.6666666666666666
# ROUGE-1 F1 score: 0.7272727223140496
print("全部结果:", scores)
# rouge-l 计算最终公共子序列

输出为:

ROUGE-1 precision: 0.8333333333333334
ROUGE-1 recall: 1.0
ROUGE-1 F1 score: 0.9090909041322315
全部结果: [{'rouge-1': {'r': 1.0, 'p': 0.8333333333333334, 'f': 0.9090909041322315}, 'rouge-2': {'r': 0.75, 'p': 0.6, 'f': 0.6666666617283951}, 'rouge-l': {'r': 0.8, 'p': 0.6666666666666666, 'f': 0.7272727223140496}}]

3.2.2 Rouge-L*

ROUGE-L(Recall-Oriented Understudy for Gisting Evaluation - Longest Common Subsequence)是自然语言处理(NLP)中用于评估自动摘要、机器翻译等生成任务质量的指标之一。

与基于 n-gram 重叠的 ROUGE-N(如 ROUGE-1, ROUGE-2)不同,ROUGE-L 基于最长公共子序列(Longest Common Subsequence, LCS)。这意味着它不要求匹配的单词必须连续,只要它们在句子中的相对顺序一致即可。这使得 ROUGE-L 能够更好地捕捉句子的结构相似性,对词序变化具有一定的鲁棒性。

子序列 (Subsequence)

指从一个字符串中删除零个或多个字符(不改变剩余字符的相对顺序)后得到的新字符串。

例如:“ace” 是 “abcde” 的子序列

ROUGE-L 的计算依赖于三个指标:召回率(Recall)、精确率(Precision)和 F1 值(F-measure)

  • m = 参考句子 XX 的长度(单词数)
  • n = 生成句子 YY 的长度(单词数)
  • LCS(X,Y)= X 和 Y 的最长公共子序列的长度

精确率:

$P_{LCS} = \frac{LCS(X, Y)}{n}$

召回率:

$ R_{LCS}= \frac{LCS(X,Y)}{m}$

F1值计算:

$F_1 = \frac{2P_{LCS} R_{LCS}}{P_{LCS} + R_{LCS}}$


3.3 PPL困惑度

1PPL用来度量一个概率分布或概率模型在预测样本的好坏程度

PPL基本思想:

  • 给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好.
  • 计算方式如下,其中S是一个句子:

$PPL(S) =p(w_1,w_2,\cdots, w_n)^{-\frac 1 N}$

$PPL(S) = \exp(\log p(w_1,w_2,\cdots, w_n)^{-\frac 1 N}) = \exp\left(-\frac 1 N \log p(w_1,w_2,\cdots,w_n)\right)$

对于1-gram的语言模型来说,上面的公式简化为:

$PPL(S) = \exp\left(-\frac 1 N \log p(w_1,w_2,\cdots,w_n)\right) = \exp\left(- \frac 1 N \sum_i^n \log p(w_i)\right)$

  • 由公式可知,句子概率越大,语言模型越好,困惑度越小

python代码实现:

import math

# 定义测试样本
sentences = [
    ['I', 'have', 'a', 'pen'],
    ['He', 'has', 'a', 'book'],
    ['She', 'has', 'a', 'cat']
]
# 定义语言模型,只写了部分词的概率
unigram = {
    'I': 1 / 100,
    'have': 1 / 100,
    'a': 3 / 100,
    'pen': 5 / 100,
    'He': 7 / 100,
    'has': 21 / 100,
    'book': 12 / 100,
    'She': 17 / 100,
    'cat': 2 / 100
}

# 计算 PPL
log_p = 0  # 计算对数化概率
total_words = 0  # 统计token 数

for sent in sentences:
    for word in sent:
        log_p += math.log(unigram[word])
        total_words += 1

ppl = math.exp(-1 / total_words * log_p)
print("最终计算的 PPL 为:", ppl)

企业使用指标

可以评估微调前后,模型在特定的语料上的PPL。

通用领域的模型qwen2.5-7B

垂直领域的微调模型qwen2.5-7B-SFT,在对应领域上微调以后,PPL应该越小


通用大模型的评估任务

通用大模型评估任务

国内外大模型的差异

SuperCLUE中文大模型测评基准-AI评测榜单

这里是中文大模型能力对比的权威平台,为您提供全面、客观的大模型性能评估和排行榜单。SuperCLUE是独立、领先的中文通用大模型综合性测评基准,涵盖通用、文本、多模态、推理、Agent、AI应用及性能系列,为产业与学术研究提供重要参考。

国内外大模型差异

OpenRouter使用排名

openRouter使用排名

LLM Rankings | OpenRouter

LLM rankings and leaderboard based on real usage data from millions of users. See which AI models developers actually use.