📖 本文是学习 Hello-Agents 项目时整理的笔记与思考。
文章已同步发布到微信公众号【浪浪山客栈】
https://mp.weixin.qq.com/s/r170l35dSyKLPlpA3NZwlQ
一、发展脉络:语言模型是如何一步步进化的?
语言模型的核心任务,是对自然语言的概率分布进行建模——简单来说,就是让机器"理解"一句话出现的可能性有多大,并据此预测下一个词。从最朴素的统计方法,到如今参数量达千亿级别的 Transformer 模型,这背后经历了数十年的技术积累与范式变迁。
1.1 统计语言模型:N-gram
最早的语言模型脱胎于统计学。其核心思想是:一个句子出现的概率,等于该句子中每个词出现的条件概率的连乘。
例如,句子"今天天气真好"的概率,可以分解为:
P("今天天气真好") = P("今天") × P("天气"|"今天") × P("真"|"今天天气") × P("好"|"今天天气真")
然而,这种全历史依赖的做法在实际中几乎无法计算——随着句子增长,条件概率的搜索空间会呈指数级膨胀。
马尔科夫假设的引入
为了使计算变得可行,研究者引入了马尔科夫假设:我们不必回溯一个词的全部历史,可以近似地认为,一个词的出现概率只与它前面有限的 N-1 个词有关。基于这个假设建立的语言模型,我们称之为 N-gram 模型。这里的"N"代表我们考虑的上下文窗口大小。
- 当 N=1 时,称为 Unigram,每个词完全独立;
- 当 N=2 时,称为 Bigram,每个词只依赖前一个词;
- 当 N=3 时,称为 Trigram,每个词依赖前两个词。
N-gram 模型简洁有效,曾长期是自然语言处理领域的主流方法,被广泛应用于语音识别、机器翻译和输入法联想等场景。
N-gram 的挑战
尽管如此,N-gram 模型存在两个根本性缺陷:
- 数据稀疏性:语言的组合方式近乎无穷,即使语料库再大,也难以覆盖所有可能的 N-gram 组合,导致大量概率估计为零。
- 泛化能力差:N-gram 本质上是对训练语料的”记忆”,而非对语言规律的”理解”。它无法识别”猫追老鼠”与”猫咪捕鼠”在语义上的相似性,因为这两个 N-gram 序列在统计上完全不同。
1.2 前馈神经网络语言模型
进入 21 世纪初,Bengio 等人提出了基于神经网络的语言模型(NNLM),通过引入词向量(Word Embedding)的概念,为语言建模带来了全新的视角。
其核心思想包含两个层面:
- 构建语义空间:创建一个高维的连续向量空间,将词汇表中的每个词都映射为该空间中的一个点。这个点(即向量)也被称为词嵌入(或词向量)。语义相近的词,在这个空间中的距离也更近——例如”国王”与”王后”的向量,比”国王”与”苹果”的向量距离更近。
- 学习上下文到下一个词的映射:通过词向量来计算词汇表中每个词在当前上下文后出现的概率,从而实现语言建模。
这一做法的最大进步在于:模型不再只是"记忆"哪些词经常一起出现,而是学会了词与词之间的语义关系,具备了初步的泛化能力。
前馈神经网络的挑战
然而,前馈神经网络语言模型的上下文是固定长度的。为了预测下一个词,模型只能看到前 N-1 个词,无法获取更长距离的上下文信息。对于需要理解长篇语义依赖的任务,这一局限显得尤为突出。
1.3 循环神经网络(RNN)
为了突破固定上下文窗口的限制,研究者提出了循环神经网络(Recurrent Neural Network, RNN)。
RNN 的核心创新是为网络增加了"记忆"功能:通过引入一个隐藏状态向量(Hidden State),它可以在处理每个词的同时,将前面所有词的信息"压缩"传递下去。这个隐藏状态相当于一个不断更新的"记忆条",理论上使模型能够捕获任意长度的上下文依赖。
RNN 在序列建模任务(如文本分类、情感分析)上取得了显著进展,成为深度学习时代早期 NLP 领域的主流架构。
RNN 的挑战:梯度消失与梯度爆炸
然而,RNN 存在一个严重的训练问题:当序列中的词太多时,误差信号在反向传播过程中需要经过很多时间步,容易发生梯度消失(Vanishing Gradient)或梯度爆炸(Exploding Gradient)问题。
- 梯度消失:靠近输出端的误差信号传递到序列前端时几乎衰减为零,导致模型无法有效学习长距离依赖;
- 梯度爆炸:相反,梯度在传播中不断放大,导致参数更新极不稳定。
这两个问题使 RNN 在处理长序列时表现欠佳。
1.4 长短时记忆网络(LSTM)
为了从结构层面解决 RNN 的梯度问题,Hochreiter 和 Schmidhuber 于 1997 年提出了长短时记忆网络(Long Short-Term Memory, LSTM)。
LSTM 的核心创新是引入了两个新机制:
- 细胞状态(Cell State):一条单独的信息通路,允许信息在时间步之间更顺畅地传递,不容易被逐步”稀释”。
- 门控制系统(Gating Mechanism):由几个小型神经网络构成,它们可以学习如何有选择地让信息通过,从而精细控制细胞状态中信息的增加与遗忘。
门控制包含三个核心组件:
| 门 | 作用 |
|---|---|
| 遗忘门(Forget Gate) | 决定从上一时刻的细胞状态中丢弃哪些信息 |
| 输入门(Input Gate) | 决定将当前输入中的哪些新信息存入细胞状态 |
| 输出门(Output Gate) | 决定根据当前的细胞状态,输出哪些信息到隐藏状态 |
通过这一精妙的设计,LSTM 能够在长序列中有选择地"记住"重要信息、"忘记"无关信息,有效缓解了梯度爆炸问题,在机器翻译、语音识别等任务上取得了当时的最优成绩。
1.5 共同的瓶颈:无法并行计算
N-gram、RNN、LSTM 等模型,都面临着同一个根本性瓶颈:必须按顺序处理数据,无法大规模并行计算。
这意味着,无论硬件算力多强,这些模型处理一个长序列时,都只能从头到尾"一个词一个词"地处理,无法充分利用 GPU 的大规模并行能力。在大数据时代,这一局限极大地限制了模型的规模与训练速度。
正是为了突破这一瓶颈,Transformer 架构应运而生。
1.6 Transformer 架构:并行计算的革命
2017 年,Google 的研究团队在论文《Attention is All You Need》中提出了 Transformer 架构,彻底改变了 NLP 领域的格局。Transformer 抛弃了循环结构,完全依赖注意力机制(Attention Mechanism)来建模序列内部的依赖关系,从而实现了高度的并行计算。
Encoder-Decoder 架构
原始 Transformer 采用编码器-解码器(Encoder-Decoder)的对称结构:
- 编码器(Encoder):负责理解输入序列,将其压缩为一系列富含语义的向量表示;
- 解码器(Decoder):基于编码器的输出,逐步生成目标序列(如翻译结果)。
这一结构天然适合"序列到序列"任务,如机器翻译、文本摘要等。
多头注意力机制(Multi-Head Attention)
Transformer 的核心是多头注意力机制,其运算基于三个核心向量:
- Query(Q):当前词”想要查询”什么信息;
- Key(K):序列中每个词”提供”的索引信息;
- Value(V):序列中每个词实际携带的内容信息。
注意力得分通过 Q 与所有 K 的点积计算得出,再经过 softmax 归一化,最终加权求和 V 得到输出。"多头"意味着这一过程在多个不同的子空间中并行进行,使模型能从多个角度同时捕捉序列中的依赖关系。
残差连接和归一化
为了使深层网络的训练更加稳定,Transformer 在每个子层(注意力层、前馈层)之后都加入了残差连接(Residual Connection)和层归一化(Layer Normalization)。残差连接允许梯度直接跳过子层传播,有效缓解了深度网络的训练困难。
位置编码(Positional Encoding)
由于注意力机制本身不感知词的顺序,Transformer 需要额外引入位置编码,将每个词在序列中的位置信息注入词向量,使模型能够区分"猫追老鼠"与"老鼠追猫"。
1.7 Decoder-Only 架构:大语言模型的主流范式
完整的 Encoder-Decoder Transformer 在机器翻译等端到端任务上表现出色。但当任务转换为构建一个能与人对话、进行创作、作为智能体大脑的通用模型时,或许并不需要那么复杂的结构。
GPT 系列模型给出了一个更简洁的答案:完全抛弃编码器,只保留解码器部分。这就是 Decoder-Only 架构。
Decoder-Only 架构的训练目标非常直接——给定前面所有的词,预测下一个词(即自回归语言建模)。这一简单的目标,在超大规模数据和算力的加持下,催生了 GPT、LLaMA、DeepSeek 等一系列强大的大语言模型,成为当今 LLM 的主流范式。
二、大语言模型的交互:如何让模型更好地工作?
理解了模型的架构,我们再来看如何更高效地与大语言模型交互。
2.1 采样参数调节
大语言模型在生成文本时,并非直接输出概率最高的词,而是通过一系列采样参数来控制输出的随机性与多样性。
Temperature(温度)
Temperature 是最常用的采样参数,它控制概率分布的"平坦程度":
| 温度范围 | 输出特点 | 适用场景 |
|---|---|---|
| 低温度(0 ~ 0.3) | 输出更”精准、确定”,倾向选择高概率词 | 事实性问答、数据计算、代码生成、法律条文解读、技术文档撰写、学术概念解释 |
| 中温度(0.3 ~ 0.7) | 输出”平衡、自然”,兼顾准确性与流畅性 | 日常对话、客服交互、邮件撰写、产品文案、简单故事创作 |
| 高温度(0.7 ~ 2) | 输出”创新、发散”,增加随机性 | 诗歌创作、科幻故事构思、广告 slogan brainstorm、艺术灵感启发、发散性思考 |
直观理解:温度越低,模型越"保守";温度越高,模型越"天马行空",但也更容易产生不连贯的输出。
Top-k 采样
Top-k 采样限制模型每次只从概率最高的 k 个词中进行采样。例如,k=50 意味着每次生成时,模型只考虑概率排名前 50 的候选词,舍弃尾部的低概率词,在保留一定多样性的同时避免生成过于离奇的内容。
Top-p 采样(核采样)
Top-p 采样(也称核采样,Nucleus Sampling)是一种动态版本的 Top-k。它不固定候选数量,而是每次选取概率之和达到阈值 p(如 0.9)的最小词集合进行采样。这样,在模型较为确定时,候选集会自动收窄;在模型不确定时,候选集会自动扩大,更加灵活。
2.2 零样本、单样本与少样本提示
提示工程(Prompt Engineering)的核心之一,是通过在提示中提供不同数量的示例,引导模型输出期望格式和风格的内容。
零样本提示(Zero-shot Prompting)
直接向模型提出任务,不提供任何示例,完全依赖模型在预训练阶段积累的知识。
请将以下文本翻译成英文:
"今天天气非常好,适合出门走走。"
单样本提示(One-shot Prompting)
提供一个示例,帮助模型理解任务格式,适用于模型不熟悉的特定输出格式场景。
示例:
输入:苹果
输出:一种常见的水果,富含维生素C,口感甜脆。
请用同样的格式介绍:香蕉
少样本提示(Few-shot Prompting)
提供多个示例,进一步明确模式。例如,训练模型进行特定风格的文本分类或格式化输出时,少样本提示往往比零样本提示效果更稳定。
少样本提示的价值在于:通过示例明确了任务的格式规范、风格要求和边界条件,有效减少了模型的歧义理解。
2.3 指令调优(Instruction Tuning)
指令调优是一种微调技术,它使用大量"指令-回答"格式的数据,对预训练模型进行进一步训练。经过指令调优后,模型能更好地理解并遵循用户的自然语言指令。
我们今天日常工作学习中使用的所有对话模型(如 ChatGPT、DeepSeek、Qwen)都是其模型家族中经过指令调优的版本。指令调优是连接"预训练基础模型"与"可用的对话助手"之间的关键桥梁。
一个典型的指令调优数据样本如下:
这是一段将英文翻译成中文的程序。
英文:Hello
中文:你好
英文:How are you?
中文:
2.4 基础提示技巧:角色扮演
角色扮演(Role-playing)是一种简单而有效的提示技巧。通过赋予模型一个特定的角色,我们可以引导它的回答风格、语气和知识范围,使其输出更符合特定场景的需求。
# 示例
你现在是一位资深的 Python 编程专家。请解释一下 Python 中的 GIL(全局解释器锁)是什么,要让一个初学者也能听懂。
角色扮演之所以有效,是因为模型在预训练阶段接触了大量带有特定角色特征的文本(如专业论文、教程、访谈等),赋予角色相当于激活了模型中相关领域的知识表达。
2.5 思维链(Chain-of-Thought, CoT)
思维链是近年来提示工程领域最重要的发现之一。它通过引导模型"一步一步地思考",显著提升了模型在复杂推理任务上的表现。
研究者发现,只需在提示中加入"让我们一步一步思考(Let’s think step by step)"这样的引导语,模型在数学应用题、逻辑推理等任务上的准确率会大幅提升。其原因在于:分步骤输出中间推理过程,相当于给模型提供了"草稿纸",使其能够对复杂问题进行分解,而非直接跳到答案。
思维链与少样本提示结合使用(即 Few-shot CoT),效果往往更佳。
2.6 文本分词(Tokenization)
在将文本输入给大语言模型之前,有一个不可跳过的预处理步骤:分词(Tokenization)。
这个将文本序列转换为数字序列的过程,就叫做分词。分词器(Tokenizer)的作用,是定义一套规则,将原始文本切分成一个个最小的单元,我们称之为词元(Token)。
Token 并不等于"词"。在英文中,Token 通常是词或子词(subword);在中文中,Token 可能是一个汉字,也可能是几个汉字的组合。例如,"Anthropic" 可能被切分为 "Anthrop" 和 "ic" 两个 Token。
理解 Token 的概念很重要,因为大语言模型的上下文长度(Context Length)、API 计费等,都以 Token 数为基本单位。
2.7 调用大语言模型的方式
目前,调用大语言模型主要有两种方式:
- 本地调用:将模型权重下载到本地设备,直接在本机运行推理。优点是数据隐私性好、无网络延迟、无 API 费用;缺点是对硬件(尤其是 GPU 显存)要求较高。常见工具如 Ollama、LM Studio 等。
- API 调用:通过云端服务提供商的 API 接口访问模型,按 Token 用量付费。优点是门槛低、可调用超大规模模型;缺点是有数据传输的隐私顾虑和一定的延迟。OpenAI、Anthropic、DeepSeek 等均提供此类服务。
三、大语言模型的缩放法则与局限性
掌握了模型架构和交互方式之后,我们还需要理解两个更宏观的话题:大语言模型为什么越来越大?以及它最核心的局限性是什么?
3.1 缩放法则(Scaling Laws)
缩放法则是近年来大语言模型领域最重要的发现之一。它揭示了模型性能与以下三个因素之间存在着可预测的幂律关系:
- 模型参数量(Model Size)
- 训练数据量(Dataset Size)
- 计算资源(Compute Budget)
简单来说,缩放法则告诉我们:在一定范围内,系统性地增加这三个维度的投入,模型性能会以可预测的方式持续提升。
这一发现为大语言模型的研究路线提供了理论依据。它解释了为什么 GPT-3(1750 亿参数)显著强于 GPT-2(15 亿参数),也指导了研究者在固定算力预算下,如何在参数量与数据量之间做出最优的资源分配——即著名的 Chinchilla 最优计算比例。
缩放法则的意义不仅在于"越大越好",更在于让大规模投入变得可预测、可规划,从而驱动了近年来模型规模的指数级增长。
3.2 模型幻觉(Hallucination)
尽管大语言模型能力强大,但它存在一个广为人知的核心缺陷:幻觉(Hallucination)。
模型幻觉通常指的是大语言模型生成的内容与客观事实、用户输入或上下文信息相矛盾,或者生成了不存在的事实、实体或事件。幻觉的本质是:模型在生成过程中过度自信地"编造"了信息,而非准确地检索或推理。
幻觉的主要类型
根据其表现形式,幻觉可以分为以下几类:
- 事实性幻觉(Factual Hallucinations):模型生成与现实世界事实不符的信息,例如错误引用一篇不存在的论文,或虚构一个名人的言论。
- 忠实性幻觉(Faithfulness Hallucinations):在文本摘要、翻译等任务中,生成的内容未能忠实地反映源文本的含义,例如摘要时无中生有。
- 内在幻觉(Intrinsic Hallucinations):模型生成的内容与输入信息直接矛盾,例如在用户明确提供了某个数据后,模型仍然输出相反的结论。
检测与缓解幻觉的方法
应对幻觉是当前 LLM 落地应用的核心挑战,目前主流策略分为三个层面:
1. 数据层面
通过高质量数据清洗、引入事实性知识以及强化学习与人类反馈(RLHF)等方式,从源头减少幻觉的产生。RLHF 通过训练奖励模型来区分"好答案"和"坏答案",引导模型生成更准确、更诚实的输出。
2. 模型层面
探索新的模型架构,或让模型能够表达对生成内容的不确定性——例如,当模型不确定某个事实时,应该说"我不确定",而非自信地给出错误答案。
3. 推理与生成层面
这一层面目前已有多种实用方法:
- 检索增强生成(Retrieval-Augmented Generation, RAG):这是目前缓解幻觉最主流的有效方法之一。RAG 系统在生成回答之前,先从外部知识库(如文档数据库、网页)中检索相关信息,然后将检索到的内容作为上下文,引导模型生成基于事实的回答。这相当于给模型配备了一个”实时查阅的参考书”,有效减少了”无中生有”的情况。
- 多步推理与验证:引导模型进行多步推理,并在每一步进行自我检查或外部验证,减少单步跳跃导致的错误累积。
- 引入外部工具:允许模型调用外部工具(如搜索引擎、计算器、代码解释器)来获取实时信息或进行精确计算,将”需要精确性”的任务从模型自身的参数记忆中”卸载”出去。
结语
从 N-gram 到 Transformer,从固定窗口到全局注意力,语言模型的发展史,本质上是一部不断突破"上下文理解瓶颈"的历史。而提示工程、缩放法则和幻觉治理,则是我们在这个新范式下,与模型打交道时需要深刻理解的三条主线。
大语言模型远未到达终点。缩放法则是否会触及上限?幻觉问题能否从根本上解决?Decoder-Only 架构是否还有更好的替代方案?这些都是当下学界和工业界正在激烈探索的开放问题。
理解这些基础,是参与这场技术变革的起点。
