跳到主要内容

[LLM 1/10] 继续预训练:把新知识真正灌进泰语 LLM

· 阅读需 4 分钟
Kobkrit Viriyayudhakorn
CEO, iApp Technology

一个泰语能力还不错的大语言模型,往往对你所在组织的专业知识"一无所知"—— 不懂泰国的政府法规,不懂你这个行业的术语,更没见过公司内部文档。 这篇文章要讲的是最直接的解法:继续预训练(Continue Pretraining,CPT), 从公式一直讲到能在免费 Colab 上大约 15 分钟真正跑完的代码。

Open in Colab01_continue_pretraining.ipynb

1. 问题(Problem statement)

设想你拿 Qwen3-0.6B 去问一句:"按照泰国总理府的规定,什么情况下可以采用特定方式采购?" 模型会非常自信地回答你,而且答错——因为它压根没见过足够多的泰国政府公文。

很多人试图用几千条问答对做 fine-tuning 来补救,然后发现根本没用。 原因在于:SFT 教的是"回答的形式",不是"知识"本身。 如果知识从来就不在模型权重里, 教它用正确的语气去回答,只不过是让它在胡说八道的时候更加理直气壮而已。

新知识进入模型有三条路,选错路正是大多数 LLM 项目失败的根源:

方法适合的场景推理时的开销
RAG变动频繁、需要标注来源的知识每次都要检索 + prompt 变长
继续预训练大量且相对稳定的专业领域知识无(知识已在权重里)
SFT格式、语气、答案结构

这篇文章走的是第二条路。

2. 我们要做什么(Solution)

我们会拿一个 base 模型(尚未经过 instruction tuning), 用与预训练阶段完全相同的 objective——预测下一个词——在我们关心领域的泰语原始文本上继续训练。 没有标签,没有问答对,只有纯文本。

但这篇文章的核心不是"训完变强了",而是你为此付出的代价:

本章的核心观点

CPT 是用牺牲通用能力来换取领域上的精准。 它是一笔交易,不是免费的午餐,而这笔交易的"汇率"由一个叫 replay ratio 的数字单独控制。

模型忘掉原本会做的事情,这个现象叫作灾难性遗忘(catastrophic forgetting)。 我们不会空口谈它,而是要把它量化成数字,再去找一个你能接受的平衡点。

3. 公式(Equation)

3.1 CPT 的 objective

LCPT(θ)=ExDdomain[t=1xlogpθ(xtx<t)]\mathcal{L}_{\text{CPT}}(\theta) = -\mathbb{E}_{x\sim\mathcal{D}_{\text{domain}}}\left[\sum_{t=1}^{|x|}\log p_\theta(x_t \mid x_{<t})\right]
  • xtx_t = 第 tt 个位置的 token
  • x<tx_{<t} = 它前面的全部 token
  • pθp_\theta = 模型预测出的概率

这个式子和预训练时一模一样,唯一变的是数据。 这正是 CPT 不需要标签的原因——文本自己就是答案。

3.2 Perplexity:我们的度量单位

PPL(D)=exp ⁣(1NiLCPT(x(i)))\text{PPL}(\mathcal{D}) = \exp\!\left(\frac{1}{N}\sum_{i}\mathcal{L}_{\text{CPT}}(x^{(i)})\right)

翻译成人话就是:"平均而言,模型正在多少个选项之间犹豫。" PPL = 20 表示大约在 20 个词之间摇摆,PPL = 5 则笃定得多。困惑度越低越好。

3.3 本章最重要的公式——Replay Mixing

Dmix=λDdomain+(1λ)Dgeneral\mathcal{D}_{\text{mix}} = \lambda\,\mathcal{D}_{\text{domain}} + (1-\lambda)\,\mathcal{D}_{\text{general}}

λ\lambda 就是每个 batch 中领域数据所占的比例。

  • λ=1.0\lambda = 1.0 → 纯领域数据 → 领域能力涨得最快,同时也忘得最快
  • λ=0.5\lambda = 0.5 → 一半一半 → 涨得慢一些,但遗忘少得多

不要把这个值写死,去扫一遍它的取值,然后挑一个你能接受的点。

完整内容在课程中

这篇文章大约是本章的前 30%。其余部分——环境准备、数据准备、核心代码、实测结果与总结——都在免费的 LLM Finetuning 课程中,使用 Google 登录即可阅读。

在课程中阅读完整章节 →